Картинка блога

Речь пойдет о StringTemplate 3.1 для C#, который я использовал для генерации веб страниц. Вообще, этот движок шаблонизации используется для разных целей — например, для генерации кода или SQL. Основным достоинством считается то, что библиотека переписана на разных языках — C#, Java, Python и т.д. Хоть о StringTemplate написано несколько больших страниц, документации все еще недостаточно. По этому, я решил сделать меленькое вступление и описать несколько граблей, встретившийся на моем пути.

Данное описание является чистым опытом автора и не может быть рассмотрено как пособие для обучения или перевод документации.

Простые переменные и вызов шаблонов

Я не стану описывать синтаксис переменных (все переменные находсятся между знаком «$») и возможность его переключения на теги (в зависимости от выбора TemplateLexer), все это собрано на одной CheatSheet странице. Перейдем сразу к примеру, содержание файла baseHtml.st в папке templates/super:

<html>
 <head>
 <title>MySite- $title$</title>
 </head>
 <body>
 <div>
 $menuTop()$
 $body$
 $menuBottom()$
 </div>
 </body>
</html>

Тут, вместо $body$, будет подставлено значение этой переменной. В случае объекта, можно получать параметры через точку. $menuBottom()$ — это вызов шаблона с одноименным названием. При этом, можно передавать именные параметры. В случае анонимной передачи параметра ($menuBottom($param$)$) — внутри шаблон к нему можно получить доступ с помощью ключевого слова $it$.

Наследование — аналог MasterPage

Для наследования я использую вспомогательный файл (templates/super/tplPost.st):


$htmlBase(
title={ $page.title$ }
,body={ $htmlPage()$ }
)$

Таким образом вызывается шаблон htmlBase с содержанием результата работы шаблона htmlPage вместо параметра body. И да, переменные можно объявлять в шаблоне. htmlPage — уж додумайте сами — главное тут помнить, что все переменные — глобальные, а значит $page$ доступен во всех шаблонах.

Создание файла на основе шаблона

И так, настало время все это запустить из C#. Думаю, вы уже скачали «StringTemplate.dll» и добавили его в зависимости проекта. Код следующий:

var skinGroup = new StringTemplateGroup(skin, TEMPLATES_URL);
var page = skinGroup.GetInstanceOf("tplPast.st");
page.SetAttribute("page", page); //предпологаем, что page это объект, как минимум с параметром - <strong>title</strong>
var file = File.CreateText(Path.Combine(outputFolder, name));
 try
 {
 file.Write(page);
 }
 catch (Exception ex)
 {
 throw ex;
 }
 finally
 {
 file.Close();
 }

Во второй части посмотрим на код C# внимательней.

Метки:, ,