Changeset 35148 in osm


Ignore:
Timestamp:
2019-09-27T16:12:13+02:00 (5 years ago)
Author:
donvip
Message:

fix #josm14951 - add lat/lon mapping

Location:
applications/editors/josm/plugins/tag2link
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • applications/editors/josm/plugins/tag2link/resources/tag2link_sources.xml

    r35146 r35148  
    201201            <link name="View INSEE explanation of %name% code" href="http://recherche-naf.insee.fr/SIRENET_ClassesNaf/%v%.htm" />
    202202        </rule>
     203        <!--  lat/lon of selected object works, but this website does not. Kept as an example
    203204        <rule>
    204205            <condition k="ref:FR:NAF" v="[A-Z0-9-]{5}" />
    205             <link name="View a map of %name% items" href="https://sidjy.github.io/ape.html?ape=%v%" />
    206         </rule>
    207         <!--  TODO map lat/lon of selected object
    208         <rule>
    209             <condition k="ref:FR:NAF" v="[A-Z0-9-]{5}" />
    210             <link name="View a map of %name% items" href="https://sidjy.github.io/ape.html?ape=%v%#%zoom%/%lat%/%lon%" />
     206            <link name="View a map of %name% items" href="https://sidjy.github.io/ape.html?ape=%v%#15/%lat%/%lon%" />
    211207        </rule> -->
    212208    </src>
  • applications/editors/josm/plugins/tag2link/src/org/openstreetmap/josm/plugins/tag2link/Tag2LinkRuleChecker.java

    r35147 r35148  
    2727import java.util.regex.Pattern;
    2828
     29import org.openstreetmap.josm.data.coor.LatLon;
    2930import org.openstreetmap.josm.data.osm.IPrimitive;
    3031import org.openstreetmap.josm.data.osm.Tag;
     
    7374    }
    7475
    75     private static String replaceParams(String s, EvalResult eval) {
     76    private static String replaceParams(String s, Collection<MatchingTag> matchingTags, LatLon latLon) {
    7677        String result = s;
    7778        Matcher m = PLACEHOLDERS.matcher(s);
     
    8081           
    8182            // Search for a standard value
    82             String val = findValue(arg, eval.matchingTags);
     83            String val = findValue(arg, matchingTags);
    8384           
    8485            // No standard value found: test lang() function
    8586            if (val == null) {
    86                 Matcher lm = LANG.matcher(arg);
    87                 if (lm.matches()) {
    88                     String josmLang = Config.getPref().get("language");
    89                     String jvmLang = (josmLang.isEmpty() ? Locale.getDefault().getLanguage() : josmLang).split("_")[0];
    90                     if (lm.groupCount() == 0) {
    91                         val = jvmLang;
    92                     } else {
    93                         for (int i = 1; i<=lm.groupCount() && val == null; i++) {
    94                             if (jvmLang.equals(lm.group(i))) {
    95                                 val = jvmLang;
    96                             }
    97                         }
    98                     }
    99                 }
    100             }
    101            
     87                val = replaceLang(arg);
     88            }
     89
     90            // No standard value found: test lat/lon
     91            if (val == null && latLon != null) {
     92                val = replaceLatLon(arg, latLon);
     93            }
     94
    10295            // Find a default value if set after ":"
    10396            if (val == null && arg.contains(":")) {
    10497                String[] vars = arg.split(":");
    10598                for (int i = 0; val == null && i < vars.length-1; i++) {
    106                     val = findValue(vars[i], eval.matchingTags);
     99                    val = findValue(vars[i], matchingTags);
    107100                }
    108101                if (val == null) {
     
    135128    }
    136129
    137     private static void replaceMapParams(Map<String, String> map, EvalResult eval) {
     130    private static String replaceLang(String arg) {
     131        Matcher lm = LANG.matcher(arg);
     132        if (lm.matches()) {
     133            String josmLang = Config.getPref().get("language");
     134            String jvmLang = (josmLang.isEmpty() ? Locale.getDefault().getLanguage() : josmLang).split("_")[0];
     135            if (lm.groupCount() == 0) {
     136                return jvmLang;
     137            } else {
     138                for (int i = 1; i <= lm.groupCount(); i++) {
     139                    if (jvmLang.equals(lm.group(i))) {
     140                        return jvmLang;
     141                    }
     142                }
     143            }
     144        }
     145        return null;
     146    }
     147
     148    private static String replaceLatLon(String arg, LatLon ll) {
     149        switch (arg) {
     150            case "lat": return Double.toString(ll.lat());
     151            case "lon": return Double.toString(ll.lon());
     152            default: return null;
     153        }
     154    }
     155
     156    private static void replaceMapParams(Map<String, String> map, Collection<MatchingTag> matchingTags, LatLon latLon) {
    138157        for (Entry<String, String> e : map.entrySet()) {
    139158            String key = e.getKey();
    140159            String value = e.getValue();
    141             String key2 = replaceParams(key, eval);
    142             String value2 = replaceParams(value, eval);
     160            String key2 = replaceParams(key, matchingTags, latLon);
     161            String value2 = replaceParams(value, matchingTags, latLon);
    143162            if (key.equals(key2) && value.equals(value2)) {
    144163                // Nothing to do
     
    154173    }
    155174
    156     private static Collection<Link> processEval(EvalResult eval, Rule rule, Source source) {
     175    private static Collection<Link> processEval(EvalResult eval, Rule rule, Source source, LatLon latLon) {
    157176        Collection<Link> result = new ArrayList<>();
    158177        if (eval.matches()) {
     
    161180                    Link copy = (Link) link.clone();
    162181                    copy.name = copy.name.replaceAll("%name%", source.name);
    163                     copy.url = replaceParams(copy.url, eval);
     182                    copy.url = replaceParams(copy.url, eval.matchingTags, latLon);
    164183                    if (copy instanceof LinkPost) {
    165184                        LinkPost lp = (LinkPost) copy;
    166                         replaceMapParams(lp.headers, eval);
    167                         replaceMapParams(lp.params, eval);
     185                        replaceMapParams(lp.headers, eval.matchingTags, latLon);
     186                        replaceMapParams(lp.params, eval.matchingTags, latLon);
    168187                    }
    169188                    result.add(copy);
     
    176195    }
    177196
    178     private static <T> Collection<Link> doGetLinks(BiFunction<Rule, T, EvalResult> evaluator, T obj) {
     197    private static <T> Collection<Link> doGetLinks(BiFunction<Rule, T, EvalResult> evaluator, T obj, LatLon latLon) {
    179198        Collection<Link> result = new ArrayList<>();
    180199        for (Source source : sources) {
    181200            for (Rule rule : source.rules) {
    182                 result.addAll(processEval(evaluator.apply(rule, obj), rule, source));
     201                result.addAll(processEval(evaluator.apply(rule, obj), rule, source, latLon));
    183202            }
    184203        }
     
    192211     */
    193212    public static Collection<Link> getLinks(IPrimitive p) {
    194         return doGetLinks(Rule::evaluates, p);
     213        return doGetLinks(Rule::evaluates, p, p.getBBox().getCenter());
    195214    }
    196215
     
    198217     * Replies the links relevant to the given OSM tag.
    199218     * @param tag The OSM tag
     219     * @param tags The latlon center, or null
    200220     * @return the links relevant to the {@code tag}.
    201221     */
    202     public static Collection<Link> getLinks(Tag tag) {
    203         return doGetLinks(Rule::evaluates, tag);
     222    public static Collection<Link> getLinks(Tag tag, LatLon latLon) {
     223        return doGetLinks(Rule::evaluates, tag, latLon);
    204224    }
    205225
     
    207227     * Replies the links relevant to the given OSM tags.
    208228     * @param tags The OSM tags
     229     * @param tags The latlon center, or null
    209230     * @return the links relevant to the {@code tags}.
    210231     */
    211     public static Collection<Link> getLinks(Tags tags) {
    212         return doGetLinks(Rule::evaluates, tags);
     232    public static Collection<Link> getLinks(Tags tags, LatLon latLon) {
     233        return doGetLinks(Rule::evaluates, tags, latLon);
    213234    }
    214235}
  • applications/editors/josm/plugins/tag2link/src/org/openstreetmap/josm/plugins/tag2link/data/Rule.java

    r35134 r35148  
    3232    public final Collection<Condition> conditions = new ArrayList<>();
    3333    public final Collection<Link> links = new ArrayList<>();
    34    
     34
    3535    public static class MatchingTag {
    3636        public String key;
     
    4646        }
    4747        public void addParams(Matcher m, String paramName) {
    48             for (int i = 1; i<=m.groupCount(); i++) {
     48            for (int i = 1; i <= m.groupCount(); i++) {
    4949                params.put(prefix+paramName+"."+i, m.group(i));
    5050            }
     
    6262            return "MatchingTag [" + (key != null ? "key=" + key + ", " : "")
    6363                    + (value != null ? "value=" + value + ", " : "")
    64                     + (params != null ? "params=" + params + ", " : "")
    65                     + (prefix != null ? "prefix=" + prefix : "") + "]";
     64                    + "params=" + params + ", "
     65                    + (prefix != null ? "prefix=" + prefix : "") + ']';
    6666        }
    6767    }
    68    
     68
    6969    public static class EvalResult {
    7070        private final int conditionsNumber;
     
    7979        public String toString() {
    8080            return "EvalResult [conditionsNumber=" + conditionsNumber
    81                     + ", matchingTags=" + matchingTags + "]";
     81                    + ", matchingTags=" + matchingTags + ']';
    8282        }
    8383    }
  • applications/editors/josm/plugins/tag2link/src/org/openstreetmap/josm/plugins/tag2link/listeners/PropertyPopupListener.java

    r35134 r35148  
    1616package org.openstreetmap.josm.plugins.tag2link.listeners;
    1717
     18import java.util.Optional;
     19
    1820import javax.swing.JPopupMenu;
    1921import javax.swing.event.PopupMenuEvent;
    2022
     23import org.openstreetmap.josm.data.osm.BBox;
     24import org.openstreetmap.josm.data.osm.OsmPrimitive;
    2125import org.openstreetmap.josm.data.osm.Tags;
     26import org.openstreetmap.josm.gui.MainApplication;
    2227import org.openstreetmap.josm.gui.MapFrame;
    2328import org.openstreetmap.josm.plugins.tag2link.Tag2LinkRuleChecker;
     
    3540        if (tags != null) {
    3641            JPopupMenu popup = (JPopupMenu) e.getSource();
    37             for (Link link : Tag2LinkRuleChecker.getLinks(tags)) {
     42            Optional<BBox> bbox = MainApplication.getLayerManager().getEditDataSet().getSelected()
     43                .stream().filter(x -> x.hasTag(tags.getKey(), tags.getValues())).map(OsmPrimitive::getBBox).findAny();
     44            for (Link link : Tag2LinkRuleChecker.getLinks(tags, bbox.isPresent() ? bbox.get().getCenter() : null)) {
    3845                addLink(popup, link);
    3946            }
  • applications/editors/josm/plugins/tag2link/test/unit/org/openstreetmap/josm/plugins/tag2link/Tag2LinkRuleCheckerTest.java

    r35146 r35148  
    1919    @Test
    2020    public void testImageCommons() {
    21         Collection<Link> links = Tag2LinkRuleChecker.getLinks(new Tag("image", "File:Witten Brücke Gasstraße.jpg"));
     21        Collection<Link> links = Tag2LinkRuleChecker.getLinks(new Tag("image", "File:Witten Brücke Gasstraße.jpg"), null);
    2222        assertEquals(1, links.size());
    2323        assertEquals("https://commons.wikimedia.org/wiki/File%3AWitten_Br%C3%BCcke_Gasstra%C3%9Fe.jpg", links.iterator().next().url);
    24         links = Tag2LinkRuleChecker.getLinks(new Tag("image", "category:JOSM"));
     24        links = Tag2LinkRuleChecker.getLinks(new Tag("image", "category:JOSM"), null);
    2525        assertEquals(1, links.size());
    2626        assertEquals("https://commons.wikimedia.org/wiki/category%3AJOSM", links.iterator().next().url);
     
    2929    @Test
    3030    public void testBrandWikidata() {
    31         final Collection<Link> links = Tag2LinkRuleChecker.getLinks(new Tag("brand:wikidata", "Q259340"));
     31        final Collection<Link> links = Tag2LinkRuleChecker.getLinks(new Tag("brand:wikidata", "Q259340"), null);
    3232        assertEquals(1, links.size());
    3333        assertEquals("https://www.wikidata.org/wiki/Q259340", links.iterator().next().url);
     
    3636    @Test
    3737    public void testArchipelagoWikidata() {
    38         final Collection<Link> links = Tag2LinkRuleChecker.getLinks(new Tag("archipelago:wikidata", "Q756987"));
     38        final Collection<Link> links = Tag2LinkRuleChecker.getLinks(new Tag("archipelago:wikidata", "Q756987"), null);
    3939        assertEquals(1, links.size());
    4040        assertEquals("https://www.wikidata.org/wiki/Q756987", links.iterator().next().url);
Note: See TracChangeset for help on using the changeset viewer.