【问题标题】:Is there an Emacs Lisp library for generating HTML?是否有用于生成 HTML 的 Emacs Lisp 库?
【发布时间】:2010-10-22 07:09:22
【问题描述】:

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

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

我当然可以write my own macros,但是如果有任何解决这个问题的项目我很感兴趣。

【问题讨论】:

  • 您为什么希望它出现在 Emacs Lisp 中,这是一种过时的方言?您可以使用 SLIME 轻松与 Common Lisp 交互,然后您可以使用 htmlgen 或 yaclml 或 htout 或 LML(2) 或 CL-WHO 或 Scribble 或 ...
  • 我使用了一个用 Emacs Lisp 编写的框架,我想用这个 HTML 生成特性来扩展它。它与 Emacs 紧密集成,这就是我寻找 Elisp 解决方案的原因。

标签: html macros code-generation elisp


【解决方案1】:

当您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)))

注意:这个接口是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 例程生成的空格。

【讨论】:

  • 这太好了,谢谢。如果这个功能是 xml.el 的一部分就好了 ;-)
【解决方案2】:

这可能是一个起点:http://www.emacswiki.org/emacs/HtmlLite

【讨论】:

  • 谢谢,这也很有用。我唯一的问题是它用许多函数而不是使用宏来污染命名空间。
【解决方案3】:

这不是您想要的,但是有一个 20 分钟的视频,其中一个人使用 UCW(UnCommon Web 应用程序框架)创建了一个简单的网站。这一切都是在 Emacs 中使用 lisp 完成的......

这里是transcript 的链接(所有代码(约 25 行)都在成绩单的末尾)。

【讨论】:

  • 谢谢,但这真的不是我想要的。我有一个现有的 Elisp 框架,它有一些 HTML 生成工具——目前我想替换硬编码的 HTML 字符串。
【解决方案4】:

同时,我发现 some code 包含我想要的类似内容。现在我可以写了:

(views-with-html
 ((body)
  (h1 "Title")
  ((p (class . "entry")) "Hello, World!")))

该实现有一些限制(例如硬编码元素列表),但它似乎是一个很好的起点。

【讨论】:

    【解决方案5】:

    我有一个类似的要求,即能够使用 xml-parse 函数解析 xml,对其进行转换,然后将其作为 xml 字符串输出回来。

    Trey 的解决方案几乎奏效了,只是我需要保留空白 xml 元素。所以我在这里写了自己的实现:

    https://github.com/upgradingdave/xml-to-string

    【讨论】:

      【解决方案6】:

      你考虑过yaclml吗? yaclml (Yet Another Common Lisp Markup Language) 是一个 HTML 生成器和 HTML 模板库。 yaclml 用作 ucw Web 框架的 html 模板后端。 https://www.cliki.net/yaclml

      这是普通的lisp。不是省略。但是,...

      【讨论】:

      • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多