Ticket #18057: 18057.3.patch
| File 18057.3.patch, 6.4 KB (added by , 7 years ago) |
|---|
-
src/org/openstreetmap/josm/gui/mappaint/mapcss/Functions.java
9 9 import java.util.Collections; 10 10 import java.util.List; 11 11 import java.util.Locale; 12 import java.util.Map.Entry; 12 13 import java.util.TreeSet; 13 14 import java.util.regex.Matcher; 14 15 import java.util.regex.Pattern; 16 import java.util.stream.Collectors; 15 17 import java.util.zip.CRC32; 16 18 17 19 import org.openstreetmap.josm.data.coor.LatLon; … … 386 388 } 387 389 388 390 /** 391 * Get keys that follow a regex 392 * @param env the environment 393 * @param key_regex the pattern that the key must match 394 * @return the values for the keys that match the pattern 395 * @see Functions#tag_regex(Environment, String, String) 396 * @since xxx 397 */ 398 public static List<String> tag_regex(final Environment env, String key_regex) { // NO_UCD (unused code) 399 return tag_regex(env, key_regex, ""); 400 } 401 402 /** 403 * Get keys that follow a regex 404 * @param env the environment 405 * @param key_regex the pattern that the key must match 406 * @return the values for the keys that match the pattern 407 * @param flags a string that may contain "i" (case insensitive), "m" (multiline) and "s" ("dot all") 408 * @see Pattern#CASE_INSENSITIVE 409 * @see Pattern#DOTALL 410 * @see Pattern#MULTILINE 411 * @since xxx 412 */ 413 public static List<String> tag_regex(final Environment env, String key_regex, String flags) { // NO_UCD (unused code) 414 int f = parse_regex_flags(flags); 415 Pattern compiled = Pattern.compile(key_regex, f); 416 return env.osm.getKeys().entrySet().stream() 417 .filter(object -> compiled.matcher(object.getKey()).find()) 418 .map(Entry::getValue).collect(Collectors.toList()); 419 } 420 421 /** 422 * Parse flags for regex usage. Shouldn't be used in mapcss 423 * @param flags a string that may contain "i" (case insensitive), "m" (multiline) and "s" ("dot all") 424 * @see Pattern#CASE_INSENSITIVE 425 * @see Pattern#DOTALL 426 * @see Pattern#MULTILINE 427 * @return An int that can be used by a {@link Pattern} object 428 * @since xxx 429 */ 430 private static final int parse_regex_flags(String flags) { 431 int f = 0; 432 if (flags.contains("i")) { 433 f |= Pattern.CASE_INSENSITIVE; 434 } 435 if (flags.contains("s")) { 436 f |= Pattern.DOTALL; 437 } 438 if (flags.contains("m")) { 439 f |= Pattern.MULTILINE; 440 } 441 return f; 442 } 443 444 /** 389 445 * Gets the first non-null value of the key {@code key} from the object's parent(s). 390 446 * @param env the environment 391 447 * @param key the OSM key … … 724 780 * @since 5699 725 781 */ 726 782 public static boolean regexp_test(String pattern, String target, String flags) { // NO_UCD (unused code) 727 int f = 0; 728 if (flags.contains("i")) { 729 f |= Pattern.CASE_INSENSITIVE; 730 } 731 if (flags.contains("s")) { 732 f |= Pattern.DOTALL; 733 } 734 if (flags.contains("m")) { 735 f |= Pattern.MULTILINE; 736 } 783 int f = parse_regex_flags(flags); 737 784 return Pattern.compile(pattern, f).matcher(target).matches(); 738 785 } 739 786 … … 751 798 * @since 5701 752 799 */ 753 800 public static List<String> regexp_match(String pattern, String target, String flags) { // NO_UCD (unused code) 754 int f = 0; 755 if (flags.contains("i")) { 756 f |= Pattern.CASE_INSENSITIVE; 757 } 758 if (flags.contains("s")) { 759 f |= Pattern.DOTALL; 760 } 761 if (flags.contains("m")) { 762 f |= Pattern.MULTILINE; 763 } 801 int f = parse_regex_flags(flags); 764 802 return Utils.getMatches(Pattern.compile(pattern, f).matcher(target)); 765 803 } 766 804 -
test/unit/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSParserTest.java
12 12 import java.util.Arrays; 13 13 import java.util.List; 14 14 15 import org.junit.Assert; 15 16 import org.junit.Rule; 16 17 import org.junit.Test; 17 18 import org.openstreetmap.josm.TestUtils; … … 262 263 assertFalse(c2.applies(new Environment(w2))); 263 264 } 264 265 266 /** 267 * Make certain that getting tags by regex works 268 * @throws Exception if there is an assert error (or another error) 269 */ 265 270 @Test 271 public void testTagRegex() throws Exception { 272 DataSet ds = new DataSet(); 273 Way way1 = TestUtils.newWay("old_ref=A1 ref=A2", new Node(new LatLon(1, 1)), new Node(new LatLon(2, 2))); 274 for (Node node : way1.getNodes()) { 275 ds.addPrimitive(node); 276 } 277 ds.addPrimitive(way1); 278 279 tagRegex(way1, "way[ref][count(tag_regex(\"ref\")) > 1] {}", new Boolean[] {true, false, false, true, false}); 280 way1.keySet().stream().forEach(key -> way1.put(key, null)); 281 way1.put("old_ref", "A1"); 282 way1.put("ref", "A2"); 283 tagRegex(way1, "way[ref][count(tag_regex(\"ref\", \"i\")) > 1] {}", new Boolean[] {true, false, false, true, true}); 284 } 285 286 private void tagRegex(Way way, String parserString, Boolean[] expected) throws Exception { 287 Selector selector = getParser(parserString).selector(); 288 Assert.assertEquals(expected[0], selector.matches(new Environment(way))); 289 way.put("old_ref", null); 290 Assert.assertEquals(expected[1], selector.matches(new Environment(way))); 291 way.put("no_match_tag", "false"); 292 Assert.assertEquals(expected[2], selector.matches(new Environment(way))); 293 way.put("old_ref", "A22"); 294 Assert.assertEquals(expected[3], selector.matches(new Environment(way))); 295 way.put("old_ref", null); 296 way.put("OLD_REF", "A23"); 297 Assert.assertEquals(expected[4], selector.matches(new Environment(way))); 298 } 299 300 @Test 266 301 public void testParentTag() throws Exception { 267 302 Selector c1 = getParser("way[foo] > node[tag(\"foo\")=parent_tag(\"foo\")] {}").child_selector(); 268 303 DataSet ds = new DataSet();
