Мета-шаблонизация



Мета-шаблонизация

0 0


pYatnitsa


On Github vkz / pYatnitsa

Мета-шаблонизация

конвертируем Bemhtml в Bh

Bemhtml

Bh

block input {
    tag: 'span'

    mix: { block: 'clearfix' }

    default: {
        this._attrs = this.ctx.attrs;
        delete this.ctx.attrs;
        applyNext();
    }

    content: {
        return {
            elem: 'control',
            tag: 'input',
            attrs: this._attrs
        }
    }
}
              
module.exports = function (bh) {
    bh.match('input', function (ctx, json) {
        ctx.tParam('_attrs', json.attrs);
        delete json.attrs;
        ctx.tag('span', true);
        ctx.mix([{ 'block': 'clearfix' }]
           .concat(ctx.mix()));
        ctx.content({
            'elem': 'control',
            'tag': 'input',
            'attrs': ctx.tParam('_attrs')
        }, true);
    });
};
              

(bem)-JSON

HTML

[
  {
    "block": "input",
    "attrs": {
      "value": "<script>alert('xss');</script>",
      "name": "text",
      "tabindex": 1,
      "type": "search",
      "autocomplete": "off",
      "maxlength": 400
      }
  }
]
<span class="input clearfix">
    <input
        class="input__control"
        value="<script>alert('xss');</script>"
        name="text" tabindex="1"
        type="search"
        autocomplete="off"
        maxlength="400"/>
</span>

Яндекс

Компиляция

tokenize < input |     parse     |    serialise

Компиляция

tokenize < input |     parse     |    serialise

Что могли бы использовать?

  • Вариации на тему Lex/Yacc (flex, bison)
  • Вариации на тему PEGs (Packrat parsers)
  • Parser Combinators
  • Parsing with derivatives

НавернЯка, много чего еще

или ... 

Выкатить свое

кастомное барахло

Ometa

  • ОО язык для pattern matching
  • один инструмент для всего
    • лексический анализ
    • парсинг
    • обход и модификация AST
    • кодогенерация 
  • расширяемый

нЯш

Ometa матчит

  • поток символов
  • структурные данные (массивы)

нЯш

Ometa умеет и позволяет

  • Наследовать и расширять существующие грамматики
  • Вызывать правила из внешних грамматик
  • Параметризовать правила
  • Определять правила более высокого порядка - "функционалы" над правилами
  • Матчиться на аргументы правил, как ML-языки
  • Выполнять семантические действия и предикаты на языке носителе
  • Писать правила на BNF-похожем синтаксисе
  • Писать правила с "левой рекурсией"
  • Пользоваться всеми возможностями языка носителя

Ometa

Знаю /regexp/ - готов к омете