Pregunta

Soy relativamente nuevo en Clojure y una Virgen HTML/CompOJUR completa. Estoy tratando de usar CompoJure para crear páginas estáticas de HTML usando una función similar a esta:

(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 solo escribe HTML en un archivo. (Los args El argumento es irrelevante aquí. Justo allí para asegurar que el ejemplo compila y se ejecuta en mi programa).

"Programación de Clojure" indicó que la llamada al html La función produciría HTML formateado: múltiples líneas con sangría. Todo lo que obtengo es el tipo DOC como se esperaba seguido de todo el HTML en una sola línea. Html ordenado No encuentra ningún problema con el contenido del archivo de salida. Sale como una sola línea si println también en el repl.

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

¿Fue útil?

Solución

El formato de la salida HTML en CompOjure fue eliminado por razones de rendimiento y complejidad. Para obtener una salida formatada, probablemente tendrá que escribir su propia función de impresora.

Por lo general, salgo de HTML como CompOjure se ve ajustado y uso Firebug para verlo en vivo en mi navegador. Firebug lo mostrará bien formateado sin importar si realmente está en una línea o no. Esto funciona bastante bien la mayor parte del tiempo. Si necesita serializar este HTML en una forma legible, podría mantenerlo como vectores Clojure y Sexps y serializarlo de esa manera.

Otros consejos

Aunque la respuesta de Brian me señaló a Firebug, permitiendo la depuración que quería, solo era obsesivo compulsivo para dejarlo solo. Siguiendo el puntero de Kwertii a JTidy, incluí el siguiente código en mi programa.

Editar: Simplificó un poco el código

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

Agregué el JTidy-R938.Jar a mi proyecto (NetBeans usando el complemento enclojure) y lo importé. La función de configuración le indica al analizador que la salida HTML formateado y se saltea las advertencias. El valor de retorno de la función Pretty-Presinter ahora está bien formateado, ya sea que lo abro con Firebug o un editor de texto simple.

Hay toneladas de Html bonitas impresoras disponibles para java, notablemente Jtidy, un puerto de Java de Html ordenado. Puede alimentar fácilmente la salida de Clojure a través de esta biblioteca programáticamente y obtener un HTML cuidadosamente sangrado y formateado.

HTML Tidy también está disponible como un programa de línea de comandos para UNIX si le gustaría seguir esa ruta: puede simplemente imponer su HTML a través de él como cualquier otro programa de shell.

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

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

Si alguien todavía está mirando esta consulta, necesita la hipo biblioteca. Si se muestra los formatos HTML de la estructura de datos Clojure.

Asi que


(require '[hiccup.core :refer [html]])

(defn fake-write-html
  [dir args]
  (let [file (str dir *file-separator* *index-file*)
        my-html (html
                  [: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)))

funcionará exactamente como pretendía el póster original. Muy recomendado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top