- From: Yves Lafon via cvs-syncmail <cvsmail@w3.org>
- Date: Tue, 24 Feb 2009 23:29:15 +0000
- To: www-validator-cvs@w3.org
Update of /sources/public/2002/css-validator/org/w3c/css/parser/analyzer In directory hutz:/tmp/cvs-serv21985 Modified Files: CssParser.jj Log Message: various changes done on selectors to allow error recovery on a selector list. Previously: "a, ::unknown, b" was entirely removed, as ::unknown is an error, now it is just ignored as it should. Note that if no selectors are present, the next "{ ... }" is not checked. Index: CssParser.jj =================================================================== RCS file: /sources/public/2002/css-validator/org/w3c/css/parser/analyzer/CssParser.jj,v retrieving revision 1.64 retrieving revision 1.65 diff -u -d -r1.64 -r1.65 --- CssParser.jj 18 Feb 2009 07:02:20 -0000 1.64 +++ CssParser.jj 24 Feb 2009 23:29:13 -0000 1.65 @@ -128,7 +128,7 @@ private boolean reinited = false; - static StringBuffer SPACE = new StringBuffer(" "); + static StringBuilder SPACE = new StringBuilder(" "); // to be able to remove a ruleset if the selector is not valid protected boolean validSelector = true; @@ -1258,7 +1258,10 @@ } } )* - <LBRACE> ( <S> )* + <LBRACE> { + validSelector = (context_set.size() > 0); + } + ( <S> )* value_set=declarations() <RBRACE> ( <S> )* { @@ -1398,44 +1401,39 @@ { return current; } } catch (InvalidParamException ie) { - skipStatement(); - removeThisRule(); + // 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); + } return null; } catch (ParseException e) { - validSelector = false; - if (ac.getProfile() != null) { - if(!(ac.getProfile().equals("mobile"))) { - Token t = getToken(1); - StringBuffer s = new StringBuffer(); - s.append(getToken(0).image); - while ((t.kind != COMMA) && (t.kind != LBRACE) && - (t.kind != EOF)) { - s.append(t.image); - getNextToken(); - t = getToken(1); - } - - addError(e, s.toString()); - - return null; - } - } else { - Token t = getToken(1); - StringBuffer s = new StringBuffer(); - s.append(getToken(0).image); - while ((t.kind != COMMA) && (t.kind != LBRACE) && (t.kind != EOF)) { - s.append(t.image); - getNextToken(); - t = getToken(1); - } - - addError(e, s.toString()); - - return null; + // 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; + return null; } } @@ -1490,8 +1488,9 @@ // s.addAttribute("class", convertIdent(n.image.substring(1)), // CssSelectors.ATTRIBUTE_CLASS_SEL); } catch (InvalidParamException e) { - removeThisRule(); - ac.getFrame().addError(new CssError(e)); + // removeThisRule(); + ac.getFrame().addError(new CssError(e)); + throw new ParseException(e.getMessage()); } } /* FIXME <DOT> n=deprecated_class() ... ?? (DONE-> to be tested) */ @@ -1500,22 +1499,22 @@ n.image = n.image.substring(1); // the class with the first digit escaped - String cl = "\\" + Integer.toString(n.image.charAt(0), 16); - cl += n.image.substring(1); - + String cl = "."+hexEscapeFirst(n.image); + String profile = ac.getProfile(); if(profile == null || profile.equals("") || profile.equals("none")) { profile = ac.getCssVersion(); } if(!profile.equals("css1")) { - addError(new ParseException(ac.getMsg().getString( - "parser.old_class")), - "To make \"." + n.image + "\" a valid class, CSS2" + - " requires the first digit to be escaped " + - "(\"." + cl + "\")"); - s.addClass(new ClassSelector(n.image)); - removeThisRule(); + StringBuilder sb = new StringBuilder(); + Vector<String> param_err = new Vector<String>(2); + param_err.add(n.image); + param_err.add(cl); + sb.append(ac.getMsg().getString("parser.old_class", param_err)); + throw new ParseException(sb.toString()); + // s.addClass(new ClassSelector(n.image)); + // removeThisRule(); } else { CssLength length = new CssLength(); @@ -1528,21 +1527,23 @@ isLength = false; } if(isLength) { - addError(new ParseException(ac.getMsg().getString( - "parser.class_dim")), n.image); - s.addClass(new ClassSelector(n.image)); - removeThisRule(); + StringBuilder sb = new StringBuilder(); + sb.append(ac.getMsg().getString("parser.class_dim")); + sb.append(n.image); + 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)); - + s.addClass(new ClassSelector(n.image)); ac.getFrame().addWarning("old_class"); } catch (InvalidParamException e) { - ac.getFrame().addError(new CssError(e)); - removeThisRule(); + throw new ParseException(e.getMessage()); + //ac.getFrame().addError(new CssError(e)); + //removeThisRule(); } } } @@ -1761,9 +1762,10 @@ ac.getCssVersion() ,ac); } } catch(InvalidParamException e) { - //e.printStackTrace(); - removeThisRule(); - ac.getFrame().addError(new CssError(e)); + // removeThisRule(); + // ac.getFrame().addError(new CssError(e)); + validSelector = false; + throw new ParseException(e.getMessage()); } } ) ) | @@ -1772,7 +1774,6 @@ try { s.addPseudoClass(convertIdent(n.image).toLowerCase()); } catch(InvalidParamException e) { - //e.printStackTrace(); removeThisRule(); ac.getFrame().addError(new CssError(e)); } @@ -1870,7 +1871,7 @@ } } | n=<HASH> { - throw new ParseException("Unrecognized "); + throw new ParseException(ac.getMsg().getString("parser.invalid_id_selector")); } } @@ -2135,7 +2136,7 @@ JAVACODE String skipStatement() { - StringBuffer s = new StringBuffer(); + StringBuilder s = new StringBuilder(); Token tok = getToken(0); boolean first = true; @@ -2194,7 +2195,7 @@ JAVACODE String skip_to_matching_brace() { - StringBuffer s = new StringBuffer(); + StringBuilder s = new StringBuilder(); Token tok; int nesting = 1; /* FIXME @@ -2235,7 +2236,7 @@ */ JAVACODE void skipAfterExpression(Exception e) { - StringBuffer s = new StringBuffer(); + StringBuilder s = new StringBuilder(); s.append(getToken(0).image); while (true) { try { @@ -2392,6 +2393,19 @@ return convertStringIndex(s, 0, s.length(), false); } +JAVACODE +String hexEscapeFirst(String s) { + StringBuilder sb = new StringBuilder(); + sb.append('\\').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(); +} /* * compile-command: javacc CssParser.jj & jc CssParser.java */
Received on Tuesday, 24 February 2009 23:29:24 UTC