[ACCEPTED]-Looking for a CSS Parser in java-parsing
I've used CSSParser and I like it- it gives good 2 feedback on errors as well.
Here's some sample 1 code I've found and modified:
package com.dlogic;
import com.steadystate.css.parser.CSSOMParser;
import org.w3c.css.sac.InputSource;
import org.w3c.dom.css.CSSStyleSheet;
import org.w3c.dom.css.CSSRuleList;
import org.w3c.dom.css.CSSRule;
import org.w3c.dom.css.CSSStyleRule;
import org.w3c.dom.css.CSSStyleDeclaration;
import java.io.*;
public class CSSParserTest
{
protected static CSSParserTest oParser;
public static void main(String[] args) {
oParser = new CSSParserTest();
if (oParser.Parse("design.css")) {
System.out.println("Parsing completed OK");
} else {
System.out.println("Unable to parse CSS");
}
}
public boolean Parse(String cssfile)
{
FileOutputStream out = null;
PrintStream ps = null;
boolean rtn = false;
try
{
// cssfile accessed as a resource, so must be in the pkg (in src dir).
InputStream stream = oParser.getClass().getResourceAsStream(cssfile);
// overwrites and existing file contents
out = new FileOutputStream("log.txt");
if (out != null)
{
//log file
ps = new PrintStream( out );
System.setErr(ps); //redirects stderr to the log file as well
} else {
return rtn;
}
InputSource source = new InputSource(new InputStreamReader(stream));
CSSOMParser parser = new CSSOMParser();
// parse and create a stylesheet composition
CSSStyleSheet stylesheet = parser.parseStyleSheet(source, null, null);
//ANY ERRORS IN THE DOM WILL BE SENT TO STDERR HERE!!
// now iterate through the dom and inspect.
CSSRuleList ruleList = stylesheet.getCssRules();
ps.println("Number of rules: " + ruleList.getLength());
for (int i = 0; i < ruleList.getLength(); i++)
{
CSSRule rule = ruleList.item(i);
if (rule instanceof CSSStyleRule)
{
CSSStyleRule styleRule=(CSSStyleRule)rule;
ps.println("selector:" + i + ": " + styleRule.getSelectorText());
CSSStyleDeclaration styleDeclaration = styleRule.getStyle();
for (int j = 0; j < styleDeclaration.getLength(); j++)
{
String property = styleDeclaration.item(j);
ps.println("property: " + property);
ps.println("value: " + styleDeclaration.getPropertyCSSValue(property).getCssText());
ps.println("priority: " + styleDeclaration.getPropertyPriority(property));
}
}// end of StyleRule instance test
} // end of ruleList loop
if (out != null) out.close();
if (stream != null) stream.close();
rtn = true;
}
catch (IOException ioe)
{
System.err.println ("IO Error: " + ioe);
}
catch (Exception e)
{
System.err.println ("Error: " + e);
}
finally
{
if (ps != null) ps.close();
}
return rtn;
}
}
A CSS library for reading and writing CSS2 6 and CSS3 files in Java is ph-css from https://github.com/phax/ph-css It is based 5 on a JavaCC grammar and supports both CSS2 4 as well as CSS3 and additionally lets you 3 parse HTML style attributes.
- It supports the most common hacks "*", "_" and "$" which are not spec compliant
- It supports CSS math - the calc() expression
- It supports the @page rule
- It supports the CSS3 media queries
- It supports @viewport rules
- It supports @keyframes rules
- It supports @supports rules - quite new
- It supports the @namespace rules
- You can get source location information for the different elements (line + column number for start and end - both for the tag as well as for the complete construct)
Since May 21st, 2013 2 a JDK 1.5 version is also available, which 1 makes it more interesting for Android development
I needed a CSS parser for an own project, but 6 I found "CSSParser" to be too 5 tedious and inflexible to work with (but 4 that could have just been me), so I ended 3 up writing my own simple but functional 2 CSS parser.
Feel free to use it if you want 1 to :-)
Check out SAC and its implementstions here: http://www.w3.org/Style/CSS/SAC/
CSSParser 1 is a little bit out of date
jStyleParser provides exactly this functionality. It 2 parses all the referenced style sheets and 1 maps them to the DOM tree nodes.
If you struggle with CSSParser, because 12 there seems to be no documentation at all, and 11 you perhaps want to parse just a CSS String, like 10 value from style parameter, here is my simple 9 sample of use:
import org.junit.Test;
import org.w3c.css.sac.InputSource;
import org.w3c.dom.css.CSSRule;
import org.w3c.dom.css.CSSStyleDeclaration;
import org.w3c.dom.css.CSSValue;
import com.steadystate.css.parser.CSSOMParser;
public class ParseCssTest {
@Test
public void testParseStyleDeclaration() throws IOException {
String cssSample = "margin-top: 0cm; margin-bottom: 0cm; background: #e6e6e6";
CSSOMParser parser = new CSSOMParser();
CSSStyleDeclaration o = parser.parseStyleDeclaration(new InputSource(new StringReader(cssSample)));
assertEquals("margin-top: 0cm; margin-bottom: 0cm; background: rgb(230, 230, 230)", o.toString());
assertEquals("0cm", o.getPropertyCSSValue("margin-bottom").toString());
assertEquals("0cm", o.getPropertyCSSValue("margin-bottom").getCssText());
assertEquals(null, o.getPropertyCSSValue("foo"));
}
@Test
public void testParseARule() throws IOException {
String cssSample = "r1 { margin-top: 0cm; margin-bottom: 0cm; background: #e6e6e6 }";
CSSOMParser parser = new CSSOMParser();
CSSRule o = parser.parseRule(new InputSource(new StringReader(cssSample)));
assertEquals("r1 { margin-top: 0cm; margin-bottom: 0cm; background: rgb(230, 230, 230) }", o.toString());
}
@Test
public void parseStyleDeclarationWithAdvancedTests() throws IOException {
String cssSample = "margin-top: 0 cm; margin-bottom: 0cm; background: #e6e6e6";
CSSOMParser parser = new CSSOMParser();
CSSStyleDeclaration o = parser.parseStyleDeclaration(new InputSource(new StringReader(cssSample)));
assertEquals("margin-top: 0 cm; margin-bottom: 0cm; background: rgb(230, 230, 230)", o.toString());
assertEquals("0cm", o.getPropertyCSSValue("margin-bottom").toString());
assertEquals("0cm", o.getPropertyCSSValue("margin-bottom").getCssText());
assertEquals(CSSValue.CSS_VALUE_LIST, o.getPropertyCSSValue("margin-top").getCssValueType());
assertEquals("0 cm", o.getPropertyCSSValue("margin-top").toString());
assertEquals("0 cm", o.getPropertyCSSValue("margin-top").getCssText());
assertEquals(CSSValue.CSS_VALUE_LIST, o.getPropertyCSSValue("margin-top").getCssValueType());
}
}
Big advantage of CSSParser 8 is that it is currently in Maven. So if 7 you look for something rather simple and 6 straightforwardly usable CSSParser seems 5 to be good option.
Notes: it does automatic 4 conversion for colors from hex format to 3 rgb() format, but provides no help with 2 sizes with units, it sees them as list of 1 values! Not so good.
I just rolled out my own CSS Stream Parser 2 for Java, available on github. What sets this 1 parser apart includes:
- It is a stream parser, so the parser handler will receive notification of all new content immediately after each item has been parsed
- Full support for all currently-documented At-Rules
- Custom classes
TokenSequence
andToken
simplify processes for handling selectors, etc. - Easy to use and to understand
- Useful for validation or for more advanced applications
- Scalable: designed to be able to handle changes to CSS definitions.
More Related questions
We use cookies to improve the performance of the site. By staying on our site, you agree to the terms of use of cookies.