All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.w3c.css.parser.analyzer.CssParser Maven / Gradle / Ivy

The newest version!
/* Generated By:JavaCC: Do not edit this line. CssParser.java */
package org.w3c.css.parser.analyzer;

import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.Vector;
import java.util.Enumeration;
import java.net.URL;

import org.w3c.css.values.CssValue;
import org.w3c.css.values.CssExpression;
import org.w3c.css.values.CssString;
import org.w3c.css.values.CssURL;
import org.w3c.css.values.CssLength;
import org.w3c.css.values.CssNumber;
import org.w3c.css.values.CssColor;
import org.w3c.css.values.CssIdent;
import org.w3c.css.values.CssPercentage;
import org.w3c.css.values.CssFrequency;
import org.w3c.css.values.CssTime;
import org.w3c.css.values.CssDate;
import org.w3c.css.values.CssAngle;
import org.w3c.css.values.CssFunction;
import org.w3c.css.values.CssUnicodeRange;
import org.w3c.css.values.CssResolution;
import org.w3c.css.properties.css.CssProperty;
import org.w3c.css.parser.Frame;
import org.w3c.css.util.ApplContext;
import org.w3c.css.parser.CssError;
import org.w3c.css.parser.CssSelectors;
import org.w3c.css.parser.CssParseException;
import org.w3c.css.parser.AtRule;
import org.w3c.css.parser.AtRuleMedia;
import org.w3c.css.parser.AtRuleFontFace;
import org.w3c.css.parser.AtRulePage;
import org.w3c.css.parser.AtRulePreference;
import org.w3c.css.parser.AtRulePhoneticAlphabet;
import org.w3c.css.properties.svg.AtRuleColorProfile;
import org.w3c.css.util.InvalidParamException;
import org.w3c.css.util.Util;
import org.w3c.css.util.Messages;
import org.w3c.css.css.StyleSheetCom;

import org.w3c.css.selectors.AdjacentSiblingSelector;
import org.w3c.css.selectors.AttributeSelector;
import org.w3c.css.selectors.ChildSelector;
import org.w3c.css.selectors.ClassSelector;
import org.w3c.css.selectors.DescendantSelector;
import org.w3c.css.selectors.GeneralSiblingSelector;
import org.w3c.css.selectors.IdSelector;
import org.w3c.css.selectors.TypeSelector;
import org.w3c.css.selectors.UniversalSelector;
import org.w3c.css.selectors.attributes.AttributeAny;
import org.w3c.css.selectors.attributes.AttributeBegin;
import org.w3c.css.selectors.attributes.AttributeExact;
import org.w3c.css.selectors.attributes.AttributeOneOf;
import org.w3c.css.selectors.attributes.AttributeStart;
import org.w3c.css.selectors.attributes.AttributeSubstr;
import org.w3c.css.selectors.attributes.AttributeSuffix;

/**
 * A CSS3 parser  
 *
 * @author Philippe Le Hegaret and Sijtsche Smeman
 * @version $Revision: 1.70 $
 */
public abstract class CssParser implements CssParserConstants {

    private static char hexdigits[] = { '0', '1', '2', '3',
                                        '4', '5', '6', '7',
                                        '8', '9', 'a', 'b',
                                        'c', 'd', 'e', 'f' };
    // the current atRule
    protected AtRule atRule;
    protected String mediaDeclaration = "off";

    /**
     * The URL of the document
     */
    protected URL url;

    protected ApplContext ac;

    protected boolean incompatible_error;

    /**
     * The current context recognized by the parser (for errors).
     */
    protected Vector currentContext;

    /**
     * The current property recognized by the parser (for errors).
     */
    protected String currentProperty;

    /**
     * true if the parser should recognized Aural properties, 
     * false otherwise.
     */
    protected boolean mode;

    /**
     * true if the parser had recognize a rule,
     * false otherwise.
     */
    protected boolean markRule;

    private boolean reinited = false;
    private boolean charsetdeclared = false;

    static StringBuilder SPACE = new StringBuilder(" ");

    // to be able to remove a ruleset if the selector is not valid
    protected boolean validSelector = true;

    /**
     * The ac for handling errors and warnings.
     * 
     * @param ac the new ac for the parser.
     */
    public final void setApplContext(ApplContext ac) {
        this.ac = ac;
    }

    /**
     * Set the attribute atRule
     *
     * @param atRule the new value for the attribute
     */
    public void setAtRule(AtRule atRule) {
        this.atRule = atRule;
    }

    /**
     * Set the attribute mediaDeclaration
     *
     * @param mediaDeclaration indicator if in a media expression list or not
     */
    public void setMediaDeclaration(String mediadeclaration) {
        this.mediaDeclaration = mediadeclaration;
    }

    /**
     * Returns the attribute mediaDeclaration
     *
     * @return the value of the attribute
     */
    public String getMediaDeclaration() {
        return mediaDeclaration;
    }

    /**
     * Returns the attribute atRule
     *
     * @return the value of the attribute
     */
    public AtRule getAtRule() {
        return atRule;
    }

    /**
     * Reinitialized the parser.
     *
     * @param stream the stream data to parse.
     * @param ac  the new ac to use for parsing.
     */
    public void ReInitWithAc(InputStream stream, ApplContext ac,
                             String charset)
    {
        if (charset == null) {
            charset = "iso-8859-1";
        }
        InputStreamReader isr = null;
        try {
            isr = new InputStreamReader(stream, charset);
        } catch (UnsupportedEncodingException uex) {
            isr = new InputStreamReader(stream);
        }
        // reinit, it can not happen...
        // ...in theory ;)
        ReInit(isr);
        markRule = false;
        reinited = true;
        setApplContext(ac);
    }

    /* utilities for a parser */

    /**
     * Call by the import statement.
     *
     * @param url  The style sheet where this import statement appears.
     * @param file the file name in the import
     */
    public abstract void handleImport(URL url, String file,
                                      boolean is_url, AtRuleMedia media);

    /**
     * Call by the namespace declaration statement.
     *
     * @param url  The style sheet where this namespace statement appears.
     * @param file the file/url name in the namespace declaration
     */
    public abstract void handleNamespaceDeclaration(URL url, String prefix,
                                                    String file,
                                                    boolean is_url);

    /**
     * Call by the at-rule statement.
     *
     * @param ident  The ident for this at-rule (for example: 'font-face')
     * @param string The string associate to this at-rule
     * @see          org.w3c.css.parser.Analyzer.Couple
     */
    public abstract void handleAtRule(String ident, String string);

    /* added by Sijtsche Smeman */
    public abstract void addCharSet(String charset);
    public abstract void newAtRule(AtRule atRule);
    public abstract void endOfAtRule();
    public abstract void setImportant(boolean important);
    public abstract void setSelectorList(Vector selectors);
    public abstract void addProperty(Vector properties);
    public abstract void endOfRule();
    public abstract void removeThisRule();
    public abstract void removeThisAtRule();

    /**
     * Assign an expression to a property.  This function create a new property
     * with property and assign to it the expression with the
     * importance. Don't forget to set informations too.
     * 

* A subclass must provide an implementation of this method. * * @param property the name of the property * @param values the expression representation of values * @param important true if values are important * * @return nullor a property * * @see org.w3c.css.css.CssProperty */ public abstract CssProperty handleDeclaration(String property, CssExpression values, boolean important) throws InvalidParamException; /** * Adds a vector of properties to a selector. *

* A subclass must provide an implementation of this method. * * @param selector the selector * @param declarations Properties to associate with contexts */ public abstract void handleRule(CssSelectors selector, Vector declarations); /*Added by Sijtsche Smeman */ /** * Returns the source file of the style sheet */ public final String getSourceFile() { return getURL().toString(); } /** * Returns the current line in the style sheet */ public final int getLine() { //return token.beginLine; return 0; } /** * Set the URL of the style sheet. * * @param URL The URL for the style sheet */ public final void setURL(URL url) { this.url = url; } public final URL getURL() { return url; } /** * Return the next selector from the inputstream */ public CssSelectors parseSelector() throws ParseException { return externalSelector(); } /* * Add a value to an expression */ private void setValue(CssValue v, CssExpression expr, char operator, Token n, int token) throws ParseException { if (n != null) { if (ac.getCssVersion().equals("css1") && (n.image).equals("inherit")) { incompatible_error = true; } String val = (operator == ' ') ? n.image : operator+n.image; if (n.kind == CssParserConstants.IDENT) { v.set(convertIdent(val), ac); } else if (n.kind == CssParserConstants.STRING) { v.set(val, ac); } else { v.set(val, ac); } } expr.addValue(v); } /* * Error control */ private void addError(Exception e, String skippedText) { if (Util.onDebug) { System.err.println(e.getMessage()); e.printStackTrace(); } CssParseException ex = new CssParseException(e); ex.setSkippedString(skippedText); ex.setProperty(currentProperty); ex.setContexts(currentContext); CssError error = new CssError(getSourceFile(), getLine(), ex); ac.getFrame().addError(error); } /* * Error control 2 */ private void addError(Exception e, CssExpression exp) { if (Util.onDebug) { System.err.println(e.getMessage()); e.printStackTrace(); } // if ((exp != null) && (exp.getCount() != 0)) { CssParseException ex = new CssParseException(e); ex.setExp(exp); ex.setProperty(currentProperty); ex.setContexts(currentContext); CssError error = new CssError(getSourceFile(), getLine(), ex); ac.getFrame().addError(error); // } } // //TOKEN : //{ /* avoid token manager error */ // < UNKNOWN : ~[] > //} /* * The grammar of CSS2 */ /** * The main entry for the parser. * * @exception ParseException exception during the parse */ final public void parserUnit() throws ParseException { Token n = null; try { label_1: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case HTMLSTARTTAG: case HTMLENDTAG: ; break; default: jj_la1[0] = jj_gen; break label_1; } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case HTMLSTARTTAG: n = jj_consume_token(HTMLSTARTTAG); break; case HTMLENDTAG: n = jj_consume_token(HTMLENDTAG); break; default: jj_la1[1] = jj_gen; jj_consume_token(-1); throw new ParseException(); } addError ( new ParseException(ac.getMsg().getString("generator.dontmixhtml")), n.image); } label_2: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case CHARSET_SYM: ; break; default: jj_la1[2] = jj_gen; break label_2; } charset(); } label_3: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: case CDO: case CDC: ; break; default: jj_la1[3] = jj_gen; break label_3; } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: jj_consume_token(S); break; case CDO: jj_consume_token(CDO); break; case CDC: jj_consume_token(CDC); break; default: jj_la1[4] = jj_gen; jj_consume_token(-1); throw new ParseException(); } } label_4: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case IMPORT_SYM: ; break; default: jj_la1[5] = jj_gen; break label_4; } importDeclaration(); ignoreStatement(); } label_5: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case NAMESPACE_SYM: ; break; default: jj_la1[6] = jj_gen; break label_5; } namespaceDeclaration(); ignoreStatement(); } afterImportDeclaration(); jj_consume_token(0); } catch (TokenMgrError err) { addError (new ParseException(ac.getMsg().getString("generator.unrecognize")), err.getMessage()); } } final public void charset() throws ParseException { Token n = null; Token charsetToken = null; Token space1Token = null; Token space2Token = null; Token semicolonToken = null; int nb_S = 0; try { charsetToken = jj_consume_token(CHARSET_SYM); label_6: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[7] = jj_gen; break label_6; } space1Token = jj_consume_token(S); nb_S++; } n = jj_consume_token(STRING); label_7: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[8] = jj_gen; break label_7; } space2Token = jj_consume_token(S); } semicolonToken = jj_consume_token(SEMICOLON); if (charsetdeclared && !reinited) { {if (true) throw new ParseException( ac.getMsg().getString("parser.charset"));} } // the @charset must be at the beginning of the document if(charsetToken.beginLine != 1 || charsetToken.beginColumn != 1) { {if (true) throw new ParseException( ac.getMsg().getString("parser.charset"));} } if ("css1".equals(ac.getCssVersion())) { {if (true) throw new ParseException(ac.getMsg().getString( "parser.charsetcss1"));} } // stricter rule for CSS21 and soon for CSS3 if ("css21".equals(ac.getCssVersion())) { // single space before // case sensitive // no space before ; // no comments // string must start with " if ( (nb_S != 1) || (!"@charset".equals(charsetToken.image)) || (!" ".equals(space1Token.image)) || (space2Token != null && !"".equals(space2Token.image)) || (space1Token.specialToken != null) || (n.specialToken != null) || (semicolonToken.specialToken != null) || (n.image.charAt(0) != '\u005c"') ) { {if (true) throw new ParseException(ac.getMsg().getString( "parser.charsetspecial"));} } } if (!charsetdeclared) { addCharSet(n.image.substring(1, n.image.length()-1)); charsetdeclared = true; } else { reinited = false; } } catch (Exception e) { String skip = charsetToken + ((space1Token == null) ? "" : space1Token.image) + n + ((space2Token == null) ? "" : space2Token.image) + ";"; addError(e, skip); } } final public void afterImportDeclaration() throws ParseException { String ret; label_8: while (true) { ; switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case IDENT: case HASHIDENT: case HASH: case LBRACKET: case ANY: case COLON: case LENGTH: case EMS: case EXS: case ANGLE: case TIME: case FREQ: case RESOLUTION: case DIMEN: case PSEUDOELEMENT_SYM: case CLASS: case FUNCTIONNOT: case 98: ruleSet(); break; case MEDIA_SYM: media(); break; case PAGE_SYM: page(); break; case FONT_FACE_SYM: fontFace(); break; case PREF_SYM: preference(); break; case COLOR_PROFILE: colorprofile(); break; case PHONETIC_ALPHABET_SYM: phoneticAlphabet(); break; default: jj_la1[9] = jj_gen; ret = skipStatement(); if ((ret == null) || (ret.length() == 0)) { {if (true) return;} } // quite ugly but necessary to avoid probably a lot of changes in the // grammar, still having a beautiful error message else if (ret.startsWith("@charset")) { ParseException e = new ParseException(ac.getMsg().getString("parser.charset")); addError(e, ret); } else if (ret.startsWith("@import")) { ParseException e = new ParseException(ac.getMsg().getString("parser.import_not_allowed")); addError(e, ret); } else { ParseException e = new ParseException(ac.getMsg().getString("generator.unrecognize")); addError(e, ret); } } ignoreStatement(); } } final public void ignoreStatement() throws ParseException { label_9: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case CDO: case CDC: case ATKEYWORD: ; break; default: jj_la1[10] = jj_gen; break label_9; } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case CDO: jj_consume_token(CDO); break; case CDC: jj_consume_token(CDC); break; case ATKEYWORD: atRuleDeclaration(); break; default: jj_la1[11] = jj_gen; jj_consume_token(-1); throw new ParseException(); } label_10: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[12] = jj_gen; break label_10; } jj_consume_token(S); } } } final public void namespaceDeclaration() throws ParseException { Token n=null; Token v=null; boolean is_url; /* for formatting */ String nsname; String prefix = null; CssValue val; jj_consume_token(NAMESPACE_SYM); label_11: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[13] = jj_gen; break label_11; } jj_consume_token(S); } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case IDENT: n = jj_consume_token(IDENT); prefix = convertIdent(n.image); label_12: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[14] = jj_gen; break label_12; } jj_consume_token(S); } break; default: jj_la1[15] = jj_gen; ; } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case STRING: v = jj_consume_token(STRING); is_url = false; nsname = v.image.substring(1, v.image.length()-1); break; case URL: v = jj_consume_token(URL); is_url = true; val = new CssURL(); ((CssURL) val).set(v.image, ac, url); nsname = (String) val.get(); if ((nsname.charAt(0) == '"') || (nsname.charAt(0) == '\u005c'')) { nsname = nsname.substring(1, nsname.length()-1); } break; default: jj_la1[16] = jj_gen; jj_consume_token(-1); throw new ParseException(); } label_13: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[17] = jj_gen; break label_13; } jj_consume_token(S); } jj_consume_token(SEMICOLON); label_14: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[18] = jj_gen; break label_14; } jj_consume_token(S); } if (!ac.getCssVersion().equals("css3")) { addError(new InvalidParamException("at-rule", "@namespace", ac), (n==null)?"default":n.toString()); } else { if (v != null) { handleNamespaceDeclaration(getURL(), prefix, nsname, is_url); } } } /** * The import statement * * @exception ParseException exception during the parse */ final public void importDeclaration() throws ParseException { Token n; AtRuleMedia media = new AtRuleMedia(); CssValue val; String importFile; boolean is_url = false; try { jj_consume_token(IMPORT_SYM); label_15: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[19] = jj_gen; break label_15; } jj_consume_token(S); } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case STRING: n = jj_consume_token(STRING); importFile = n.image.substring(1, n.image.length() -1); is_url = false; break; case URL: n = jj_consume_token(URL); val = new CssURL(); ((CssURL) val).set(n.image, ac, url); importFile = (String) val.get(); if ((importFile.charAt(0) == '"') || (importFile.charAt(0) == '\u005c'')) { importFile = importFile.substring(1, importFile.length()-1); } is_url = true; break; default: jj_la1[20] = jj_gen; jj_consume_token(-1); throw new ParseException(); } label_16: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[21] = jj_gen; break label_16; } jj_consume_token(S); } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case IDENT: medium(media); label_17: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case COMMA: ; break; default: jj_la1[22] = jj_gen; break label_17; } jj_consume_token(COMMA); label_18: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[23] = jj_gen; break label_18; } jj_consume_token(S); } medium(media); } break; default: jj_la1[24] = jj_gen; ; } jj_consume_token(SEMICOLON); label_19: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[25] = jj_gen; break label_19; } jj_consume_token(S); } handleImport(getURL(), importFile, is_url, media); } catch (ParseException e) { addError(e, skipStatement()); } } /** * @exception ParseException exception during the parse */ final public void media() throws ParseException { AtRule old = getAtRule(); AtRuleMedia newRule = new AtRuleMedia(); setAtRule(newRule); Token n; CssProperty p = null; try { jj_consume_token(MEDIA_SYM); label_20: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[26] = jj_gen; break label_20; } jj_consume_token(S); } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case MEDIARESTRICTOR: n = jj_consume_token(MEDIARESTRICTOR); newRule.addMediaRestrictor(convertIdent(n.image), ac); label_21: while (true) { jj_consume_token(S); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[27] = jj_gen; break label_21; } } break; default: jj_la1[28] = jj_gen; ; } medium(newRule); label_22: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case COMMA: ; break; default: jj_la1[29] = jj_gen; break label_22; } jj_consume_token(COMMA); label_23: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[30] = jj_gen; break label_23; } jj_consume_token(S); } medium(newRule); } label_24: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case AND: ; break; default: jj_la1[31] = jj_gen; break label_24; } jj_consume_token(AND); label_25: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[32] = jj_gen; break label_25; } jj_consume_token(S); } jj_consume_token(RPARAN); label_26: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[33] = jj_gen; break label_26; } jj_consume_token(S); } p = mediadeclaration(); newRule.addMediaFeature(p); jj_consume_token(LPARAN); label_27: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[34] = jj_gen; break label_27; } jj_consume_token(S); } } String media = getAtRule().toString(); if (ac.getMedium() != null && !(media.equals(ac.getMedium())) && !(ac.getMedium().equals("all"))) { ac.getFrame().addWarning("noothermedium", getAtRule().toString()); } if (ac.getCssVersion().equals("css1")) { skipStatement(); addError(new InvalidParamException("noatruleyet", "", ac), getAtRule().toString()); } if (!ac.getCssVersion().equals("css1")) { newAtRule(getAtRule()); } jj_consume_token(LBRACE); label_28: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[35] = jj_gen; break label_28; } jj_consume_token(S); } label_29: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case IDENT: case HASHIDENT: case HASH: case LBRACKET: case ANY: case COLON: case LENGTH: case EMS: case EXS: case ANGLE: case TIME: case FREQ: case RESOLUTION: case DIMEN: case PSEUDOELEMENT_SYM: case CLASS: case FUNCTIONNOT: case 98: ; break; default: jj_la1[36] = jj_gen; break label_29; } ruleSet(); } jj_consume_token(RBRACE); label_30: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[37] = jj_gen; break label_30; } jj_consume_token(S); } if (!ac.getCssVersion().equals("css1")) { endOfAtRule(); } } catch (ParseException e) { if (!ac.getCssVersion().equals("css1")) { addError(e, skipStatement()); } } finally { setAtRule(old); } } /** * @exception ParseException exception during the parse */ final public void medium(AtRuleMedia media) throws ParseException { Token n; n = jj_consume_token(IDENT); label_31: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[38] = jj_gen; break label_31; } jj_consume_token(S); } try { media.addMedia(convertIdent(n.image), ac); } catch (InvalidParamException e) { CssError error = new CssError(getSourceFile(), getLine(), e); ac.getFrame().addError(error); } } final public void unused_production_generic_syntax() throws ParseException { CssExpression values = new CssExpression(); jj_consume_token(RPARAN); label_32: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[39] = jj_gen; break label_32; } jj_consume_token(S); } term(values); jj_consume_token(LPARAN); } final public void definition() throws ParseException { CssExpression values = new CssExpression(); jj_consume_token(LBRACKET); label_33: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[40] = jj_gen; break label_33; } jj_consume_token(S); } term(values); jj_consume_token(RBRACKET); } /** * @exception ParseException exception during the parse */ final public void page() throws ParseException { Vector v ; Token n = null ; Vector collectv = new Vector() ; CssSelectors s = new CssSelectors(ac); AtRule old = getAtRule() ; AtRulePage newRule = new AtRulePage() ; setAtRule(newRule); s.setAtRule(getAtRule()); try { jj_consume_token(PAGE_SYM); label_34: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[41] = jj_gen; break label_34; } jj_consume_token(S); } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case IDENT: n = jj_consume_token(IDENT); newRule.setIdent(convertIdent(n.image)); label_35: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[42] = jj_gen; break label_35; } jj_consume_token(S); } break; default: jj_la1[43] = jj_gen; ; } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case COLON: pseudo_page(newRule); break; default: jj_la1[44] = jj_gen; ; } jj_consume_token(LBRACE); label_36: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[45] = jj_gen; break label_36; } jj_consume_token(S); } v = pageContent(); collectv = v; jj_consume_token(RBRACE); label_37: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[46] = jj_gen; break label_37; } jj_consume_token(S); } if (!ac.getCssVersion().equals("css1")) { newAtRule(getAtRule()); } if (!ac.getCssVersion().equals("css1")) { addProperty(collectv); endOfRule(); endOfAtRule(); } if (v == null) { ac.getFrame().addWarning("no-declaration"); } else { handleRule(s, collectv); } } catch (InvalidParamException ie) { if (!ac.getCssVersion().equals("css1")) { skipStatement(); removeThisAtRule(); ac.getFrame().addError(new CssError(ie)); } } catch (ParseException e) { if (!ac.getCssVersion().equals("css1")) { removeThisAtRule(); addError(e, skipStatement()); } } finally { setAtRule(old); } } final public Vector pageContent() throws ParseException { CssProperty prop; Vector v = new Vector(); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case ATTOP: case ATRIGHT: case ATBOTTOM: case ATLEFT: // ?? FIXME v = prefAtRule(); {if (true) return v;} break; default: jj_la1[47] = jj_gen; v = declarations(); {if (true) return v;} } throw new Error("Missing return statement in function"); } final public Vector prefAtRule() throws ParseException { Token n; Vector v; try { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case ATTOP: n = jj_consume_token(ATTOP); break; case ATBOTTOM: n = jj_consume_token(ATBOTTOM); break; case ATLEFT: n = jj_consume_token(ATLEFT); break; case ATRIGHT: n = jj_consume_token(ATRIGHT); break; default: jj_la1[48] = jj_gen; jj_consume_token(-1); throw new ParseException(); } label_38: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[49] = jj_gen; break label_38; } jj_consume_token(S); } jj_consume_token(LBRACE); label_39: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[50] = jj_gen; break label_39; } jj_consume_token(S); } v = declarations(); jj_consume_token(RBRACE); label_40: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[51] = jj_gen; break label_40; } jj_consume_token(S); } {if (true) return v;} } catch (ParseException e) { addError(e, skipStatement()); } throw new Error("Missing return statement in function"); } final public void pseudo_page(AtRulePage page) throws ParseException { Token n; jj_consume_token(COLON); n = jj_consume_token(IDENT); label_41: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[52] = jj_gen; break label_41; } jj_consume_token(S); } try { page.setName(":" + convertIdent(n.image), ac); } catch (InvalidParamException e) { {if (true) throw new InvalidParamException("pseudo", n.image, ac );} /*CssError error = new CssError(getSourceFile(), getLine(), e); ac.getFrame().addError(error); */ } } final public void fontFace() throws ParseException { Vector v; AtRule old = getAtRule(); setAtRule(new AtRuleFontFace()); CssSelectors s = new CssSelectors(ac); s.setAtRule(getAtRule()); try { jj_consume_token(FONT_FACE_SYM); label_42: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[53] = jj_gen; break label_42; } jj_consume_token(S); } if (ac.getCssVersion().equals("css1")) { skipStatement(); addError(new InvalidParamException("noatruleyet", "", ac), getAtRule().toString()); } if (!ac.getCssVersion().equals("css1")) { newAtRule(getAtRule()); } jj_consume_token(LBRACE); label_43: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[54] = jj_gen; break label_43; } jj_consume_token(S); } v = declarations(); jj_consume_token(RBRACE); label_44: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[55] = jj_gen; break label_44; } jj_consume_token(S); } if (!ac.getCssVersion().equals("css1")) { addProperty(v); endOfRule(); endOfAtRule(); } if (v == null) { ac.getFrame().addWarning("no-declaration"); } else { handleRule(s, v); } } catch (ParseException e) { if (!ac.getCssVersion().equals("css1")) { addError(e, skipStatement()); } } finally { setAtRule(old); } } final public void colorprofile() throws ParseException { Vector v; AtRule old = getAtRule(); setAtRule(new AtRuleColorProfile()); CssSelectors s = new CssSelectors(ac); s.setAtRule(getAtRule()); try { jj_consume_token(COLOR_PROFILE); label_45: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[56] = jj_gen; break label_45; } jj_consume_token(S); } if (!ac.getCssVersion().equals("svg")) { skipStatement(); addError(new InvalidParamException("onlysvg", "", ac), getAtRule().toString()); } if (ac.getCssVersion().equals("svg")) { newAtRule(getAtRule()); } jj_consume_token(LBRACE); label_46: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[57] = jj_gen; break label_46; } jj_consume_token(S); } v = declarations(); jj_consume_token(RBRACE); label_47: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[58] = jj_gen; break label_47; } jj_consume_token(S); } if (ac.getCssVersion().equals("svg")) { addProperty(v); endOfRule(); endOfAtRule(); } if (v == null) { //ac.getFrame().addWarning("medialist"); } else { handleRule(s, v); } } catch (ParseException e) { if (ac.getCssVersion().equals("svg")) { addError(e, skipStatement()); } } finally { setAtRule(old); } } final public void preference() throws ParseException { Vector v; AtRule old = getAtRule(); setAtRule(new AtRulePreference()); CssSelectors s = new CssSelectors(ac); s.setAtRule(getAtRule()); try { jj_consume_token(PREF_SYM); label_48: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[59] = jj_gen; break label_48; } jj_consume_token(S); } if (ac.getCssVersion().equals("css1")) { skipStatement(); addError(new InvalidParamException("noatruleyet", "", ac), getAtRule().toString()); } if (!ac.getCssVersion().equals("css1")) { newAtRule(getAtRule()); } jj_consume_token(LBRACE); label_49: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[60] = jj_gen; break label_49; } jj_consume_token(S); } v = declarations(); jj_consume_token(RBRACE); label_50: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[61] = jj_gen; break label_50; } jj_consume_token(S); } if (!ac.getCssVersion().equals("css1")) { addProperty(v); endOfRule(); endOfAtRule(); } if (v == null) { ac.getFrame().addWarning("medialist"); } else { handleRule(s, v); } } catch (ParseException e) { if (!ac.getCssVersion().equals("css1")) { addError(e, skipStatement()); } } finally { setAtRule(old); } } final public void phoneticAlphabet() throws ParseException { Vector v; AtRule old = getAtRule(); AtRulePhoneticAlphabet alphabetrule = new AtRulePhoneticAlphabet(); setAtRule(alphabetrule); Token n; try { jj_consume_token(PHONETIC_ALPHABET_SYM); label_51: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[62] = jj_gen; break label_51; } jj_consume_token(S); } n = jj_consume_token(STRING); label_52: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[63] = jj_gen; break label_52; } jj_consume_token(S); } jj_consume_token(SEMICOLON); if (!ac.getCssVersion().equals("css3")) { skipStatement(); addError(new InvalidParamException("noatruleyet", "", ac), getAtRule().toString()); } alphabetrule.addAlphabet(convertIdent(n.image), ac); if (!ac.getCssVersion().equals("css1") && !ac.getCssVersion().equals("css2")) { newAtRule(getAtRule()); } } catch (ParseException e) { if (!ac.getCssVersion().equals("css1")) { addError(e, skipStatement()); } } finally { setAtRule(old); } } /** * @exception ParseException exception during the parse */ final public void atRuleDeclaration() throws ParseException { Token n; n = jj_consume_token(ATKEYWORD); //ac.getFrame().addWarning("at-rule", token.toString()); ac.getFrame().addError( new CssError(new InvalidParamException("at-rule", token, ac))); skipStatement(); } /** * @exception ParseException exception during the parse */ final public void operator(CssExpression expr) throws ParseException { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case COMMA: case DIV: switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case DIV: jj_consume_token(DIV); if (expr.getCount() > 0) expr.setOperator('/'); break; case COMMA: jj_consume_token(COMMA); if (expr.getCount() > 0) expr.setOperator(','); break; default: jj_la1[64] = jj_gen; jj_consume_token(-1); throw new ParseException(); } label_53: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[65] = jj_gen; break label_53; } jj_consume_token(S); } break; default: jj_la1[66] = jj_gen; ; } } /** * @exception ParseException exception during the parse */ final public char combinator() throws ParseException { char connector = ' '; switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case PLUS: case GREATER: case TILDE: switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case PLUS: jj_consume_token(PLUS); connector = '+' ; break; case GREATER: jj_consume_token(GREATER); connector = '>' ; break; case TILDE: jj_consume_token(TILDE); connector = '~' ; break; default: jj_la1[67] = jj_gen; jj_consume_token(-1); throw new ParseException(); } label_54: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[68] = jj_gen; break label_54; } jj_consume_token(S); } break; case S: label_55: while (true) { jj_consume_token(S); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[69] = jj_gen; break label_55; } } connector = ' ' ; break; default: jj_la1[70] = jj_gen; jj_consume_token(-1); throw new ParseException(); } {if (true) return connector;} throw new Error("Missing return statement in function"); } /** * @exception ParseException exception during the parse */ final public char unaryOperator() throws ParseException { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case MINUS: jj_consume_token(MINUS); {if (true) return '-';} break; case PLUS: jj_consume_token(PLUS); {if (true) return '+';} break; default: jj_la1[71] = jj_gen; jj_consume_token(-1); throw new ParseException(); } throw new Error("Missing return statement in function"); } /** * @exception ParseException exception during the parse */ final public String property() throws ParseException { Token n; n = jj_consume_token(IDENT); label_56: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[72] = jj_gen; break label_56; } jj_consume_token(S); } currentProperty = convertIdent(n.image); {if (true) return currentProperty;} throw new Error("Missing return statement in function"); } /** * @exception ParseException exception during the parse */ final public void ruleSet() throws ParseException { CssSelectors contextual; Vector context_set = new Vector(); Vector value_set = null; currentContext = context_set; try { contextual = selector(); if (contextual != null) { context_set.addElement(contextual); } label_57: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case COMMA: ; break; default: jj_la1[73] = jj_gen; break label_57; } jj_consume_token(COMMA); label_58: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[74] = jj_gen; break label_58; } jj_consume_token(S); } contextual = selector(); if (contextual != null) { context_set.addElement(contextual); } } jj_consume_token(LBRACE); validSelector = (context_set.size() > 0); label_59: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[75] = jj_gen; break label_59; } jj_consume_token(S); } value_set = declarations(); jj_consume_token(RBRACE); label_60: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[76] = jj_gen; break label_60; } jj_consume_token(S); } markRule = true; /* if (value_set == null) { ac.getFrame().addWarning("no-declaration"); } else {*/ if (value_set != null) { boolean first = true; CssSelectors sel = null; Enumeration e = context_set.elements(); while (e.hasMoreElements()) { sel = e.nextElement(); if (first) { handleRule(sel, value_set); first = false; } else { // we need to duplicate properties in that case // as property holds reference to the selectors and it interact // badly with conflict detection int vsize = value_set.size(); Vector v = new Vector(vsize); for (int i=0; i declarations() throws ParseException { if(!validSelector) { validSelector = true; skip_to_matching_brace(); return null; } CssProperty values; Vector value_set = new Vector(); boolean wrong_value = true; switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case IDENT: values = declaration(); if (values != null) { value_set.addElement(values); wrong_value = false; } /* else { wrong_value = true; } */ currentProperty = null; break; default: jj_la1[77] = jj_gen; ; } label_61: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case SEMICOLON: ; break; default: jj_la1[78] = jj_gen; break label_61; } jj_consume_token(SEMICOLON); label_62: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[79] = jj_gen; break label_62; } jj_consume_token(S); } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case IDENT: values = declaration(); if (values != null) { value_set.addElement(values); wrong_value = false; }/* else { wrong_value = true; }*/ currentProperty = null; break; default: jj_la1[80] = jj_gen; ; } } if (!wrong_value) { addProperty(value_set); {if (true) return value_set;} } else { {if (true) return null;} } throw new Error("Missing return statement in function"); } /** * @exception ParseException exception during the parse */ final public CssSelectors selector() throws ParseException { char comb; CssSelectors current; try { current = simple_selector(null); label_63: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: case PLUS: case GREATER: case TILDE: ; break; default: jj_la1[81] = jj_gen; break label_63; } comb = combinator(); if (ac.getProfile() != null) { if (ac.getProfile().equals("mobile") || getAtRule().toString().equals("@media atsc-tv") || ac.getCssVersion().equals("css1")) { if (comb == '+') {if (true) throw new InvalidParamException("nocomb", "+", ac);} if (comb == '>') {if (true) throw new InvalidParamException("nocomb", ">", ac);} } else if (ac.getProfile().equals("tv")) { if (comb == '+') {if (true) throw new InvalidParamException("nocomb", "+", ac);} } } if (!ac.getCssVersion().equals("css3")) { if (comb == '~') { {if (true) throw new InvalidParamException("nocomb", "~", ac);} } } switch(comb) { case '+': current.addAdjacentSibling(new AdjacentSiblingSelector()); break; case '>': current.addChild(new ChildSelector()); break; case '~': current.addGeneralSibling(new GeneralSiblingSelector()); break; default: current.addDescendant(new DescendantSelector()); } //current.setConnector(comb); current = simple_selector(current); } {if (true) return current;} } catch (InvalidParamException ie) { // skipStatement(); // removeThisRule(); ac.getFrame().addError(new CssError(ie)); Token t = getToken(1); StringBuilder s = new StringBuilder(); s.append(getToken(0).image); // eat until , { or EOF while ((t.kind != COMMA) && (t.kind != LBRACE) && (t.kind != EOF)) { s.append(t.image); getNextToken(); t = getToken(1); } {if (true) return null;} } catch (ParseException e) { // validSelector = false; Token t = getToken(1); StringBuilder s = new StringBuilder("["); s.append(getToken(0).image); // eat until , { or EOF while ((t.kind != COMMA) && (t.kind != LBRACE) && (t.kind != EOF)) { s.append(t.image); getNextToken(); t = getToken(1); } s.append(']'); // if (validSelector) { addError(e, s.toString()); // } else { // addError(e,""); // } validSelector = true; {if (true) return null;} } throw new Error("Missing return statement in function"); } /** * I made this rule to parse a selector from a document. Combinator are avoid. * @exception ParseException exception during the parse */ final public CssSelectors externalSelector() throws ParseException { CssSelectors current; current = simple_selector(null); label_64: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[82] = jj_gen; break label_64; } label_65: while (true) { jj_consume_token(S); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[83] = jj_gen; break label_65; } } current = simple_selector(current); } {if (true) return current;} throw new Error("Missing return statement in function"); } /** * @exception ParseException exception during the parse */ final public CssSelectors simple_selector(CssSelectors next) throws ParseException { CssSelectors selector = new CssSelectors(ac, next); selector.setAtRule(getAtRule()); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case IDENT: case ANY: case 98: element_name(selector); label_66: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case HASHIDENT: case HASH: case LBRACKET: case COLON: case LENGTH: case EMS: case EXS: case ANGLE: case TIME: case FREQ: case RESOLUTION: case DIMEN: case PSEUDOELEMENT_SYM: case CLASS: case FUNCTIONNOT: ; break; default: jj_la1[84] = jj_gen; break label_66; } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case HASHIDENT: case HASH: hash(selector); break; case LENGTH: case EMS: case EXS: case ANGLE: case TIME: case FREQ: case RESOLUTION: case DIMEN: case CLASS: _class(selector); break; case LBRACKET: attrib(selector); break; case COLON: case PSEUDOELEMENT_SYM: pseudo(selector); break; case FUNCTIONNOT: negation(selector); break; default: jj_la1[85] = jj_gen; jj_consume_token(-1); throw new ParseException(); } } {if (true) return selector;} break; case HASHIDENT: case HASH: case LBRACKET: case COLON: case LENGTH: case EMS: case EXS: case ANGLE: case TIME: case FREQ: case RESOLUTION: case DIMEN: case PSEUDOELEMENT_SYM: case CLASS: case FUNCTIONNOT: label_67: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case HASHIDENT: case HASH: hash(selector); break; case LENGTH: case EMS: case EXS: case ANGLE: case TIME: case FREQ: case RESOLUTION: case DIMEN: case CLASS: _class(selector); break; case LBRACKET: attrib(selector); break; case COLON: case PSEUDOELEMENT_SYM: pseudo(selector); break; case FUNCTIONNOT: negation(selector); break; default: jj_la1[86] = jj_gen; jj_consume_token(-1); throw new ParseException(); } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case HASHIDENT: case HASH: case LBRACKET: case COLON: case LENGTH: case EMS: case EXS: case ANGLE: case TIME: case FREQ: case RESOLUTION: case DIMEN: case PSEUDOELEMENT_SYM: case CLASS: case FUNCTIONNOT: ; break; default: jj_la1[87] = jj_gen; break label_67; } } {if (true) return selector;} break; default: jj_la1[88] = jj_gen; jj_consume_token(-1); throw new ParseException(); } throw new Error("Missing return statement in function"); } /** * @exception ParseException exception during the parse */ final public void _class(CssSelectors s) throws ParseException { Token n; switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case CLASS: /* "." n= { */ n = jj_consume_token(CLASS); try { s.addClass(new ClassSelector(convertClassIdent(n.image.substring(1)))); // s.addAttribute("class", convertIdent(n.image.substring(1)), // CssSelectors.ATTRIBUTE_CLASS_SEL); } catch (InvalidParamException e) { // removeThisRule(); ac.getFrame().addError(new CssError(e)); {if (true) throw new ParseException(e.getMessage());} } break; case LENGTH: case EMS: case EXS: case ANGLE: case TIME: case FREQ: case RESOLUTION: case DIMEN: n = deprecated_class(); if (n.image.charAt(0) == '.') { n.image = n.image.substring(1); // the class with the first digit escaped String cl = "."+hexEscapeFirst(n.image); String profile = ac.getProfile(); if(profile == null || profile.equals("") || profile.equals("none")) { profile = ac.getCssVersion(); } if(!profile.equals("css1")) { StringBuilder sb = new StringBuilder(); Vector param_err = new Vector(2); param_err.add(n.image); param_err.add(cl); sb.append(ac.getMsg().getString("parser.old_class", param_err)); {if (true) throw new ParseException(sb.toString());} // s.addClass(new ClassSelector(n.image)); // removeThisRule(); } else { CssLength length = new CssLength(); boolean isLength = false; try { length.set(n.image, ac); isLength = true; } catch(Exception e) { isLength = false; } if(isLength) { StringBuilder sb = new StringBuilder(); sb.append(ac.getMsg().getString("parser.class_dim")); sb.append(n.image); {if (true) throw new ParseException(sb.toString());} // s.addClass(new ClassSelector(n.image)); // removeThisRule(); } else { try { // for css > 1, we add the rule to have a context, // and we then remove it s.addClass(new ClassSelector(n.image)); ac.getFrame().addWarning("old_class"); } catch (InvalidParamException e) { {if (true) throw new ParseException(e.getMessage());} //ac.getFrame().addError(new CssError(e)); //removeThisRule(); } } } } else { {if (true) throw new ParseException("Unrecognized ");} } break; default: jj_la1[89] = jj_gen; jj_consume_token(-1); throw new ParseException(); } } final public Token deprecated_class() throws ParseException { Token n; switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case LENGTH: n = jj_consume_token(LENGTH); break; case EMS: n = jj_consume_token(EMS); break; case EXS: n = jj_consume_token(EXS); break; case ANGLE: n = jj_consume_token(ANGLE); break; case TIME: n = jj_consume_token(TIME); break; case FREQ: n = jj_consume_token(FREQ); break; case RESOLUTION: n = jj_consume_token(RESOLUTION); break; case DIMEN: n = jj_consume_token(DIMEN); break; default: jj_la1[90] = jj_gen; jj_consume_token(-1); throw new ParseException(); } {if (true) return n;} throw new Error("Missing return statement in function"); } /** * @exception ParseException exception during the parse */ final public void element_name(CssSelectors s) throws ParseException { Token n=null; Token p=null; String prefix = null; if (jj_2_1(2)) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case IDENT: case ANY: switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case IDENT: n = jj_consume_token(IDENT); break; case ANY: n = jj_consume_token(ANY); break; default: jj_la1[91] = jj_gen; jj_consume_token(-1); throw new ParseException(); } break; default: jj_la1[92] = jj_gen; ; } p = jj_consume_token(98); } else { ; } // FIXME namespace, check versions of CSS in a better way. if (p != null) { if (!ac.getCssVersion().equals("css3")) { StringBuilder sb = new StringBuilder("namespace \u005c""); if (n != null) sb.append(n.toString()); sb.append("\u005c""); ac.getFrame().addError(new CssError(new InvalidParamException("notversion", "namespace", ac.getCssVersion(), ac))); removeThisRule(); } else if (n!=null) { prefix = convertIdent(n.image); if (!ac.isNamespaceDefined(getURL(), prefix)) { // ns is not defined addError(new ParseException("Undefined namespace"), ": The namespace \u005c""+prefix +"\u005c" is not defined. " + prefix ); removeThisRule(); } } else { prefix = ""; } } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case IDENT: n = jj_consume_token(IDENT); // s.setElement(convertIdent(n.image), ac); s.addType(new TypeSelector(prefix, convertIdent(n.image))); break; case ANY: jj_consume_token(ANY); if (!ac.getCssVersion().equals("css1")) { // s.setElement(null); s.addUniversal(new UniversalSelector(prefix)); } else { ac.getFrame().addError(new CssError(new InvalidParamException("notversion", "*", ac.getCssVersion(), ac))); } break; default: jj_la1[93] = jj_gen; jj_consume_token(-1); throw new ParseException(); } } /** * @exception ParseException exception during the parse */ final public void attrib(CssSelectors s) throws ParseException { Token att = null; Token val = null; int selectorType = CssSelectors.ATTRIBUTE_ANY; jj_consume_token(LBRACKET); label_68: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[94] = jj_gen; break label_68; } jj_consume_token(S); } att = jj_consume_token(IDENT); label_69: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[95] = jj_gen; break label_69; } jj_consume_token(S); } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case INCLUDES: case DASHMATCH: case PREFIXMATCH: case SUFFIXMATCH: case SUBSTRINGMATCH: case EQ: switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case EQ: jj_consume_token(EQ); selectorType = CssSelectors.ATTRIBUTE_EXACT; break; case INCLUDES: jj_consume_token(INCLUDES); selectorType = CssSelectors.ATTRIBUTE_ONE_OF; break; case DASHMATCH: jj_consume_token(DASHMATCH); selectorType = CssSelectors.ATTRIBUTE_BEGIN; break; case PREFIXMATCH: jj_consume_token(PREFIXMATCH); selectorType = CssSelectors.ATTRIBUTE_START; break; case SUFFIXMATCH: jj_consume_token(SUFFIXMATCH); selectorType = CssSelectors.ATTRIBUTE_SUFFIX; break; case SUBSTRINGMATCH: jj_consume_token(SUBSTRINGMATCH); selectorType = CssSelectors.ATTRIBUTE_SUBSTR; break; default: jj_la1[96] = jj_gen; jj_consume_token(-1); throw new ParseException(); } label_70: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[97] = jj_gen; break label_70; } jj_consume_token(S); } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case IDENT: val = jj_consume_token(IDENT); val.image = convertIdent(val.image); break; case STRING: val = jj_consume_token(STRING); val.image = convertStringIndex(val.image, 1, val.image.length() -1, false); break; default: jj_la1[98] = jj_gen; jj_consume_token(-1); throw new ParseException(); } label_71: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[99] = jj_gen; break label_71; } jj_consume_token(S); } break; default: jj_la1[100] = jj_gen; ; } jj_consume_token(RBRACKET); if ("css1".equals(ac.getCssVersion())) { StringBuilder reason; CssParseException cp; ParseException p; reason = new StringBuilder(" ["); if (att != null) { reason.append(convertIdent(att.image)); } if (val != null ) { reason.append('=').append(val.image); } reason.append(']'); p = new ParseException(ac.getMsg().getString("parser.attrcss1")+ reason.toString()); cp = new CssParseException(p); ac.getFrame().addError(new CssError(cp)); removeThisRule(); } if (selectorType == CssSelectors.ATTRIBUTE_ANY) { try { s.addAttribute(new AttributeAny(att.image.toLowerCase())); // s.addAttribute(att.image.toLowerCase(), null, selectorType); } catch (InvalidParamException e) { removeThisRule(); ac.getFrame().addError(new CssError(e)); } } else { AttributeSelector attribute; switch(selectorType) { case CssSelectors.ATTRIBUTE_BEGIN: attribute = new AttributeBegin(att.image.toLowerCase(), val.image); break; case CssSelectors.ATTRIBUTE_EXACT: attribute = new AttributeExact(att.image.toLowerCase(), val.image); break; case CssSelectors.ATTRIBUTE_ONE_OF: attribute = new AttributeOneOf(att.image.toLowerCase(), val.image); break; case CssSelectors.ATTRIBUTE_START: attribute = new AttributeStart(att.image.toLowerCase(), val.image); break; case CssSelectors.ATTRIBUTE_SUBSTR: attribute = new AttributeSubstr(att.image.toLowerCase(), val.image); break; case CssSelectors.ATTRIBUTE_SUFFIX: attribute = new AttributeSuffix(att.image.toLowerCase(), val.image); break; default: attribute = new AttributeExact(att.image.toLowerCase(), val.image); break; } try { s.addAttribute(attribute); // s.addAttribute(att.image.toLowerCase(), val.image, // selectorType); } catch (InvalidParamException e) { removeThisRule(); ac.getFrame().addError(new CssError(e)); } } } final public void negation(CssSelectors s) throws ParseException { Token n; CssSelectors ns = new CssSelectors(ac, null); jj_consume_token(FUNCTIONNOT); label_72: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[101] = jj_gen; break label_72; } jj_consume_token(S); } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case IDENT: case ANY: case 98: element_name(ns); break; case HASHIDENT: case HASH: hash(ns); break; case LENGTH: case EMS: case EXS: case ANGLE: case TIME: case FREQ: case RESOLUTION: case DIMEN: case CLASS: _class(ns); break; case LBRACKET: attrib(ns); break; case COLON: case PSEUDOELEMENT_SYM: pseudo(ns); break; default: jj_la1[102] = jj_gen; jj_consume_token(-1); throw new ParseException(); } label_73: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[103] = jj_gen; break label_73; } jj_consume_token(S); } jj_consume_token(LPARAN); s.setPseudoFun("not", ns.toString()); } /** * @exception ParseException exception during the parse */ final public void pseudo(CssSelectors s) throws ParseException { Token n; Token language = null; CssExpression param = null; switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case PSEUDOELEMENT_SYM: jj_consume_token(PSEUDOELEMENT_SYM); n = jj_consume_token(IDENT); try { if (ac.getCssVersion().equals("css3")) { s.addPseudoElement(convertIdent(n.image).toLowerCase()); } else { {if (true) throw new InvalidParamException("pseudo-element", "::" + convertIdent(n.image).toLowerCase() , ac.getCssVersion() ,ac);} } } catch(InvalidParamException e) { // removeThisRule(); // ac.getFrame().addError(new CssError(e)); validSelector = false; {if (true) throw new ParseException(e.getMessage());} } break; case COLON: jj_consume_token(COLON); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case IDENT: n = jj_consume_token(IDENT); try { s.addPseudoClass(convertIdent(n.image).toLowerCase()); } catch(InvalidParamException e) { removeThisRule(); ac.getFrame().addError(new CssError(e)); } break; case FUNCTIONLANG: case FUNCTION: switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case FUNCTIONLANG: n = jj_consume_token(FUNCTIONLANG); label_74: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[104] = jj_gen; break label_74; } jj_consume_token(S); } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case NUMBER: language = jj_consume_token(NUMBER); break; case IDENT: language = jj_consume_token(IDENT); break; case STRING: language = jj_consume_token(STRING); break; default: jj_la1[105] = jj_gen; jj_consume_token(-1); throw new ParseException(); } label_75: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[106] = jj_gen; break label_75; } jj_consume_token(S); } try { s.setPseudoFun(convertStringIndex(n.image, 0, n.image.length() -1, false).toLowerCase(), convertIdent(language.image)); } catch(InvalidParamException e) { removeThisRule(); ac.getFrame().addError(new CssError(e)); } break; case FUNCTION: n = jj_consume_token(FUNCTION); label_76: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[107] = jj_gen; break label_76; } jj_consume_token(S); } param = expression(); try { s.setPseudoFun(convertStringIndex(n.image, 0, n.image.length() -1, false).toLowerCase(), param.toString()); } catch(InvalidParamException e) { removeThisRule(); ac.getFrame().addError(new CssError(e)); } break; default: jj_la1[108] = jj_gen; jj_consume_token(-1); throw new ParseException(); } jj_consume_token(LPARAN); break; default: jj_la1[109] = jj_gen; jj_consume_token(-1); throw new ParseException(); } break; default: jj_la1[110] = jj_gen; jj_consume_token(-1); throw new ParseException(); } } /** * @exception ParseException exception during the parse */ final public void hash(CssSelectors s) throws ParseException { Token n; switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case HASHIDENT: n = jj_consume_token(HASHIDENT); n.image = n.image.substring(1); if(Character.isDigit(n.image.charAt(0))) { String profile = ac.getProfile(); if(profile == null || profile.equals("") || profile.equals("none")) { profile = ac.getCssVersion(); } if(!profile.equals("css1")) { // the id with the first digit escaped String cl = "\u005c\u005c" + Integer.toString(n.image.charAt(0), 16); cl += n.image.substring(1); addError(new ParseException(ac.getMsg().getString( "parser.old_id")), "To make \u005c"." + n.image + "\u005c" a valid id, CSS2" + " requires the first digit to be escaped " + "(\u005c"#" + cl + "\u005c")"); // for css > 1, we add the rule to have a context, // and we then remove it s.addId(new IdSelector(n.image)); removeThisRule(); } else { CssLength length = new CssLength(); boolean isLength = false; try { length.set(n.image, ac); isLength = true; } catch(Exception e) { isLength = false; } if(isLength) { addError(new ParseException(ac.getMsg().getString( "parser.id_dim")), n.image); // we add the rule to have a context, and then we remove it s.addId(new IdSelector(n.image)); removeThisRule(); } else { try { s.addId(new IdSelector(n.image)); ac.getFrame().addWarning("old_id"); } catch (InvalidParamException e) { ac.getFrame().addError(new CssError(e)); removeThisRule(); } } } } else { try { s.addId(new IdSelector(n.image)); } catch (InvalidParamException e) { ac.getFrame().addError(new CssError(e)); removeThisRule(); } } break; case HASH: n = jj_consume_token(HASH); {if (true) throw new ParseException(ac.getMsg().getString("parser.invalid_id_selector"));} break; default: jj_la1[111] = jj_gen; jj_consume_token(-1); throw new ParseException(); } } /** * @exception ParseException exception during the parse */ final public CssProperty mediadeclaration() throws ParseException { String string_property; CssExpression values = null; boolean important = false; setMediaDeclaration("on"); try { string_property = property(); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case COLON: jj_consume_token(COLON); label_77: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[112] = jj_gen; break label_77; } jj_consume_token(S); } values = expr(); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case IMPORTANT_SYM: important = prio(); break; default: jj_la1[113] = jj_gen; ; } break; default: jj_la1[114] = jj_gen; ; } try { setImportant(important); if (incompatible_error) { {if (true) throw new InvalidParamException("notforcss1", "inherit", ac);} } CssProperty p = handleDeclaration(string_property.toLowerCase(), values, important); {if (true) return p;} } catch (InvalidParamException e) { incompatible_error = false; if (null != values) { values.starts(); } addError(e, (CssExpression) values); } {if (true) return null;} } catch (NumberFormatException e) { skipAfterExpression(e); {if (true) return null;} } catch (ParseException e) { skipAfterExpression(e); {if (true) return null;} } finally { setMediaDeclaration("off"); } throw new Error("Missing return statement in function"); } /** * @exception ParseException exception during the parse */ final public CssProperty declaration() throws ParseException { String string_property; CssExpression values; boolean important = false; try { string_property = property(); jj_consume_token(COLON); label_78: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[115] = jj_gen; break label_78; } jj_consume_token(S); } values = expr(); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case IMPORTANT_SYM: important = prio(); break; default: jj_la1[116] = jj_gen; ; } try { setImportant(important); if (incompatible_error) { {if (true) throw new InvalidParamException("notforcss1", "inherit", ac);} } if (values.getCount() != 0) { CssProperty p = handleDeclaration(string_property.toLowerCase(), values, important); // Did the property recognize all values in the expression ? if (!values.end() && ac.getMedium() == null) { addError(new InvalidParamException("unrecognize", "", ac), values); } else { // ok, return the new property {if (true) return p;} } } } catch (InvalidParamException e) { incompatible_error = false; values.starts(); addError(e, (CssExpression) values); } {if (true) return null;} } catch (NumberFormatException e) { skipAfterExpression(e); {if (true) return null;} } catch (ParseException e) { skipAfterExpression(e); {if (true) return null;} } catch (NullPointerException e) { // NullPointerException happen if in handling a property // something bad happen (like setting values on sub properties // that had not been initialized (for an unknown reason yet). skipAfterExpression(e); {if (true) return null;} } throw new Error("Missing return statement in function"); } /** * @exception ParseException exception during the parse */ final public boolean prio() throws ParseException { jj_consume_token(IMPORTANT_SYM); label_79: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[117] = jj_gen; break label_79; } jj_consume_token(S); } {if (true) return true;} throw new Error("Missing return statement in function"); } final public CssExpression expression() throws ParseException { CssExpression exp = new CssExpression(); char operator = ' '; Token n = null; label_80: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case PLUS: jj_consume_token(PLUS); operator = '+' ; break; case MINUS: jj_consume_token(MINUS); operator = '-'; break; case NUMBER: n = jj_consume_token(NUMBER); setValue(new CssNumber(), exp, operator, n, NUMBER); break; case DIMEN: n = jj_consume_token(DIMEN); setValue(new CssIdent(), exp, operator, n, IDENT); break; case STRING: n = jj_consume_token(STRING); setValue(new CssString(), exp, operator, n, STRING); break; case IDENT: n = jj_consume_token(IDENT); setValue(new CssIdent(), exp, operator, n, IDENT); break; default: jj_la1[118] = jj_gen; jj_consume_token(-1); throw new ParseException(); } label_81: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[119] = jj_gen; break label_81; } jj_consume_token(S); } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case PLUS: case STRING: case IDENT: case MINUS: case DIMEN: case NUMBER: ; break; default: jj_la1[120] = jj_gen; break label_80; } } {if (true) return exp;} throw new Error("Missing return statement in function"); } /** * @exception ParseException exception during the parse */ final public CssExpression expr() throws ParseException { CssExpression values = new CssExpression(); term(values); label_82: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case PLUS: case COMMA: case STRING: case IDENT: case HASHIDENT: case HASH: case MINUS: case DIV: case URL: case LENGTH: case EMS: case EXS: case ANGLE: case TIME: case FREQ: case RESOLUTION: case DATE: case DIMEN: case PERCENTAGE: case NUMBER: case UNICODERANGE: case FUNCTION: ; break; default: jj_la1[121] = jj_gen; break label_82; } operator(values); term(values); } {if (true) return values;} throw new Error("Missing return statement in function"); } /** * @exception ParseException exception during the parse */ final public void term(CssExpression exp) throws ParseException { Token n; char operator = ' '; CssValue func; switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case PLUS: case MINUS: case LENGTH: case EMS: case EXS: case ANGLE: case TIME: case FREQ: case RESOLUTION: case DATE: case DIMEN: case PERCENTAGE: case NUMBER: case FUNCTION: switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case PLUS: case MINUS: operator = unaryOperator(); break; default: jj_la1[122] = jj_gen; ; } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case NUMBER: n = jj_consume_token(NUMBER); setValue(new CssNumber(), exp, operator, n, NUMBER); break; case PERCENTAGE: n = jj_consume_token(PERCENTAGE); setValue(new CssPercentage(), exp, operator, n, PERCENTAGE); break; case LENGTH: n = jj_consume_token(LENGTH); setValue(new CssLength(), exp, operator, n, LENGTH); break; case EMS: n = jj_consume_token(EMS); setValue(new CssLength(), exp, operator, n, EMS); break; case EXS: n = jj_consume_token(EXS); setValue(new CssLength(), exp, operator, n, EXS); break; case ANGLE: n = jj_consume_token(ANGLE); setValue(new CssAngle(), exp, operator, n, ANGLE); break; case TIME: n = jj_consume_token(TIME); setValue(new CssTime(), exp, operator, n, TIME); break; case FREQ: n = jj_consume_token(FREQ); setValue(new CssFrequency(), exp, operator, n, FREQ); break; case RESOLUTION: n = jj_consume_token(RESOLUTION); setValue(new CssResolution(), exp, operator, n, RESOLUTION); break; case DATE: n = jj_consume_token(DATE); setValue(new CssDate(), exp, operator, n, DATE); break; case DIMEN: n = jj_consume_token(DIMEN); addError(new ParseException(ac.getMsg().getString("parser.unknown-dimension")), n.image); break; case FUNCTION: func = function(); setValue(func, exp, operator, null, FUNCTION); break; default: jj_la1[123] = jj_gen; jj_consume_token(-1); throw new ParseException(); } label_83: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[124] = jj_gen; break label_83; } jj_consume_token(S); } break; case STRING: case IDENT: case HASHIDENT: case HASH: case URL: case UNICODERANGE: switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case STRING: n = jj_consume_token(STRING); setValue(new CssString(), exp, operator, n, STRING); break; case IDENT: n = jj_consume_token(IDENT); /* * Common error : * H1 { * color : black * background : white * } */ Token t = getToken(1); Token semicolon = new Token(); semicolon.kind = SEMICOLON; semicolon.image = ";"; if (t.kind == COLON) { /* @@SEEME. (generate a warning?) */ /* @@SEEME if expression is a single ident, generate an error ? */ addError(new ParseException(ac.getMsg().getString("parser.semi-colon")), (CssExpression) null); rejectToken(semicolon); } else { setValue(new CssIdent(), exp, operator, n, IDENT); } break; case HASHIDENT: case HASH: hexcolor(exp); break; case URL: n = jj_consume_token(URL); CssURL _u = new CssURL(); _u.set(n.image, ac, url); exp.addValue(_u); break; case UNICODERANGE: n = jj_consume_token(UNICODERANGE); setValue(new CssUnicodeRange(), exp, operator, n, UNICODERANGE); break; default: jj_la1[125] = jj_gen; jj_consume_token(-1); throw new ParseException(); } label_84: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[126] = jj_gen; break label_84; } jj_consume_token(S); } break; default: jj_la1[127] = jj_gen; jj_consume_token(-1); throw new ParseException(); } } /** * @exception ParseException exception during the parse */ final public CssValue function() throws ParseException { Token n; CssExpression exp; org.w3c.css.values.CssColor color = new org.w3c.css.values.CssColor(); org.w3c.css.values.ATSCColor colorATSC = new org.w3c.css.values.ATSCColor(); n = jj_consume_token(FUNCTION); label_85: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case S: ; break; default: jj_la1[128] = jj_gen; break label_85; } jj_consume_token(S); } exp = expr(); jj_consume_token(LPARAN); String funcname = n.image.toLowerCase(); if (funcname.equals("rgb(")) { if (!getAtRule().toString().equals("@media atsc-tv")) { color.setRGBColor(exp, ac); {if (true) return color;} } else { colorATSC.setRGBColor(exp, ac); {if (true) return colorATSC;} } } else if (n.image.toLowerCase().equals("atsc-rgba(")) { if (getAtRule().toString().equals("@media atsc-tv")) { colorATSC.setATSCrgba(exp, ac); {if (true) return colorATSC;} } else { addError(new InvalidParamException("onlyATSC", "", ac), getAtRule().toString()); {if (true) return null;} } } else { CssFunction f = new CssFunction(); f.set(n.image.substring(0, n.image.length() - 1), exp); {if (true) return f;} } throw new Error("Missing return statement in function"); } /** * @exception ParseException exception during the parse */ final public void hexcolor(CssExpression exp) throws ParseException { Token n; switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case HASHIDENT: n = jj_consume_token(HASHIDENT); break; case HASH: n = jj_consume_token(HASH); break; default: jj_la1[129] = jj_gen; jj_consume_token(-1); throw new ParseException(); } n.image = Util.strip(n.image); setValue(new org.w3c.css.values.CssColor(), exp, ' ', n, HASH); } String skipStatement() throws ParseException { StringBuilder s = new StringBuilder(); Token tok = getToken(0); boolean first = true; if (tok.image != null) { s.append(tok.image); } /* FIXME here, two option, we skip during an error, or outside an error, currently both can fail with a TokenMgrError, should we catch all, or only when filling message for errors? -> taking the "always skip" approach. */ while (true) { try { tok = getToken(1); if (tok.kind == EOF) { if (first) { return null; } else { break; } } s.append(tok.image); if (tok.kind == LBRACE) { getNextToken(); s.append(skip_to_matching_brace()); getNextToken(); tok = getToken(1); break; } else if ((tok.kind == RBRACE) || (tok.kind == SEMICOLON)) { getNextToken(); tok = getToken(1); break; } getNextToken(); } catch (TokenMgrError tokenerror) { // read one char at a time, and loop try { s.append(jj_input_stream.readChar()); continue; } catch (java.io.IOException ioex) { return s.toString().trim(); } } first = false; } // skip white space while (tok.kind == S) { getNextToken(); tok = getToken(1); } String statement = s.toString().trim(); return statement; } String skip_to_matching_brace() throws ParseException { StringBuilder s = new StringBuilder(); Token tok; int nesting = 1; /* FIXME same as above */ while (true) { tok = getToken(1); if (tok.kind == EOF) { break; } s.append(tok.image); if (tok.kind == LBRACE) { nesting++; } else if (tok.kind == RBRACE) { nesting--; if (nesting == 0) { break; } } getNextToken(); } return s.toString(); } void rejectToken(Token t) throws ParseException { Token fakeToken = new Token(); t.next = token; fakeToken.next = t; token = fakeToken; } void skipAfterExpression(Exception e) throws ParseException { StringBuilder s = new StringBuilder(); s.append(getToken(0).image); while (true) { try { Token t = getToken(1); if (t.kind == LBRACE) { s.append(t.image); getNextToken(); s.append(skip_to_matching_brace()); getNextToken(); t = getToken(1); continue; } if ((t.kind == SEMICOLON) || (t.kind == RBRACE) || (t.kind == EOF)) { break; } s.append(t.image); getNextToken(); t = getToken(1); } catch (TokenMgrError tmerr) { try { s.append(jj_input_stream.readChar()); continue; } catch (java.io.IOException ioex) { ioex.printStackTrace(); break; } } } String statement = s.toString().trim(); addError(e, s.toString()); } String convertStringIndex(String s, int start, int len, boolean escapeFirst) throws ParseException { int index = start; int t; int maxCount = 0; if ((start == 0) && (len == s.length()) && (s.indexOf('\u005c\u005c') == -1)) { return s; } StringBuilder buf = new StringBuilder(len); while (index < len) { char c = s.charAt(index); if (c == '\u005c\u005c') { if (++index < len) { c = s.charAt(index); switch (c) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': int numValue = Character.digit(c, 16); int count = 1; if (maxCount == 0) { maxCount = (ac.getCssVersion().equals("css1") ? 4 : 6); } while (index + 1 < len) { c = s.charAt(index+1); t = Character.digit(c, 16); if (t != -1 && count++ < maxCount) { numValue = (numValue<<4) | t; index++; } else { if (c == ' ' || c == '\u005ct' || c == '\u005cn' || c == '\u005cf' ) { // skip the latest white space index++; } else if ( c == '\u005cr' ) { index++; // special case for \r\n if (index+1 < len) { if (s.charAt(index + 1) == '\u005cn') { index++; } } } break; } } if (!escapeFirst && numValue < 255 && numValue>31) { if (! ( (numValue>96 && numValue<123) // [a-z] || (numValue>64 && numValue<91) // [A-Z] || (numValue>47 && numValue<58) // [0-9] || (numValue == 95) // _ || (numValue == 45) // - ) ) { buf.append('\u005c\u005c'); } buf.append((char) numValue); break; } char b[] = new char[maxCount]; t = maxCount; while (t > 0) { b[--t] = hexdigits[numValue & 0xF]; numValue >>>= 4; } buf.append('\u005c\u005c').append(b); break; case '\u005cn': case '\u005cf': break; case '\u005cr': if (index + 1 < len) { if (s.charAt(index + 1) == '\u005cn') { index ++; } } break; case '-' : case '_' : case 'g' : case 'G' : case 'h' : case 'H' : case 'i' : case 'I' : case 'j' : case 'J' : case 'k' : case 'K' : case 'l' : case 'L' : case 'm' : case 'M' : case 'n' : case 'N' : case 'o' : case 'O' : case 'p' : case 'P' : case 'q' : case 'Q' : case 'r' : case 'R' : case 's' : case 'S' : case 't' : case 'T' : case 'u' : case 'U' : case 'v' : case 'V' : case 'w' : case 'W' : case 'x' : case 'X' : case 'y' : case 'Y' : case 'z' : case 'Z' : buf.append(c); break; default: buf.append('\u005c\u005c').append(c); } } else { throw new ParseException("invalid string"); } } else { buf.append(c); } escapeFirst = false; index++; } return buf.toString(); } String convertIdent(String s) throws ParseException { return convertStringIndex(s, 0, s.length(), false); } String convertClassIdent(String s) throws ParseException { return convertStringIndex(s, 0, s.length(), true); } String convertString(String s) throws ParseException { return convertStringIndex(s, 0, s.length(), false); } String hexEscapeFirst(String s) throws ParseException { StringBuilder sb = new StringBuilder(); sb.append('\u005c\u005c').append(Integer.toString(s.charAt(0), 16)); char c = s.charAt(1); if (((c >= '0') && (c <= '9')) || ((c >= 'A') && (c <= 'F')) || ((c >= 'a') && (c <= 'f'))) { sb.append(' '); } sb.append(s.substring(1)); return sb.toString(); } private boolean jj_2_1(int xla) { jj_la = xla; jj_lastpos = jj_scanpos = token; try { return !jj_3_1(); } catch(LookaheadSuccess ls) { return true; } finally { jj_save(0, xla); } } private boolean jj_3R_86() { Token xsp; xsp = jj_scanpos; if (jj_scan_token(34)) { jj_scanpos = xsp; if (jj_scan_token(47)) return true; } return false; } private boolean jj_3_1() { Token xsp; xsp = jj_scanpos; if (jj_3R_86()) jj_scanpos = xsp; if (jj_scan_token(98)) return true; return false; } /** Generated Token Manager. */ public CssParserTokenManager token_source; SimpleCharStream jj_input_stream; /** Current token. */ public Token token; /** Next token. */ public Token jj_nt; private int jj_ntk; private Token jj_scanpos, jj_lastpos; private int jj_la; private int jj_gen; final private int[] jj_la1 = new int[130]; static private int[] jj_la1_0; static private int[] jj_la1_1; static private int[] jj_la1_2; static private int[] jj_la1_3; static { jj_la1_init_0(); jj_la1_init_1(); jj_la1_init_2(); jj_la1_init_3(); } private static void jj_la1_init_0() { jj_la1_0 = new int[] {0x0,0x0,0x0,0xe00000,0xe00000,0x0,0x0,0x200000,0x200000,0x0,0xc00000,0xc00000,0x200000,0x200000,0x200000,0x0,0x0,0x200000,0x200000,0x200000,0x0,0x200000,0x20000000,0x200000,0x0,0x200000,0x200000,0x200000,0x0,0x20000000,0x200000,0x80000000,0x200000,0x200000,0x200000,0x200000,0x0,0x200000,0x200000,0x200000,0x200000,0x200000,0x200000,0x0,0x0,0x200000,0x200000,0x0,0x0,0x200000,0x200000,0x200000,0x200000,0x200000,0x200000,0x200000,0x200000,0x200000,0x200000,0x200000,0x200000,0x200000,0x200000,0x200000,0x20000000,0x200000,0x20000000,0x58000000,0x200000,0x200000,0x58200000,0x8000000,0x200000,0x20000000,0x200000,0x200000,0x200000,0x0,0x0,0x200000,0x0,0x58200000,0x200000,0x200000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x200000,0x200000,0x3000000,0x200000,0x0,0x200000,0x3000000,0x200000,0x0,0x200000,0x200000,0x0,0x200000,0x200000,0x0,0x0,0x0,0x0,0x200000,0x0,0x0,0x200000,0x0,0x200000,0x8000000,0x200000,0x8000000,0x28000000,0x8000000,0x0,0x200000,0x0,0x200000,0x8000000,0x200000,0x0,}; } private static void jj_la1_init_1() { jj_la1_1 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x5fc8a01c,0x0,0x0,0x0,0x0,0x0,0x4,0x200001,0x0,0x0,0x0,0x200001,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x100000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x5fc8a01c,0x0,0x0,0x0,0x0,0x0,0x0,0x4,0x80000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1000,0x0,0x1000,0x0,0x0,0x0,0x0,0x400,0x0,0x0,0x0,0x0,0x0,0x4,0x800,0x0,0x4,0x0,0x0,0x0,0x5fc82018,0x5fc82018,0x5fc82018,0x5fc82018,0x5fc8a01c,0x5fc00000,0x5fc00000,0x8004,0x8004,0x8004,0x0,0x0,0x3c0,0x0,0x5,0x0,0x3c0,0x0,0x5fc8a01c,0x0,0x0,0x5,0x0,0x0,0x0,0x4,0x80000,0x18,0x0,0x0,0x80000,0x0,0x0,0x0,0x40000405,0x0,0x40000405,0xffe0141d,0x400,0xffc00000,0x0,0x20001d,0x0,0xffe0041d,0x0,0x18,}; } private static void jj_la1_init_2() { jj_la1_2 = new int[] {0x0,0x0,0x8,0x0,0x0,0x10,0x20,0x0,0x0,0x500107c4,0x20000,0x20000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x50000004,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x7800,0x7800,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x50000004,0x50000004,0x50000004,0x50000004,0x50000004,0x10000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x10000004,0x0,0x0,0x1,0x0,0x0,0xa0000000,0xa0000000,0x4,0x0,0x0,0x2,0x0,0x0,0x2,0x0,0x1,0x0,0x1,0x88000001,0x0,0x80000001,0x0,0x8000000,0x0,0x88000001,0x0,0x0,}; } private static void jj_la1_init_3() { jj_la1_3 = new int[] {0x3,0x3,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,}; } final private JJCalls[] jj_2_rtns = new JJCalls[1]; private boolean jj_rescan = false; private int jj_gc = 0; /** Constructor with InputStream. */ public CssParser(java.io.InputStream stream) { this(stream, null); } /** Constructor with InputStream and supplied encoding */ public CssParser(java.io.InputStream stream, String encoding) { try { jj_input_stream = new SimpleCharStream(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); } token_source = new CssParserTokenManager(jj_input_stream); token = new Token(); jj_ntk = -1; jj_gen = 0; for (int i = 0; i < 130; i++) jj_la1[i] = -1; for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); } /** Reinitialise. */ public void ReInit(java.io.InputStream stream) { ReInit(stream, null); } /** Reinitialise. */ public void ReInit(java.io.InputStream stream, String encoding) { try { jj_input_stream.ReInit(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); } token_source.ReInit(jj_input_stream); token = new Token(); jj_ntk = -1; jj_gen = 0; for (int i = 0; i < 130; i++) jj_la1[i] = -1; for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); } /** Constructor. */ public CssParser(java.io.Reader stream) { jj_input_stream = new SimpleCharStream(stream, 1, 1); token_source = new CssParserTokenManager(jj_input_stream); token = new Token(); jj_ntk = -1; jj_gen = 0; for (int i = 0; i < 130; i++) jj_la1[i] = -1; for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); } /** Reinitialise. */ public void ReInit(java.io.Reader stream) { jj_input_stream.ReInit(stream, 1, 1); token_source.ReInit(jj_input_stream); token = new Token(); jj_ntk = -1; jj_gen = 0; for (int i = 0; i < 130; i++) jj_la1[i] = -1; for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); } /** Constructor with generated Token Manager. */ public CssParser(CssParserTokenManager tm) { token_source = tm; token = new Token(); jj_ntk = -1; jj_gen = 0; for (int i = 0; i < 130; i++) jj_la1[i] = -1; for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); } /** Reinitialise. */ public void ReInit(CssParserTokenManager tm) { token_source = tm; token = new Token(); jj_ntk = -1; jj_gen = 0; for (int i = 0; i < 130; i++) jj_la1[i] = -1; for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); } private Token jj_consume_token(int kind) throws ParseException { Token oldToken; if ((oldToken = token).next != null) token = token.next; else token = token.next = token_source.getNextToken(); jj_ntk = -1; if (token.kind == kind) { jj_gen++; if (++jj_gc > 100) { jj_gc = 0; for (int i = 0; i < jj_2_rtns.length; i++) { JJCalls c = jj_2_rtns[i]; while (c != null) { if (c.gen < jj_gen) c.first = null; c = c.next; } } } return token; } token = oldToken; jj_kind = kind; throw generateParseException(); } static private final class LookaheadSuccess extends java.lang.Error { } final private LookaheadSuccess jj_ls = new LookaheadSuccess(); private boolean jj_scan_token(int kind) { if (jj_scanpos == jj_lastpos) { jj_la--; if (jj_scanpos.next == null) { jj_lastpos = jj_scanpos = jj_scanpos.next = token_source.getNextToken(); } else { jj_lastpos = jj_scanpos = jj_scanpos.next; } } else { jj_scanpos = jj_scanpos.next; } if (jj_rescan) { int i = 0; Token tok = token; while (tok != null && tok != jj_scanpos) { i++; tok = tok.next; } if (tok != null) jj_add_error_token(kind, i); } if (jj_scanpos.kind != kind) return true; if (jj_la == 0 && jj_scanpos == jj_lastpos) throw jj_ls; return false; } /** Get the next Token. */ final public Token getNextToken() { if (token.next != null) token = token.next; else token = token.next = token_source.getNextToken(); jj_ntk = -1; jj_gen++; return token; } /** Get the specific Token. */ final public Token getToken(int index) { Token t = token; for (int i = 0; i < index; i++) { if (t.next != null) t = t.next; else t = t.next = token_source.getNextToken(); } return t; } private int jj_ntk() { if ((jj_nt=token.next) == null) return (jj_ntk = (token.next=token_source.getNextToken()).kind); else return (jj_ntk = jj_nt.kind); } private java.util.List jj_expentries = new java.util.ArrayList(); private int[] jj_expentry; private int jj_kind = -1; private int[] jj_lasttokens = new int[100]; private int jj_endpos; private void jj_add_error_token(int kind, int pos) { if (pos >= 100) return; if (pos == jj_endpos + 1) { jj_lasttokens[jj_endpos++] = kind; } else if (jj_endpos != 0) { jj_expentry = new int[jj_endpos]; for (int i = 0; i < jj_endpos; i++) { jj_expentry[i] = jj_lasttokens[i]; } jj_entries_loop: for (java.util.Iterator it = jj_expentries.iterator(); it.hasNext();) { int[] oldentry = (int[])(it.next()); if (oldentry.length == jj_expentry.length) { for (int i = 0; i < jj_expentry.length; i++) { if (oldentry[i] != jj_expentry[i]) { continue jj_entries_loop; } } jj_expentries.add(jj_expentry); break jj_entries_loop; } } if (pos != 0) jj_lasttokens[(jj_endpos = pos) - 1] = kind; } } /** Generate ParseException. */ public ParseException generateParseException() { jj_expentries.clear(); boolean[] la1tokens = new boolean[99]; if (jj_kind >= 0) { la1tokens[jj_kind] = true; jj_kind = -1; } for (int i = 0; i < 130; i++) { if (jj_la1[i] == jj_gen) { for (int j = 0; j < 32; j++) { if ((jj_la1_0[i] & (1< jj_gen) { jj_la = p.arg; jj_lastpos = jj_scanpos = p.first; switch (i) { case 0: jj_3_1(); break; } } p = p.next; } while (p != null); } catch(LookaheadSuccess ls) { } } jj_rescan = false; } private void jj_save(int index, int xla) { JJCalls p = jj_2_rtns[index]; while (p.gen > jj_gen) { if (p.next == null) { p = p.next = new JJCalls(); break; } p = p.next; } p.gen = jj_gen + xla - jj_la; p.first = token; p.arg = xla; } static final class JJCalls { int gen; Token first; int arg; JJCalls next; } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy