parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Прошу совет по элегантному подходу к шаблонизации, и отдельно вопрос: удачно ли я решил применять в нем junction?

andylars 20.07.2015 19:52 / 20.07.2015 19:54

Подхожу к краеугольному камню - подхода к шаблонизации. Хочется простого, но элегантного и удобного.

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


Реализация в принципе простая: есть шаблоны/гриды, между разметкой которых есть именованные "слоты", которые содержать или просто значения: числа/строки, или вызов других гридов и|или код-на-парсере.

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

Наглядный пример:
@main[]
# ... 
^switch[$Url]{
  ^case[/;DEFAULT]{
     ^Tpl:MainGrid[
       $.Pagename[Main page]
     ]
  }
  ^case[/article]{
    ^Tpl:MainGrid[
       $.Pagename[Article]
       $.Content{^Tpl:Content_Article[]}
       $.Footer{ 
           ^Tpl:Footer[
               $.Year{ ^for[i](3;0){ ^eval(2015-$i) }[,]   }
           ]
       }
    ]
  }
}


@CLASS
Tpl

@MainGrid[_param][locals]
$_slot[
  $.Title[SiteName]
  $.Header{^Tpl:Header[$.Size[big] ]}
  $.Pagename[Undefined]
  $.Content{^Tpl:Content_Main[]}
  $.Footer[Copyright (c)]
]
^_slot.add[$_param]
<html>
<head><title>$_slot.Title</title></head>
<body>
  $_slot.Header
  <hr>
  <h3>$_slot.PageName</h3>
  $_slot.Content
  $_slot.Footer
</body>

@Header[_param][locals]
$_slot[
  $.Size[small]
]
^_slot.add[$_param]

^if($_slot.Size eq 'big'){
   <h1>BIG Header</h1>
}{
   <h2>Small Header</h2>
}

@Content_Main[]
<p>Main content</p>

@Content_Article[]
<p>Article content</p>

@Footer[_param][locals]
$_slot[
  $.Year[2015]
]
^_slot.add[$_param]

<i>$_slot.Year</i>