2009-12-17 19 views
5

Jestem względnie nowy w Clojure i kompletnej wersji HTML/Compositure virgin. Próbuję użyć Compojure do tworzenia statycznych stron HTML przy użyciu funkcji podobny do tego:Formatowanie w formacie Compojure HTML

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

Funkcja prostu zapisuje do pliku HTML. (The args argument jest nieistotny tu tylko tam, aby zapewnić przykład kompiluje i działa w moim programie.).

„Programming Clojure” wskazano, że wywołanie funkcji html przyniosłoby sformatowany HTML - wiele linii z wcięciem. Dostaję tylko typ dokumentu zgodnie z oczekiwaniami, a następnie cały kod HTML w jednej linii. HTML Tidy nie znajduje żadnych problemów z zawartością pliku wyjściowego. Wydaje się jako pojedyncza linia, jeśli I println to również na REPL.

Czy jest coś jeszcze, co wymaga sformatowanego wyjścia?

Odpowiedz

9

Formatowanie wyjścia HTML w aplikacji Compojure to removed for performance and complexity reasons. Aby uzyskać sformatowany wynik, prawdopodobnie będziesz musiał napisać własną funkcję drukarki.

Zwykle wyprowadzam kod HTML, tak jak widzi to narzędzie Compojure, i używam Firebug, aby wyświetlić go na żywo w mojej przeglądarce. Firebug wyświetla je ładnie sformatowane, bez względu na to, czy naprawdę wszystko jest w jednym wierszu, czy nie. Działa to wystarczająco dobrze przez większość czasu. Jeśli chcesz serializować ten HTML w czytelnej formie, możesz zachować go jako wektory Clojure i sexps i serializować w ten sposób.

+0

Dzięki za inną odpowiedź Brian. Nie znałem Firebuga, ale po graniu z nim przez kilka minut wydaje mi się, że szukam umiejętności debugowania. Ja także natknąłem się na inne ciekawe podejście na http://www.erik-rasmussen.com/blog/2009/09/08/xml-renderer-in-clojure/. Jeszcze go nie wypróbowałem, ale wygląda to o wiele łatwiej (szybciej) niż rozwijanie funkcji drukarki. Mogę też po prostu pobrać wcześniejszą wersję programu Compojure, która dokonała formatowania. – clartaq

4

Istnieje ton HTML pretty printers available for Java, w szczególności JTidy, port Java HTML Tidy. Możesz łatwo programowo pobierać dane wyjściowe Clojure za pośrednictwem tej biblioteki i przywrócić starannie sformatowany kod HTML.

HTML Tidy jest również dostępny jako program uruchamiany z poziomu wiersza poleceń dla systemu Unix, jeśli chciałbyś pójść tą trasą - możesz po prostu przesuwać swój HTML przez nią jak każdy inny program powłoki.

+0

Dzięki za wskaźnik, kwertii. Nie wiedziałem o tym i spróbuję. – clartaq

8

Mimo że odpowiedź Briana wskazała mi Firebuga, pozwalając na debugowanie, które chciałem, byłem po prostu obsesyjno-kompulsywny, by zostawić to w spokoju. Podążając za wskaźnikiem kwertii do JTidy, włączyłem poniższy kod do mojego programu.

Edit: Uproszczony kod nieco

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

dodałem jtidy-r938.jar do mojego projektu (NetBeans za pomocą wtyczki enclojure) i importowanych go. Funkcja konfiguracyjna nakazuje parserowi wyprowadzanie sformatowanego, wciętego HTML i pomijanie ostrzeżeń. Wartość zwracana z funkcji ładnej drukarki jest teraz dobrze sformatowana, niezależnie od tego, czy otworzę ją za pomocą Firebug, czy prostego edytora tekstu.

1

Powyższe nie działa dla mnie. Zmieniłem to trochę.

dodać ten [jtidy "4aug2000r7-dev"] do 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))) 
Powiązane problemy