html - 是否有用于生成 HTML 的 Emacs Lisp 库?

标签 html macros code-generation elisp

我正在寻找一种解决方案,它允许我编写原生 Emacs Lisp 代码并在编译时将其转换为 HTML,例如 Franz's htmlgen :

(html
 ((:div class "post")
  (:h1 "Title")
  (:p "Hello, World!")))

我当然可以write my own macros , 但我对是否有任何解决此问题的项目感兴趣。

最佳答案

如你found out , xmlgen从列表结构生成 XML。我确实对 ``xmlgen` 包感到失望,因为它支持的格式与 Emacs 的格式并不完全相反' xml parser .

我确实将它添加到我的 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)))

注意:这个的接口(interface)是xml-gen(不是原始解析的xmlgen)。

有了这个接口(interface),以下内容成立:

(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 例程生成的周围的空白。

关于html - 是否有用于生成 HTML 的 Emacs Lisp 库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/797442/

相关文章:

jquery - 如何调整文本以适应容器而不会溢出 :auto

html - 如何在移动和 PC 浏览器上为 iframe 视频提供不同的宽度和高度?

ios - 使iOS App具有与Excel Sheet相同的功能

vba - 在从 vba 创建的新工作簿中设置命名范围使它们成为本地范围而不是全局范围

html - Django:第 49 行无效的 block 标记: 'endfor',应为 'elif'、 'else' 或 'endif'。您是否忘记注册或加载此标签?

javascript - Dom 网格、固定内部的流体等等

macros - Racket - 使用宏实现 let* 函数

java - 如何使用 Java codeModel 为数组的特定索引赋值

code-generation - ANTLRWorks TestRig 编译时卡住

java - 在 IntelliJ 插件构建期间运行代码生成器