2009-04-28 89 views
17

我正在寻找一个解决方案,让我写本地的Emacs Lisp代码,并在编译的时候把它变成HTML,像Franz's htmlgen是否有一个用于生成HTML的Emacs Lisp库?

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

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

+0

为什么你希望它成为的Emacs Lisp,一个过时的方言?您可以使用SLIME轻松地与Common Lisp进行交互,然后您可以使用htmlgen或yaclml或htout或LML(2)或CL-WHO或Scribble或... – 2009-04-28 12:36:52

+1

我使用用Emacs Lisp编写的框架,我希望用这个HTML生成功能扩展。它与Emacs紧密集成,这就是我寻找Elisp解决方案的原因。 – 2009-04-28 13:09:12

回答

1

同时,我发现some code包含类似于我想要的东西。现在我可以这样写:

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

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

1

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

这里是transcript的链接(所有代码(〜25行)都可以在成绩单结尾处找到)。

+0

谢谢,但那不是我正在寻找的。我有一个现有的Elisp框架,它有一些HTML生成工具 - 目前使用硬编码的HTML字符串,我想替换它。 – 2009-04-28 14:16:33

2

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

+1

谢谢,这也很有用。我唯一的问题就是它使用许多函数而不是使用宏来污染命名空间。 – 2009-04-29 07:00:09

6

当你found outxmlgen从列表结构生成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

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

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

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

相关问题