Это БЭМ-ориентированные хелперы над стандартным 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 }).