我正在尋找一個解決方案,讓我寫本地的Emacs Lisp代碼,並在編譯的時候把它變成HTML,像Franz's htmlgen:是否有一個用於生成HTML的Emacs Lisp庫?
(html
((:div class "post")
(:h1 "Title")
(:p "Hello, World!")))
當然可以write my own macros,但我很感興趣,如果有是圍繞這個問題的任何項目。
我正在尋找一個解決方案,讓我寫本地的Emacs Lisp代碼,並在編譯的時候把它變成HTML,像Franz's htmlgen:是否有一個用於生成HTML的Emacs Lisp庫?
(html
((:div class "post")
(:h1 "Title")
(:p "Hello, World!")))
當然可以write my own macros,但我很感興趣,如果有是圍繞這個問題的任何項目。
同時,我發現some code包含類似於我想要的東西。現在我可以這樣寫:
(views-with-html
((body)
(h1 "Title")
((p (class . "entry")) "Hello, World!")))
實現有一些限制(例如硬編碼的元素列表),但它似乎是一個很好的起點。
這不是你要找的東西,但是有一個20分鐘的視頻,一個人使用UCW這個UnCommon Web應用程序框架創建一個簡單的網站。這些都是在Emacs上使用lisp完成的...
這裏是transcript的鏈接(所有代碼(〜25行)都可以在成績單結尾處找到)。
謝謝,但那不是我正在尋找的。我有一個現有的Elisp框架,它有一些HTML生成工具 - 目前使用硬編碼的HTML字符串,我想替換它。 – 2009-04-28 14:16:33
謝謝,這也很有用。我唯一的問題就是它使用許多函數而不是使用宏來污染命名空間。 – 2009-04-29 07:00:09
當你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解析函數解析xml,進行轉換,然後將其作爲xml字符串輸出。
Trey的解決方案几乎可以工作,除了我需要保留空白xml元素。所以我在這裏寫我自己的實現:
爲什麼你希望它成爲的Emacs Lisp,一個過時的方言?您可以使用SLIME輕鬆地與Common Lisp進行交互,然後您可以使用htmlgen或yaclml或htout或LML(2)或CL-WHO或Scribble或... – 2009-04-28 12:36:52
我使用用Emacs Lisp編寫的框架,我希望用這個HTML生成功能擴展。它與Emacs緊密集成,這就是我尋找Elisp解決方案的原因。 – 2009-04-28 13:09:12