private void parseAtRule(Ruleset ruleset, CSSTextScanner scan) throws SAXException { String atKeyword = scan.nextIdentifier(); scan.skipWhitespace(); if (atKeyword == null) throw new SAXException("Invalid '@' rule in <style> element"); if (!inMediaRule && atKeyword.equals("media")) { List<MediaType> mediaList = parseMediaList(scan); if (!scan.consume('{')) throw new SAXException("Invalid @media rule: missing rule set"); scan.skipWhitespace(); if (mediaMatches(mediaList, rendererMediaType)) { inMediaRule = true; ruleset.addAll(parseRuleset(scan)); inMediaRule = false; } else { parseRuleset(scan); // parse and ignore accompanying ruleset } if (!scan.consume('}')) throw new SAXException("Invalid @media rule: expected '}' at end of rule set"); // } else if (atKeyword.equals("charset")) { // } else if (atKeyword.equals("import")) { } else { // Unknown/unsupported at-rule warn("Ignoring @%s rule", atKeyword); skipAtRule(scan); } scan.skipWhitespace(); }
private boolean parseRule(Ruleset ruleset, CSSTextScanner scan) throws SAXException { List<Selector> selectors = parseSelectorGroup(scan); if (selectors != null && !selectors.isEmpty()) { if (!scan.consume('{')) throw new SAXException("Malformed rule block in <style> element: missing '{'"); scan.skipWhitespace(); SVG.Style ruleStyle = parseDeclarations(scan); scan.skipWhitespace(); for (Selector selector : selectors) { ruleset.add(new Rule(selector, ruleStyle)); } return true; } else { return false; } }
public static boolean mediaMatches(String mediaListStr, MediaType rendererMediaType) throws SAXException { CSSTextScanner scan = new CSSTextScanner(mediaListStr); scan.skipWhitespace(); List<MediaType> mediaList = parseMediaList(scan); if (!scan.empty()) throw new SAXException("Invalid @media type list"); return mediaMatches(mediaList, rendererMediaType); }
// Parse a list of private SVG.Style parseDeclarations(CSSTextScanner scan) throws SAXException { SVG.Style ruleStyle = new SVG.Style(); while (true) { String propertyName = scan.nextIdentifier(); scan.skipWhitespace(); if (!scan.consume(':')) break; // Syntax error. Stop processing CSS rules. scan.skipWhitespace(); String propertyValue = scan.nextPropertyValue(); if (propertyValue == null) break; // Syntax error // Check for !important flag. scan.skipWhitespace(); if (scan.consume('!')) { scan.skipWhitespace(); if (!scan.consume("important")) { throw new SAXException("Malformed rule set in <style> element: found unexpected '!'"); } // We don't do anything with these. We just ignore them. scan.skipWhitespace(); } scan.consume(';'); SVGParser.processStyleProperty(ruleStyle, propertyName, propertyValue); scan.skipWhitespace(); if (scan.consume('}')) return ruleStyle; if (scan.empty()) break; } throw new SAXException("Malformed rule set in <style> element"); }
/* * Used by SVGParser to parse the "class" attribute. */ protected static List<String> parseClassAttribute(String val) throws SAXException { CSSTextScanner scan = new CSSTextScanner(val); List<String> classNameList = null; while (!scan.empty()) { String className = scan.nextIdentifier(); if (className == null) throw new SAXException("Invalid value for \"class\" attribute: " + val); if (classNameList == null) classNameList = new ArrayList<String>(); classNameList.add(className); scan.skipWhitespace(); } return classNameList; }
public Ruleset parse(String sheet) throws SAXException { CSSTextScanner scan = new CSSTextScanner(sheet); scan.skipWhitespace(); return parseRuleset(scan); }