Pergunta

Sou relativamente novo no Clojure e uma Virgin Complete Html/Compojure. Estou tentando usar o Compojure para criar páginas estáticas de HTML usando uma função semelhante a esta:

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

A função apenas grava HTML em um arquivo. (O args O argumento é irrelevante aqui. Apenas lá para garantir que o exemplo compila e seja executado no meu programa.)

"Clojure de programação" indicou que a chamada para o html A função produziria HTML formatada - várias linhas com indentação. Tudo o que eu recebo é o tipo de documento, conforme o esperado, seguido por todo o HTML em uma única linha. HTML Tidy Não encontra problemas com o conteúdo do arquivo de saída. Sai como uma única linha se eu println no repl também.

Há algo mais necessário para obter a saída formatada?

Foi útil?

Solução

A formatação da saída HTML na composição foi removido por razões de desempenho e complexidade. Para obter saída formatada, você provavelmente terá que escrever sua própria função de impressora.

Normalmente, eu produzi o HTML como o Compojure vê o ajuste e uso o Firebug para vê -lo ao vivo no meu navegador. O Firebug exibirá bem formatado, não importa se está realmente em uma linha ou não. Isso funciona bem o suficiente na maioria das vezes. Se você precisar serializar esse HTML de forma legível, poderá mantê -lo como vetores e sexps e serializar -o dessa maneira.

Outras dicas

Embora a resposta de Brian me apontasse para o Firebug, permitindo a depuração que eu queria, eu era apenas obsessiva-compulsiva para deixá-la em paz. Seguindo o ponteiro de Kwertii para Jtidy, incluí o código a seguir no meu programa.

Editar: Simplificaram o código um pouco

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

Adicionei o JTIDY-R938.JAR ao meu projeto (NetBeans usando o plug-in do Enclojure) e o importei. A função de configuração diz ao analisador para produzir html formatado, recuado e pule os avisos. O valor de retorno da função de impressora bonita agora é bem formatada se eu o abro com o Firebug ou um editor de texto simples.

Existem toneladas de Impressoras bonitas html disponíveis para java, notavelmente Jtidy, uma porta Java de HTML Tidy. Você pode facilmente alimentar a saída de Clojure através desta biblioteca programaticamente e ficar com o HTML de remendado e formatado de volta.

O HTML Tidy também está disponível como um programa de linha de comando para o UNIX se você quiser seguir esse caminho-você pode simplesmente transmitir seu HTML através dele como qualquer outro programa de shell.

O exposto acima não funcionou para mim. Eu mudei um pouco isso.

Adicione este [jtidy "4AUG2000R7-DEV"] ao 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)))

Se alguém ainda está olhando para esta consulta, você precisa do soluço biblioteca. Se os formatos html exatamente da estrutura de dados do clojure mostrada.

Então


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

funcionará exatamente como o pôster original pretendido. Fortemente recomendado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top