2009-12-17 8 views
5

Ich bin relativ neu zu Clojure und eine komplette HTML/Compojure Jungfrau. Ich versuche Compojure zu verwenden statische Seiten von HTML erstellen eine ähnliche Funktion wie diese verwenden:Compojure HTML Formatierung

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

Die Funktion schreibt nur HTML in eine Datei. (Das args Argument ist hier irrelevant Gerade dort das Beispiel, um sicherzustellen, kompiliert und ausgeführt in meinem Programm..)

„Programming Clojure“ zeigte an, dass der Anruf an die html Funktion würde formatiert HTML erzeugen - mehrere Zeilen mit Vertiefung. Alles, was ich bekomme, ist der Dokumenttyp wie erwartet, gefolgt von dem gesamten HTML in einer einzigen Zeile. HTML Tidy findet keine Probleme mit dem Inhalt der Ausgabedatei. Es kommt als eine einzige Zeile heraus, wenn ich es an der REPL auch println bin.

Gibt es noch etwas anderes, um eine formatierte Ausgabe zu erhalten?

Antwort

9

Die Formatierung der HTML-Ausgabe in Compojure war removed for performance and complexity reasons. Um formatierte Ausgaben zu erhalten, müssen Sie wahrscheinlich Ihre eigene Druckerfunktion schreiben.

Ich gebe normalerweise HTML aus, wie Compojure es für richtig hält, und benutze Firebug, um es live in meinem Browser anzusehen. Firebug wird es schön formatiert zeigen, egal ob es wirklich alles in einer Zeile ist oder nicht. Das funktioniert die meiste Zeit gut. Wenn Sie diesen HTML-Code in einer lesbaren Form serialisieren müssen, können Sie ihn als Clojure-Vektoren und -Sprache speichern und auf diese Weise serialisieren.

+0

Danke für eine andere Antwort Brian project.clj. Ich war mit Firebug nicht vertraut, aber nachdem ich ein paar Minuten mit ihm gespielt habe, scheint es mir die Debugging-Fähigkeit zu geben, nach der ich gesucht habe. Ich stieß auch auf einen anderen interessanten Ansatz unter http://www.erik-rasmussen.com/blog/2009/09/08/xml-renderer-in-clojure/. Hab es noch nicht probiert, aber es sieht viel einfacher (schneller) aus als meine Druckerfunktion zu entwickeln. Oder ich könnte einfach eine frühere Version von Compojure greifen, die die Formatierung durchgeführt hat. – clartaq

4

Es gibt Tonnen von HTML pretty printers available for Java, insbesondere JTidy, ein Java-Port von HTML Tidy. Sie können die Ausgabe von Clojure über diese Bibliothek leicht programmatisch einspeisen und ordentlich eingerücktes und formatiertes HTML zurückbekommen.

HTML Tidy ist auch als ein Befehlszeilenprogramm für Unix verfügbar, wenn Sie diesen Weg gehen möchten - Sie können Ihren HTML-Code wie jedes andere Shell-Programm durchreichen.

+0

Danke für den Zeiger, kwertii. Ich war mir dessen nicht bewusst und werde es versuchen. – clartaq

8

Obwohl Brians Antwort mich auf Firebug hinwies und mir das Debugging ermöglichte, das ich wollte, war ich nur zwanghaft, es in Ruhe zu lassen. Im Anschluss an kwertiis Zeiger auf JTidy habe ich den folgenden Code in mein Programm eingefügt.

bearbeiten: Vereinfachtes den Code etwas

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

ich die jtidy-r938.jar zu meinem Projekt (NetBeans mit dem enclojure Plugin) hinzugefügt und es importiert. Die Konfigurationsfunktion weist den Parser an, formatierten, eingerückten HTML-Code auszugeben und die Warnungen zu überspringen. Der Rückgabewert von der Pretty-Printer-Funktion ist jetzt schön formatiert, ob ich es mit Firebug oder einem einfachen Texteditor öffne.

1

Das obige hat nicht für mich funktioniert. Ich habe das ein bisschen geändert.

hinzufügen, um dieses [jtidy "4aug2000r7-dev"]

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