Compojure HTML Форматирование - PullRequest
       22

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

5 голосов
/ 17 декабря 2009

Я относительно новичок в 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 Tidy не находит проблем с содержимым выходного файла. Выдается в виде одной строки, если я println это тоже на REPL.

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

Ответы [ 5 ]

9 голосов
/ 17 декабря 2009

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

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

8 голосов
/ 01 января 2010

Хотя ответ Брайана указал мне на 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-код с отступом и пропускал предупреждения. Возвращаемое значение из функции pretty-printer теперь хорошо отформатировано, открываю ли я его с помощью Firebug или простого текстового редактора.

4 голосов
/ 28 декабря 2009

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

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

1 голос
/ 20 мая 2013

Выше не работал для меня. Я немного изменил это.

добавить это [jtidy "4aug2000r7-dev"] в 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)))
0 голосов
/ 10 марта 2019

Если кто-то все еще просматривает этот запрос, вам нужна библиотека hiccup . Если форматирует HTML именно из показанной структуры данных Clojure.

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

будет работать точно так, как задумал оригинальный постер. Настоятельно рекомендуется.

...