6

私は 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 が 1 行にあることだけです。HTML Tidyは、出力ファイルのコンテンツに関する問題を検出しません。printlnREPLでも1行で出てきます。

フォーマットされた出力を取得するために他に必要なものはありますか?

4

5 に答える 5

10

Compojure での HTML 出力の書式設定は、パフォーマンスと複雑さの理由から削除されました。フォーマットされた出力を取得するには、おそらく独自のプリンター関数を作成する必要があります。

私は通常、Compojure が適していると判断した HTML を出力し、Firebug を使用してブラウザーでライブ表示します。Firebug は、実際にすべてが 1 行であるかどうかに関係なく、適切にフォーマットされて表示します。ほとんどの場合、これで十分に機能します。この HTML を読み取り可能な形式でシリアライズする必要がある場合は、Clojure のベクトルと SEP として保持し、その方法でシリアライズすることができます。

于 2009-12-17T01:58:58.417 に答える
9

ブライアンの答えは、私が望んでいたデバッグを可能にする 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)))

プロジェクト (enclojure プラグインを使用する NetBeans) に jtidy-r938.jar を追加してインポートしました。構成関数は、パーサーに、書式設定され、インデントされた HTML を出力し、警告をスキップするように指示します。pretty-printer 関数からの戻り値は、Firebug で開いても単純なテキスト エディターで開いても、適切にフォーマットされています。

于 2010-01-01T17:32:04.890 に答える
4

Java で使用できる HTML プリティ プリンターはたくさんあります。特に、JTidyはHTML Tidyの Java ポートです。このライブラリを介して Clojure の出力をプログラムで簡単にフィードし、きれいにインデントしてフォーマットされた HTML を返すことができます。

HTML Tidy は、Unix 用のコマンドライン プログラムとしても利用できます。他のシェル プログラムと同じように HTML をパイプするだけです。

于 2009-12-27T22:07:48.030 に答える