Это БЭМ-ориентированные хелперы над стандартным XJST-синтаксисом. Сюда входит:
- синтаксический сахар для подпредикатов про БЭМ предметную область
- возможность писать вложенные шаблоны
- синтаксический сахар для
applyпо какой-то mode (apply(this._mode = 'bla')) - ключевое слово
applyCtx(синтаксический сахар дляapplyNext(this.ctx = { some: 'new' }))
В старом синтаксисе шаблон состоит из перечисления подпредикатов через запятую и тела после двоеточия:
block link, tag, this.ctx.url: 'a'Есть такие типы подпредикатов: кастомные, про матчинг на входной BEMJSON и про моду (генерация результата).
Прийдётся ввести ключевое слово для кастомных подпредикатов -- match -- оно ведёт себя так же (почти, об этом ниже) как и template в XJST:
match(this.block === 'link', this._mode === 'tag', this.ctx.url)('a')А ещё можно написать так (цепочкой вызовов):
match(this.block === 'link').match(this._mode === 'tag').match(this.ctx.url)('a')Теперь для кастомных подпредикатов про БЭМ абсолютно логично пишется:
block('link').tag().match(this.ctx.url)('a')
block('link').mod('pseudo', 'yes').tag().match(this.ctx.url)('a')В старом синтаксисе можно писать шаблоны так:
block link {
tag: 'a'
attrs: { href: this.ctx.url }
}и это просто способ не повторять два раза под предикат на блок, в конечном счёте это два шаблона:
block link, tag: 'a'
block link, attrs: { href: this.ctx.url }Так можно группировать любые подпредикаты, в том числе кастомные:
this.block === 'link' {
this._mode === 'tag': 'a'
this._mode === 'attrs': { href: this.ctx.url }
}Предлагается иметь такой синтаксис:
block('link')(
tag()('a'),
attrs()({ href: this.ctx.url })
)Попутно мы получаем более красивую возможность вкладывать на один уровень тело и подшаблоны. То что раньше записывалось через подпредикат true:
this.ctx.url {
true: 'a'
mods not-link yes: 'span'
}можно написать:
match(this.ctx.url)(
'a',
mods('not-link', 'yes')('span')
)Вложенность естественным образом может быть любой глубины:
block('link')(
tag()('span'),
match(this.ctx.url)(
tag()('a'),
attrs()({ href: this.ctx.url })
)
)Сейчас вместо apply(this._mode = 'bla') можно написать просто apply('bla').
Благодаря возможности apply в XJST иметь произвольное количество аргументов для модификации контекста, мы можем иметь такой синтаксис: apply(this)('bla').
Вместо applyNext(this.ctx = { some: 'new' }) можно написать просто applyCtx({ some: 'new' }).
По аналогии с предыдущим пунктом, можно иметь: applyCtx(this)({ some: 'new' }).
Тут есть небольшой нюанс, т.к. в applyCtx можно также использовать модификацию контекста: applyCtx({ some: 'new' }, this.bla = 1).
Поскольку в новом синтаксисе для выражения модификации контекста используются объекты, прийдётся договориться, что первый параметр это всегда новый this.ctx: applyCtx(this)({ some: 'new' }, { bla: 1 }).