2009-04-28 92 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

相關問題