Question

Je suis relativement nouveau à Clojure et une Vierge HTML / Compojure complète complète. J'essaie d'utiliser Compojure pour créer des pages statiques de HTML en utilisant une fonction similaire à celle-ci:

(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 fonction écrit juste HTML dans un fichier. (La args L'argument n'est pas pertinent ici. Juste là pour assurer que l'exemple compile et s'exécute dans mon programme.)

"Programmation Clojure" a indiqué que l'appel à la html La fonction produirait HTML formatée - plusieurs lignes avec indentation. Tout ce que j'obtiens, c'est le type de doc comme prévu suivi par tout le HTML sur une seule ligne. Html rangé ne trouve aucun problème avec le contenu du fichier de sortie. Il sort comme une seule ligne si je println c'est aussi au REP.

Y a-t-il autre chose nécessaire pour obtenir une sortie formatée?

Était-ce utile?

La solution

Le formatage de la sortie HTML dans Compojure était supprimé pour des raisons de performance et de complexité. Pour obtenir une sortie formatée, vous devrez probablement écrire votre propre fonction d'imprimante.

Je publie généralement du HTML car Compojure le voit et j'utilise Firebug pour le voir en direct dans mon navigateur. Firebug l'affichera bien formaté, peu importe si tout est vraiment sur une seule ligne ou non. Cela fonctionne assez bien la plupart du temps. Si vous avez besoin de sérialiser ce HTML sous une forme lisible, vous pouvez le garder comme des vecteurs et des sexps Clojure et le sérialiser de cette façon.

Autres conseils

Bien que la réponse de Brian m'a souligné à Firebug, permettant le débogage que je voulais, j'étais juste à obsessionnel-compulsif de le laisser tranquille. Après le pointeur de Kwertii vers JTIDY, j'ai inclus le code suivant dans mon programme.

Éditer: Simplifié le code quelque peu

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

J'ai ajouté le jtidy-r938.jar à mon projet (NetBeans à l'aide du plugin Enclojure) et je l'ai importé. La fonction de configuration indique à l'analyseur de sortir de la sortie, HTML en retrait et de sauter les avertissements. La valeur de retour de la fonction assez imprimante est désormais bien formatée, que je l'ouvre avec Firebug ou un éditeur de texte simple.

Il y a des tonnes de HTML jolies imprimantes disponibles pour Java, notamment Jtidy, un port java de Html rangé. Vous pouvez facilement alimenter la sortie de Clojure via cette bibliothèque de manière programmatique et obtenir un retour HTML soigneusement en retrait et formaté.

HTML Tidy est également disponible en tant que programme de ligne de commande pour UNIX si vous voulez emprunter cette voie - vous pouvez simplement tuyau votre HTML à travers lui comme tout autre programme de shell.

Ce qui précède n'a pas fonctionné pour moi. J'ai un peu changé cela.

Ajoutez ce [jtidy "4AUG2000R7-DEV"] à 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 quelqu'un regarde toujours cette requête, vous avez besoin du hoquet bibliothèque. Si les formats HTML à partir de la structure de données Clojure indiquée.

Alors


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

fonctionnera exactement comme l'affiche originale prévue. Vivement recommandé.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top