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