Comparing version 0.6.0 to 0.6.1
@@ -10,3 +10,3 @@ { | ||
], | ||
"version": "0.6.0", | ||
"version": "0.6.1", | ||
"repository": { | ||
@@ -49,16 +49,20 @@ "type": "git", | ||
"scripts": { | ||
"test": "node tests/tests.js" | ||
"test": "grunt test --verbose" | ||
}, | ||
"dependencies": {}, | ||
"devDependencies": { | ||
"vows": "*" | ||
"grunt": "~0.4.0", | ||
"grunt-contrib-clean": "~0.4.0", | ||
"grunt-contrib-jshint": "~0.1.1", | ||
"grunt-contrib-watch": "~0.2.0", | ||
"jasmine-node": "~1.3.0" | ||
}, | ||
"readme": "# Fest\n\n## Данные и вывод\n\n### fest:set\n\nОбъявить внутреннюю переменную\n\n```xml\n<fest:set name=\"name\">John</fest:set>\n```\n\n```xml\n<fest:set name=\"full_name\">\n <fest:get name=\"name\"/><fest:space/>F. Kennedy\n</fest:set>\n```\n\nДля ```fest:set``` можно использовать атрибут ```test```. Операция выполнится, если его значение (js-выражение) истинно.\n\n```xml\n<fest:set name=\"name\" test=\"false\">should not be set</fest:set>\n```\n\nВнутри ```fest:set``` доступен контекст ```params```, передаваемый через ```fest:get```.\n\n```xml\n<fest:set name=\"line\">\n Hello,<fest:space/><fest:value>params.username</fest:value>\n</fest:set>\n<fest:get name=\"line\">{username: \"John\"}</fest:get>\n```\n\n### fest:get\n\nПолучить переменную, объявленную через ```fest:set```\n\n```xml\n<fest:get name=\"name\"/>\n```\n\n```xml\n<fest:get name=\"name\">{'some': 'data'}</fest:get>\n```\n\nЧерез `fest:param` можно передавать в блок XML-данные:\n```xml\n<fest:get name=\"page\">\n\t<fest:param name=\"doctype\">html</fest:param>\n\t<fest:params>\n\t\t{\n\t\t\ttitle: json.title\n\t\t}\n\t</fest:params>\n\t<fest:param name=\"content\">\n\t\t<article>\n\t\t\t<fest:if test=\"json.title\">\n\t\t\t\t<h1><fest:value>json.title</fest:value></h1>\n\t\t\t</fest:if>\n\t\t</article>\n\t</fest:param>\n</fest:get>\n<fest:set name=\"page\">\n\t<fest:doctype><fest:value>params.doctype</fest:value></fest:doctype>\n\t<title><fest:value>params.title</fest:value></title>\n\t<body>\n\t\t<fest:value output=\"text\">params.content</fest:value>\n\t</body>\n</fest:set>\n```\n\nЕсли указать тег select, то выражение внутри выполнится и результирующая строка будет именем блока set.\n```xml\n<fest:script>\n var name = 'foo'\n</fest:srcipt>\n<fest:get select=\"name\"/>\n<fest:set name=\"foo\">foo</fest:set>\n<fest:set name=\"bar\">bar</fest:set>\n```\n\n### fest:element\n\nВывод ноды с переменным именем\n\n```xml\n<fest:script>\n var variable = 'table';\n</fest:script>\n<fest:element select=\"variable\">\n fest code\n</fest:element>\n<fest:element select=\"variable2\">\n fest code\n</fest:element>\n```\n\nВыведет\n\n```xml\n<table>fest code</table><div>fest code</div>\n```\n\n### fest:attributes, fest:attribute\n\nДобавить атрибуты к родительскому тегу. Все ```fest:attribute``` должны быть внутри блока ```fest:attributes```, который должен быть первым внутри тега.\n\n```xml\n<a>\n <fest:attributes>\n <fest:attribute name=\"href\"><fest:value>json.href</fest:value></fest:attribute>\n </fest:attributes>\n Some link\n</a>\n```\n\nБыстрый способ вставить значение в атрибут\n\n```xml\n<a href=\"{json.href}\">Some link</a>\n```\n\n### fest:value\n\nВывести значение js-выражения\n\n```xml\n<fest:value>json.value</fest:value>\n<fest:value output=\"text\"><![CDATA[\"<script/>\"]]></fest:value>\n<fest:value output=\"js\">'\"'</fest:value>\n```\n\n### fest:var\n\nУстановить js-переменную\n\n```xml\n<fest:var name=\"question\">Ultimate Question of Life, The Universe, and Everything</fest:value>\n<fest:value>question</fest:value>\n<fest:var name=\"answer\" select=\"question.length - 13\" />\n<fest:value>answer</fest:value>\n```\n\n### fest:text\n\nВывод неформатированного текста\n\n```xml\n<fest:text>\"Bla bla bla\"</fest:text>\n```\n\n### fest:space\n\nПробел\n\n\n## Управляющие конструкции\n\n### fest:each\n\nИтерация по объекту\n\n```xml\n<fest:script>var obj = {\"foo\": \"bar\"}</fest:script>\n<fest:each iterate=\"obj\" index=\"i\">\n <fest:value>i</fest:value>=<fest:value>obj[i]</fest:value>\n</fest:each>\n<fest:each iterate=\"obj\" index=\"i\" value=\"v\">\n <fest:value>i</fest:value>=<fest:value>v</fest:value>\n</fest:each>\n```\n\n### fest:for\n\nИтерация по массиву или по числовому ряду\n\n```xml\n<fest:script>json.items = ['a', 'b', 'c']</fest:script>\n<fest:for iterate=\"json.items\" index=\"i\">\n <fest:value>json.items[i]</fest:value>\n</fest:for>\n<fest:for iterate=\"json.items\" index=\"i\" value=\"v\">\n <fest:value>v</fest:value>\n</fest:for>\n<fest:for from=\"1\" to=\"5\" index=\"i\">\n <fest:value>i</fest:value>\n</fest:for>\n```\n\n### fest:if\n\nУсловный оператор\n\n```xml\n<fest:if test=\"true\">\n true\n</fest:if>\n```\n\n### fest:choose, fest:when, fest:otherwise\n\nВетвление. Если ни один ```fest:when``` не выполнен, будет выбрана ветвь ```fest:otherwise```.\n\n```xml\n<fest:choose>\n <fest:when test=\"1\">\n <fest:text>one</fest:text>\n </fest:when>\n\n <fest:when test=\"2\">\n <fest:text>two</fest:text>\n </fest:when>\n\n <fest:otherwise>\n <fest:text>More than 2</fest:text>\n </fest:otherwise>\n</fest:choose>\n```\n\n## Остальное\n\n### fest:cdata\n\nБлок CDATA\n\n```xml\n<script>\n <fest:cdata>\n <![CDATA[alert (\"2\" < 3);]]>\n </fest:cdata>\n</script>\n```\n\n### fest:comment\n\nHTML комментарий\n\n```xml\n<fest:comment>comment</fest:comment>\n```\n\n### fest:doctype\n\nОбъявление doctype страницы\n\n```xml\n<fest:doctype>html</fest:doctype>\n```\n\n### fest:script\n\nВыполнить javascript\n\n```xml\n<fest:script>\n <![CDATA[\n json.script = 2 < 3;\n ]]>\n</fest:script>\n```\n\n```xml\n<fest:script src=\"script.js\"/>\n```\n\n### fest:include\n\nВставить содержимое другого шаблона с заданным контекстом.\n\n```xml\n<fest:script>json.list = ['a', 'b', 'c'];</fest:script>\n<fest:include context=\"json.list\" src=\"./include_foreach.xml\"/>\n```\n\n### fest:insert\n\nВставить файл напрямую в шаблон\n\n```xml\n<style type=\"text/css\">\n <fest:insert src=\"style.css\"/>\n<style>\n```\n\n# Примеры\n\n## Установка\n\n```\nnpm install fest\n```\n\n## Как использовать\n\ncompile():\n\n```javascript\nvar fest = require('fest');\n\nvar data = {name: 'Jack \"The Ripper\"'},\n template = './templates/basic.xml';\n\nvar compiled = fest.compile(template, {beautify: false}),\n template = (new Function('return ' + compiled))();\n\nconsole.log(template(data));\n```\n\nrender():\n\n```javascript\nvar fest = require('fest');\n\nvar data = {name: 'Jack \"The Ripper\"'},\n template = './templates/basic.xml';\n\nconsole.log(fest.render(template, data, {beautify: false}));\n```\n\n\nbasic.xml\n\n```xml\n<?xml version=\"1.0\"?>\n<fest:template xmlns:fest=\"http://fest.mail.ru\" context_name=\"json\">\n <h1>Hello,<fest:space/><fest:value output=\"text\">json.name</fest:value></h1>\n\n <!-- По умолчанию все значения fest:value экранируются -->\n <!--\n Необходимо использовать fest:space или\n fest:text для явного указания строк с пробелами\n -->\n</fest:template>\n```\n\nРезультат\n\n```html\n<h1>Hello, Jack \"The Ripper\"</h1>\n```\n\n## Вложенные шаблоны\n\nДанные на вход\n\n```javascript\nvar data = {\n people: [\n {name: 'John', age: 20},\n {name: 'Mary', age: 21},\n {name: 'Gary', age: 55}\n ],\n\n append: '>>'\n}\n```\n\nforeach.xml (основной шаблон)\n\n```xml\n<?xml version=\"1.0\"?>\n<fest:template xmlns:fest=\"http://fest.mail.ru\" context_name=\"json\">\n\n <!-- Контекст можно передавать во вложенные шаблоны -->\n <fest:include context_name=\"json\" src=\"./person.xml\"/>\n\n <!-- Значением iterate может быть любое js-выражение -->\n <fest:for iterate=\"json.people.reverse()\" index=\"i\">\n\n <!-- Передаваемые значения будут доступны в контексте params -->\n <fest:get name=\"person\">json.people[i]</fest:get>\n </fest:for>\n</fest:template>\n```\n\nperson.xml\n\n```xml\n<?xml version=\"1.0\"?>\n<fest:template xmlns:fest=\"http://fest.mail.ru\" context_name=\"json\">\n\n <!--\n Используем set для объявления переменной,\n которую используем в родительском шаблоне\n -->\n <fest:set name=\"person\">\n <p>\n <fest:script><![CDATA[\n var first = params.name[0],\n other = params.name.slice(1);\n ]]></fest:script>\n\n <fest:value>json.append</fest:value>\n <strong>\n <fest:value>first</fest:value>\n </strong>\n <fest:value>other</fest:value>\n </p>\n </fest:set>\n</fest:template>\n```\n\nРезультат\n\n```html\n<p>>><strong>G</strong>ary</p>\n<p>>><strong>M</strong>ary</p>\n<p>>><strong>J</strong>ohn</p>\n```\n\n## Использование set и get\n\n```xml\n<?xml version=\"1.0\"?>\n<fest:template xmlns:fest=\"http://fest.mail.ru\" context_name=\"json\">\n <fest:set name=\"host\">http://e.mail.ru</fest:set>\n <fest:set name=\"all\">msglist</fest:set>\n <fest:set name=\"new\">sentmsg?compose</fest:set>\n\n <fest:set name=\"all_link\">\n <fest:get name=\"host\"/>/<fest:get name=\"all\"/>\n </fest:set>\n\n <fest:set name=\"new_link\">\n <fest:get name=\"host\"/>/<fest:get name=\"new\"/>\n </fest:set>\n\n <ul>\n <!-- fest:attribute добавляет параметр к родительскому тегу -->\n\n <li><a>\n <fest:attributes>\n <fest:attribute name=\"href\"><fest:get name=\"all_link\"/></fest:attribute>\n </fest:attributes>\n Все сообщения\n </a></li>\n\n <li><a>\n <fest:attributes>\n <fest:attribute name=\"href\"><fest:get name=\"new_link\"/></fest:attribute>\n </fest:attributes>\n Написать письмо\n </a></li>\n </ul>\n</fest:template>\n```\n\nРезультат\n\n```html\n<ul>\n <li><a href=\"http://e.mail.ru/msglist\">Все сообщения</a></li>\n <li><a href=\"http://e.mail.ru/sentmsg?compose\">Написать письмо</a></li>\n</ul>\n```\n## Интернационализация\n\n### fest:plural\n\nПо умолчанию доступна поддержка плюрализации для русского и английского языка. В параметрах `fest.compile` можно передать любую другую функцию плюрализации.\n\n```xml\n<fest:plural select=\"json.n\">один рубль|%s рубля|%s рублей</fest:plural>\n```\nИли англоязычный вариант:\n\n```xml\n<fest:plural select=\"json.n\">one ruble|%s rubles</fest:plural>\n```\n\nЧтобы вывести символ “%” внутри тега `fest:plural` используйте “%%”:\n\n```xml\n<fest:plural select=\"json.n\">…1%%…|…%s%%…|…%s%%…</fest:plural>\n```\n\n### fest:message и fest:msg\n\nПозволяет указать границы фразы для перевода и контекст для снятия многозначности. Например,\n\n```xml\n<fest:message context=\"растение\">Лук</fest:message>\n<fest:message context=\"оружие\">Лук</fest:message>\n```\n\nДля каждого `fest:message`, `fest:msg`, обычного текста, заключенного между XML тегами (опция `auto_message`), или текстового значения некоторых атрибутов компилятор вызывает функцию `events.message` (если такая была указана в параметрах). Данный механизм используется в `fest-build` утилите для построения оригинального PO-файла.\n\nПример вызова `fest-build` для создания PO-файла:\n\n```\n$ fest-build --dir=fest --po=ru_RU.po --compile.auto_message=true\n```\n\nПример компиляции локализованных шаблонов:\n\n```\n$ fest-build --dir=fest --translate=en_US.po\n```\n", | ||
"readme": "# Fest [](https://travis-ci.org/eprev/fest)\n\n## Данные и вывод\n\n### fest:set\n\nОбъявить внутреннюю переменную\n\n```xml\n<fest:set name=\"name\">John</fest:set>\n```\n\n```xml\n<fest:set name=\"full_name\">\n <fest:get name=\"name\"/><fest:space/>F. Kennedy\n</fest:set>\n```\n\nДля ```fest:set``` можно использовать атрибут ```test```. Операция выполнится, если его значение (js-выражение) истинно.\n\n```xml\n<fest:set name=\"name\" test=\"false\">should not be set</fest:set>\n```\n\nВнутри ```fest:set``` доступен контекст ```params```, передаваемый через ```fest:get```.\n\n```xml\n<fest:set name=\"line\">\n Hello,<fest:space/><fest:value>params.username</fest:value>\n</fest:set>\n<fest:get name=\"line\">{username: \"John\"}</fest:get>\n```\n\n### fest:get\n\nПолучить переменную, объявленную через ```fest:set```\n\n```xml\n<fest:get name=\"name\"/>\n```\n\n```xml\n<fest:get name=\"name\">{'some': 'data'}</fest:get>\n```\n\nЧерез `fest:param` можно передавать в блок XML-данные:\n```xml\n<fest:get name=\"page\">\n\t<fest:param name=\"doctype\">html</fest:param>\n\t<fest:params>\n\t\t{\n\t\t\ttitle: json.title\n\t\t}\n\t</fest:params>\n\t<fest:param name=\"content\">\n\t\t<article>\n\t\t\t<fest:if test=\"json.title\">\n\t\t\t\t<h1><fest:value>json.title</fest:value></h1>\n\t\t\t</fest:if>\n\t\t</article>\n\t</fest:param>\n</fest:get>\n<fest:set name=\"page\">\n\t<fest:doctype><fest:value>params.doctype</fest:value></fest:doctype>\n\t<title><fest:value>params.title</fest:value></title>\n\t<body>\n\t\t<fest:value output=\"text\">params.content</fest:value>\n\t</body>\n</fest:set>\n```\n\nЕсли указать тег select, то выражение внутри выполнится и результирующая строка будет именем блока set.\n```xml\n<fest:script>\n var name = 'foo'\n</fest:srcipt>\n<fest:get select=\"name\"/>\n<fest:set name=\"foo\">foo</fest:set>\n<fest:set name=\"bar\">bar</fest:set>\n```\n\n### fest:element\n\nВывод ноды с переменным именем\n\n```xml\n<fest:script>\n var variable = 'table';\n</fest:script>\n<fest:element select=\"variable\">\n fest code\n</fest:element>\n<fest:element select=\"variable2\">\n fest code\n</fest:element>\n```\n\nВыведет\n\n```xml\n<table>fest code</table><div>fest code</div>\n```\n\n### fest:attributes, fest:attribute\n\nДобавить атрибуты к родительскому тегу. Все ```fest:attribute``` должны быть внутри блока ```fest:attributes```, который должен быть первым внутри тега.\n\n```xml\n<a>\n <fest:attributes>\n <fest:attribute name=\"href\"><fest:value>json.href</fest:value></fest:attribute>\n </fest:attributes>\n Some link\n</a>\n```\n\nБыстрый способ вставить значение в атрибут\n\n```xml\n<a href=\"{json.href}\">Some link</a>\n```\n\n### fest:value\n\nВывести значение js-выражения\n\n```xml\n<fest:value>json.value</fest:value>\n<fest:value output=\"text\"><![CDATA[\"<script/>\"]]></fest:value>\n<fest:value output=\"js\">'\"'</fest:value>\n```\n\n### fest:var\n\nУстановить js-переменную\n\n```xml\n<fest:var name=\"question\">Ultimate Question of Life, The Universe, and Everything</fest:value>\n<fest:value>question</fest:value>\n<fest:var name=\"answer\" select=\"question.length - 13\" />\n<fest:value>answer</fest:value>\n```\n\n### fest:text\n\nВывод неформатированного текста\n\n```xml\n<fest:text>\"Bla bla bla\"</fest:text>\n```\n\n### fest:space\n\nПробел\n\n\n## Управляющие конструкции\n\n### fest:each\n\nИтерация по объекту\n\n```xml\n<fest:script>var obj = {\"foo\": \"bar\"}</fest:script>\n<fest:each iterate=\"obj\" index=\"i\">\n <fest:value>i</fest:value>=<fest:value>obj[i]</fest:value>\n</fest:each>\n<fest:each iterate=\"obj\" index=\"i\" value=\"v\">\n <fest:value>i</fest:value>=<fest:value>v</fest:value>\n</fest:each>\n```\n\n### fest:for\n\nИтерация по массиву или по числовому ряду\n\n```xml\n<fest:script>json.items = ['a', 'b', 'c']</fest:script>\n<fest:for iterate=\"json.items\" index=\"i\">\n <fest:value>json.items[i]</fest:value>\n</fest:for>\n<fest:for iterate=\"json.items\" index=\"i\" value=\"v\">\n <fest:value>v</fest:value>\n</fest:for>\n<fest:for from=\"1\" to=\"5\" index=\"i\">\n <fest:value>i</fest:value>\n</fest:for>\n```\n\n### fest:if\n\nУсловный оператор\n\n```xml\n<fest:if test=\"true\">\n true\n</fest:if>\n```\n\n### fest:choose, fest:when, fest:otherwise\n\nВетвление. Если ни один ```fest:when``` не выполнен, будет выбрана ветвь ```fest:otherwise```.\n\n```xml\n<fest:choose>\n <fest:when test=\"1\">\n <fest:text>one</fest:text>\n </fest:when>\n\n <fest:when test=\"2\">\n <fest:text>two</fest:text>\n </fest:when>\n\n <fest:otherwise>\n <fest:text>More than 2</fest:text>\n </fest:otherwise>\n</fest:choose>\n```\n\n## Остальное\n\n### fest:cdata\n\nБлок CDATA\n\n```xml\n<script>\n <fest:cdata>\n <![CDATA[alert (\"2\" < 3);]]>\n </fest:cdata>\n</script>\n```\n\n### fest:comment\n\nHTML комментарий\n\n```xml\n<fest:comment>comment</fest:comment>\n```\n\n### fest:doctype\n\nОбъявление doctype страницы\n\n```xml\n<fest:doctype>html</fest:doctype>\n```\n\n### fest:script\n\nВыполнить javascript\n\n```xml\n<fest:script>\n <![CDATA[\n json.script = 2 < 3;\n ]]>\n</fest:script>\n```\n\n```xml\n<fest:script src=\"script.js\"/>\n```\n\n### fest:include\n\nВставить содержимое другого шаблона с заданным контекстом.\n\n```xml\n<fest:script>json.list = ['a', 'b', 'c'];</fest:script>\n<fest:include context=\"json.list\" src=\"./include_foreach.xml\"/>\n```\n\n### fest:insert\n\nВставить файл напрямую в шаблон\n\n```xml\n<style type=\"text/css\">\n <fest:insert src=\"style.css\"/>\n<style>\n```\n\n# Примеры\n\n## Установка\n\n```\nnpm install fest\n```\n\n## Как использовать\n\ncompile():\n\n```javascript\nvar fest = require('fest');\n\nvar data = {name: 'Jack \"The Ripper\"'},\n template = './templates/basic.xml';\n\nvar compiled = fest.compile(template, {beautify: false}),\n template = (new Function('return ' + compiled))();\n\nconsole.log(template(data));\n```\n\nrender():\n\n```javascript\nvar fest = require('fest');\n\nvar data = {name: 'Jack \"The Ripper\"'},\n template = './templates/basic.xml';\n\nconsole.log(fest.render(template, data, {beautify: false}));\n```\n\n\nbasic.xml\n\n```xml\n<?xml version=\"1.0\"?>\n<fest:template xmlns:fest=\"http://fest.mail.ru\" context_name=\"json\">\n <h1>Hello,<fest:space/><fest:value output=\"text\">json.name</fest:value></h1>\n\n <!-- По умолчанию все значения fest:value экранируются -->\n <!--\n Необходимо использовать fest:space или\n fest:text для явного указания строк с пробелами\n -->\n</fest:template>\n```\n\nРезультат\n\n```html\n<h1>Hello, Jack \"The Ripper\"</h1>\n```\n\n## Вложенные шаблоны\n\nДанные на вход\n\n```javascript\nvar data = {\n people: [\n {name: 'John', age: 20},\n {name: 'Mary', age: 21},\n {name: 'Gary', age: 55}\n ],\n\n append: '>>'\n}\n```\n\nforeach.xml (основной шаблон)\n\n```xml\n<?xml version=\"1.0\"?>\n<fest:template xmlns:fest=\"http://fest.mail.ru\" context_name=\"json\">\n\n <!-- Контекст можно передавать во вложенные шаблоны -->\n <fest:include context_name=\"json\" src=\"./person.xml\"/>\n\n <!-- Значением iterate может быть любое js-выражение -->\n <fest:for iterate=\"json.people.reverse()\" index=\"i\">\n\n <!-- Передаваемые значения будут доступны в контексте params -->\n <fest:get name=\"person\">json.people[i]</fest:get>\n </fest:for>\n</fest:template>\n```\n\nperson.xml\n\n```xml\n<?xml version=\"1.0\"?>\n<fest:template xmlns:fest=\"http://fest.mail.ru\" context_name=\"json\">\n\n <!--\n Используем set для объявления переменной,\n которую используем в родительском шаблоне\n -->\n <fest:set name=\"person\">\n <p>\n <fest:script><![CDATA[\n var first = params.name[0],\n other = params.name.slice(1);\n ]]></fest:script>\n\n <fest:value>json.append</fest:value>\n <strong>\n <fest:value>first</fest:value>\n </strong>\n <fest:value>other</fest:value>\n </p>\n </fest:set>\n</fest:template>\n```\n\nРезультат\n\n```html\n<p>>><strong>G</strong>ary</p>\n<p>>><strong>M</strong>ary</p>\n<p>>><strong>J</strong>ohn</p>\n```\n\n## Использование set и get\n\n```xml\n<?xml version=\"1.0\"?>\n<fest:template xmlns:fest=\"http://fest.mail.ru\" context_name=\"json\">\n <fest:set name=\"host\">http://e.mail.ru</fest:set>\n <fest:set name=\"all\">msglist</fest:set>\n <fest:set name=\"new\">sentmsg?compose</fest:set>\n\n <fest:set name=\"all_link\">\n <fest:get name=\"host\"/>/<fest:get name=\"all\"/>\n </fest:set>\n\n <fest:set name=\"new_link\">\n <fest:get name=\"host\"/>/<fest:get name=\"new\"/>\n </fest:set>\n\n <ul>\n <!-- fest:attribute добавляет параметр к родительскому тегу -->\n\n <li><a>\n <fest:attributes>\n <fest:attribute name=\"href\"><fest:get name=\"all_link\"/></fest:attribute>\n </fest:attributes>\n Все сообщения\n </a></li>\n\n <li><a>\n <fest:attributes>\n <fest:attribute name=\"href\"><fest:get name=\"new_link\"/></fest:attribute>\n </fest:attributes>\n Написать письмо\n </a></li>\n </ul>\n</fest:template>\n```\n\nРезультат\n\n```html\n<ul>\n <li><a href=\"http://e.mail.ru/msglist\">Все сообщения</a></li>\n <li><a href=\"http://e.mail.ru/sentmsg?compose\">Написать письмо</a></li>\n</ul>\n```\n## Интернационализация\n\n### fest:plural\n\nПо умолчанию доступна поддержка плюрализации для русского и английского языка. В параметрах `fest.compile` можно передать любую другую функцию плюрализации.\n\n```xml\n<fest:plural select=\"json.n\">один рубль|%s рубля|%s рублей</fest:plural>\n```\nИли англоязычный вариант:\n\n```xml\n<fest:plural select=\"json.n\">one ruble|%s rubles</fest:plural>\n```\n\nЧтобы вывести символ “%” внутри тега `fest:plural` используйте “%%”:\n\n```xml\n<fest:plural select=\"json.n\">…1%%…|…%s%%…|…%s%%…</fest:plural>\n```\n\n### fest:message и fest:msg\n\nПозволяет указать границы фразы для перевода и контекст для снятия многозначности. Например,\n\n```xml\n<fest:message context=\"растение\">Лук</fest:message>\n<fest:message context=\"оружие\">Лук</fest:message>\n```\n\nДля каждого `fest:message`, `fest:msg`, обычного текста, заключенного между XML тегами (опция `auto_message`), или текстового значения некоторых атрибутов компилятор вызывает функцию `events.message` (если такая была указана в параметрах). Данный механизм используется в `fest-build` утилите для построения оригинального PO-файла.\n\nПример вызова `fest-build` для создания PO-файла:\n\n```\n$ fest-build --dir=fest --po=ru_RU.po --compile.auto_message=true\n```\n\nПример компиляции локализованных шаблонов:\n\n```\n$ fest-build --dir=fest --translate=en_US.po\n```\n\n## Contribution\n\nНеобходимо установить [Grunt](http://gruntjs.com):\n\n```\n$ git clone git@github.com:mailru/fest.git\n$ cd fest\n$ sudo npm install -g grunt-cli\n$ npm install\n$ grunt\n```\n\nGrunt используется для валидации JS (тестов) и запуска тестов. Перед отправкой пулл-риквеста убедись, что успешно выполнены `git rebase master` и `grunt`.", | ||
"readmeFilename": "README.md", | ||
"_id": "fest@0.6.0", | ||
"_id": "fest@0.6.1", | ||
"dist": { | ||
"shasum": "a95770c7cd73d315710c5cbe5821c0dd94744bbb" | ||
"shasum": "f1ae10dcffb04e55a845a54b55a9a9c5944a2c27" | ||
}, | ||
"_from": "fest@0.6.0", | ||
"_resolved": "https://registry.npmjs.org/fest/-/fest-0.6.0.tgz" | ||
"_from": "fest@0.6.1", | ||
"_resolved": "https://registry.npmjs.org/fest/-/fest-0.6.1.tgz" | ||
} |
@@ -1,2 +0,2 @@ | ||
# Fest | ||
# Fest [](https://travis-ci.org/eprev/fest) | ||
@@ -499,1 +499,15 @@ ## Данные и вывод | ||
``` | ||
## Contribution | ||
Необходимо установить [Grunt](http://gruntjs.com): | ||
``` | ||
$ git clone git@github.com:mailru/fest.git | ||
$ cd fest | ||
$ sudo npm install -g grunt-cli | ||
$ npm install | ||
$ grunt | ||
``` | ||
Grunt используется для валидации JS (тестов) и запуска тестов. Перед отправкой пулл-риквеста убедись, что успешно выполнены `git rebase master` и `grunt`. |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Shell access
Supply chain riskThis module accesses the system shell. Accessing the system shell increases the risk of executing arbitrary code.
Found 1 instance in 1 package
512
11
11
243784
5
36
3616