- Merge #259. Разрешить комментарии внутри объектов.
- Fixed #257. Ошибка в работе предиката с отрицательным числом.
-
Динамическое имя тега:
name = .name <{ name } class="foo"> "Hello" </> <{ .foo }><{ .bar }>Hello</></>
- Операторы
===
и!==
.
- Merged #250. Именованный docroot.
- Merged #249. Добавлена возможность передавать аргументы шаблона в методе run.
- Fixed #242.
- Fixed #243.
-
Fixed #234. Оказывается, проверка на
is_matchable
была, но, похоже, в процессе рефакторинга там опечатка случилась и она сломалась. Теперь вот такое будет падать при компиляции:match .foo[ /.bar ] { }
Вместо этого, нужно писать так:
match .foo[ !!/.bar ] { }
- Merged #235. Починена опция
--write-ast
.
-
Блок внутри массива может создавать несколько элементов массива, в том числе и разнородных:
[ for .item { { "foo": 42 } { "bar": 24 } 42 true() } ]
-
Флаг
--module-name
(#228):yate foo.yate --module-name "foo" yate /foo/bar.yate --module-name "/foo/bar.yate"
Если в модуле не задано имя директивой
module "foo"
, то сперва берется имя из этого параметра (если он есть), а если нет, то используется дефолтное значение"main"
. -
В методы
yate.parse()
,yate.compile()
,yate.run()
теперь вторым параметром передается список опций (в случае запуска из командной строк, он содержит параметры из разобранной командной строки):var js = yate.compile( 'foo.yate', { 'module-name': 'bar' } );
Внимание. У
yate.run
поменялась сигнатура (уyate.parse
иyate.compile
просто не было второго параметра, теперь он есть и опциональный). Для симметрии (ха-ха), опции передаются тоже вторым параметром, поэтому остальные параметры сдвинулись на один:// Было. yate.run = function(yate_filename, data, ext_filename, mode) { ... }; // Стало. yate.run = function(yate_filename, options, data, ext_filename, mode) { ... };
- Merged #227. Метод
yr.isRegistered(id)
.
-
В
runtime.js
повсюду использовалась конструкцияfoo instanceof Array
, которая не работает, например, когда шаблон исполняется в ноде через модульvm
т.к. данные и шаблон используют разныеArray
.Начиная с этой версии, в
runtime.js
используетсяArray.isArray(foo)
.Важно.
Array.isArray()
нет, например, в IE7 и IE8. Так что, если нужна подддержка этих (и других старых браузеров), нужно позаботиться о полифиле. Например, вот такой:if ( !Array.isArray ) { Array.isArray = function( a ) { return Object.prototype.toString.call( a ) === '[object Array]'; }; }
или даже (в браузере, если нет нескольких фреймов):
if ( !Array.isArray ) { Array.isArray = function( a ) { return ( a instanceof Array ); }; }
Я не стал добавлять это в
runtime.js
автоматически.
- Fixed #103. Аналог
current()
. - Fixed #163. Тернарный оператор.
- Merged #196. "Неймспейсы" в xml-атрибутах.
- Fixes #218.
- Fixed #170. Рекурсивные функции и hoisting. См. тесты
tests/function.[24, 25, 26, 28, 29].yate
. Могут сломаться юзерские функции, имя которых совпадает с одним из типов. Например,xml
.
- Пофикшен тест
tests/jpaths.22.yate
.simpleScalar
выдавалundefined
(вместо пустой строки), если по jpath'у ничего не было.
- Попытка пофиксить #198. Объекты и массивы в аргументах функции должны приводиться к нодесету, если так написано в сигнатуре функции.
- Fixes
tests/json.23.yate
.for
внутри массива должен вычислять свой тип по-другому. Так чтобы, например, можно было сгенерить массив объектов.
- Fixed
tests/jpaths.21.yate
. Ноль при приведении к скаляру должен давать'0'
, а не''
.
- Fixed #209. Глобальная переменная всегда вычисляется в глобальном контексте, а не в том контексте, где к ней впервые обратились.
- Fixed #202. Поддержка произвольных строк в jpath nametest.
- Merged #201. Какая-то поддержка вложенных массивов.
- Merged #199. parse-tools -> 0.0.17
- Временно возвращаем возможность использовать
include
внутри блоков, не на верхнем уровне файла.
- Ловили странный баг, добавляли логирование, потом все оторвали.
- В runtime'е вместо
s.toString()
используем'' + s
. Потенциально, это фиксит странный баг в Сафари.
- Fixed #195.
-
Меняем местами аргументы
subnode()
:subnode("foo", 42) subnode("foo", { "bar": 24 })
-
Функция
subnode
, которая делает примерно то же самое, что иdocument
, но не меняет контекст документа:apply subnode(42, "foo") bar = { "bar": 24 } apply subnode(bar, "foo")
В этих примерах будет создана нода с именем
"foo"
, подклеенная к текущему контексту. Т.е. примерно как:// Условно. this.foo = 42; apply .foo // Условно. this.foo = { bar: 24 }; apply .foo
У этой новой ноды родителем будет текущий контекст.
См. tests/json.22.yate.
- Fixed #188.
- Fixed #189.
- Правильные версии nommon и parse-tools.
- Fixed #179.
- Более-менее пофикшен #175.
- Частично пофикшен #181. См. тесты
spaces.*.yate
.
- Fixed #178.
- Fixed #172 (вроде бы).
- Fixed #171
-
Изменен синтаксис атрибутов с динамическим именем. Было:
@{ .name } = 42 @{ "data-{ .name }" } = 24
Стало:
@{ .name } = 42 @data-{ .name } = 24
Т.е. статические куски имени (строковые литералы) не нужно заключать в кавычки.