2009-04-28 7 views
17

Busco una solución que me permite escribir código nativo Emacs Lisp y en tiempo de compilación convierte en HTML, como Franz's htmlgen:¿Existe una biblioteca Emacs Lisp para generar HTML?

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

Por supuesto que puedo write my own macros, pero estoy interesado si hay hay proyectos alrededor de este problema

+0

¿Por qué quiere que sea en Emacs Lisp, un dialecto anticuado? Puede interactuar fácilmente con Common Lisp usando SLIME, y luego puede usar htmlgen o yaclml o htout o LML (2) o CL-WHO o Scribble o ... –

+1

Uso un marco escrito en Emacs Lisp que me gustaría extender con esta característica de generación de HTML. Está estrechamente integrado con Emacs, por eso estoy buscando una solución Elisp. –

Respuesta

1

Mientras tanto, me encontré con some code que contiene algo similar que quiero. Ahora puedo escribir:

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

La aplicación tiene algunas limitaciones (por ejemplo, la lista del elemento modificable), pero parece ser un buen punto de partida.

1

Esto no es exactamente lo que estás buscando, pero hay un video de 20 minutos en el que un chico crea un sitio web simple usando UCW, el marco de aplicación web UnCommon. Todo se hace en Emacs usando lisp ...

Aquí hay un enlace al transcript (todo el código (~ 25 líneas) está disponible al final de la transcripción).

+0

Gracias, pero eso realmente no es lo que estoy buscando. Tengo un marco Elisp existente que tiene algunas instalaciones de generación de HTML, actualmente con cadenas de código HTML que me gustaría reemplazar. –

2

Esto podría ser un punto de partida: http://www.emacswiki.org/emacs/HtmlLite

+1

Gracias, esto también es útil. Mi único problema con eso es que contamina el espacio de nombres con muchas funciones en lugar de usar una macro. –

6

Como usted found out, xmlgen genera XML a partir de una estructura de lista. Lo que encontré decepcionante con el paquete `` xmlgen` que el formato que soporta no es exactamente el inverso al xml parser de Emacs.

lo hice añadir esto a mi copia de 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))) 

Nota: la interfaz de esto es xml-gen (no xmlgen que es el análisis original).

Con esta interfaz, se cumple lo siguiente:

(string-equal (xml-gen (car (xml-parse-region <some-region-of-xml>))) 
       <some-region-of-xml>) 

y

(equal (car (xml-parse-region (insert (xml-gen <some-xml-form>)))) 
     <some-xml-form>) 

El nuevo xml-gen no se esfuerza para conservar el espacio en blanco en torno a que la rutina genera xml-parse-region.

+0

Esto es genial, gracias. Sería bueno si esta funcionalidad fuera parte de xml.el ;-) – Upgradingdave

1

Tenía un requisito similar para poder analizar XML utilizando funciones xml-parse, transformarlo y luego devolverlo como una cadena xml.

La solución de Trey casi funcionaba, excepto que necesitaba conservar los elementos xml de espacio en blanco. Así que escribí mi propia aplicación aquí:

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

Cuestiones relacionadas