понедельник, 9 ноября 2009 г.

Closure Template для Common Lisp

Недавно компания Google открыла исходный код системы Closure Template которая позволяет использовать общий набор шаблонов как с Java, так и с JavaScript. Так получилось, что как раз в этот момент я был озабочен поиском приемлемой системы шаблонов и больше всего меня интересовала возможность использования как на стороне сервера, так и в коде на JavaScript. Я рассмотрел ряд вариантов, но мне ничего не нравилось, а почему-то, такая простая мысль, как генерация javascript-кода на стороне сервера мне в голову никак не приходила (ну может и приходила, но казалась слишком ресурсоёмкой). И тут появляется эта Closure Template.

Исходный код я смотреть не стал (ну что там смотреть, это же Java, раздуто неимоверно, как всегда), вместо этого просмотрел документацию и понял, что это достаточно просто реализовать. И примерно за 8 часов накидал общий каркас решения. Для разбора всего шаблона использую ту же схему, что и для парсинга dokuwiki-страниц (используемую на lisper.ru). Для разбора выражений (типа "$x + $y") взял код из AIMA (http://aima.cs.berkeley.edu/lisp/logic/algorithms/infix.lisp), правда, его надо ещё дотачивать. В данный момент уже могу обрабатывать шаблон "helloName" (из официальных примеров), типа:
CL-USER> (closure-template:translate-template :common-lisp-backend
"{namespace soy.examples.simple} {template hello-name}Hello {$name}{/template}")
(PROGN
(DEFUN SOY.EXAMPLES.SIMPLE:HELLO-NAME (CLOSURE-TEMPLATE::DATA)
(LET ((CLOSURE-TEMPLATE::*TEMPLATE-DATA* CLOSURE-TEMPLATE::DATA))
(WITH-OUTPUT-TO-STRING (CLOSURE-TEMPLATE::*TEMPLATE-OUTPUT*)
(PROGN
(CLOSURE-TEMPLATE::WRITE-TEMPLATE-STRING "Hello ")
(CLOSURE-TEMPLATE::WRITE-TEMPLATE-STRING
(GETF CLOSURE-TEMPLATE::*TEMPLATE-DATA* :NAME)))))))
Либо можно сразу скомпилировать:
CL-USER> (closure-template:compile-template :common-lisp-backend
"{namespace soy.examples.simple} {template hello-name}Hello {$name}{/template}")
SOY.EXAMPLES.SIMPLE:HELLO-NAME
CL-USER> (soy.examples.simple:hello-name '(:name "Andrey"))
"Hello Andrey"
Backend-а к JavaScript ещё нет, но его изготовление, с помощью, parenscript, представляется делом тривиальным.

Сделано пока всё очень топорно и сыро, но общий каркас уже есть (который даже работает на тривиальных примерах). Работа представляется достаточно несложной, думаю, что итоговое решение вряд ли превысит 2000 строк кода (думаю, что будет реально меньше).

Исходный код можно посмотреть здесь: http://github.com/archimag/cl-closure-template

Приглашаются желающие поучаствовать в развитие проекта :)

Комментариев нет:

Отправить комментарий