Changeset 26921 in osm for applications/editors


Ignore:
Timestamp:
2011-10-21T23:05:50+02:00 (13 years ago)
Author:
donvip
Message:

tag2link: works for wikipedia

Location:
applications/editors/josm/plugins/tag2link
Files:
9 edited
1 moved

Legend:

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

    r26918 r26921  
    3131       </rule>
    3232    </source>
    33        
    34         <source name="Wikipedia">
    35            <rule>
    36                <condition k="wikipedia(?::([\p{Lower}]{2,}))?" />
    37            <link name="View %name% article" href="http://%k.1:en%.wikipedia.org/wiki/%v%" />
    38            </rule>
    39         </source>
    40        
    41         <!-- Only for France -->
     33   
     34    <source name="Wikipedia">
     35       <rule>
     36           <condition k="wikipedia(?::([\p{Lower}]{2,}))?" v="(?:([\p{Lower}]{2,}):)?(.*)" />
     37           <link name="View %name% article" href="http://%k.1:v.1:en%.wikipedia.org/wiki/%v.2:v.1%" />
     38       </rule>
     39    </source>
     40   
     41    <!-- Only for France -->
    4242   
    4343    <source name="SANDRE" country-code="FR">
  • applications/editors/josm/plugins/tag2link/src/org/openstreetmap/josm/plugins/tag2link/Tag2LinkConstants.java

    r26917 r26921  
    3131         * File encoding.
    3232         */
    33         public static final String ENCODING = "UTF-8";
     33        public static final String UTF8_ENCODING = "UTF-8";
    3434       
    3535        /**
  • applications/editors/josm/plugins/tag2link/src/org/openstreetmap/josm/plugins/tag2link/Tag2LinkRuleChecker.java

    r26918 r26921  
    1616package org.openstreetmap.josm.plugins.tag2link;
    1717
     18import java.io.UnsupportedEncodingException;
     19import java.net.URLEncoder;
    1820import java.util.ArrayList;
    1921import java.util.Collection;
     22import java.util.regex.Matcher;
     23import java.util.regex.Pattern;
    2024
    21 import org.openstreetmap.josm.data.osm.OsmPrimitive;
     25import org.openstreetmap.josm.data.osm.IPrimitive;
    2226import org.openstreetmap.josm.plugins.tag2link.data.Link;
    2327import org.openstreetmap.josm.plugins.tag2link.data.Rule;
     
    4044    }
    4145   
    42     public static Collection<Link> getLinks(OsmPrimitive p) {
     46    private static String findValue(String arg, Collection<MatchingTag> matchingTags) {
     47                for (MatchingTag tag : matchingTags) {
     48                        if (tag.params.containsKey(arg)) {
     49                                return tag.params.get(arg);
     50                        }
     51                }
     52                return null;
     53    }
     54   
     55    public static Collection<Link> getLinks(IPrimitive p) {
    4356        Collection<Link> result = new ArrayList<Link>();
    4457        for (Source source : sources) {
     
    4962                        Link copy = new Link(link);
    5063                        copy.name = copy.name.replaceAll("%name%", source.name);
    51                         MatchingTag firstTag = eval.matchingTags.iterator().next();
    52                         copy.url = copy.url.replaceAll("%k%", firstTag.key)
    53                                                    .replaceAll("%v%", firstTag.value);
     64                                                Matcher m = Pattern.compile("%([^%]*)%").matcher(copy.url);
     65                                                while (m.find()) {
     66                                                        String arg = m.group(1);
     67                                                        String val = findValue(arg, eval.matchingTags);
     68                                                        if (val == null && arg.contains(":")) {
     69                                                                String[] vars = arg.split(":");
     70                                                                for (int i = 0; val == null && i < vars.length-1; i++) {
     71                                                                        val = findValue(vars[i], eval.matchingTags);
     72                                                                }
     73                                                                if (val == null) {
     74                                                                        // Default value
     75                                                                        val = vars[vars.length-1];
     76                                                                }
     77                                                        }
     78                                                        if (val != null) {
     79                                                                try {
     80                                                                        // Special hack for Wikipedia that prevents spaces being replaced by "+" characters, but by "_"
     81                                                                        if (copy.url.contains("wikipedia.")) {
     82                                                                                val = val.replaceAll(" ", "_");
     83                                                                        }
     84                                                                        // Encode param to be included in the URL, except if it is the URL itself !
     85                                                                        if (!m.group().equals(copy.url)) {
     86                                                                                val = URLEncoder.encode(val, UTF8_ENCODING);
     87                                                                        }
     88                                                                        // Finally replace parameter
     89                                                                        copy.url = copy.url.replaceFirst(m.group(), val);
     90                                                                } catch (UnsupportedEncodingException e) {
     91                                                                        e.printStackTrace();
     92                                                                }
     93                                                        } else {
     94                                                                System.err.println("Invalid argument: "+arg);
     95                                                        }
     96                                                }
    5497                        result.add(copy);
    5598                    }
  • applications/editors/josm/plugins/tag2link/src/org/openstreetmap/josm/plugins/tag2link/action/OpenLinkAction.java

    r26918 r26921  
    1616   
    1717    public OpenLinkAction(Link link) {
    18         super(tr(link.name), ICON_24, tr("Launch browser with information about the selected object"), null, true);
     18        super(tr(link.name), ICON_24, tr("Launch browser with information about the selected object"), null, false);
    1919        this.url = link.url;
    2020    }
     
    2222    @Override
    2323    public void actionPerformed(ActionEvent e) {
     24        System.out.println("Opening "+url);
    2425        OpenBrowser.displayUrl(url);
    2526    }
  • applications/editors/josm/plugins/tag2link/src/org/openstreetmap/josm/plugins/tag2link/data/Rule.java

    r26918 r26921  
    77import java.util.regex.Matcher;
    88
    9 import org.openstreetmap.josm.data.osm.OsmPrimitive;
     9import org.openstreetmap.josm.data.osm.IPrimitive;
    1010
    1111public class Rule {
     
    1616        public String key;
    1717        public String value;
    18         public final Map<String, String> params = new HashMap<String, String>();
    19         public MatchingTag(String key, String value) {
     18        public final Map<String, String> params;
     19        private String prefix;
     20        public MatchingTag(String key, String value, String prefix) {
    2021                this.key = key;
    2122                this.value = value;
     23                this.params = new HashMap<String, String>();
     24                this.prefix = prefix;
     25                addKeyValueParams();
    2226        }
    23         public void addParams(Matcher m, String prefix) {
     27        public void addParams(Matcher m, String paramName) {
    2428                for (int i = 1; i<=m.groupCount(); i++) {
    25                         this.params.put(prefix+i, m.group(i));
     29                        params.put(prefix+paramName+"."+i, m.group(i));
    2630                }
     31        }
     32        private void addKeyValueParams() {
     33                params.put("k", key);
     34                params.put("v", value);
     35                if (!prefix.isEmpty()) {
     36                params.put(prefix+"k", key);
     37                params.put(prefix+"v", value);
     38                }
    2739        }
    2840    }
     
    3547    }
    3648   
    37     public EvalResult evaluates(OsmPrimitive p) {
     49    public EvalResult evaluates(IPrimitive p) {
    3850        EvalResult result = new EvalResult();
    3951        Map<String, String> tags = p.getKeys();
     
    4355                if (keyMatcher.matches()) {
    4456                        String idPrefix = c.id == null ? "" : c.id+".";
    45                         MatchingTag tag = new MatchingTag(key, tags.get(key));
    46                         tag.addParams(keyMatcher, idPrefix+"k.");
     57                        MatchingTag tag = new MatchingTag(key, tags.get(key), idPrefix);
     58                        tag.addParams(keyMatcher, "k");
    4759                        boolean matchingTag = true;
    4860                        if (c.valPattern != null) {
    4961                                Matcher valMatcher = c.valPattern.matcher(tag.value);
    5062                                if (valMatcher.matches()) {
    51                                         tag.addParams(valMatcher, idPrefix+"v.");
     63                                        tag.addParams(valMatcher, "v");
    5264                                } else {
    5365                                        matchingTag = false;
  • applications/editors/josm/plugins/tag2link/src/org/openstreetmap/josm/plugins/tag2link/io/SourcesReader.java

    r26918 r26921  
    3737        try {
    3838            InputStream is = SourcesReader.class.getResourceAsStream(XML_LOCATION);
    39             InputStreamReader ir = UTFInputStreamReader.create(is, ENCODING);
     39            InputStreamReader ir = UTFInputStreamReader.create(is, UTF8_ENCODING);
    4040            XMLStreamReader parser = XMLInputFactory.newInstance().createXMLStreamReader(ir);
    4141            result.addAll(new SourcesReader(parser).parseDoc());
  • applications/editors/josm/plugins/tag2link/src/org/openstreetmap/josm/plugins/tag2link/listeners/AbstractIPrimitivePopupListener.java

    r26917 r26921  
    1919import javax.swing.event.PopupMenuEvent;
    2020
    21 import org.openstreetmap.josm.data.osm.OsmPrimitive;
     21import org.openstreetmap.josm.data.osm.IPrimitive;
    2222import org.openstreetmap.josm.gui.MapFrame;
    2323import org.openstreetmap.josm.plugins.tag2link.Tag2LinkRuleChecker;
    2424import org.openstreetmap.josm.plugins.tag2link.data.Link;
    2525
    26 public abstract class AbstractOsmPrimitivePopupListener extends AbstractPopupListener {
     26public abstract class AbstractIPrimitivePopupListener extends AbstractPopupListener {
    2727
    28     protected AbstractOsmPrimitivePopupListener(MapFrame frame) {
     28    protected AbstractIPrimitivePopupListener(MapFrame frame) {
    2929        super(frame);
    3030    }
    3131
    32     protected abstract OsmPrimitive getFirstSelectedPrimitive();
     32    protected abstract IPrimitive getFirstSelectedPrimitive();
    3333   
    3434    @Override
    3535    public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
    36         OsmPrimitive p = getFirstSelectedPrimitive();
     36        IPrimitive p = getFirstSelectedPrimitive();
    3737        if (p != null) {
    3838            JPopupMenu popup = (JPopupMenu) e.getSource();
  • applications/editors/josm/plugins/tag2link/src/org/openstreetmap/josm/plugins/tag2link/listeners/MembershipPopupListener.java

    r26917 r26921  
    1616package org.openstreetmap.josm.plugins.tag2link.listeners;
    1717
    18 import org.openstreetmap.josm.data.osm.OsmPrimitive;
     18import org.openstreetmap.josm.data.osm.IPrimitive;
    1919import org.openstreetmap.josm.gui.MapFrame;
    2020
    21 public class MembershipPopupListener extends AbstractOsmPrimitivePopupListener {
     21public class MembershipPopupListener extends AbstractIPrimitivePopupListener {
    2222
    2323    public MembershipPopupListener(MapFrame frame) {
     
    2626
    2727    @Override
    28     protected OsmPrimitive getFirstSelectedPrimitive() {
    29         // TODO Auto-generated method stub
    30         return null;
     28    protected IPrimitive getFirstSelectedPrimitive() {
     29        return frame.propertiesDialog.getSelectedMembershipRelations().iterator().next();
    3130    }
    3231}
  • applications/editors/josm/plugins/tag2link/src/org/openstreetmap/josm/plugins/tag2link/listeners/RelationPopupListener.java

    r26917 r26921  
    1616package org.openstreetmap.josm.plugins.tag2link.listeners;
    1717
    18 import org.openstreetmap.josm.data.osm.OsmPrimitive;
     18import org.openstreetmap.josm.data.osm.IPrimitive;
    1919import org.openstreetmap.josm.gui.MapFrame;
    2020
    21 public class RelationPopupListener extends AbstractOsmPrimitivePopupListener {
     21public class RelationPopupListener extends AbstractIPrimitivePopupListener {
    2222
    2323    public RelationPopupListener(MapFrame frame) {
     
    2626
    2727    @Override
    28     protected OsmPrimitive getFirstSelectedPrimitive() {
     28    protected IPrimitive getFirstSelectedPrimitive() {
    2929        return frame.relationListDialog.getSelectedRelations().iterator().next();
    3030    }
  • applications/editors/josm/plugins/tag2link/src/org/openstreetmap/josm/plugins/tag2link/listeners/SelectionPopupListener.java

    r26917 r26921  
    1616package org.openstreetmap.josm.plugins.tag2link.listeners;
    1717
    18 import org.openstreetmap.josm.data.osm.OsmPrimitive;
     18import org.openstreetmap.josm.data.osm.IPrimitive;
    1919import org.openstreetmap.josm.gui.MapFrame;
    2020
    21 public class SelectionPopupListener extends AbstractOsmPrimitivePopupListener {
     21public class SelectionPopupListener extends AbstractIPrimitivePopupListener {
    2222
    2323    public SelectionPopupListener(MapFrame frame) {
     
    2626
    2727    @Override
    28     protected OsmPrimitive getFirstSelectedPrimitive() {
     28    protected IPrimitive getFirstSelectedPrimitive() {
    2929        return frame.selectionListDialog.getSelectedPrimitives().iterator().next();
    3030    }
Note: See TracChangeset for help on using the changeset viewer.