Po wygenerowaniu found out, xmlgen
generowany jest XML ze struktury listy. To, co znalazłem, rozczarowało pakiet `` xmlgen`, który obsługuje format, który nie jest odwrotny od Emacsa 'xml parser.
zrobiłem dodać to do mojej kopii 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)))
Uwaga: interfejs tego jest xml-gen
(nie xmlgen
który jest oryginalny parsowania).
Z tego interfejsu, co następuje posiada:
(string-equal (xml-gen (car (xml-parse-region <some-region-of-xml>)))
<some-region-of-xml>)
i
(equal (car (xml-parse-region (insert (xml-gen <some-xml-form>))))
<some-xml-form>)
Nowa xml-gen
nie starają się zachować odstępy wokół, że rutyna xml-parse-region
generuje.
Dlaczego chcesz go mieć w Emacs Lisp, przestarzały dialekcie? Możesz łatwo łączyć się z Common Lisp używając SLIME, a następnie możesz użyć htmlgen lub yaclml lub htout lub LML (2) lub CL-WHO lub Scribble lub ... –
Używam frameworka napisanego w Emacs Lisp, który chciałbym rozszerz z tą funkcją generującą HTML. Jest ściśle zintegrowany z Emacsem, dlatego szukam rozwiązania Elisp. –