Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Looking for a CSS Parser in java [closed]

Tags:

java

css

parsing

I'm looking for a CSS Parser in java. In particular my requirement is, for a given node/element in an HTML document, to be able to ask/get the css styles for that element from the Parser.

I know there is the W3C SAC interface and one or 2 implementations based on this - but turorials/examples appear non-existant.

Any help/points in right direction much appreciated.

Thanks

like image 992
Richard H Avatar asked Oct 03 '09 12:10

Richard H


People also ask

Where does eclipse keep CSS files?

It can reside in the same folder where your html/jsp page resides, or it can reside in any sub folder within that too. But accordingly to you have to specify the path. Deploy them in subdirectories under "[your-project]/WebContent". I usually name the subdirectories "js" and "css".

Can you add CSS to Java?

Java objects are not HTML documents. The CSS2 syntax remains, so that a CSS editor can still be used to create the style sheet. However, the differences lead to adaptations of the CSS mechanism so that its power can be fully exploited and directed to some specific behavior.

What is a CSS parser?

Overview. The CSS Parser is implemented as a package of Java classes, that inputs Cascading Style Sheets source text and outputs a Document Object Model Level 2 Style tree. Alternatively, applications can use SAC: The Simple API for CSS.

How is a CSS selector parsed?

Essentially, we parse through any CSS selectors we have and assign them their place in the tree. If there's a single selector, it will be attached to the root node of the tree. Nested selectors will be attached to the node which they are nested underneath.


1 Answers

I've used CSSParser and I like it- it gives good feedback on errors as well.

Here's some sample 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;      }  } 
like image 79
Gene Myers Avatar answered Oct 03 '22 08:10

Gene Myers