2009-12-17 7 views
5

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

(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 simplement HTML dans un fichier. (L'argument args est hors de propos ici juste là pour assurer l'exemple compile et fonctionne dans mon programme..)

« Programmation Clojure » a indiqué que l'appel à la fonction html produirait au format HTML - plusieurs lignes avec indentation. Tout ce que je reçois est le type de doc comme prévu suivi de tout le HTML sur une seule ligne. HTML Tidy ne trouve pas de problèmes avec le contenu du fichier de sortie. Il sort comme une seule ligne si je l'ai au REPL aussi.

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

Répondre

9

La mise en forme de la sortie HTML dans Compojure était removed for performance and complexity reasons. Pour obtenir une sortie formatée, vous devrez probablement écrire votre propre fonction d'imprimante.

J'ai l'habitude de sortir du HTML car Compojure le voit bien et utilise Firebug pour le voir en direct dans mon navigateur. Firebug l'affichera bien formaté, peu importe si c'est vraiment tout sur une ligne ou non. Cela fonctionne assez bien la plupart du temps. Si vous devez sérialiser ce code HTML sous une forme lisible, vous pouvez le conserver comme vecteurs Clojure et sexps et le sérialiser de cette façon.

+0

Merci pour une autre réponse Brian. Je n'étais pas familier avec Firebug, mais après avoir joué avec pendant quelques minutes, cela m'a donné la capacité de déboguer que je cherchais. J'ai également rencontré une autre approche intéressante sur http://www.erik-rasmussen.com/blog/2009/09/08/xml-renderer-in-clojure/. Je n'ai pas encore essayé, mais cela semble beaucoup plus facile (plus rapide) que de développer ma fonction d'imprimante. Ou je pourrais juste saisir une version antérieure de Compojure qui a fait le formatage. – clartaq

4

Il y a des tonnes de HTML pretty printers available for Java, notamment JTidy, un port Java de HTML Tidy. Vous pouvez facilement programmer la sortie de Clojure à travers cette bibliothèque de manière programmatique et obtenir un retour en arrière parfaitement formaté.

HTML Tidy est également disponible en tant que programme de ligne de commande pour Unix si vous voulez suivre cette route - vous pouvez simplement y passer votre code HTML comme n'importe quel autre programme shell.

+0

Merci pour le pointeur, kwertii. Je n'étais pas au courant et je vais essayer. – clartaq

8

Bien que la réponse de Brian m'a indiqué Firebug, permettant le débogage que je voulais, j'étais juste obsessionnel-compulsif pour le laisser tranquille. Suite au pointeur de kwertii vers JTidy, j'ai inclus le code suivant dans mon programme.

Modifier: simplifié le code un 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 en utilisant le plugin enclojure) et l'importaient. La fonction de configuration indique à l'analyseur de produire un HTML formaté et indenté et d'ignorer les avertissements. La valeur de retour de la fonction pretty-printer est maintenant bien formatée que je l'ouvre avec Firebug ou un simple éditeur de texte.

1

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

ajouter ce [JTidy "4aug2000r7-dev"] pour 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)))