2012-11-09 18 views
7

के साथ इनलाइन बाहरी सीएसएस मैं जावा पुस्तकालय की तलाश में हूं जो फ़ाइल को HTML दस्तावेज़ के साथ अपने आईडी/क्लास विशेषताओं के आधार पर रेखांकित कर सकता है।एचटीएमएल

मुझे jStyleParser मिला है, लेकिन मुझे यकीन नहीं है कि यह मेरे लिए सही पुस्तकालय है या नहीं। मुझे लगता है कि यह HTML में तत्वों पर CSS को रेखांकित करने का काम कर सकता है या नहीं। दस्तावेज और उदाहरण वह नहीं है जो मैंने अपेक्षित था।

क्या कोई ऐसा व्यक्ति है जो इस प्रश्न का उत्तर दे सकता है या इसके लिए कोई अन्य लाइब्रेरी मौजूद है?

धन्यवाद

उत्तर

9

आप CSSBox कोशिश कर सकते हैं। पैकेज में निहित कंप्यूट स्टाइल डेमो पर एक नज़र डालें (डेमो चलाने के बारे में जानकारी के लिए वितरण पैकेज में दस्तावेज़/उदाहरण/README फ़ाइल देखें)। यह सभी शैलियों की गणना करता है और संबंधित इनलाइन शैली परिभाषाओं के साथ एक नया HTML दस्तावेज़ (एक डोम द्वारा प्रतिनिधित्व) बनाता है।

स्रोत src/org/fit/cssbox/डेमो/ComputeStyles.java में है और यह बहुत छोटा है। असल में, यह मुख्य नौकरी करने के लिए jStyleParser का उपयोग करता है, सीएसएसबॉक्स सिर्फ इसके लिए एक अच्छा इंटरफ़ेस प्रदान करता है।

 //Open the network connection 
     DocumentSource docSource = new DefaultDocumentSource(args[0]); 

     //Parse the input document 
     DOMSource parser = new DefaultDOMSource(docSource); 
     Document doc = parser.parse(); 

     //Create the CSS analyzer 
     DOMAnalyzer da = new DOMAnalyzer(doc, docSource.getURL()); 
     da.attributesToStyles(); //convert the HTML presentation attributes to inline styles 
     da.addStyleSheet(null, CSSNorm.stdStyleSheet(), DOMAnalyzer.Origin.AGENT); //use the standard style sheet 
     da.addStyleSheet(null, CSSNorm.userStyleSheet(), DOMAnalyzer.Origin.AGENT); //use the additional style sheet 
     da.getStyleSheets(); //load the author style sheets 

     //Compute the styles 
     System.err.println("Computing style..."); 
     da.stylesToDomInherited(); 

     //Save the output 
     PrintStream os = new PrintStream(new FileOutputStream(args[1])); 
     Output out = new NormalOutput(doc); 
     out.dumpTo(os); 
     os.close(); 

     docSource.close(); 
+0

एएके! यह AppEngine में काम नहीं करता है! आपको Google पर अभिशाप! – Chloe

+0

@radkovo स्रोत को स्ट्रिंग इनपुट = " ..." (URL के बजाय) में इस उदाहरण को कैसे संशोधित किया जाएगा? अच्छा काम बीटीडब्ल्यू! – athspk

+0

@athspk आपको अपना खुद का दस्तावेज़ स्रोत कार्यान्वयन लिखना होगा जो किसी URL की बजाय स्ट्रिंग से इनपुट स्ट्रीम बनाता है। यह काफी सरल होना चाहिए, बस मूल DefaultDocumentSource कार्यान्वयन पर एक नज़र डालें। [यहां] (http://stackoverflow.com/questions/247161/how-do-i-turn-a-string-into-a-stream-in-java) आप स्ट्रिंग से इनपुट स्ट्रीम कैसे बना सकते हैं । – radkovo

4

मैं JSoup (v1.5.2) से बहुत खुश हूं। मेरे पास इस तरह की एक विधि है:

public static String inlineCss(String html) { 
    final String style = "style"; 
    Document doc = Jsoup.parse(html); 
    Elements els = doc.select(style);// to get all the style elements 
    for (Element e : els) { 
     String styleRules = e.getAllElements().get(0).data().replaceAll("\n", "").trim(); 
     String delims = "{}"; 
     StringTokenizer st = new StringTokenizer(styleRules, delims); 
     while (st.countTokens() > 1) { 
     String selector = st.nextToken(), properties = st.nextToken(); 
     if (!selector.contains(":")) { // skip a:hover rules, etc. 
      Elements selectedElements = doc.select(selector); 
      for (Element selElem : selectedElements) { 
      String oldProperties = selElem.attr(style); 
      selElem.attr(style, 
       oldProperties.length() > 0 ? concatenateProperties(
        oldProperties, properties) : properties); 
      } 
     } 
     } 
     e.remove(); 
    } 
    return doc.toString(); 
    } 

    private static String concatenateProperties(String oldProp, @NotNull String newProp) { 
    oldProp = oldProp.trim(); 
    if (!oldProp.endsWith(";")) 
     oldProp += ";"; 
    return oldProp + newProp.replaceAll("\\s{2,}", " "); 
    } 
+0

मुझे लगता है कि आप 'याद कर रहे हैं concatenateProperties' समारोह :) – zozelfelfo

+0

@zozelfelfo धन्यवाद - मैं एक प्रकार का बंदर से लापता समारोह –

+0

स्विचिंग सत्र अमेज़न करने के लिए जोड़ा - आप मेरा दिन :) प्रकार का बंदर बचाया अपने आप में इस इनलाइनिंग – jang00