Ejemplo n.º 1
0
  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();
  }
Ejemplo n.º 2
0
 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;
   }
 }
Ejemplo n.º 3
0
 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);
 }
Ejemplo n.º 4
0
 // 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");
 }
Ejemplo n.º 5
0
  /*
   * 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;
  }
Ejemplo n.º 6
0
  public Ruleset parse(String sheet) throws SAXException {
    CSSTextScanner scan = new CSSTextScanner(sheet);
    scan.skipWhitespace();

    return parseRuleset(scan);
  }