Legend:
- Unmodified
- Added
- Removed
-
trunk/src/org/openstreetmap/josm/tools/Tag2Link.java
r18208 r18475 11 11 import java.util.Arrays; 12 12 import java.util.Collections; 13 import java.util. HashMap;13 import java.util.EnumMap; 14 14 import java.util.List; 15 15 import java.util.Map; 16 16 import java.util.Objects; 17 17 import java.util.Optional; 18 import java.util.Set; 18 19 import java.util.function.Supplier; 19 20 import java.util.function.UnaryOperator; … … 68 69 static final CachingProperty<List<String>> PREF_SEARCH_ENGINES = new ListProperty("tag2link.search", 69 70 Arrays.asList("https://duckduckgo.com/?q=$1", "https://www.google.com/search?q=$1")).cached(); 71 private static final Pattern PATTERN_DOLLAR_ONE = Pattern.compile("$1", Pattern.LITERAL); 70 72 71 73 private Tag2Link() { … … 148 150 } 149 151 150 final HashMap<OsmPrimitiveType, Optional<ImageResource>> memoize = new HashMap<>();152 final Map<OsmPrimitiveType, Optional<ImageResource>> memoize = new EnumMap<>(OsmPrimitiveType.class); 151 153 final Supplier<ImageResource> imageResource = () -> memoize 152 154 .computeIfAbsent(OsmPrimitiveType.NODE, type -> OsmPrimitiveImageProvider.getResource(key, value, type)) … … 209 211 } 210 212 211 wikidataRules.getValues(key).forEach(urlFormatter -> { 213 final Set<String> formatterUrls = wikidataRules.getValues(key); 214 if (!formatterUrls.isEmpty()) { 212 215 final String formattedValue = valueFormatter.getOrDefault(key, x -> x).apply(value); 213 final String url = urlFormatter.replace("$1", formattedValue); 214 linkConsumer.acceptLink(getLinkName(url, key), url, imageResource.get()); 215 }); 216 217 final String urlKey = formatterUrls.stream().map(urlFormatter -> PATTERN_DOLLAR_ONE.matcher(urlFormatter) 218 .replaceAll(Matcher.quoteReplacement("(.*)"))).map(PatternUtils::compile) 219 .map(pattern -> pattern.matcher(value)).filter(Matcher::matches) 220 .map(matcher -> matcher.group(1)).findFirst().orElse(formattedValue); 221 222 formatterUrls.forEach(urlFormatter -> { 223 // Check if the current value matches the formatter pattern -- some keys can take a full url or a key for 224 // the formatter. Example: https://wiki.openstreetmap.org/wiki/Key:contact:facebook 225 final String url = PATTERN_DOLLAR_ONE.matcher(urlFormatter).replaceAll(urlKey); 226 linkConsumer.acceptLink(getLinkName(url, key), url, imageResource.get()); 227 }); 228 } 216 229 } 217 230 -
trunk/test/unit/org/openstreetmap/josm/tools/Tag2LinkTest.java
r18037 r18475 1 1 // License: GPL. For details, see LICENSE file. 2 2 package org.openstreetmap.josm.tools; 3 4 import static org.junit.jupiter.api.Assertions.assertEquals; 5 import static org.junit.jupiter.api.Assertions.assertTrue; 3 6 4 7 import java.util.ArrayList; … … 6 9 import java.util.List; 7 10 8 import org.junit.Assert;9 11 import org.junit.jupiter.api.Test; 12 import org.junit.jupiter.params.ParameterizedTest; 13 import org.junit.jupiter.params.provider.ValueSource; 10 14 import org.openstreetmap.josm.testutils.annotations.BasicPreferences; 11 15 … … 23 27 24 28 void checkLinks(String... expected) { 25 Assert.assertEquals(Arrays.asList(expected),links);29 assertEquals(Arrays.asList(expected), this.links); 26 30 } 27 31 … … 32 36 void testInitialize() { 33 37 Tag2Link.initialize(); 34 Assert.assertTrue("obtains at least 40 rules", Tag2Link.wikidataRules.size() > 40); 38 assertTrue(Tag2Link.wikidataRules.size() > 40, "obtains at least 40 rules"); 39 } 40 41 /** 42 * Unit test for links that may come in multiple forms. 43 * Example: <a href="https://wiki.osm.org/wiki/Key:contact:facebook">https://wiki.openstreetmap.org/wiki/Key:contact:facebook</a> 44 * 45 * See also JOSM #21794 46 * @param value The tag value for "contact:facebook" 47 */ 48 @ParameterizedTest 49 @ValueSource(strings = {"https://www.facebook.com/FacebookUserName", "FacebookUserName"}) 50 void testUrlKeyMultipleForms(final String value) { 51 // We need the wikidata rules Since testInitialize tests initialization, reuse it. 52 if (!Tag2Link.wikidataRules.containsKey("contact:facebook")) { 53 this.testInitialize(); 54 } 55 Tag2Link.getLinksForTag("contact:facebook", value, this::addLink); 56 this.checkLinks("Open unavatar.now.sh // https://unavatar.now.sh/facebook/FacebookUserName", 57 "Open facebook.com // https://www.facebook.com/FacebookUserName", 58 "Open messenger.com // https://www.messenger.com/t/FacebookUserName"); 35 59 } 36 60
Note:
See TracChangeset
for help on using the changeset viewer.