Встроенный внешний CSS с HTML

Я ищу библиотеку Java, которая может встроить внешний CSS файл с HTML документ на основе его идентификатора / атрибутов класса.

Я нашел jStyleParser, но я не уверен, подходит ли мне эта библиотека. Я, кажется, не понимаю, может ли он сделать работу по CSS на элементы из HTML. Документация и примеры не то, что я ожидал.

Есть ли кто-нибудь, кто может ответить на этот вопрос, или для этого существует другая библиотека?

Спасибо

2 ответа

Решение

Вы можете попробовать CSSBox. Просто взгляните на демонстрационную версию ComputeStyles, содержащуюся в пакете (для получения информации о запуске демонстрационной версии см. Файл doc/examples/README в дистрибутивном пакете). Он вычисляет все стили и создает новый HTML-документ (представленный DOM) с соответствующими определениями встроенного стиля.

Исходный код находится в src/org/fit/cssbox/demo/ComputeStyles.java, и он довольно короткий. На самом деле, он использует jStyleParser для выполнения основной работы, CSSBox просто обеспечивает более удобный интерфейс для этого.

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

Я был очень счастлив с 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,}", " ");
  }
Другие вопросы по тегам