2009-12-17 15 views
5

मैं क्लोजर और एक पूर्ण एचटीएमएल/कंपोजर कुंवारी के लिए अपेक्षाकृत नया हूं। मैं 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))) 

समारोह सिर्फ एक फाइल करने के लिए एचटीएमएल लिखता है। (args तर्क यहाँ अप्रासंगिक है बस वहाँ उदाहरण आश्वस्त करने के लिए संकलित और मेरे कार्यक्रम में चलाता है।।)

"प्रोग्रामिंग Clojure" संकेत दिया कि html कार्य करने के लिए कॉल स्वरूपित एचटीएमएल उत्पादन होगा - खरोज के साथ कई लाइनों। मुझे बस एक ही पंक्ति पर सभी HTML द्वारा अपेक्षित दस्तावेज़ प्रकार मिलता है। HTML Tidy आउटपुट फ़ाइल की सामग्री के साथ कोई समस्या नहीं मिलती है। यह एक पंक्ति के रूप में आता है यदि मैं println आरईपीएल में भी हूं।

स्वरूपित आउटपुट प्राप्त करने के लिए कुछ और आवश्यक है?

उत्तर

9

कंपोज़र में HTML आउटपुट का स्वरूपण removed for performance and complexity reasons था। स्वरूपित आउटपुट प्राप्त करने के लिए आपको शायद अपना खुद का प्रिंटर फ़ंक्शन लिखना होगा।

मैं आमतौर पर एचटीएमएल आउटपुट करता हूं क्योंकि कंपोज़र फिट बैठता है और इसे अपने ब्राउज़र में देखने के लिए फ़ायरबग का उपयोग करता है। फायरबग इसे अच्छी तरह से स्वरूपित करेगा, इससे कोई फर्क नहीं पड़ता कि यह वास्तव में एक पंक्ति पर है या नहीं। यह ज्यादातर समय काफी अच्छी तरह से काम करता है। यदि आपको इस एचटीएमएल को एक पठनीय रूप में क्रमबद्ध करने की आवश्यकता है, तो आप इसे क्लोजर वैक्टर और सेक्सप्स के रूप में रख सकते हैं और इसे इस तरह से क्रमबद्ध कर सकते हैं।

+0

धन्यवाद जोड़ें। मैं फायरबग से परिचित नहीं था, लेकिन कुछ मिनटों के साथ खेलने के बाद, ऐसा लगता है कि मुझे डिबगिंग क्षमता मिल रही है जिसे मैं ढूंढ रहा था। मैं http://www.erik-rasmussen.com/blog/2009/09/08/xml-renderer-in-clojure/ पर एक और दिलचस्प दृष्टिकोण में भी भाग गया। अभी तक यह कोशिश नहीं की है, लेकिन यह मेरे प्रिंटर फ़ंक्शन को विकसित करने से बहुत आसान (तेज़) दिखता है। या मैं सिर्फ कंपोज़र के पहले संस्करण को पकड़ सकता हूं जिसने स्वरूपण किया था। – clartaq

4

HTML pretty printers available for Java के टन हैं, विशेष रूप से JTidy, HTML Tidy का जावा पोर्ट। आप आसानी से इस पुस्तकालय के माध्यम से क्लोजर के आउटपुट को प्रोग्रामेटिक रूप से फ़ीड कर सकते हैं और अच्छी तरह से इंडेंट और HTML बैक स्वरूपित कर सकते हैं।

एचटीएमएल टिडी यूनिक्स के लिए कमांड लाइन प्रोग्राम के रूप में भी उपलब्ध है यदि आप उस मार्ग पर जाना चाहते हैं - आप अपने एचटीएमएल को किसी भी अन्य शैल प्रोग्राम की तरह पाइप कर सकते हैं।

+0

पॉइंटर, kwertii के लिए धन्यवाद। मुझे इसके बारे में पता नहीं था और यह कोशिश करेगा। – clartaq

8

हालांकि ब्रायन के जवाब ने मुझे फायरबग की ओर इशारा किया, जिससे मैं चाहता था कि डिबगिंग सक्षम हो, मैं केवल इसे छोड़ने के लिए जुनूनी-बाध्यकारी था। क्वर्टी के पॉइंटर पर जेटीडी के बाद, मैंने अपने कार्यक्रम में निम्नलिखित कोड शामिल किया।

संपादित: कोड सरलीकृत कुछ हद तक

(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 आउटपुट और चेतावनियों को छोड़ने के लिए कहता है। सुंदर-प्रिंटर फ़ंक्शन से वापसी मान अब अच्छी तरह से स्वरूपित है कि क्या मैं इसे फ़ायरबग या एक साधारण टेक्स्ट एडिटर के साथ खोलता हूं।

1

उपरोक्त मेरे लिए काम नहीं किया। मैंने इसे थोड़ा सा बदल दिया।

इस [jtidy "4aug2000r7-देव"] 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))) 
संबंधित मुद्दे