求个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类是哪儿的,我试了几个都不行

[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]

http://sourceforge.net/projects/cssparser/files/下载cssparser-0.9.4.tar.gz,这里有实例和源码,是sac的。

希望答案早日水落石出, :lol: 观望中……

不好意思,忘记给出代码了,我自己封装的过滤器

[code="java"]

import java.util.List;

public interface Filter
{
public void accept(List list, T t);

}
[/code]

我这个通用类是用于解析css得到所有的类选择器(也就是 .xxx{xxx})