我正在寻找一种解决方案,允许我编写本机 Emacs Lisp 代码并在编译时将其转换为 HTML,例如Franz 的 htmlgen:
(html
((:div class "post")
(:h1 "Title")
(:p "Hello, World!")))
当然我可以编写自己的宏,但是如果有任何项目围绕这个问题我很感兴趣。
我正在寻找一种解决方案,允许我编写本机 Emacs Lisp 代码并在编译时将其转换为 HTML,例如Franz 的 htmlgen:
(html
((:div class "post")
(:h1 "Title")
(:p "Hello, World!")))
当然我可以编写自己的宏,但是如果有任何项目围绕这个问题我很感兴趣。
如您所见,xmlgen
从列表结构生成 XML。令我失望的是 ``xmlgen` 包,它支持的格式与 Emacs 的xml 解析器并不完全相反。
我确实将此添加到我的 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
例程生成的空白。
这不是您要寻找的,但是有一个 20 分钟的视频,其中一个人使用 UCW(UnCommon Web 应用程序框架)创建了一个简单的网站。这一切都是在 Emacs 中使用 lisp 完成的......
这是一个成绩单的链接(所有代码(约 25 行)都在成绩单的末尾)。
同时,我发现了一些包含我想要的类似内容的代码。现在我可以写:
(views-with-html
((body)
(h1 "Title")
((p (class . "entry")) "Hello, World!")))
该实现有一些限制(例如硬编码元素列表),但它似乎是一个很好的起点。
我有一个类似的要求,能够使用 xml-parse 函数解析 xml,对其进行转换,然后将其作为 xml 字符串输出。
Trey 的解决方案几乎奏效了,只是我需要保留空白 xml 元素。所以我在这里写了自己的实现:
你考虑过yaclml吗?yaclml (Yet Another Common Lisp Markup Language) 是一个 HTML 生成器和 HTML 模板库。yaclml 用作 ucw Web 框架的 html 模板后端。 https://www.cliki.net/yaclml
它是常见的 lisp。不是省略。但, ...