2009-12-17 7 views
5

Soy relativamente nuevo en Clojure y una virgen completa de HTML/Compojure. Estoy tratando de utilizar Compojure para crear páginas estáticas de HTML utilizando una función similar a esto:Compojure Formato HTML

(defn fake-write-html 
    [dir args] 
    (let [file (str dir *file-separator* *index-file*) 
     my-html (html 
        (doctype :html4) 
        [:html 
        [:head 
        [:title "Docs and Dirs:"]] 
        [:body 
        [:div 
        [:h2 "A nice title"]] 
        [:div 
        [:ul 
         [:li "One"] 
         [:li "Two"]]]]])] 
    (clojure.contrib.duck-streams/spit file my-html))) 

La función simplemente escribe en un archivo HTML. (El argumento args es irrelevante aquí sólo existe para asegurar el ejemplo compila y se ejecuta en mi programa..)

"Programación Clojure" indicó que la llamada a la función html produciría formato HTML - varias líneas con sangría. Todo lo que obtengo es el tipo de documento como se esperaba, seguido de todo el HTML en una sola línea. HTML Tidy no encuentra ningún problema con el contenido del archivo de salida. Viene como una sola línea si I println en el REPL también.

¿Se necesita algo más para obtener una salida formateada?

Respuesta

9

El formato de salida de HTML en Compojure era removed for performance and complexity reasons. Para obtener una salida formateada, probablemente tendrá que escribir su propia función de impresora.

Normalmente publico HTML como Compojure y uso Firebug para verlo en vivo en mi navegador. Firebug lo mostrará muy bien formateado, sin importar si realmente está todo en una línea o no. Esto funciona bastante bien la mayor parte del tiempo. Si necesita serializar este HTML en un formato legible, puede mantenerlo como vectores Clojure y sexps y serializarlo de esa manera.

+0

Gracias por Brian otra respuesta. No estaba familiarizado con Firebug, pero después de jugar con él durante unos minutos, parece darme la capacidad de depuración que estaba buscando. También encontré otro enfoque interesante en http://www.erik-rasmussen.com/blog/2009/09/08/xml-renderer-in-clojure/. Todavía no lo he probado, pero parece mucho más fácil (más rápido) que desarrollar mi función de impresora. O podría tomar una versión anterior de Compojure que hizo el formateo. – clartaq

4

Hay toneladas de HTML pretty printers available for Java, notablemente JTidy, un puerto de Java de HTML Tidy. Puede alimentar fácilmente los resultados de Clojure a través de esta biblioteca mediante programación y obtener una sangría ordenada y formatear el HTML de nuevo.

HTML Tidy también está disponible como un programa de línea de comandos para Unix si desea ir por esa ruta: puede pasar su HTML a través de él como cualquier otro programa de shell.

+0

Gracias por el puntero, kwertii. No estaba al tanto y lo intentaré. – clartaq

8

Aunque la respuesta de Brian me indicó Firebug, habilitando la depuración que yo quería, estaba obsesivo-compulsivo por dejarlo solo. Siguiendo el puntero de kwertii hacia JTidy, incluí el siguiente código en mi programa.

Editar: el código simplificado un poco

(ns net.dneclark.someprogram 
    (:gen-class) 
    ... 
    (:import (org.w3c.tidy Tidy)) 
    ) 

    ... 

(defn configure-pretty-printer 
    "Configure the pretty-printer (an instance of a JTidy Tidy class) to 
generate output the way we want -- formatted and without sending warnings. 
Return the configured pretty-printer." 
    [] 
    (doto (new Tidy) 
    (.setSmartIndent true) 
    (.setTrimEmptyElements true) 
    (.setShowWarnings false) 
    (.setQuiet true))) 

(defn pretty-print-html 
    "Pretty-print the html and return it as a string." 
    [html] 
    (let [swrtr (new StringWriter)] 
    (.parse (configure-pretty-printer) (new StringReader (str html)) swrtr) 
    (str swrtr))) 

que añade el JTidy-r938.jar a mi proyecto (NetBeans utilizando el plugin enclojure) e importados ella. La función de configuración le dice al analizador que emita HTML formateado y sangrado y omita las advertencias. El valor de retorno de la función bonita de la impresora ahora tiene un buen formato si lo abro con Firebug o con un simple editor de texto.

1

Lo anterior no funcionó para mí. Cambié esto un poco.

añadir esta [JTidy "4aug2000r7-dev"] a project.clj

(:use clojure.core) 
(:import (org.w3c.tidy Tidy)) 
(:import (java.io ByteArrayInputStream ByteArrayOutputStream))) 



(defn configure-pretty-printer 
"Configure the pretty-printer (an instance of a JTidy Tidy class) to 
generate output the way we want -- formatted and without sending warnings. 
Return the configured pretty-printer." 
[] 
(doto (new Tidy) 
(.setSmartIndent true) 
;(.setTrimEmptyElements true) 
(.setShowWarnings false) 
(.setQuiet true))) 

(defn pretty-print-html 
    "Pretty-print the html and return it as a string." 
[html] 
(let [swrtr (ByteArrayOutputStream.)] 
    (.parse (configure-pretty-printer) (ByteArrayInputStream. (.getBytes (str html))) swrtr) 
(str swrtr)))