Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Концепт шаблонизатора ;) 
:(
    Опции темы
ksnk
Дата 6.10.2010, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



для начала - зачем оно нужно? 

Старый мой шаблонизатор перестал меня удовлетворять  smile Так что подыскивается какой-нибудь претендент. 
Смарти , как правило, раза в 2-4 превосходит по объему весь комплект скриптов, который мне, обычно, нужно ставить клиенту. Так что смарти отпадает и по причине своего большого объема. 
Возникли несколько задач, для которых генерация данных на клиенской машине JavaScript'ом более эффективна, чем отправка отрендеренных данных с сервера. Однако существующие шаблоны вывода данных не могут быть эффективно откомпилированы в javaScript и  их приходится дублировать. Так что код шаблона, по возможности, не должен содержать в себе php функций
По этому условию отпадают всякие нативные шаблонизаторы, в которых php вставлен во все места.

Данными для шаблона должны быть "сырые", практически никак не обработанные данные. Разве что склейка разных данных в масив для передачи параметром в шаблонизатор и отрезание явно ненужных данных для пущей оптимизации. На этом этапе отваливаются все "шаблонизаторы без логики", в которых логику приходится вытаскивать на этап подготовки данных.

Что хочется? Готовое решение было бы приятно, но, вероятно, недостижимо. :( Однако, хочется понять какой шаблонизатор даст наиболее компактную, и при этом наиболее понятную запись на своем языке шаблонов для задачи вывода таблицы "через-строчку", причем первая, четная, нечетная и последняя строчки выводятся РАЗНЫМИ html тегами. Разными в том смысле, что обычными плясками с классами-атрибутами не обойтись. Подключать javascript для форматирования - неспортивно. На этой задаче, imho, проиграют всякие атрибутивные шаблонизаторы, типа PHPTAL'а, по сравнению с тем-же Смарти. Так что логика Смарти, imho, предпочтительнее.

-- 
Хочется продумать систему тегов шаблонизатора.
Сейчас, вот, постепенно получается что-то такое
Цитата

Язык шаблонизатора

Язык представляет собой `текст`, который перемежается “тегами шаблонизатора”. 
Данные для шаблона представляют собой один ассоциативный массив. Каждый элемент этого массива может в свою очередь быть массивом и обрабатываться в соответствии с логикой шаблона. Таким образом данные представляют собой некое “дерево”, для которого можно определить “текущий” узел. При старте процедуры шаблона, “текущим узлом” будет сам массив. Некоторые теги позволяют двигаться по дереву данных вглубь и обратно.

Ссылки на элементы дерева данных могут встречаться в управляющих конструкциях и параметрах фильтров явных операторов. Ссылка обозначается как имя элемента в `` косых одинарных кавычках (a la MySql).

тег явной вставки данных

Тег представляет собой имя поля текущего узла данных, взятое в фигурные скобки. в зависимости от логики шаблона. можно дополнить поле значением по умолчанию и фильтрами вывода.
{NAME} - поле текущего узла данных с именем NAME будет вставлено вместо этого тега
пример: <title> hello {user}</title>
{NAME|DEFAULT} - поле текущего узла данных с именем NAME будет вставлено вместо этого тега. Если поле NAME пусто, будет вставлено значение DEFAULT
пример: <title> hello {user|неизвестный юзер}</title>

{NAME[>>filter1[::par1[::par2[...]]]][>>filter2[::par1[::par2[...]]]]...[|DEFAULT]} - общий вид тега. Вставить вместо этого тега результат обработки данных функциями filter1,filter2,... с параметрами par1, par2,... Функции будут вызываться последовательно. Если поле NAME отсутствует - будет вставлено значение по умолчанию.
пример: <input type=”text” value=”{user>>html}”> - вставка данных в поле input с гарантией, что в поле не будут встречаться невалидные символы. ( html_special_chars )
пример: <div title=”{user>>strip}”> - вставка данных в поле input с гарантией, что в поле не будут встречаться html теги ( strip_tags ) 
пример: {name>>tpl::admin::input_form} - вставка в текст формы ввода данных из шаблона admin:input_form, сделать при этом  узел с имнем name новым текущим узлом.
Управляющие теги

В управляющих тегах могут встречаться функции и операторы выбранного языка программирования. Также, в качестве операндов могут встречаться конструкции `NAME` - элемент текущей ветки данных, с именем NAME. При порождении функции на ЯП, вместо такой конструкции будет вставлена ссылка на соответствующий элемент. Общий синтаксис управляющих тегов - две открывающие фигурные скобки, возможные пробельные символы, управляющее слово, однозначно определяющее тег, дополнительные параметры тега, возможные пробельные символы,  две закрывающие фигурные скобки. 

{{ if CONDITION }}..
[{{elseif CONDITION}} ...]
[{{ else }}... ]
{{endif}} - логическая конструкция. В текст будет вставлена первая ветка, для которой удовлетворяется CONDITION, либо ветка ELSE, если все условия ложны.
пример: Good {{if time(`date`)<12*60*60*1000}} morning{{elseif time(`date`)<20*60*60*1000}} day {{ else}} evening {{ endif }}, commander.
{{ for ELEMENT[ from START][to FINISH] }}..
{{endfor}} - циклическая конструкция. Для каждого элемента массива ELEMENT, будет обработана часть шаблона между граничными тегами. При этом текущий узел дерева данных смещается в ELEMENT. Если указано значение START - начальное значение будет им, если нет - от первого элемента массива. FINISH - цикл будет продолжаться до этого значения или до последнего элемента. Внутри шаблона будет действовать псевдоэлемент _index - индекс элемента, который будет изменяться от START до FINISH, псевдоэлементы _start и _finish - индексы первого и последнего элементов массива. 
пример: {{ for USER }} Имя:{name}<br>Звание:{military}<br>Дата призыва:{date>>date::H:i:s}<hr> {{endfor}}

{{= SENTENCE}} - вывод результат выполнения. Если в качестве выражения используется `NAME`, то конструкция эквивалентна {NAME}

{{sub NAME}} ... {{endsub [NAME]}} - описание подшаблона с именем NAME.

Хочется понять, этого достаточно для нормальной жизни или я что-то упустил и  обязательно понадобится что-то еще?
кстати, на этом языке задача решается примерно так
Код

<table>
{{for `rows` }}
{{if `_index`==`_first` }}
    <tr><td colspan=2><img src="{img}"><td><td>{data}</td></tr>
{{elseif `_index`==`_last` }}
    <tr><td colspan=2><img src="{img}"><td><td>{data}</td></tr>
{{elseif odd(`_index`) }}
    <tr><td>{data}</td><td>{descr}</td><td><img src="{img}"></td></tr>
{{else}}
    <tr><td><img src="{img}"><td>{data}</td><td>{descr}</td></td></tr>
{{endif }}
{{ endfor }}
</table>


Это сообщение отредактировал(а) ksnk - 6.10.2010, 11:53


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Muerto
Дата 6.10.2010, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1207
Регистрация: 23.9.2006

Репутация: 3
Всего: 4



У  меня конечно сервер vmware со смарти есть, но увы рыться в нем нет сейчас не желания не время...

У меня есть шаблонизатор, но в Php.
Я на самом деле не понимаю зачем ещё один уровень абстракции над кодом чтоли...
Вот к примеру смарти берет, перегоняет шаблон в Php и дальше с php работает...

А у вас больше ресурсов жрать будет если в Php не перегонять  smile 

Я шаблонизаторов такого рода 
Код

HELLO {king}
 не строил

Стало любопытно как оно делается... сразу пришла в голову eval...


Код

function  r_prep(&$content){
$find_arr=array( '{', '}' );
$rep_arr=array( '{$', '}' );
$content=str_replace($find_arr, $rep_arr, $content);
}

function  r_render($content){

}

$a=<<<TEXT
HELLO {king}
TEXT;

$king="David";

r_prep($a);

eval( 'echo "' . $a . '";' );



Дальше не стал в пустую конечно время тратить и придумывать велосипед, но вот к примеру а как с if быть?

Это сообщение отредактировал(а) Muerto - 6.10.2010, 19:22


--------------------
user posted image
PM MAIL   Вверх
ksnk
Дата 6.10.2010, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Muerto, Этот шаблонизатор будет порождать php код, примерно как и смарти, но без излишних телодвижений и дополнительных тегов, так что скоростные характеристики будут на нормальном уровне. Сейчас пока больше интересует определение языка описания шаблона. Хочется не потерять при этом возможность транслировать шаблон в другие языки, javascript, например. 

Ну а конструкция 
Код

HELLO {king}
, находящаяся, к примеру, в файле main.tpl
будет преобразована в файл tpl_main.php с таким содержимым
Код

class tpl_main extends _tpl_base {
   function _(&$par){
     return 'HELLO '.(isset($par['king']?$par['king']:'') ;
   }
}
 Случай немного вырожденный, обычно у меня в файле несколько подшаблонов, каждый из который занимает отдельную функцию в классе, так что класс получается довольно наполненный.

собственно рендеринг данных по шаблону будет делаться примерно так
Код

echo smart_template('tpl_main',array('king'=>'Arthur'));



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
SneG0K
Дата 6.10.2010, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Max Mara
***


Профиль
Группа: Завсегдатай
Сообщений: 1887
Регистрация: 1.12.2007
Где: Wis Dells

Репутация: 7
Всего: 54



ksnk, то есть если я правильно понял, ты хочешь написать новый язык шаблонизаторов, а интерпретатор будет кросс-платформенным (в данном случае в роли платформ будет выступать PHP, JS)?
PM WWW Skype   Вверх
ksnk
Дата 6.10.2010, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



SneG0K, сам шаблонизатор будет написан на php. В нормальном режиме сам шаблонизатор просто подгрузит недостающие классы и вызовет нужный метод нужного класса. Однако, при необходимости (время создания шаблонов поменялось) он перетранслирует изменившиеся файлы. Некоторые шаблоны (видимо их будет удобнее задавать просто списком) будут также оттранслированы в отдельный javascript файл, для использование на клиентской стороне.

Да, в принципе, получается новый язык. Хотя такой способ записи операторов встречается во многих местах. просто хочется зафиксировать минимальный набор конструкций и переписать имеющиеся шаблоны на новый язык. Oбидно будет, если где-то на половине работы выяснится какая-то идеологическая дыра ;) 


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
cutwater
Дата 6.10.2010, 21:36 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 592
Регистрация: 24.6.2008

Репутация: 1
Всего: 10



ksnk, если говорить о синтаксисе языка шаблонизатора, обратите внимание на такие решения как Jinja2 (python-шаблонизатор) или ERB (шаблонизатор Ruby On Rails).

Добавлено @ 21:42
Цитата

Что хочется? Готовое решение было бы приятно, но, вероятно, недостижимо. :( Однако, хочется понять какой шаблонизатор даст наиболее компактную, и при этом наиболее понятную запись на своем языке шаблонов для задачи вывода таблицы "через-строчку", причем первая, четная, нечетная и последняя строчки выводятся РАЗНЫМИ html тегами.


Пример того как это реализовано в той же Jinja2
http://jinja.pocoo.org/2/documentation/templates#for

Хочу сказать что обилие шаблонизаторов не ограничевается одним лишь Smarty, для php видел с подобным сиснтаксисом, наследованием шаблонов. Но насколько они допилены до вменяемого состояния судить не берусь. Вообще нахожу Jinja2 весьма интересным и удобным инструментом. Было бы неплохо, чтобы и в php реализовали что-то подобное.

Цитата(Muerto @  6.10.2010,  18:20 Найти цитируемый пост)
Стало любопытно как оно делается... сразу пришла в голову eval...

 
eval это же моветон и не спортивно совсем.

Точней в итоге конечно все сводится к выполнению шаблона, но все равно одной простой замены недостаточно. Таки шаблон необходимо парсить.

Это сообщение отредактировал(а) cutwater - 6.10.2010, 21:44


--------------------
user posted image
PM MAIL   Вверх
ksnk
Дата 7.10.2010, 00:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(cutwater @  6.10.2010,  21:36 Найти цитируемый пост)
...внимание на такие решения как Jinja2...

Да, как пример синтаксических конструкций - очень полезно. Некоторые вещи надо срисовать. Однако, на мой взгляд, там много и ненужных мне вещей. Я примерно ориентируюсь на перспективу переписывания уже существующих моих шаблонов и примерно представляю что получится. Правда тут следует сделать оговорку, что в моем случае использовалось что-то, что начиналось как "шаблоны без логики", затем он начал обрастать логикой, но изначально заложенные ограничения сильно мешали жить. Так что мне, возможно, только кажется, что хватит небольшой функциональности шаблонизатора   smile

Добавлено через 4 минуты и 42 секунды
шаблонизатор для ruby, к сожалению, сильно далек синтаксисом от моего и заточен для Руби. Так что, видимо, пока отложу...


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
skyboy
Дата 7.10.2010, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



ksnktwig пробовал? 
PM MAIL   Вверх
enoff
Дата 7.10.2010, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 297
Регистрация: 30.6.2010
Где: Санкт-Петербург

Репутация: 11
Всего: 13



постоянно не хватает {for}<li>...</li>{else}нет ничего.{/for}
PM MAIL ICQ Skype GTalk   Вверх
ksnk
Дата 7.10.2010, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(skyboy @  7.10.2010,  10:32 Найти цитируемый пост)
ksnk, twig пробовал?  

Посмотрел. Это Django-template порт на PHP. Пока отпугивает размер в 400к самого дистрибутива и 300к после выкидывания примеров... Размером Смарти подобен  smile 

Накопал еще один порт этого движка - h2o. Пока ковыряю его. Из минусов - обнаружил, что он хранит откомпилированные шаблоны в сериализованных данных в файле. Если удасться уговорить его сохранять результат в PHP, то просто очень приличное решение получится. На первый взгляд - довольно удобный, компактный шаблонизатор с очень приличными возможностями. Размером в +50к скриптов в боевой поставке - немного, вообще говоря.

Хотя никто из них не хочет транслироваться куда-то еще, так что придется писать и самому  smile 




--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
NewDima
Дата 8.10.2010, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

Репутация: 10
Всего: 12



ksnk, ну как там с уговорами? Интересно же, к чему приводят ковыряния.
PM ICQ   Вверх
ksnk
Дата 8.10.2010, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



NewDima, пока остается желание писать свое - пишу свое smile Синтаксис, преимущественно, будет взят из Jinja2 по ссылке cutwater. Oн немного более разумен, imho, чем родной Django'вский. 
h2o пока отложен, так как простого и понятного средства получить "исполняемый" скрипт не придумалось.

Ксати, "кроссплатформенность" предполагается получать с помощью трансляции шаблона по шаблонам, которые создаются самим шаблонизатором  Что-то вроде раскрутки юникса от С. smile . Для php - один шаблон, для Js - другой. Правда первый шаблон придется компилировать вручную, да и описания возможных операций для разных языков тоже как-то отдельно придется вводить...
 
В общем - в выходные должен получится хоть как-то работающий прототип. Дальше буду смотреть уже на него, уродец получился или пусть поживет .  



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
ksnk
Дата 15.10.2010, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Продолжу описание концепта...

-- за основу синтаксиса взят синтаксис Jinja2. По ссылкам выше можно найти документацию по нему. Сейчас реализованы некоторые базовые теги, механизм отработки фильтров, тестов. 
Необходимость реализации  макросов пока представляется сомнительной. 

шаблонизатор логически разбивается на 2 слабосвязанные части
-- система рендеринга - рендеринг данных по готовым "шаблонам". 
Состоит из базового класса шаблонов с описанием некоторых нестандартных фильтров и тестов.
Код

/**
 * 
 * Базовый класс исполнительного движка шаблонизатора.
 * содержит описания нестандартных фильтров и тестов
 * Фильтры обязаны иметь первым параметром данные для фильтрации
 *
 */
class tpl_base {
/**
 * фильтр join. Нестандартен только по тому, что в implode перевернуты параметры 
 * @param array $pieces
 * @param string $glue
 */
    function filter_join($pieces,$glue ) {
        return implode($glue,$pieces);
    }
/**
 * фильтр default - вывод значения по умолчанию, при пустом параметре
 * @param $par
 * @param $def 
 */
    function filter_default($par,$def ) {
        return empty($par)?$def:$par;
    }
}


оттранслированные шаблоны
Код

<?php
/**
 * this file is created automatically at "15 Oct 2010 9:25". 
 */

class tpl_test1 extends tpl_base {
function __construct(){
}
function _callblock(&$par){
$result='';
$x=(isset($par['name'])?$par['name']:"");     
if( $x ) {
$result.='$this->_';
$result.=$x;
$result.='($par)';
};     
return $result;
}

function _ (&$par){
$result='';
$result.=$this->_callblock($par);
$result.='        ';
foreach(array(1,2,3,4,5,6,7,8,9) as $item){
$result.=$item;
};     
return $result;
}

}

код не форматирован и пока не оптимизирован. 

Функция рендеринга, которая вызывает нужный метод 
Код

/**
 * Рендеринг данных по шаблону
 * @param string $idx имя подшаблона для рендеринга
 * @param array $par - данные для ренденига
 * @param string $tpl_class - имя шаблона.
 */
function _template($idx='',$par=null,$tpl_class=null) {
    static $tpl_compiler;
        
    if(!is_null($tpl_class) || empty($tpl_compiler)) {
        $tpl_compiler='tpl_'.pps($tpl_class,'compiler');
        if(!class_exists($tpl_compiler)){ 
            // попытка включить файл
            include_once TEMPLATE_PATH..DIRECTORY_SEPARATOR.$tpl_compiler.'.php';
        };        
        $tpl_compiler=new $tpl_compiler();
    }    
        
    if (!is_null($par)){
        if (method_exists($tpl_compiler,'_'.$idx))
            return call_user_func (array($tpl_compiler,'_'.$idx),$par);
        else 
            printf('have no template "%s:%s"','tpl_compiler','_'.$idx);
    }
    return '';
}

Функция просто вызывает нужный метод из нужных шаблонов, подставляя туда данные.

-- компилятор шаблонов - компилятор с Jinja2 в удобную для шаблонизатора систему скриптов на php.
по такому шаблону получен код, приведенный выше
Код

##{% extends "test.html" %} 
        
{%- block callblock -%}
    {% set x=name %}
    {%- if x -%}
       $this->_{{x}}($par) 
    {%- endif -%}
{% endblock %}
{% for item in [1,2,3,4,5,6,7,8,9] -%}
    {{ item }}
{%- endfor %}

-- "удобная для шаблонизатора система скриптов" задается комплектом скриптов на Jinja2, которая транслируется компилятором шаблонов. Получаемые скрипты рендеринга (внутренний рендеринг) используются для компиляции "боевых" шаблонов.

Вот такой Jinja2 скрипт сейчас используется для получения "внутренних" шаблонов. 
Код

####################################################################
## 
##  файл шаблонов для шаблонизатора 
##
####################################################################

####################################################################
## class
##
{%- block class -%}
<?php
/**
 * this file is created automatically at "{{ now('d M Y G:i') }}". 
 */
{%  if extends %}
include_once TEMPLATE_PATH.DIRECTORY_SEPARATOR.'tpl_{{extends}}.php';
{% endif %}

class tpl_{{name}} extends tpl_{{extends |default('base') }} {
function __construct(){
{%if import-%}
require_once ('tpl_{{import}}.php');
${{import}}=new tpl_{{import}}();
{%-endif%}
}
{% for func in data %} 
{{ func }}

{% endfor %} 
}
{% endblock %}

####################################################################
##  представление тега SET
##
{%- block set %}{{id}}={{res}}{%- endblock %}

####################################################################
## представление тега FOR 
##
{%- block for -%}
foreach({{in}} as {{index}}){
{{body}}
}
{%- endblock %}

####################################################################
## представление тега блок в функции 
##
{%- block callblock -%}
    {% set x=name %}
    {%- if x -%}
       $this->_{{x}}($par) 
    {%- endif -%}
{% endblock %}

####################################################################
## представление тега блок 
##
{%- block block -%}
{% if name %}
function _{{name}}(&$par){
$result='';
{% endif %}        
{% for blk in data%}
{%if blk.string %}{%if blk.string!="''" %}
$result.={{ blk.string }};
{%endif %}{% else %}
{{ blk.data}};     
{%endif %}
{%- endfor %}
{% if name %}
return $result;
}
{% endif %}    
{%- endblock -%}

####################################################################
## представление тега IF  
##
{%- block if -%}
{%set loop_index=1 %}
{%set loop_last=length(data) %}
{% for  d in data %}
{% if loop_index==1 -%}
if( {{d.if}} ) {
{{d.then}}
}
{%- elif d.if or (loop_index!=loop_last) %}
 elseif( {{d.if}} ) {
{{d.then}}
}
{%- else %}
 else {
{{d.then}}
}
{%- endif %}    
{% set loop_index=loop_index+1 %}
{% endfor %}
{%- endblock -%}



Сейчас нужно вытащить все завязки на генерацию PHP конструкций из  компилятора в этот скрипт и появится возможность написать "внутренний" шаблон для javaScript'а


Это сообщение отредактировал(а) ksnk - 15.10.2010, 10:00


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
ksnk
Дата 24.10.2010, 01:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Вот, что-то получилось. Пока - в стадии "deep beta", однако кое-что уже работает и мне, в принципе, для замены моего шаблонизатора, уже хватает. Исходников написалось аж на 50к, если определить все недостающие теги и нужные фильтры-функции, вполне способен дорасти до 100. Компилирует достаточно шустро, хотя использовать его для online трансляции я бы не стал.
В Javascript пока не транслирует, пока нужно определится с php-трансляцией и понять как можно тестировать javascript код с помощью simpletest...

В архиве - комплект файлов. в каталоге sample - простой пример использования и пара шаблонов.

А вообще - хотелось бы узнать - компилирующий шаблонизатор с Jinja2 синтаксисом еще кому-нибудь нужен?  smile 

Если нужен, то как его назвать? Пока рабочее название Jinja4php. Довольно корявое, imho...

Какие функции в шаблонизаторе необходимы в первую очередь?



Это сообщение отредактировал(а) ksnk - 24.10.2010, 01:27

Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  Jinja4PHP.rar 29,39 Kb


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
NLspieler
Дата 24.10.2010, 08:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 619
Регистрация: 13.10.2008
Где: Берлин

Репутация: 16
Всего: 19



Если нужен шаблонизатор, напиши себе свой шаблонизатор.
Мне вот нужен был, я взял и написал.
Теперь с удовольсьвием его использую.

Шаблонизатор получился не большим, всего 12 килобайт (с русскими комментариями).
Я его как раз заточил под такие случии: 
Цитата

причем первая, четная, нечетная и последняя строчки выводятся РАЗНЫМИ html тегами

В шаблонах даже комментарии можно писать.


PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1034 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.