Buscando un analizador de CSS en java

Estoy buscando un analizador CSS en Java. En particular, mi requisito es, para un nodo / elemento dado en un documento HTML, poder preguntar / obtener los estilos CSS para ese elemento del analizador.

Sé que existe la interfaz W3C SAC y una o dos implementaciones basadas en esto, pero turorials / examples parecen inexistentes.

Cualquier ayuda / puntos en la dirección correcta es muy apreciada.

Gracias

He usado CSSParser y me gusta, también da buenos comentarios sobre los errores.

Aquí hay un código de muestra que he encontrado y modificado:

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; } } 

Una biblioteca CSS para leer y escribir archivos CSS2 y CSS3 en Java es ph-css de https://github.com/phax/ph-css Está basada en una gramática JavaCC y es compatible tanto con CSS2 como con CSS3 y además le permite analizar atributos de estilo HTML.

  • Admite los hacks “*”, “_” y “$” más comunes que no cumplen con las especificaciones
  • Es compatible con las matemáticas CSS: la expresión calc ()
  • Es compatible con la regla @page
  • Es compatible con las consultas de medios de CSS3
  • Es compatible con las reglas @viewport
  • Es compatible con las reglas @keyframes
  • Admite reglas de @supports – bastante nuevo
  • Es compatible con las reglas de @namespace
  • Puede obtener información de ubicación de origen para los diferentes elementos (línea + número de columna para el inicio y el final, tanto para la etiqueta como para la construcción completa)

Desde el 21 de mayo de 2013 también está disponible una versión JDK 1.5, lo que la hace más interesante para el desarrollo de Android

Necesitaba un analizador de CSS para un proyecto propio, pero encontré que “CSSParser” era demasiado tedioso e inflexible para trabajar (pero podía ser solo yo), así que terminé escribiendo mi propio analizador de CSS simple pero funcional.

Siéntete libre de usarlo si quieres 🙂

OSBCP CSS Parser

una adición a cssparser.sourcefourge.net,

Cobra:

http://lobobrowser.org/cobra.jsp

Consulte SAC y sus implementaciones aquí: http://www.w3.org/Style/CSS/SAC/

CSSParser está un poco desactualizado

jStyleParser proporciona exactamente esta funcionalidad. Analiza todas las hojas de estilo referenciadas y las asigna a los nodos del árbol DOM.

Si tiene problemas con CSSParser, porque parece que no hay documentación, y tal vez quiera analizar solo una cadena de CSS, como el valor del parámetro de estilo, aquí está mi simple muestra de uso:

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

La gran ventaja de CSSParser es que actualmente se encuentra en Maven. Entonces, si buscas algo bastante simple y directamente utilizable CSSParser parece ser una buena opción.

Notas: realiza la conversión automática de colores del formato hexadecimal al formato rgb (), pero no proporciona ayuda con los tamaños con unidades, ¡los ve como una lista de valores! No tan bien.

Acabo de instalar mi propio analizador de flujo CSS para Java, disponible en github . Lo que diferencia a este analizador incluye:

  • Es un analizador de flujo, por lo que el controlador del analizador recibirá una notificación de todo el contenido nuevo inmediatamente después de que se haya analizado cada elemento.
  • Soporte completo para todas las reglas At actualmente documentadas
  • Las clases personalizadas TokenSequence y Token simplifican los procesos para manejar selectores, etc.
  • Fácil de usar y entender
  • Útil para validación o para aplicaciones más avanzadas
  • Escalable: diseñado para poder manejar cambios en las definiciones de CSS.