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

时间:2009-04-28 11:37:50

标签: html macros code-generation elisp

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

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

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

5 个答案:

答案 0 :(得分:6)

当您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例程生成的空白。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

以下是transcript的链接(所有代码(~25行)在成绩单的末尾都有。)

答案 3 :(得分:1)

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

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

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

答案 4 :(得分:1)

我有类似的要求,能够使用xml-parse函数解析xml,转换它,然后将其作为xml字符串输出。

Trey的解决方案几乎可以工作,除了我需要保留空白xml元素。所以我在这里编写了自己的实现:

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