За последние 24 часа нас посетил 18151 программист и 1662 робота. Сейчас ищут 1718 программистов ...

Мой простой шаблонизатор

Тема в разделе "Решения, алгоритмы", создана пользователем Awilum, 1 май 2011.

  1. Awilum

    Awilum Активный пользователь

    С нами с:
    15 ноя 2009
    Сообщения:
    325
    Симпатии:
    26
    Адрес:
    Earth
    Сначала хотел сделать такую фичу как у WP short-коды но пошел другим путем и почему бы не сделать php шаблоны.
    например: дизайнер пишет в шаблоне

    {if:$var > 10}
    message here...
    {end}

    шаблонизатор переведет в

    <?php if($var > 10) { ?>
    message here...
    <?php } ?>

    В реализации этот шаблонизатор прост(всего одно регулярное выражение).
    Можно добавлять свои шаблоны кодов.
    С назначением своим справляется. Или нет ?
    Хотелось бы услышать критику и предложения.

    Скачать можно тут
     
  2. Alex_pac

    Alex_pac Активный пользователь

    С нами с:
    11 апр 2011
    Сообщения:
    285
    Симпатии:
    1
    Адрес:
    Россия, Тольятти
  3. Awilum

    Awilum Активный пользователь

    С нами с:
    15 ноя 2009
    Сообщения:
    325
    Симпатии:
    26
    Адрес:
    Earth
    Что есть ? я там не нашел ничего общего с моим. У меня нету цели своим шаблонизатором переплюнуть чей то.
    Я юзал Smarty, RainTPL, XTemplate в различных проектах.
    Но тут в моей CMS мне нужно было 1) желательно не юзать чужую наработку(библиотеку) 2) что то простое, легкое и не сложное.
     
  4. Alex_pac

    Alex_pac Активный пользователь

    С нами с:
    11 апр 2011
    Сообщения:
    285
    Симпатии:
    1
    Адрес:
    Россия, Тольятти
    меня смущают скобки { }

    которые используются в любом javascript и css

    как в вашем шаблонизаторе решена эта проблема?
     
  5. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    IMHO, не удобно всё это. Направление кавычек меняется, логику всё равно приходится писать в шаблоне, знак $ остаётся, конструкция if-end (если-конец) совсем не интуитивно понятна, притом количество кода уменьшилось только на несколько символов. Тот же PHP, только наоборот.
     
  6. Alex_pac

    Alex_pac Активный пользователь

    С нами с:
    11 апр 2011
    Сообщения:
    285
    Симпатии:
    1
    Адрес:
    Россия, Тольятти
    я вижу смысл в этих шаблонизаторах только в автоматическом парсере

    коротких скобок в длинные

    <? $content; ?>

    преобразовывал бы в <?php echo $content ; ?>
     
  7. Awilum

    Awilum Активный пользователь

    С нами с:
    15 ноя 2009
    Сообщения:
    325
    Симпатии:
    26
    Адрес:
    Earth
    парсер затрагивает только те шаблоны что есть в массиве шаблонов $tcodes так что с этим кодом например:
    Код (Text):
    1.     <script>
    2.     $(function() {
    3.         $( "#accordion" ).accordion({});
    4.     });
    5.     </script>
    ничего не случится
     
  8. Awilum

    Awilum Активный пользователь

    С нами с:
    15 ноя 2009
    Сообщения:
    325
    Симпатии:
    26
    Адрес:
    Earth
    Логику отображение можно писать в шаблоне. Это есть (if,loop и пр.) в любом шаблонизаторе.

    дык. в каком шаблонизаторе его нету ?
     
  9. Alex_pac

    Alex_pac Активный пользователь

    С нами с:
    11 апр 2011
    Сообщения:
    285
    Симпатии:
    1
    Адрес:
    Россия, Тольятти
    Awilum

    мне идея нравится хотя я еще не совсем вник в ее.
    только вот что если заметить скобки { }

    на <% %> тогда они будут отображатся в Notepad++ как особые области и не смешиваться с кодом.

    [​IMG]
     
  10. titch

    titch Активный пользователь

    С нами с:
    18 дек 2010
    Сообщения:
    847
    Симпатии:
    0
    <% %> это теги ASP. они иногда разрешены для исполнения php-кода, потому считаю это плохой идеей
     
  11. Awilum

    Awilum Активный пользователь

    С нами с:
    15 ноя 2009
    Сообщения:
    325
    Симпатии:
    26
    Адрес:
    Earth
    хм в принципе можно сделать настраиваемые теги. ток тут не уверен пока на каких может сломаться регулярка

    сейчас проверил с такими тегами

    {cut:'hello':5}

    <%cut:'hello':5%>

    да можно заменить на <% %> - работает.


    p.s.
    дока потихоньку наполняется http://www.tcodes.template-cms.org/
     
  12. Alex_pac

    Alex_pac Активный пользователь

    С нами с:
    11 апр 2011
    Сообщения:
    285
    Симпатии:
    1
    Адрес:
    Россия, Тольятти
    titch
    а как asp связан с шаблоном?

    шаблон НИКОГДА не исполняется.
    Он берется как текст, проходит через фильтр и далее либо сохраняется в отдельный файл, либо выполняется на лету, и скобки какие они бы не были там уже отсутвуют вовсе.
     
  13. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Alex_pac, хм, иногда исполняется. Обрабатывается сначала, а потом пропускается через eval.
    Считаю это неправильным. Для того он и шаблон, чтобы его использовать, как шаблон. Если есть if-else, то это уже не язык разметки, а язык программирования. Но это только моё мнение, ты же спрашивал...
    В PHPLib Template, например (короткое описание http://kurilka.co.ua/archives/phplib-template/).
     
  14. Alex_pac

    Alex_pac Активный пользователь

    С нами с:
    11 апр 2011
    Сообщения:
    285
    Симпатии:
    1
    Адрес:
    Россия, Тольятти
    шаблон для php вообщето. поэтому наличие $ внутри шаблона вполне законно.
     
  15. Awilum

    Awilum Активный пользователь

    С нами с:
    15 ноя 2009
    Сообщения:
    325
    Симпатии:
    26
    Адрес:
    Earth
    TCode 1.0.1
    + Реорганизовал папки...
    + Добавил возможность задавать свой вид тега $tag_start тег $tag_end
    + Захостил на Битбакет
     
  16. Alex_pac

    Alex_pac Активный пользователь

    С нами с:
    11 апр 2011
    Сообщения:
    285
    Симпатии:
    1
    Адрес:
    Россия, Тольятти
    Awilum

    вы меня вдохновили и я написал ремейк на ваш шаблонизатор

    шаблонизатор
    template_sys.php
    PHP:
    1. <?php
    2.  
    3. # utf-8 document
    4. #template sys v 0.1
    5. # шаблонизатор версия 0.1
    6. # Alex_pac 2011 [email=alexpac26@yandex.ru]alexpac26@yandex.ru[/email]
    7. # free GNU modul php
    8.  
    9. class template { # static global class
    10.  
    11. static $mask = array (
    12.     # if:$expr
    13.     'if:(\([^;]+\))', '<?php if $1 { ?>', /**/ 'iU',
    14.     # else
    15.     'else','<?php } else { ?>', /**/ 'iU',
    16.     # elseif:$expr
    17.     'elseif:(\([^;]+\))', '<?php } elseif $1 { ?>', /**/ 'iU',
    18.     # endif
    19.     '(endif|end|endfor|endforeach)', '<?php } ?>', /**/ 'Ui',
    20.     # foreach:($var1 as $var2)
    21.     'foreach:(\([^;]+\))','<?php foreach $1 { ?>', /**/ 'iU',
    22.     # for:($i=0; $i<10; $i++)
    23.     'for:(\([^\)]+\))','<?php for $1 { ?>', /**/ 'iU',
    24.     # echo short
    25.     '(\$[^;]+)', '<?php echo $1; ?>', /**/ 'iU',
    26.     #echo:$conts
    27.     'echo:(\$[^;]+)', '<?php echo $1; ?>', /**/ 'iU',
    28.     #php:{ script }
    29.     'php:(.+)', '<?php $1 ?>', /**/ 'Usi',
    30.     #var:$conts = $value
    31.     'var:(\$[^;]+ ?= ?["]?.*["]?)', '<?php $1; ?>', /**/ 'iU',
    32.     #charset:utf-8
    33.     'charset:(.+)', '<?php header("Content-Type: text/html;charset=$1"); ?>', /**/ 'iU',
    34.     );
    35.    
    36. static $r1 = '/\<% ';
    37. static $r2 = ' %\>/';
    38.    
    39. static function convert_by_mask($text) {
    40.     $c = count(self::$mask);
    41.     for ($i=0; $i<$c; $i+=3) {
    42.         $text = preg_replace(self::$r1.self::$mask[$i].self::$r2.self::$mask[$i+2], self::$mask[$i+1], $text);
    43.     }
    44. }
    45.  
    46. static function export_temp ($file) { # экcпорт в файл
    47.     $FP=fopen($file.'.php',"w");
    48.     fwrite($FP,self::get_temp($file,false));
    49.     fclose($FP);
    50. }
    51.  
    52. static function get_temp($file, $eval=true) { # получение кода шаблона, при $eval = false не добавляет закрывающую скобку
    53.     $text = file_get_contents($file);
    54.     self::convert_by_mask(&$text);
    55.     if ($eval) {
    56.         return '?>'.$text;
    57.     }
    58.     return $text;
    59. }}
    60.  
    61. if (isset($__template)) {
    62.     eval (template::get_temp($__template));
    63.     die();
    64. }
    65.  
    66.  
    67.  
    68.  
    69.  
    шаблон
    sha.html
    HTML:
    1. <% charset:utf-8 %> <!--установка кодировки -->
    2. <% $title %>
    3. .exp { color: blue; background-color: #FFCCFA; }
    4. </head>
    5. <P class = "exp">проверка вывода статики (короткий echo) </P><P>
    6.  
    7. <% $content %>
    8.  
    9. <P class = "exp">проверка вывода статики (обычный echo) </P><P>
    10.  
    11. <% echo:$content %>
    12.  
    13. <P class = "exp">проверка объявления структуированной переменной </P><P>
    14.  
    15. <% var:$newp = "<font color=red>Новый параметр :: ".$content.", $title </font>" %>
    16. <% $newp %>
    17.  
    18. <P class = "exp">работа условий </P><P>
    19.  
    20. <% var:$rand = mt_rand(1,3) %>
    21. <% if:($rand == 1) %>
    22.     результат 1
    23. <% elseif:($rand == 2) %>
    24.     результат 2
    25. <% else %>
    26.     результат 3
    27. <% endIf %>
    28.  
    29. <P class = "exp">определяем случайный массив и выводим его </P><P>
    30.  
    31. <% for:($i=0; $i<7; $i++) %>
    32. <% var:$massive[$i*2] = mt_rand(1,20) %>
    33. <% endFor %>
    34.  
    35. <% foreach:($massive as $key => $value) %>
    36. <% $key %> : <% echo:$massive[$key] %> S ,
    37. <% echo:$key %> : <% $massive[$key] %> D ,
    38. <% endForeach %>
    39.  
    40. <P class = "exp">выполнение скрипта </P><P>
    41.  
    42. <% php:
    43.     print time();
    44.     for ($i=0; $i<10; $i++) {
    45.         echo 12;
    46.     }
    47. %>
    48. </body>
    49.  
    тестовый скрипт
    test.php
    PHP:
    1. <?php
    2.  
    3. include ('template_sys.php');
    4.  
    5. $title = 'переменная $title';
    6. $content = 'переменная $content';
    7.  
    8. $t = template::get_temp('sha.html');
    9.  
    10. //template::export_temp('sha.html'); экспорт шаблона в php файл
    11.  
    12. //print $t;
    13.  
    14. eval ($t); //выполнение шаблона
    15.  
    результат работы test.php

    [​IMG]

    скачать исходник

    http://webdrive.avtograd.ru/Download/Al ... my_sha.zip

    ******** дополнение

    наглядная демонстрация выделяющей окраски шаблона в редакторе Notepad++ благодаря <% %> псевдо ASP скобкам.

    [​IMG]
     
  17. titch

    titch Активный пользователь

    С нами с:
    18 дек 2010
    Сообщения:
    847
    Симпатии:
    0
    никогда не говори никогда. в таком шаблонизаторе он не исполняется, пока ты его используешь. как только до этого шаблона доберутся чужие руки, шаблон будет вести себя как обдолбанный мутант. в противоположность тому, есть шаблоны, к примеру, LJ. вот в них гарантировано ничего исполняться не будет.
     
  18. Alex_pac

    Alex_pac Активный пользователь

    С нами с:
    11 апр 2011
    Сообщения:
    285
    Симпатии:
    1
    Адрес:
    Россия, Тольятти
    чтобы там гарантировано ниче не исполнялось надо просто шаблону поставить расширение txt или tlp чтобы интерпретатор думал что это текст.
     
  19. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Мне больше всего понравился вот этот:
    http://www.php.ru/forum/viewtopic.php?p=201089#201089

    Можно пример, я не совсем понимаю что ты имеешь ввиду.

    Alex_pac
    У меня шаблоны хранятся в tpl и прекрасно запускаются.
     
  20. Awilum

    Awilum Активный пользователь

    С нами с:
    15 ноя 2009
    Сообщения:
    325
    Симпатии:
    26
    Адрес:
    Earth
  21. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    да хоть настоящий jpeg, все, что между дескрипторами <?php / <? и ?> будет выполнятся, если делать include или require или eval.
     
  22. guest2013

    guest2013 Активный пользователь

    С нами с:
    19 ноя 2007
    Сообщения:
    109
    Симпатии:
    0
    Ответьте блондину с голубыми глазами, почему передаете через указатель. Когда то туть шла дискусия, что по ссылкам быстрее бы было. Т.е.
    PHP:
    1.  
    2. <?
    3. $text = self::convert_by_mask($text);
    4.  
    Ну соответственно подправить функцию convert_by_mask.
     
  23. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    ???
    указатель и ссылка - одно и то же, &.
     
  24. Alex_pac

    Alex_pac Активный пользователь

    С нами с:
    11 апр 2011
    Сообщения:
    285
    Симпатии:
    1
    Адрес:
    Россия, Тольятти
    братуха, если ты используешь include это значит что ты php-кодер, а значит ты знаеш что ты делаешь и следовательно намеренно хочеш все испортить и запустить неоткомплимированный шаблон.
     
  25. Awilum

    Awilum Активный пользователь

    С нами с:
    15 ноя 2009
    Сообщения:
    325
    Симпатии:
    26
    Адрес:
    Earth
    можно вырезать php в шаблоне (<?php / <? и ?>)

    Код (Text):
    1. $template_code = preg_replace( array("/\<\?/","/\?\>/"), array("&lt;?","?&gt;"), $template_code );
    код не мой. не проверял, но должен работать..