Есть ли библиотека Emacs Lisp для генерации HTML?
Я ищу решение, которое позволяет мне написать собственный код Emacs Lisp и во время компиляции превращает его в HTML, например Franz htmlgen:
(html
((:div class "post")
(:h1 "Title")
(:p "Hello, World!")))
Конечно, я могу писать свои собственные макросы, но мне интересно, есть ли какие-либо проекты вокруг этой проблемы.
Ответы
Ответ 1
Между тем, я нашел некоторый код, который содержит нечто подобное, что я хочу. Теперь я могу написать:
(views-with-html
((body)
(h1 "Title")
((p (class . "entry")) "Hello, World!")))
Реализация имеет несколько ограничений (например, список жестко запрограммированных элементов), но, похоже, это хорошая отправная точка.
Ответ 2
Как вы узнали, xmlgen
генерирует XML из списка состав. То, что мне показалось неутешительным с пакетом `` xmlgen`, поддерживает тот формат, который не является обратным для анализатора xml Emacs.
Я добавил это к моей копии xmlgen:
;; this creates a routine to be the inverse of what xml-parse does
;;;###autoload
(defun xml-gen (form &optional in-elm level)
"Convert a sexp to xml:
'(p :class \"big\")) => \"<p class=\\\"big\\\" />\""
(let ((level (or level 0)))
(cond
((numberp form) (number-to-string form))
((stringp form) form)
((listp form)
(destructuring-bind (xml attrs) (xml-gen-extract-plist form)
(let ((el (car xml)))
(unless (symbolp el)
(error "Element must be a symbol (got '%S')." el))
(setq el (symbol-name el))
(concat "<" el (xml-gen-attr-to-string attrs)
(if (> (length xml) 1)
(concat ">" (mapconcat
(lambda (s) (xml-gen s el (1+ level)))
(cdr xml)
"")
"</" el ">")
"/>"))))))))
(defun xml-gen-attr-to-string (plist)
(reduce 'concat (mapcar (lambda (p) (concat " " (symbol-name (car p)) "=\"" (cdr p) "\"")) plist)))
(defun xml-gen-extract-plist (list)
(list (cons (car list) (let ((kids (xml-node-children list)))
(if (= 1 (length kids))
kids
(remove-if-not 'listp kids))))
(xml-node-attributes list)))
Примечание: для этого интерфейса есть xml-gen
(не xmlgen
, который является оригинальным синтаксическим разбором).
В этом интерфейсе выполняется следующее:
(string-equal (xml-gen (car (xml-parse-region <some-region-of-xml>)))
<some-region-of-xml>)
и
(equal (car (xml-parse-region (insert (xml-gen <some-xml-form>))))
<some-xml-form>)
Новый xml-gen
не пытается сохранить пробел вокруг того, что генерирует процедура xml-parse-region
.
Ответ 3
Это может быть отправной точкой: http://www.emacswiki.org/emacs/HtmlLite
Ответ 4
Это не совсем то, что вы ищете, но есть 20-минутное видео, где парень создает простой веб-сайт, используя UCW, инфраструктуру веб-приложений UnCommon. Все это сделано в Emacs с помощью lisp...
Вот ссылка на transcript (весь код (~ 25 строк) доступен в конце расшифровки).
Ответ 5
У меня было аналогичное требование, чтобы иметь возможность анализировать xml с помощью функций xml-parse, преобразовывать его и затем выводить обратно как строку xml.
Решение Trey почти сработало, за исключением того, что мне нужно было сохранить пробельные элементы xml. Поэтому я написал свою собственную реализацию здесь:
https://github.com/upgradingdave/xml-to-string