Compojure форматирование HTML

Я относительно плохо знаком с 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 также.

Там что-то еще необходимо для получения отформатированного вывода?

5
задан clartaq 17 December 2009 в 01:40
поделиться

3 ответа

Форматирование вывода HTML в Compojure было удалено из соображений производительности и сложности . Чтобы получить форматированный вывод, вам, вероятно, придется написать свою собственную функцию принтера.

Я обычно печатаю HTML так, как Compojure считает нужным, и использую Firebug для просмотра его в реальном времени в моем браузере. Firebug отобразит его в красивом отформатированном виде, независимо от того, действительно ли это все в одной строке или нет. В большинстве случаев это работает достаточно хорошо. Если вам нужно сериализовать этот HTML-код в читаемой форме,

9
ответ дан 18 December 2019 в 06:50
поделиться

Для Java доступны тонны HTML-принтеров, в частности JTidy, Java-порт HTML Tidy. Вы можете запрограммировать вывод Clojure через эту библиотеку и получить аккуратно отпечатанный и отформатированный HTML обратно.

HTML Tidy также доступен как программа командной строки для Unix, если вы хотите пойти по этому пути - вы можете просто пропустить через него HTML, как через любую другую оболочку программы.

.
4
ответ дан 18 December 2019 в 06:50
поделиться

Хотя ответ Брайана указал мне на 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 или простого текстового редактора.

9
ответ дан 18 December 2019 в 06:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: