Frage

Ich bin relativ neu in Clojure und eine vollständige HTML/Compojure -Jungfrau. Ich versuche Compojure zu verwenden, um statische Seiten von HTML mit einer ähnlichen Funktion zu erstellen:

(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. Nur da, um das Beispiel zu versichern, kompiliert und läuft mein Programm.)

"Clojure programmieren" zeigte, dass der Anruf an die html Die Funktion würde formatiertes HTML erzeugen - mehrere Linien mit Eindrückung. Alles, was ich bekomme, ist der DOC -Typ wie erwartet, gefolgt von allen HTML in einer einzelnen Zeile. HTML Tidy Findet keine Probleme mit dem Inhalt der Ausgabedatei. Es kommt als einzelne Zeile heraus, wenn ich println es auch bei der Reply.

Gibt es noch etwas, das für die Formatierung der Formatierung benötigt wird?

War es hilfreich?

Lösung

Die Formatierung der HTML -Ausgabe in Kompojure war Aus Gründen der Leistung und Komplexität entfernt. Um eine formatierte Ausgabe zu erhalten, müssen Sie wahrscheinlich Ihre eigene Druckerfunktion schreiben.

Normalerweise geben ich HTML aus, da Compojure anpasst und Firebug benutze, um es lebend in meinem Browser zu sehen. Firebug zeigt es gut formatiert, egal ob es wirklich alles in einer Zeile ist oder nicht. Dies funktioniert die meiste Zeit gut genug. Wenn Sie dieses HTML in einer lesbaren Form serialisieren müssen, können Sie sie als Clojure -Vektoren und -Susexps halten und sie so serialisieren.

Andere Tipps

Obwohl Brians Antwort mich auf Firebug wies und das Debuggen ermöglichte, das ich wollte, war ich nur zu Zwang, es in Ruhe zu lassen. Nachdem ich auf Kwertiis Zeiger auf JTIDY nachgefolgt bin, habe ich den folgenden Code in mein Programm aufgenommen.

Bearbeiten: Vereinfacht 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 habe mein Projekt (NetBeans mit dem Grack-Plugin) den JTIDY-R938.jar hinzugefügt und es importiert. Die Konfigurationsfunktion fordert den Parser an, formatiert, eingerichtetes HTML und die Warnungen überspringen. Der Rückgabewert der Pretty-Printer-Funktion ist jetzt gut formatiert, ob ich ihn mit Firebug oder einem einfachen Texteditor öffne.

Es gibt Tonnen von Html hübsche Drucker für Java verfügbar, vor allem Jtidy, ein Java -Hafen von HTML Tidy. Sie können die Ausgabe von Clojure programmlich durch diese Bibliothek programmlich füttern und ordentlich ein Einverletzung und formatiertes HTML zurückerhalten.

HTML Tidy ist auch als Befehlszeilenprogramm für UNIX erhältlich, wenn Sie diese Route gehen möchten.

Das obige hat bei mir nicht funktioniert. Ich habe das ein bisschen geändert.

Fügen Sie diese [jtidy "4Ag2000r7-dev"] zu project.clj hinzu

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

Wenn sich jemand diese Frage noch ansieht, brauchen Sie die Schluckauf Bibliothek. Wenn Formate HTML aus genau der gezeigten Clojure -Datenstruktur ausgestattet sind.

So


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

funktioniert genau wie das ursprüngliche Poster beabsichtigt. Wärmstens empfohlen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top