- From: Yves Lafon via cvs-syncmail <cvsmail@w3.org>
- Date: Wed, 10 Oct 2012 07:47:33 +0000
- To: www-validator-cvs@w3.org
Update of /sources/public/2002/css-validator/org/w3c/css/parser/analyzer
In directory hutz:/tmp/cvs-serv7462/analyzer
Modified Files:
CssParser.java CssParser.jj CssParserConstants.java
CssParserTokenManager.java
Log Message:
allow empty prefix to match all properties from an @rule
Index: CssParserTokenManager.java
===================================================================
RCS file: /sources/public/2002/css-validator/org/w3c/css/parser/analyzer/CssParserTokenManager.java,v
retrieving revision 1.45
retrieving revision 1.46
diff -u -d -r1.45 -r1.46
--- CssParserTokenManager.java 4 Oct 2012 13:16:50 -0000 1.45
+++ CssParserTokenManager.java 10 Oct 2012 07:47:31 -0000 1.46
@@ -29,12 +29,14 @@
import org.w3c.css.properties.css.CssProperty;
import org.w3c.css.parser.Frame;
import org.w3c.css.parser.CssError;
+import org.w3c.css.parser.CssErrorToken;
import org.w3c.css.parser.CssSelectors;
import org.w3c.css.parser.CssParseException;
import org.w3c.css.parser.AtRule;
import org.w3c.css.media.AtRuleMedia;
import org.w3c.css.media.MediaFeature;
import org.w3c.css.parser.AtRuleFontFace;
+import org.w3c.css.parser.AtRuleKeyframes;
[...1486 lines suppressed...]
break;
default : break;
@@ -6187,14 +6240,15 @@
"\135", "\52", "\56", "\51", "\50", "\72", null, null, null, null, null, null, null,
null, null, null, null, null, "\72\72", null, null, null, null, null, null, null,
null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-null, null, null, null, null, null, null, null, null, null, "\174", };
+null, null, null, null, null, null, null, null, null, null, null, null, null,
+"\174", "\53", };
/** Lexer state names. */
public static final String[] lexStateNames = {
"DEFAULT",
};
static final long[] jjtoToken = {
- 0xffffffffffe00001L, 0x3fc01ffffL,
+ 0xffffffffffe00001L, 0x3ff803ffffL,
};
static final long[] jjtoSkip = {
0x2L, 0x0L,
Index: CssParser.jj
===================================================================
RCS file: /sources/public/2002/css-validator/org/w3c/css/parser/analyzer/CssParser.jj,v
retrieving revision 1.84
retrieving revision 1.85
diff -u -d -r1.84 -r1.85
--- CssParser.jj 4 Oct 2012 13:16:50 -0000 1.84
+++ CssParser.jj 10 Oct 2012 07:47:31 -0000 1.85
@@ -51,12 +51,14 @@
import org.w3c.css.properties.css.CssProperty;
import org.w3c.css.parser.Frame;
import org.w3c.css.parser.CssError;
+import org.w3c.css.parser.CssErrorToken;
import org.w3c.css.parser.CssSelectors;
import org.w3c.css.parser.CssParseException;
import org.w3c.css.parser.AtRule;
import org.w3c.css.media.AtRuleMedia;
import org.w3c.css.media.MediaFeature;
import org.w3c.css.parser.AtRuleFontFace;
+import org.w3c.css.parser.AtRuleKeyframes;
import org.w3c.css.parser.AtRulePage;
import org.w3c.css.parser.AtRulePreference;
import org.w3c.css.parser.AtRulePhoneticAlphabet;
@@ -420,6 +422,15 @@
ac.getFrame().addError(error);
// }
}
+
+ private void addParseError(ParseException e, String skipped) {
+ if (Util.onDebug) {
+ System.err.println(e.getMessage());
+ e.printStackTrace();
+ }
+ CssErrorToken err = new CssErrorToken(e, skipped);
+ ac.getFrame().addError(err);
+ }
}
PARSER_END(CssParser)
@@ -540,7 +551,6 @@
< URL : "url(" ( <S> )* ( <STRING> | <_URL> ) ( <S> )* ")" >
}
-
<DEFAULT>
TOKEN [IGNORE_CASE] :
{
@@ -594,6 +604,7 @@
| < MEDIA_SYM : "@media" >
| < PAGE_SYM : "@page" >
| < FONT_FACE_SYM : "@font-face" >
+ | < KEYFRAMES_SYM : "@keyframes" >
| < PREF_SYM : "@preference" >
| < COLOR_PROFILE : "@color-profile" >
| < ATTOP : "@top" >
@@ -631,16 +642,12 @@
<DEFAULT>
TOKEN [IGNORE_CASE] :
{
- < FUNCTIONLANG : "lang(" >
-}
-
-<DEFAULT>
-TOKEN [IGNORE_CASE] :
-{
- < FUNCTIONNOT : ":not(" >
+ < FUNCTIONLANG : "lang(" >
+ | <FUNCTIONNOT : ":not(" >
+ | <FUNCTIONCALC : "calc(" >
+ | <FUNCTIONATTR : "attr(" >
}
-
<DEFAULT>
TOKEN :
{
@@ -768,7 +775,7 @@
void afterImportDeclaration() :
{String ret; }
{
- ( ( ruleSet() | media() | page() | fontFace() | preference() |
+ ( ( ruleSet() | media() | page() | fontFace() | keyframes() | preference() |
colorprofile() | phoneticAlphabet() | ret=skipStatement()
{ if ((ret == null) || (ret.length() == 0)) {
return;
@@ -1118,6 +1125,127 @@
}
}
+/**
+ * @exception ParseException exception during the parse
+ */
+CssSelectors keyframe_selector(CssSelectors next) :
+{ CssSelectors selector = new CssSelectors(ac, next);
+ selector.setAtRule(getAtRule());
+ Token n;
+}
+{
+ try {
+ ( n=<IDENT> {
+ selector.addType(new TypeSelector(convertIdent(n.image)));
+ } | n=<PERCENTAGE> {
+ selector.addType(new TypeSelector(n.image));
+ } ) ( <S> )*
+ {
+ return selector;
+ }
+ } catch (InvalidParamException ie) {
+ 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);
+ }
+ return null;
+ } catch (ParseException e) {
+ // TODO fix the error
+ Token t = getToken(1);
+ int _line = t.beginLine;
+ int _col = t.beginColumn;
+ StringBuilder s = new StringBuilder();
+ s.append(" [");
+ 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(']');
+ addParseError(e, s.toString());
+ validSelector = true;
+ return null;
+ }
+}
+
+
+void keyframes() :
+{
+ Token n;
+ ArrayList<CssProperty> v;
+ AtRule old = getAtRule();
+ AtRuleKeyframes krule = new AtRuleKeyframes("-internal-");
+ setAtRule(krule);
+ CssSelectors s;
+ ArrayList<CssSelectors> sl;
+ CssVersion version = ac.getCssVersion();
+}
+{
+ try {
+ <KEYFRAMES_SYM> ( <S> )+ n=<IDENT> ( <S> )* {
+ krule.setName(convertIdent(n.image));
+ if (version.compareTo(CssVersion.CSS3) < 0) {
+ skipStatement();
+ addError(new InvalidParamException("noatruleyet", "", ac),
+ getAtRule().toString());
+ } else {
+ newAtRule(getAtRule());
+ }
+ }
+ <LBRACE> ( <S> )*
+ ( s=keyframe_selector(null) {
+ sl = new ArrayList<CssSelectors>();
+ if (s != null) {
+ s.setAtRule(getAtRule());
+ sl.add(s);
+ }
+ }
+ ( <COMMA> ( <S> )* s=keyframe_selector(null) {
+ if (s != null) {
+ s.setAtRule(getAtRule());
+ sl.add(s);
+ }
+ } )*
+ <LBRACE> ( <S> )* v=declarations() <RBRACE> ( <S> )* {
+ validSelector = (sl.size() != 0);
+ if (v == null) {
+ ac.getFrame().addWarning("no-declaration");
+ } else {
+ boolean first = true;
+ for (CssSelectors _s : sl) {
+ if (first) {
+ handleRule(_s, v);
+ first = false;
+ } else {
+ ArrayList<CssProperty> vcopy = new ArrayList<CssProperty>(v.size());
+ for (CssProperty p : v) {
+ vcopy.add(p.duplicate());
+ }
+ handleRule(_s, vcopy);
+ }
+ }
+ }
+ setSelectorList(sl);
+ endOfRule();
+ }
+ )* <RBRACE> ( <S> )* {
+ endOfAtRule();
+ }
+ } catch (ParseException e) {
+ addError(e, skipStatement());
+ } finally {
+ setAtRule(old);
+ }
+}
+
void fontFace() :
{
ArrayList<CssProperty> v;
@@ -1399,10 +1527,7 @@
} else {*/
if (value_set != null) {
boolean first = true;
- CssSelectors sel = null;
- Iterator<CssSelectors> e = context_set.iterator();
- while (e.hasNext()) {
- sel = e.next();
+ for (CssSelectors sel : context_set) {
if (first) {
handleRule(sel, value_set);
first = false;
@@ -1412,9 +1537,9 @@
// badly with conflict detection
int vsize = value_set.size();
ArrayList<CssProperty> v = new ArrayList<CssProperty>(vsize);
- for (int i=0; i<vsize; i++) {
- v.add(value_set.get(i).duplicate());
- }
+ for (CssProperty p : value_set) {
+ v.add(p.duplicate());
+ }
handleRule(sel, v);
}
}
@@ -1425,7 +1550,7 @@
}
} catch (ParseException e) {
if ((ac.getCssProfile() != CssProfile.MOBILE) && !context_set.isEmpty()) {
- addError(e, skipStatement());
+ addError(e, skipStatement());
}
} catch (TokenMgrError e) {
addError(new ParseException(e.getMessage()), skipStatement());
@@ -2285,6 +2410,91 @@
UNICODERANGE); }
) ( <S> )* )
}
+
+CssCheckableValue mathcalc() :
+{
+CssCheckableValue v;
+}
+{
+ ( <FUNCTIONCALC> ( <S> )* v=mathsum() ( <S> )* ")" ) {
+ return v;
+ }
+}
+
+CssCheckableValue mathsum() :
+{ Token n,o;
+ CssCheckableValue v1 = null;
+ CssCheckableValue v2 = null;
+}
+{ // product [ S+ [ "+" | "-" ] S+ product ]*;
+ ( v1=mathproduct() ( LOOKAHEAD(1) ( <S> )+ ( o="+" | o="-" ) ( <S> )+ v2=mathproduct() {
+ // TODO add stuff, type checking etc...
+ }
+ )*
+ ) { return v1; }
+}
+
+
+CssCheckableValue mathproduct() :
+{ Token n,o;
+ CssCheckableValue v1 = null;
+ CssCheckableValue v2 = null;
+}
+{
+
+ ( v1=mathunit() ( LOOKAHEAD(1) ( <S> )* ( ( o="*" ( <S> )* v2=mathunit() )
+ | ( o="/" ( <S> )* n=<NUMBER> { v2 = new CssNumber(); v2.set(n.image, ac); } )
+ ) { /* TODO check */
+ if ("/".equals(o.image)) {
+ BigDecimal p = (BigDecimal) v1.get();
+ BigDecimal d = (BigDecimal) v2.get();
+ if (BigDecimal.ZERO.equals(d)) {
+ // TODO throw divided by zero error
+ }
+ p.divide(d);
+ v1.setValue(p);
+ } else {
+ if ((v1.getType() != CssTypes.CSS_NUMBER) &&
+ (v2.getType() != CssTypes.CSS_NUMBER)) {
+ // TODO one operand must be a number
+ }
+ BigDecimal p = (BigDecimal) v1.get();
+ BigDecimal d = (BigDecimal) v2.get();
+ p.multiply(d);
+ if (v1.getType() == CssTypes.CSS_NUMBER) {
+ v2.setValue(p);
+ v1 = v2;
+ } else {
+ v1.setValue(p);
+ }
+ }
+ }
+ )*
+ ) { return v1; }
+}
+
+CssCheckableValue mathunit() :
+{ Token n;
+CssCheckableValue v = null;
+}
+{
+( n=<NUMBER> { v = new CssNumber(); v.set(n.image, ac); }
+ | n=<PERCENTAGE> { v = new CssPercentage(); v.set(n.image, ac); }
+ | n=<RELFONTLENGTH> { v = new CssLength(); v.set(n.image, ac); }
+ | n=<RELVIEWLENGTH> { v = new CssLength(); v.set(n.image, ac); }
+ | n=<ABSOLUTLENGTH> { v = new CssLength(); v.set(n.image, ac); }
+ | n=<ANGLE> { v = new CssAngle(); v.set(n.image, ac); }
+ | n=<TIME> { v = new CssTime(); v.set(n.image, ac); }
+ | n=<FREQ> { v= new CssFrequency(); v.set(n.image, ac); }
+ | ( "(" ( <S> )* v=mathsum() ( <S> )* ")" )
+ | v=mathcalc()
+ // | v=attr()
+ ) {
+ return v;
+ }
+}
+
+
/**
* @exception ParseException exception during the parse
*/
Index: CssParser.java
===================================================================
RCS file: /sources/public/2002/css-validator/org/w3c/css/parser/analyzer/CssParser.java,v
retrieving revision 1.85
retrieving revision 1.86
diff -u -d -r1.85 -r1.86
--- CssParser.java 4 Oct 2012 13:16:49 -0000 1.85
+++ CssParser.java 10 Oct 2012 07:47:30 -0000 1.86
@@ -31,12 +31,14 @@
import org.w3c.css.properties.css.CssProperty;
import org.w3c.css.parser.Frame;
import org.w3c.css.parser.CssError;
+import org.w3c.css.parser.CssErrorToken;
import org.w3c.css.parser.CssSelectors;
import org.w3c.css.parser.CssParseException;
import org.w3c.css.parser.AtRule;
import org.w3c.css.media.AtRuleMedia;
import org.w3c.css.media.MediaFeature;
import org.w3c.css.parser.AtRuleFontFace;
+import org.w3c.css.parser.AtRuleKeyframes;
[...1846 lines suppressed...]
- boolean[] la1tokens = new boolean[98];
+ boolean[] la1tokens = new boolean[102];
if (jj_kind >= 0) {
la1tokens[jj_kind] = true;
jj_kind = -1;
}
- for (int i = 0; i < 143; i++) {
+ for (int i = 0; i < 168; i++) {
if (jj_la1[i] == jj_gen) {
for (int j = 0; j < 32; j++) {
if ((jj_la1_0[i] & (1<<j)) != 0) {
@@ -4378,7 +4895,7 @@
}
}
}
- for (int i = 0; i < 98; i++) {
+ for (int i = 0; i < 102; i++) {
if (la1tokens[i]) {
jj_expentry = new int[1];
jj_expentry[0] = i;
Index: CssParserConstants.java
===================================================================
RCS file: /sources/public/2002/css-validator/org/w3c/css/parser/analyzer/CssParserConstants.java,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -d -r1.21 -r1.22
--- CssParserConstants.java 6 Sep 2012 12:37:53 -0000 1.21
+++ CssParserConstants.java 10 Oct 2012 07:47:31 -0000 1.22
@@ -153,55 +153,61 @@
/** RegularExpression Id. */
int FONT_FACE_SYM = 71;
/** RegularExpression Id. */
- int PREF_SYM = 72;
+ int KEYFRAMES_SYM = 72;
/** RegularExpression Id. */
- int COLOR_PROFILE = 73;
+ int PREF_SYM = 73;
/** RegularExpression Id. */
- int ATTOP = 74;
+ int COLOR_PROFILE = 74;
/** RegularExpression Id. */
- int ATRIGHT = 75;
+ int ATTOP = 75;
/** RegularExpression Id. */
- int ATBOTTOM = 76;
+ int ATRIGHT = 76;
/** RegularExpression Id. */
- int ATLEFT = 77;
+ int ATBOTTOM = 77;
/** RegularExpression Id. */
- int ATCOUNTER = 78;
+ int ATLEFT = 78;
/** RegularExpression Id. */
- int PHONETIC_ALPHABET_SYM = 79;
+ int ATCOUNTER = 79;
/** RegularExpression Id. */
- int ATKEYWORD = 80;
+ int PHONETIC_ALPHABET_SYM = 80;
/** RegularExpression Id. */
- int RANGE0 = 81;
+ int ATKEYWORD = 81;
/** RegularExpression Id. */
- int RANGE1 = 82;
+ int RANGE0 = 82;
/** RegularExpression Id. */
- int RANGE2 = 83;
+ int RANGE1 = 83;
/** RegularExpression Id. */
- int RANGE3 = 84;
+ int RANGE2 = 84;
/** RegularExpression Id. */
- int RANGE4 = 85;
+ int RANGE3 = 85;
/** RegularExpression Id. */
- int RANGE5 = 86;
+ int RANGE4 = 86;
/** RegularExpression Id. */
- int RANGE6 = 87;
+ int RANGE5 = 87;
/** RegularExpression Id. */
- int RANGE = 88;
+ int RANGE6 = 88;
/** RegularExpression Id. */
- int UNI = 89;
+ int RANGE = 89;
/** RegularExpression Id. */
- int UNICODERANGE = 90;
+ int UNI = 90;
/** RegularExpression Id. */
- int CLASS = 91;
+ int UNICODERANGE = 91;
/** RegularExpression Id. */
- int FUNCTIONLANG = 92;
+ int CLASS = 92;
/** RegularExpression Id. */
- int FUNCTIONNOT = 93;
+ int FUNCTIONLANG = 93;
/** RegularExpression Id. */
- int FUNCTION = 94;
+ int FUNCTIONNOT = 94;
/** RegularExpression Id. */
- int HTMLSTARTTAG = 95;
+ int FUNCTIONCALC = 95;
/** RegularExpression Id. */
- int HTMLENDTAG = 96;
+ int FUNCTIONATTR = 96;
+ /** RegularExpression Id. */
+ int FUNCTION = 97;
+ /** RegularExpression Id. */
+ int HTMLSTARTTAG = 98;
+ /** RegularExpression Id. */
+ int HTMLENDTAG = 99;
/** Lexical state. */
int DEFAULT = 0;
@@ -280,6 +286,7 @@
"\"@media\"",
"\"@page\"",
"\"@font-face\"",
+ "\"@keyframes\"",
"\"@preference\"",
"\"@color-profile\"",
"\"@top\"",
@@ -302,10 +309,13 @@
"<CLASS>",
"\"lang(\"",
"\":not(\"",
+ "\"calc(\"",
+ "\"attr(\"",
"<FUNCTION>",
"<HTMLSTARTTAG>",
"<HTMLENDTAG>",
"\"|\"",
+ "\"+\"",
};
}
Received on Wednesday, 10 October 2012 07:47:34 UTC