- Timestamp:
- 2013-12-29T12:03:21+01:00 (11 years ago)
- Location:
- trunk
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/Condition.java
r6554 r6560 22 22 abstract public boolean applies(Environment e); 23 23 24 public static Condition create (String k, String v, Op op, Context context, boolean considerValAsKey) {24 public static Condition createKeyValueCondition(String k, String v, Op op, Context context, boolean considerValAsKey) { 25 25 switch (context) { 26 26 case PRIMITIVE: … … 41 41 } 42 42 43 public static Condition create (String k, boolean not, KeyMatchType matchType, Context context) {43 public static Condition createKeyCondition(String k, boolean not, KeyMatchType matchType, Context context) { 44 44 switch (context) { 45 45 case PRIMITIVE: … … 57 57 } 58 58 59 public static Condition create (String id, boolean not, Context context) {59 public static Condition createPseudoClassCondition(String id, boolean not, Context context) { 60 60 return new PseudoClassCondition(id, not); 61 61 } 62 62 63 public static Condition create(Expression e, Context context) { 63 public static Condition createClassCondition(String id, boolean not, Context context) { 64 return new ClassCondition(id, not); 65 } 66 67 public static Condition createExpressionCondition(Expression e, Context context) { 64 68 return new ExpressionCondition(e); 65 69 } … … 275 279 } 276 280 281 public static class ClassCondition extends Condition { 282 283 public final String id; 284 public final boolean not; 285 286 public ClassCondition(String id, boolean not) { 287 this.id = id; 288 this.not = not; 289 } 290 291 @Override 292 public boolean applies(Environment env) { 293 return not ^ env.mc.getCascade(env.layer).containsKey(id); 294 } 295 296 @Override 297 public String toString() { 298 return (not ? "!" : "") + "." + id; 299 } 300 } 301 277 302 public static class PseudoClassCondition extends Condition { 278 303 -
trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/ExpressionFactory.java
r6538 r6560 84 84 Environment env; 85 85 86 /** 87 * Identity function for compatibility with MapCSS specification. 88 * @param o any object 89 * @return {@code o} unchanged 90 */ 86 91 public static Object eval(Object o) { 87 92 return o; -
trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSParser.jj
r6554 r6560 42 42 TOKEN: 43 43 { 44 < IDENT: ["a"-"z","A"-"Z","_"] ( ["a"-"z","A"-"Z","_","-","0"-"9"] )* > 44 < SET: ("set" | "SET") > 45 | < IDENT: ["a"-"z","A"-"Z","_"] ( ["a"-"z","A"-"Z","_","-","0"-"9"] )* > 45 46 | < UINT: ["1"-"9"] ( ["0"-"9"] )* > 46 47 | < UFLOAT: ( ["0"-"9"] )+ ( "." ( ["0"-"9"] )+ )? > … … 78 79 | < DOLLAR: "$" > 79 80 | < CARET: "^" > 81 | < FULLSTOP: "." > 80 82 | < COMMENT_START: "/*" > : COMMENT 81 83 | < UNEXPECTED_CHAR : ~[] > // avoid TokenMgrErrors because they are hard to recover from … … 271 273 ( 272 274 ( <GREATER> { parentSelector = false; } | <LESS> { parentSelector = true; } ) 273 ( ( c=condition(Context.LINK) | c= pseudoclass(Context.LINK) ) { conditions.add(c); } )*275 ( ( c=condition(Context.LINK) | c=class_or_pseudoclass(Context.LINK) ) { conditions.add(c); } )* 274 276 { selLink = new LinkSelector(conditions); } 275 277 w() … … 290 292 ( base=<IDENT> | base=<STAR> ) 291 293 ( r=zoom() )? 292 ( ( c=condition(Context.PRIMITIVE) | c= pseudoclass(Context.PRIMITIVE) ) { conditions.add(c); } )*294 ( ( c=condition(Context.PRIMITIVE) | c=class_or_pseudoclass(Context.PRIMITIVE) ) { conditions.add(c); } )* 293 295 ( sub=subpart() )? 294 296 { return new GeneralSelector(base.image, r, conditions, sub); } … … 327 329 c=simple_key_value_condition(context) s() <RSQUARE> { return c; } 328 330 | 329 e=expression() <RSQUARE> { return Condition.create (e, context); }331 e=expression() <RSQUARE> { return Condition.createExpressionCondition(e, context); } 330 332 ) 331 333 } … … 357 359 ( LOOKAHEAD(2) <QUESTION> <EXCLAMATION> { matchType = Condition.KeyMatchType.FALSE; } )? 358 360 ( <QUESTION> { matchType = Condition.KeyMatchType.TRUE; } )? 359 { return Condition.create (key, not, matchType, context); }361 { return Condition.createKeyCondition(key, not, matchType, context); } 360 362 } 361 363 … … 418 420 f=float_() { val=Float.toString(f); } 419 421 ) 420 { return Condition.create (key, val, op, context, considerValAsKey); }421 } 422 423 Condition pseudoclass(Context context) :422 { return Condition.createKeyValueCondition(key, val, op, context, considerValAsKey); } 423 } 424 425 Condition class_or_pseudoclass(Context context) : 424 426 { 425 427 Token t; 426 428 boolean not = false; 429 boolean pseudo; 427 430 } 428 431 { 429 432 ( <EXCLAMATION> { not = true; } )? 430 <COLON> 433 ( 434 <FULLSTOP> { pseudo = false; } 435 | 436 <COLON> { pseudo = true; } 437 ) 431 438 t=<IDENT> 432 { return Condition.create(t.image, not, context); } 439 { return pseudo 440 ? Condition.createPseudoClassCondition(t.image, not, context) 441 : Condition.createClassCondition(t.image, not, context); } 433 442 } 434 443 … … 448 457 Instruction i; 449 458 Token key; 450 Object val ;459 Object val = null; 451 460 } 452 461 { 453 462 <LBRACE> w() 454 463 ( 464 ( 465 <SET> w() key=<IDENT> w() 466 ( <EQUAL> val=expression() )? 467 { ins.add(new Instruction.AssignmentInstruction(key.image, val == null ? true : val)); } 468 ( <RBRACE> { return ins; } | <SEMICOLON> w() ) 469 ) 470 | 455 471 key=<IDENT> w() <COLON> w() 456 472 ( -
trunk/test/unit/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSParserTest.groovy
r6554 r6560 8 8 import org.openstreetmap.josm.data.osm.Way 9 9 import org.openstreetmap.josm.gui.mappaint.Environment 10 import org.openstreetmap.josm.gui.mappaint.MultiCascade 10 11 import org.openstreetmap.josm.gui.mappaint.mapcss.parsergen.MapCSSParser 11 12 … … 22 23 } 23 24 25 protected static MapCSSParser getParser(String stringToParse) { 26 return new MapCSSParser(new StringReader(stringToParse)); 27 } 28 24 29 @Before 25 30 public void setUp() throws Exception { … … 28 33 29 34 @Test 35 public void testKothicStylesheets() throws Exception { 36 new MapCSSParser(new URL("http://kothic.googlecode.com/hg/src/styles/default.mapcss").openStream(), "UTF-8") 37 new MapCSSParser(new URL("http://kothic.googlecode.com/hg/src/styles/mapink.mapcss").openStream(), "UTF-8") 38 } 39 40 @Test 41 public void testDeclarations() { 42 getParser("{ opacity: 0.5; color: rgb(1.0, 0.0, 0.0); }").declaration() 43 getParser("{ set tag=value; }").declaration() //set a tag 44 getParser("{ set tag; }").declaration() // set a tag to 'yes' 45 getParser("{ opacity: eval(\"tag('population')/100000\"); }").declaration() 46 getParser("{ set width_in_metres=eval(\"tag('lanes')*3\"); }").declaration() 47 } 48 49 @Test 50 public void testClassCondition() throws Exception { 51 def conditions = ((Selector.GeneralSelector) getParser("way[name=X].highway:closed").selector()).conds 52 assert conditions.get(0) instanceof Condition.KeyValueCondition 53 assert conditions.get(0).applies(getEnvironment("name", "X")) 54 assert conditions.get(1) instanceof Condition.ClassCondition 55 assert conditions.get(2) instanceof Condition.PseudoClassCondition 56 } 57 58 @Test 59 public void testClassMatching() throws Exception { 60 def css = new MapCSSStyleSource("") 61 getParser("" + 62 "way[highway=footway] { set path; color: #FF6644; width: 2; }\n" + 63 "way[highway=path] { set path; color: brown; width: 2; }\n" + 64 "way[\"set\"=escape] { }\n" + 65 "way.path { text:auto; text-color: green; text-position: line; text-offset: 5; }\n" + 66 "way!.path { color: orange; }\n" 67 ).sheet(css) 68 assert css.getErrors().isEmpty() 69 def mc1 = new MultiCascade() 70 css.apply(mc1, getPrimitive("highway", "path"), 1, null, false); 71 assert "green".equals(mc1.getCascade("default").get("text-color", null, String.class)) 72 assert "brown".equals(mc1.getCascade("default").get("color", null, String.class)) 73 def mc2 = new MultiCascade() 74 css.apply(mc2, getPrimitive("highway", "residential"), 1, null, false); 75 assert "orange".equals(mc2.getCascade("default").get("color", null, String.class)) 76 assert mc2.getCascade("default").get("text-color", null, String.class) == null 77 } 78 79 @Test 30 80 public void testEqualCondition() throws Exception { 31 def condition = (Condition.KeyValueCondition) new MapCSSParser(new StringReader("[surface=paved]")).condition(Condition.Context.PRIMITIVE)81 def condition = (Condition.KeyValueCondition) getParser("[surface=paved]").condition(Condition.Context.PRIMITIVE) 32 82 assert condition instanceof Condition.KeyValueCondition 33 83 assert Condition.Op.EQ.equals(condition.op) … … 40 90 @Test 41 91 public void testNotEqualCondition() throws Exception { 42 def condition = (Condition.KeyValueCondition) new MapCSSParser(new StringReader("[surface!=paved]")).condition(Condition.Context.PRIMITIVE)92 def condition = (Condition.KeyValueCondition) getParser("[surface!=paved]").condition(Condition.Context.PRIMITIVE) 43 93 assert Condition.Op.NEQ.equals(condition.op) 44 94 assert !condition.applies(getEnvironment("surface", "paved")) … … 48 98 @Test 49 99 public void testRegexCondition() throws Exception { 50 def condition = (Condition.KeyValueCondition) new MapCSSParser(new StringReader("[surface=~/paved|unpaved/]")).condition(Condition.Context.PRIMITIVE)100 def condition = (Condition.KeyValueCondition) getParser("[surface=~/paved|unpaved/]").condition(Condition.Context.PRIMITIVE) 51 101 assert Condition.Op.REGEX.equals(condition.op) 52 102 assert condition.applies(getEnvironment("surface", "unpaved")) … … 56 106 @Test 57 107 public void testNegatedRegexCondition() throws Exception { 58 def condition = (Condition.KeyValueCondition) new MapCSSParser(new StringReader("[surface!~/paved|unpaved/]")).condition(Condition.Context.PRIMITIVE)108 def condition = (Condition.KeyValueCondition) getParser("[surface!~/paved|unpaved/]").condition(Condition.Context.PRIMITIVE) 59 109 assert Condition.Op.NREGEX.equals(condition.op) 60 110 assert !condition.applies(getEnvironment("surface", "unpaved")) … … 64 114 @Test 65 115 public void testStandardKeyCondition() throws Exception { 66 def c1 = (Condition.KeyCondition) new MapCSSParser(new StringReader("[ highway ]")).condition(Condition.Context.PRIMITIVE)116 def c1 = (Condition.KeyCondition) getParser("[ highway ]").condition(Condition.Context.PRIMITIVE) 67 117 assert c1.matchType == null 68 118 assert c1.applies(getEnvironment("highway", "unclassified")) 69 119 assert !c1.applies(getEnvironment("railway", "rail")) 70 def c2 = (Condition.KeyCondition) new MapCSSParser(new StringReader("[\"/slash/\"]")).condition(Condition.Context.PRIMITIVE)120 def c2 = (Condition.KeyCondition) getParser("[\"/slash/\"]").condition(Condition.Context.PRIMITIVE) 71 121 assert c2.matchType == null 72 122 assert c2.applies(getEnvironment("/slash/", "yes")) … … 76 126 @Test 77 127 public void testYesNoKeyCondition() throws Exception { 78 def c1 = (Condition.KeyCondition) new MapCSSParser(new StringReader("[oneway?]")).condition(Condition.Context.PRIMITIVE)79 def c2 = (Condition.KeyCondition) new MapCSSParser(new StringReader("[oneway?!]")).condition(Condition.Context.PRIMITIVE)80 def c3 = (Condition.KeyCondition) new MapCSSParser(new StringReader("[!oneway?]")).condition(Condition.Context.PRIMITIVE)81 def c4 = (Condition.KeyCondition) new MapCSSParser(new StringReader("[!oneway?!]")).condition(Condition.Context.PRIMITIVE)128 def c1 = (Condition.KeyCondition) getParser("[oneway?]").condition(Condition.Context.PRIMITIVE) 129 def c2 = (Condition.KeyCondition) getParser("[oneway?!]").condition(Condition.Context.PRIMITIVE) 130 def c3 = (Condition.KeyCondition) getParser("[!oneway?]").condition(Condition.Context.PRIMITIVE) 131 def c4 = (Condition.KeyCondition) getParser("[!oneway?!]").condition(Condition.Context.PRIMITIVE) 82 132 def yes = getEnvironment("oneway", "yes") 83 133 def no = getEnvironment("oneway", "no") … … 99 149 @Test 100 150 public void testRegexKeyCondition() throws Exception { 101 def c1 = (Condition.KeyCondition) new MapCSSParser(new StringReader("[/.*:(backward|forward)\$/]")).condition(Condition.Context.PRIMITIVE)151 def c1 = (Condition.KeyCondition) getParser("[/.*:(backward|forward)\$/]").condition(Condition.Context.PRIMITIVE) 102 152 assert Condition.KeyMatchType.REGEX.equals(c1.matchType) 103 153 assert !c1.applies(getEnvironment("lanes", "3")) … … 109 159 @Test 110 160 public void testKeyKeyCondition() throws Exception { 111 def c1 = (Condition.KeyValueCondition) new MapCSSParser(new StringReader("[foo = *bar]")).condition(Condition.Context.PRIMITIVE)161 def c1 = (Condition.KeyValueCondition) getParser("[foo = *bar]").condition(Condition.Context.PRIMITIVE) 112 162 def w1 = new Way() 113 163 w1.put("foo", "123") … … 116 166 w1.put("bar", "123") 117 167 assert c1.applies(new Environment().withPrimitive(w1)) 118 def c2 = (Condition.KeyValueCondition) new MapCSSParser(new StringReader("[foo =~ */bar/]")).condition(Condition.Context.PRIMITIVE)168 def c2 = (Condition.KeyValueCondition) getParser("[foo =~ */bar/]").condition(Condition.Context.PRIMITIVE) 119 169 def w2 = new Way(w1) 120 170 w2.put("bar", "[0-9]{3}")
Note:
See TracChangeset
for help on using the changeset viewer.