Czy istnieje Biblioteka Emacs Lisp do generowania HTML?

Szukam rozwiązania, które pozwoli mi pisać natywny kod Emacs Lisp i w czasie kompilacji zamienia go w HTML, jak Franz ' s htmlgen :

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

Oczywiście mogę pisać własne makra , ale interesuje mnie, czy są jakieś projekty wokół tego problemu.

Author: Török Gábor, 2009-04-28

5 answers

Jak się dowiedziałaś , xmlgen generuje XML ze struktury listy. To, co uznałem za rozczarowujące z pakietem "xmlgen", który obsługuje format, nie jest zupełnie odwrotnością parsera XML Emacsa .

Dodałem 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 do tego jest xml-gen (nie xmlgen, który jest oryginalnym parsowaniem).

Z tym interfejsem:

(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>)

The nowa xml-gen nie stara się zachować białych znaków wokół, które generuje xml-parse-region.

 6
Author: Trey Jackson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:08

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

 2
Author: js.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-28 14:09:48

To nie jest to, czego szukasz, ale jest 20-minutowy film, w którym facet tworzy prostą stronę internetową za pomocą UCW, rzadkiego frameworka aplikacji internetowych. Wszystko odbywa się w Emacsie przy użyciu Lispa...

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

 1
Author: Trey Jackson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-28 14:01:05

Tymczasem znalazłem jakiś kod , który zawiera coś podobnego, czego chcę. Teraz mogę napisać:

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

Implementacja ma kilka ograniczeń (np. hard-coded element list), ale wydaje się być dobrym punktem wyjścia.

 1
Author: Török Gábor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-29 06:58:09

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

Rozwiązanie Trey ' a prawie działało, z wyjątkiem tego, że musiałem zachować elementy XML z białymi spacjami. Więc napisałem własną implementację tutaj:

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

 1
Author: Upgradingdave,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-08 15:00:57