2009-04-28 10 views
17

szukam rozwiązanie, które pozwala mi pisać kodu macierzystego Emacs Lisp oraz w czasie kompilacji zamienia ją w HTML, jak Franz's htmlgen:Czy istnieje biblioteka Emacs Lisp do generowania kodu HTML?

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

Oczywiście mogę write my own macros, ale jestem zainteresowany, jeśli istnieje są jakieś projekty związane z tym problemem.

+0

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 ... –

+1

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. –

Odpowiedz

1

Tymczasem znalazłem some code że zawiera coś podobnego chcę. Teraz mogę napisać:

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

Realizacja ma kilka ograniczeń (np zakodowane listy element), ale wydaje się być dobrym punktem wyjścia.

1

Nie jest to dokładnie to, czego szukasz, ale jest 20-minutowy film, w którym facet tworzy prostą stronę internetową, używając UCW, szkieletu aplikacji UnCommon Web. Wszystko odbywa się w Emacsie używając sepl ...

Oto link do transcript (cały kod (~ 25 linii) jest dostępny na końcu transkrypcji).

+0

Dzięki, ale to naprawdę nie jest to, czego szukam. Mam istniejącą strukturę Elisp, która ma pewne możliwości generowania HTML - obecnie z mocno zakodowanymi ciągami HTML, które chciałbym zamienić. –

2

To może być punkt wyjścia: http://www.emacswiki.org/emacs/HtmlLite

+1

Dzięki, to też jest przydatne. Mój jedyny problem z tym, że zanieczyszcza przestrzeń nazw wieloma funkcjami zamiast używać makra. –

6

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.

+0

To świetnie, dzięki. Byłoby miło, gdyby ta funkcjonalność była częścią xml.el ;-) – Upgradingdave

1

Miałem podobny wymóg, aby móc parsować xml za pomocą funkcji xml-pars, przekształcać go, a następnie wyprowadzać z powrotem jako ciąg xml.

Rozwiązanie Treya prawie działało, z tym, że musiałem zachować białe elementy xml. Więc napisałem własną implementację tutaj:

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