kjah_1 2009-10-09 16:58
浏览 275
已采纳

求个sac解析css的例子,或Flute、Batik、CSSParser解析css例子


http://www.w3.org/Style/CSS/SAC/

 

SAC 1.3: Java Implementation

  • SAC 1.3 (Download)
  • SAC 1.3 Online javadoc documentation (Download)
  • Some SAC implementation in Java:
    • Flute 1.2 (download) (W3C). This implementation is using JavaCC.
    • Batik SAC 1.2 CSS Parser (Apache). Smaller and faster than flute! Only available on the Apache CVS server.
    • CSS Parser (David Schweinsberg). The CSS Parser, very soon to be updated to SAC 1.3, is implemented as a package of Java classes, that inputs Cascading Style Sheets Level 2 source text and outputs a Document Object Model Level 2 Style tree. Alternatively, applications can use SAC: The Simple API for CSS. Its purpose is to allow developers working with Java to incorporate Cascading Style Sheet information, primarily in conjunction with XML application developments.



问题补充:
问下lovewhzlq

提供的例子中
87行和142行
processFilter(selectors, new Filter<String>()

中的Filter类是哪儿的,我试了几个都不行
  • 写回答

5条回答 默认 最新

  • wanghaolovezlq 2009-10-12 10:41
    关注

    [code="java"]

    import java.io.IOException;
    import java.io.Reader;
    import java.util.ArrayList;
    import java.util.List;

    import org.apache.log4j.Logger;
    import org.w3c.css.sac.InputSource;
    import org.w3c.dom.css.CSSImportRule;
    import org.w3c.dom.css.CSSRule;
    import org.w3c.dom.css.CSSRuleList;
    import org.w3c.dom.css.CSSStyleRule;
    import org.w3c.dom.css.CSSStyleSheet;

    import com.steadystate.css.parser.CSSOMParser;

    public class CSSParserUtils
    {
    private static Logger log = Logger.getLogger(CSSParserUtils.class);
    public static String URIPath = "file:///" + "";

    /**
     * 测试之用
     *
     * @param args
     */
    public static void main(String[] args)
    {
        System.out.println(parserCSSSelectors("F:/index.css"));
    
    }
    
    /**
     * 解析给定的url对应的页面文件中的css选择器
     *
     * @param url   给定页面文件url
     * @return  css选择器列表
     */
    public static List<String> parserCSSSelectors(String url)
    {
        return parserCSSSelectors(null, url);
    }
    
    /**
     * 合并两个方法成一个通用的方法
     *
     * @param read  如果不为null,则以它为主
     * @param url   如果不为null,则表示页面文件的url
     * @return  css选择器列表
     */
    public static List<String> parserCSSSelectors(Reader read, String url)
    {
        CSSOMParser cssparser = new CSSOMParser();
        CSSStyleSheet css = null;
        try
        {
            if (read == null)
                css = cssparser.parseStyleSheet(new InputSource(URIPath + url), null, null);
            else
                css = cssparser.parseStyleSheet(new InputSource(read), null, null);
        } catch (IOException e)
        {
            log.error("解析css文件异常", e);
            return null;
        }
    
        return parseCSSGeneral(url, css);
    }
    
    private static List<String> parseCSSGeneral(String url, CSSStyleSheet css)
    {
        CSSRuleList cssrules = css.getCssRules();
    
        if (cssrules == null)
            return null;
    
        List<String> selectors = new ArrayList<String>();
        for (int i = 0; i < cssrules.getLength(); i++)
        {
            CSSRule rule = cssrules.item(i);
            if (rule instanceof CSSStyleRule)
            {
                CSSStyleRule cssrule = (CSSStyleRule) rule;
    
                processFilter(selectors, new Filter<String>()
                {
    
                    public void accept(List<String> list, String t)
                    {
                        if (t.indexOf(".") != -1)
                        {
                            String[] result = t.split("\\s");
                            for (int x = 0; x < result.length; x++)
                            {
                                int index = result[x].indexOf(".");
                                if (index != -1)
                                {
                                    list.add(result[x].substring(index + 1));
                                }
                            }
    
                        }
    
                    }
    
                }, cssrule.getSelectorText());
            }
            else if (rule instanceof CSSImportRule)
            {
                CSSImportRule cssrule = (CSSImportRule) rule;
                selectors.addAll(parserCSSSelectors(processURL(url, cssrule.getHref())));
            }
    
        }
        return selectors;
    }
    
    /**
     * 处理url
     *
     * @param url   原始url
     * @param dest  目标url
     * @return
     */
    public static String processURL(String url, String dest)
    {
        int indexWin = url.lastIndexOf("\\");
        int indexUnix = url.lastIndexOf("/");
    
        int index = indexWin == -1 ? indexUnix : indexWin;
        if (index != -1)
        {
            String ret = url.substring(0, index) + "/" + dest;
            return ret;
        }
    
        return dest;
    }
    
    public static void processFilter(List<String> selectors, Filter<String> selectorFilter,
                    String selectorText)
    {
        selectorFilter.accept(selectors, selectorText);
    }
    

    }

    [/code]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

悬赏问题

  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?
  • ¥100 求三轴之间相互配合画圆以及直线的算法
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题