Changeset 35134 in osm


Ignore:
Timestamp:
2019-09-26T18:17:23+02:00 (5 years ago)
Author:
donvip
Message:

see #josm14465 - fetch all links from selected tags

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

Legend:

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

    r34559 r35134  
    1 <?xml version="1.0" encoding="utf-8"?>
     1<?xml version="1.0" encoding="utf-8"?>
    22<project name="tag2link" default="dist" basedir=".">
    33
     
    55    <property name="commit.message" value="Commit message"/>
    66    <!-- enter the *lowest* JOSM version this plugin is currently compatible with -->
    7     <property name="plugin.main.version" value="12847"/>
     7    <property name="plugin.main.version" value="15376"/>
    88
    99    <property name="plugin.author" value="Don-vip &amp; FrViPofm"/>
  • applications/editors/josm/plugins/tag2link/src/org/openstreetmap/josm/plugins/tag2link/Tag2LinkRuleChecker.java

    r34599 r35134  
    2323import java.util.Locale;
    2424import java.util.Map;
     25import java.util.function.BiFunction;
    2526import java.util.regex.Matcher;
    2627import java.util.regex.Pattern;
     
    2829import org.openstreetmap.josm.data.osm.IPrimitive;
    2930import org.openstreetmap.josm.data.osm.Tag;
     31import org.openstreetmap.josm.data.osm.Tags;
    3032import org.openstreetmap.josm.plugins.tag2link.data.Link;
    3133import org.openstreetmap.josm.plugins.tag2link.data.LinkPost;
     
    4850   
    4951    private static boolean initialized = false;
    50    
     52
     53    private static final Pattern PLACEHOLDERS = Pattern.compile("%([^%]*)%");
     54    private static final Pattern LANG = Pattern.compile(".*lang(?:\\((\\p{Lower}{2,})(?:,(\\p{Lower}{2,}))*\\))?.*");
     55
    5156    /**
    5257     * Initializes the matching rules mechanism.
     
    6772        return null;
    6873    }
    69    
     74
    7075    private static String replaceParams(String s, EvalResult eval) {
    7176        String result = s;
    72         Matcher m = Pattern.compile("%([^%]*)%").matcher(s);
     77        Matcher m = PLACEHOLDERS.matcher(s);
    7378        while (m.find()) {
    7479            String arg = m.group(1);
     
    7984            // No standard value found: test lang() function
    8085            if (val == null) {
    81                 Matcher lm = Pattern.compile(".*lang(?:\\((\\p{Lower}{2,})(?:,(\\p{Lower}{2,}))*\\))?.*").matcher(arg);
     86                Matcher lm = LANG.matcher(arg);
    8287                if (lm.matches()) {
    8388                    String josmLang = Config.getPref().get("language");
     
    107112            }
    108113           
    109             // Has a value been found ?
     114            // Has a value been found?
    110115            if (val != null) {
    111116                try {
     
    114119                        val = val.replaceAll(" ", "_");
    115120                    }
    116                     // Encode param to be included in the URL, except if it is the URL itself !
     121                    // Encode param to be included in the URL, except if it is the URL itself!
    117122                    if (!m.group().equals(s)) {
    118123                        val = URLEncoder.encode(val, UTF8_ENCODING);
     
    124129                }
    125130            } else {
    126                 System.err.println("Invalid argument: "+arg);
     131                Logging.error("Invalid argument: " + arg);
    127132            }
    128133        }
     
    164169                    result.add(copy);
    165170                } catch (CloneNotSupportedException e) {
    166                     System.err.println(e);
     171                    Logging.error(e);
    167172                }
    168173            }
     
    170175        return result;
    171176    }
    172    
     177
     178    private static <T> Collection<Link> doGetLinks(BiFunction<Rule, T, EvalResult> evaluator, T obj) {
     179        Collection<Link> result = new ArrayList<>();
     180        for (Source source : sources) {
     181            for (Rule rule : source.rules) {
     182                result.addAll(processEval(evaluator.apply(rule, obj), rule, source));
     183            }
     184        }
     185        return result;
     186    }
     187
    173188    /**
    174189     * Replies the links relevant to the given OSM primitive.
     
    177192     */
    178193    public static Collection<Link> getLinks(IPrimitive p) {
    179         Collection<Link> result = new ArrayList<>();
    180         for (Source source : sources) {
    181             for (Rule rule : source.rules) {
    182                 result.addAll(processEval(rule.evaluates(p), rule, source));
    183             }
    184         }
    185         return result;
     194        return doGetLinks(Rule::evaluates, p);
    186195    }
    187196
     
    192201     */
    193202    public static Collection<Link> getLinks(Tag tag) {
    194         Collection<Link> result = new ArrayList<>();
    195         for (Source source : sources) {
    196             for (Rule rule : source.rules) {
    197                 result.addAll(processEval(rule.evaluates(tag), rule, source));
    198             }
    199         }
    200         return result;
     203        return doGetLinks(Rule::evaluates, tag);
     204    }
     205
     206    /**
     207     * Replies the links relevant to the given OSM tags.
     208     * @param tags The OSM tags
     209     * @return the links relevant to the {@code tags}.
     210     */
     211    public static Collection<Link> getLinks(Tags tags) {
     212        return doGetLinks(Rule::evaluates, tags);
    201213    }
    202214}
  • applications/editors/josm/plugins/tag2link/src/org/openstreetmap/josm/plugins/tag2link/data/Condition.java

    r28547 r35134  
    4040    public String id;
    4141   
    42     /* (non-Javadoc)
    43      * @see java.lang.Object#toString()
    44      */
    4542    @Override
    4643    public String toString() {
  • applications/editors/josm/plugins/tag2link/src/org/openstreetmap/josm/plugins/tag2link/data/Link.java

    r32698 r35134  
    4545    }
    4646
    47     /* (non-Javadoc)
    48      * @see java.lang.Object#toString()
    49      */
    5047    @Override
    5148    public String toString() {
     
    5350    }
    5451
    55     /* (non-Javadoc)
    56      * @see java.lang.Object#clone()
    57      */
    5852    @Override
    5953    public Link clone() throws CloneNotSupportedException {
  • applications/editors/josm/plugins/tag2link/src/org/openstreetmap/josm/plugins/tag2link/data/LinkPost.java

    r30717 r35134  
    5959    }
    6060
    61     /* (non-Javadoc)
    62      * @see org.openstreetmap.josm.plugins.tag2link.data.Link#containsParams()
    63      */
    6461    @Override
    6562    public boolean containsParams() {
     
    6764    }
    6865
    69     /* (non-Javadoc)
    70      * @see org.openstreetmap.josm.plugins.tag2link.data.Link#clone()
    71      */
    7266    @Override
    7367    public LinkPost clone() throws CloneNotSupportedException {
  • applications/editors/josm/plugins/tag2link/src/org/openstreetmap/josm/plugins/tag2link/data/Rule.java

    r30717 r35134  
    1616package org.openstreetmap.josm.plugins.tag2link.data;
    1717
     18import static java.util.Collections.singleton;
     19
    1820import java.util.ArrayList;
    1921import java.util.Collection;
    2022import java.util.HashMap;
    2123import java.util.Map;
     24import java.util.function.Function;
    2225import java.util.regex.Matcher;
    2326
    2427import org.openstreetmap.josm.data.osm.IPrimitive;
    2528import org.openstreetmap.josm.data.osm.Tag;
     29import org.openstreetmap.josm.data.osm.Tags;
    2630
    2731public class Rule {
     
    5458            }
    5559        }
    56         /* (non-Javadoc)
    57          * @see java.lang.Object#toString()
    58          */
    5960        @Override
    6061        public String toString() {
     
    7576            return conditionsNumber > 0 && matchingTags.size() >= conditionsNumber;
    7677        }
    77         /* (non-Javadoc)
    78          * @see java.lang.Object#toString()
    79          */
    8078        @Override
    8179        public String toString() {
     
    8482        }
    8583    }
    86    
    87     public EvalResult evaluates(Map<String, String> tags) {
     84
     85    public EvalResult evaluates(Iterable<String> keys, Function<String, Iterable<String>> valuesFn) {
    8886        EvalResult result = new EvalResult(conditions.size());
    8987        for (Condition c : conditions) {
    90             for (String key : tags.keySet()) {
     88            for (String key : keys) {
    9189                Matcher keyMatcher = c.keyPattern.matcher(key);
    9290                if (keyMatcher.matches()) {
    9391                    String idPrefix = c.id == null ? "" : c.id+".";
    94                     MatchingTag tag = new MatchingTag(key, tags.get(key), idPrefix);
    95                     tag.addParams(keyMatcher, "k");
    96                     boolean matchingTag = true;
    97                     if (c.valPattern != null) {
    98                         Matcher valMatcher = c.valPattern.matcher(tag.value);
    99                         if (valMatcher.matches()) {
    100                             tag.addParams(valMatcher, "v");
    101                         } else {
    102                             matchingTag = false;
     92                    for (String value : valuesFn.apply(key)) {
     93                        MatchingTag tag = new MatchingTag(key, value, idPrefix);
     94                        tag.addParams(keyMatcher, "k");
     95                        boolean matchingTag = true;
     96                        if (c.valPattern != null) {
     97                            Matcher valMatcher = c.valPattern.matcher(tag.value);
     98                            if (valMatcher.matches()) {
     99                                tag.addParams(valMatcher, "v");
     100                            } else {
     101                                matchingTag = false;
     102                            }
    103103                        }
    104                     }
    105                     if (matchingTag) {
    106                         result.matchingTags.add(tag);
     104                        if (matchingTag) {
     105                            result.matchingTags.add(tag);
     106                        }
    107107                    }
    108108                }
     
    111111        return result;
    112112    }
    113    
     113
    114114    public EvalResult evaluates(IPrimitive p) {
    115         return evaluates(p.getKeys());
     115        return evaluates(p.keySet(), key -> singleton(p.get(key)));
    116116    }
    117117
    118118    public EvalResult evaluates(Tag tag) {
    119         Map<String, String> map = new HashMap<>();
    120         map.put(tag.getKey(), tag.getValue());
    121         return evaluates(map);
     119        return evaluates(singleton(tag.getKey()), x -> singleton(tag.getValue()));
    122120    }
    123121
    124     /* (non-Javadoc)
    125      * @see java.lang.Object#toString()
    126      */
     122    public EvalResult evaluates(Tags tags) {
     123        return evaluates(singleton(tags.getKey()), x -> tags.getValues());
     124    }
     125
    127126    @Override
    128127    public String toString() {
    129         return "Rule [conditions=" + conditions + ", links=" + links + "]";
     128        return "Rule [conditions=" + conditions + ", links=" + links + ']';
    130129    }
    131130}
  • applications/editors/josm/plugins/tag2link/src/org/openstreetmap/josm/plugins/tag2link/data/Source.java

    r30717 r35134  
    4343    }
    4444
    45     /* (non-Javadoc)
    46      * @see java.lang.Object#toString()
    47      */
    4845    @Override
    4946    public String toString() {
  • applications/editors/josm/plugins/tag2link/src/org/openstreetmap/josm/plugins/tag2link/listeners/PropertyPopupListener.java

    r28547 r35134  
    1919import javax.swing.event.PopupMenuEvent;
    2020
    21 import org.openstreetmap.josm.data.osm.Tag;
     21import org.openstreetmap.josm.data.osm.Tags;
    2222import org.openstreetmap.josm.gui.MapFrame;
    2323import org.openstreetmap.josm.plugins.tag2link.Tag2LinkRuleChecker;
     
    3232    @Override
    3333    public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
    34         Tag tag = frame.propertiesDialog.getSelectedProperty();
    35         if (tag != null) {
     34        Tags tags = frame.propertiesDialog.getSelectedProperties();
     35        if (tags != null) {
    3636            JPopupMenu popup = (JPopupMenu) e.getSource();
    37             for (Link link : Tag2LinkRuleChecker.getLinks(tag)) {
     37            for (Link link : Tag2LinkRuleChecker.getLinks(tags)) {
    3838                addLink(popup, link);
    3939            }
Note: See TracChangeset for help on using the changeset viewer.