/**
   * given a string that denotes the properties of one or more selectors, parse further into
   * name/value pairs and call documentHandler's property callback.
   */
  private void _handlePropertiesString(SkinCSSDocumentHandler documentHandler, String properties) {
    if (properties == null) return;

    // first, parse out any comments
    Matcher matcher = _COMMENT_PATTERN.matcher(properties);
    properties = matcher.replaceAll("");
    // split into name and value (don't skip whitespace since properties like padding: 0px 5px
    // need the spaces)
    String[] property = _splitString(properties, ';', false);

    for (int i = 0; i < property.length; i++) {
      int indexOfColon = property[i].indexOf(':');
      if ((indexOfColon > -1) && (indexOfColon < property[i].length())) {
        String name = property[i].substring(0, indexOfColon);
        String value = property[i].substring(indexOfColon + 1);
        documentHandler.property(name.trim(), value.trim());
      }
    }
  }
  public void parseCSSDocument(Reader in, SkinCSSDocumentHandler documentHandler) {

    try {
      CSSScanner scanner = new CSSScanner(in);
      documentHandler.startDocument();
      List<String> selectorList = null;

      // start scanning the document
      // return comments /* xxx */
      // return @rules, which end with ';'
      // return selectors, which end with a {
      // return properties, which end with a }
      int currentType = _nextIgnoreSpaces(scanner);

      while (currentType != CSSLexicalUnits.EOF) {
        if (currentType == CSSLexicalUnits.COMMENT)
          documentHandler.comment(scanner.getStringValue());
        else if (currentType == CSSLexicalUnits.AT_KEYWORD)
          documentHandler.atRule(scanner.getStringValue());
        else if (currentType == CSSLexicalUnits.LEFT_CURLY_BRACE) {
          documentHandler.startSelector();
          selectorList = _parseSelectorString(scanner.getStringValue());
        } else if (currentType == CSSLexicalUnits.RIGHT_CURLY_BRACE) {
          String properties = scanner.getStringValue();
          _handlePropertiesString(documentHandler, properties);
          if (selectorList == null) {
            if (_LOG.isWarning()) {
              _LOG.warning("IGNORING_PROPERTIES_WITHOUT_SELECTOR", properties);
            }
          }
          documentHandler.endSelector(selectorList);
        }
        currentType = _nextIgnoreSpaces(scanner);
      }
    } finally {
      documentHandler.endDocument();
    }
  }