ID/クラス属性に基づいてドキュメントを外部CSS
ファイルにインライン化できる Java ライブラリを探しています。HTML
jStyleParserを見つけましたが、これが適切なライブラリであるかどうかはわかりません。CSS
HTMLから要素をインライン化することができるかどうかを理解できていないようです。ドキュメントと例は、私が期待したものではありません。
その質問に答えられる人はいますか、それとも別のライブラリが存在しますか?
ありがとう
ID/クラス属性に基づいてドキュメントを外部CSS
ファイルにインライン化できる Java ライブラリを探しています。HTML
jStyleParserを見つけましたが、これが適切なライブラリであるかどうかはわかりません。CSS
HTMLから要素をインライン化することができるかどうかを理解できていないようです。ドキュメントと例は、私が期待したものではありません。
その質問に答えられる人はいますか、それとも別のライブラリが存在しますか?
ありがとう
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,}", " ");
}