Исходный код я смотреть не стал (ну что там смотреть, это же 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-backendBackend-а к JavaScript ещё нет, но его изготовление, с помощью, parenscript, представляется делом тривиальным.
"{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"
Сделано пока всё очень топорно и сыро, но общий каркас уже есть (который даже работает на тривиальных примерах). Работа представляется достаточно несложной, думаю, что итоговое решение вряд ли превысит 2000 строк кода (думаю, что будет реально меньше).
Исходный код можно посмотреть здесь: http://github.com/archimag/cl-closure-template
Приглашаются желающие поучаствовать в развитие проекта :)
Комментариев нет:
Отправить комментарий