2012-11-09 12 views
7

Szukam biblioteki Java, która może wstawić zewnętrzny plik CSS z dokumentem HTML na podstawie jego atrybutów ID/klasy.Wewnętrzny zewnętrzny CSS z HTML

Znalazłem jStyleParser, ale nie jestem pewien, czy jest to dla mnie odpowiednia biblioteka. Wydaje mi się, że nie rozumiem, czy może on wykonać zadanie polegające na wstawianiu CSS na elementach z kodu HTML. Dokumentacja i przykłady nie są tym, czego oczekiwałem.

Czy jest ktoś, kto może odpowiedzieć na to pytanie lub czy istnieje inna biblioteka do tego?

Dzięki

Odpowiedz

9

Możesz spróbować CSSBox. Wystarczy zapoznać się z wersją demonstracyjną ComputeStyles zawartą w pakiecie (zobacz plik doc/examples/README w pakiecie dystrybucyjnym, aby uzyskać informacje o uruchomieniu wersji demo). Oblicza wszystkie style i tworzy nowy dokument HTML (reprezentowany przez DOM) z odpowiednimi wewnętrznymi definicjami stylu.

Źródło jest w src/org/fit/cssbox/demo/ComputeStyles.java i jest dość krótkie. W rzeczywistości używa on jStyleParser do wykonywania głównej pracy, CSSBox zapewnia po prostu lepszy interfejs.

 //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

Ack! To nie działa w AppEngine! Przeklęcie Cię, Google! – Chloe

+0

@radkovo Jak zmodyfikować ten przykład w przypadku, gdy źródłem jest ciąg wejściowy = " ..." (zamiast adresu URL)? Dobra robota! – athspk

+0

@athspk Trzeba by napisać własną implementację DocumentSource, która tworzy strumień wejściowy z łańcucha zamiast z adresu URL. To powinno być dość proste, wystarczy spojrzeć na oryginalną implementację DefaultDocumentSource. [Tutaj] (http://stackoverflow.com/questions/247161/how-do-i-turn-a-string-into-a-stream-in-java) możesz znaleźć sposób tworzenia strumienia wejściowego z ciągu . – radkovo

4

Jestem bardzo zadowolony z JSoup (v1.5.2). Mam taką metodę:

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

Chyba brakuje 'concatenateProperties' funkcja :) – zozelfelfo

+0

Dzięki @zozelfelfo - dodałem brakujący funkcji –

+0

przełączania z mandrill Amazon SES - uratowałeś mój dzień :) Mandrill robi to inline sama – jang00