Compojure HTML格式

时间:2009-12-17 01:21:48

标签: html clojure compojure clojure-contrib

我对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 - 带缩进的多行。我得到的只是预期的doc类型,然后是一行中的所有HTML。 HTML Tidy未发现输出文件内容有任何问题。如果我在REPL上println,它就会出现一行。

是否需要其他东西才能获得格式化输出?

5 个答案:

答案 0 :(得分:9)

Compojure中HTML输出的格式为removed for performance and complexity reasons。要获得格式化输出,您可能需要编写自己的打印机功能。

我通常输出HTML,因为Compojure认为合适,并使用Firebug在我的浏览器中实时查看。 Firebug将显示格式很好,无论它是否真的都在一条线上。这在大多数情况下都能很好地工作。如果你需要以可读的形式序列化这个HTML,你可以将它保存为Clojure向量和sexps并将其序列化。

答案 1 :(得分:8)

虽然Brian的回答指向了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添加到我的项目(使用enclojure插件的NetBeans)并导入它。配置函数告诉解析器输出格式化的缩进HTML并跳过警告。不管是用Firebug还是简单的文本编辑器打开它,漂亮的打印机功能的返回值现在都很好了。

答案 2 :(得分:4)

有大量HTML pretty printers available for Java,特别是JTidy,Java端口HTML Tidy。您可以通过编程方式轻松地通过此库提供Clojure的输出,并获得整齐的缩进和格式化HTML。

HTML Tidy也可以作为Unix的命令行程序使用,如果您想要走这条路线 - 您可以像其他任何shell程序一样通过它管道HTML。

答案 3 :(得分:1)

以上对我不起作用。 我改变了一下。

将此[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)))

答案 4 :(得分:0)

如果任何人仍在查看此查询,则需要hiccup库。如果完全按照所示的Clojure数据结构格式化HTML。

所以


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

将完全按照原始海报的要求工作。强烈推荐。