mailru / fest

javascript templates
Other
128 stars 28 forks source link

Добавить интерфейс масштабирования #65

Open monolithed opened 11 years ago

monolithed commented 11 years ago

Идея возникла в следствии того что периодически приходится писать что-то вроде:

<fest:script>
console.log(params);
</fest:script>

Лично мне было бы проще написать:

<fest:print data="params" />

или так:

__print(params);

Как оказалось, добавить новый тег и прочий сахар в текущей реализиции крайне проблематично для этого не предусмотрено никакого API.

Пример добавления нового тега с переменным количеством атрибутов:
fest.api('print', {
   data: function(params) {
      consoe.log(params);
  }
});
RubaXa commented 11 years ago

Да я уже давно об этом говорю и как понял Антон плотно этим занят. У себя я сделал так (идея запантетовона :])

<x:log data="..."/>
xtpl.tags({
    'log': {
        args: ['data'],
        expr: ['data'],
        code: function (args){
            return this.expr('console.log(@data);', args);
        }
    }
});

или вот например как реализуются теги <x:enter/> и <x:switch/case/default/>:

xtpl.tags({
    'enter': {
        'short': true,
        replace: '\n'
    },

    'switch': {
        args: ['select'],
        expr: ['select'],
        code: {
            open: function (args){
                return this.expr('switch(@select){', args);
            },
            close: '}'
        }
    },

    'case': {
        args: ['test'],
        expr: ['test'],
        parent: 'switch',
        code: {
            open: function (args){ return 'case '+args.test+':'; },
            close: 'break;'
        }
    },

    'default': {
        parent: 'switch',
        valid: function (node){
            if( node.parent.children[node.parent.index(node)+1] ){
                node.exception('must be lastChild');
            }
        },
        code: {
            open: 'default:',
            close: 'break;'
        }
    }
});