Я относительно плохо знаком с Clojure и полной девственницей HTML/Compojure. Я пытаюсь использовать 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)))
Функция просто пишет HTML в файл. ( args
аргумент не важен здесь. Просто там для уверения компиляций в качестве примера и выполнений в моей программе.)
"Программирование Clojure" указало что вызов к html
функция произвела бы, отформатировал HTML - несколько строк с добавлением отступа. Все, что я получаю, является типом документа, как ожидалось сопровождаемым всем HTML на одной строке. Опрятный HTML не находит проблем с содержанием выходного файла. Это выходит как одна строка если я println
это в REPL также.
Там что-то еще необходимо для получения отформатированного вывода?
Форматирование вывода HTML в Compojure было удалено из соображений производительности и сложности . Чтобы получить форматированный вывод, вам, вероятно, придется написать свою собственную функцию принтера.
Я обычно печатаю HTML так, как Compojure считает нужным, и использую Firebug для просмотра его в реальном времени в моем браузере. Firebug отобразит его в красивом отформатированном виде, независимо от того, действительно ли это все в одной строке или нет. В большинстве случаев это работает достаточно хорошо. Если вам нужно сериализовать этот HTML-код в читаемой форме,
Для Java доступны тонны HTML-принтеров, в частности JTidy, Java-порт HTML Tidy. Вы можете запрограммировать вывод Clojure через эту библиотеку и получить аккуратно отпечатанный и отформатированный HTML обратно.
HTML Tidy также доступен как программа командной строки для Unix, если вы хотите пойти по этому пути - вы можете просто пропустить через него HTML, как через любую другую оболочку программы.
.Хотя ответ Брайана указал мне на Firebug, позволяя отладку, которую я хотел, я был просто навязчиво-компульсивным, чтобы оставить это в покое. Следуя указателю kwertii на JTidy, я включил в свою программу следующий код.
Редактирование : Несколько упростил код
(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)))
Я добавил jtidy-r938.jar в свой проект (NetBeans с помощью плагина enclojure) и импортировал его. Функция конфигурации подсказывает парсеру выводить отформатированный, с отступом HTML и пропускать предупреждения. Возвращаемое значение из функции красивого принтера теперь красиво отформатировано независимо от того, открываю ли я его с помощью Firebug или простого текстового редактора.