34 votes

Recherche d'un analyseur CSS en java

Je recherche un analyseur CSS en java. En particulier, mon exigence est, pour un nœud / élément donné dans un document HTML, de pouvoir demander / obtenir les styles CSS pour cet élément à partir de l'analyseur.

Je sais qu'il y a l'interface W3C SAC et une ou deux implémentations basées sur cela - mais les turorials / exemples semblent inexistants.

Toute aide / point dans la bonne direction est très appréciée.

Merci

17voto

Gene M. Points 765

J'ai utilisé CSSParser et je l'aime bien - cela donne également de bons commentaires sur les erreurs.

Voici un exemple de code que j'ai trouvé et modifié:

 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;

    }

}
 

15voto

Philip Helger Points 880

Un CSS bibliothèque pour la lecture et l'écriture CSS2 et CSS3 fichiers en Java est phloc-css à partir de http://code.google.com/p/phloc-css/ Il est basé sur un JavaCC grammaire et prend en charge les CSS2 ainsi que le CSS3 et en plus vous permet d'analyser HTML attributs de style.

  • Il prend en charge la plupart des communes hacks "*", "_" et "$" qui ne sont pas conformes à la spéc
  • Il prend en charge CSS mathématiques - le calc() expression
  • Il prend en charge la page @règle
  • Il prend en charge CSS3 media queries
  • Il prend en charge @viewport règles
  • Il prend en charge @keyframes règles
  • Il prend en charge @soutient des règles tout à fait nouveau
  • Il prend en charge l' @namespace règles
  • Vous pouvez obtenir l'emplacement de la source de l'information pour les différents éléments (ligne + numéro de colonne pour le début et la fin - à la fois pour l'étiquette ainsi que pour l'intégralité de la construction)

Depuis le 21 Mai, 2013 un JDK 1.5 version est également disponible, ce qui le rend plus intéressant pour le développement Android

12voto

corgrath Points 1742

J'avais besoin d'un analyseur CSS pour un propre projet, mais j'ai trouvé que "CSSParser" était trop fastidieux et rigide pour travailler avec (mais cela aurait pu être juste moi), alors j'ai fini par écrire mon propre analyseur CSS simple mais fonctionnel.

N'hésitez pas à l'utiliser si vous le souhaitez :-)

Analyseur CSS OSBCP

4voto

Juraj Blahunka Points 5620

un ajout à cssparser.sourcefourge.net,

Cobra:

http://lobobrowser.org/cobra.jsp

4voto

Dmitry Negoda Points 1318

Découvrez SAC et ses implémentations ici: http://www.w3.org/Style/CSS/SAC/

CSSParser est un peu obsolète

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X