// License: GPL. For details, see LICENSE file. package org.wikipedia.data; import org.openstreetmap.josm.data.coor.LatLon; import org.openstreetmap.josm.data.osm.Tag; import org.openstreetmap.josm.tools.AlphanumComparator; import org.openstreetmap.josm.tools.Utils; import org.wikipedia.WikipediaApp; import java.util.Objects; import java.util.regex.Matcher; import java.util.regex.Pattern; public class WikipediaEntry implements Comparable<WikipediaEntry> { public final String lang; public final String article; public final LatLon coordinate; private Boolean wiwosmStatus; public WikipediaEntry(String lang, String article) { this(lang, article, null); } public WikipediaEntry(String lang, String article, LatLon coordinate) { this.lang = lang; this.article = article; this.coordinate = coordinate; } static WikipediaEntry parseFromUrl(String url) { if (url == null) { return null; } // decode URL for nicer value url = Utils.decodeUrl(url); // extract Wikipedia language and final Matcher m = Pattern.compile("(https?:)?//(\\w*)\\.wikipedia\\.org/wiki/(.*)").matcher(url); if (!m.matches()) { return null; } return new WikipediaEntry(m.group(2), m.group(3)); } public static WikipediaEntry parseTag(String key, String value) { if (value == null) { return null; } else if (value.startsWith("http")) { //wikipedia=http... return WikipediaEntry.parseFromUrl(value); } else if (value.contains(":")) { //wikipedia=[lang]:[article] //wikipedia:[lang]=[lang]:[article] final String[] item = Utils.decodeUrl(value).split(":", 2); final String article = item[1].replace("_", " "); return new WikipediaEntry(item[0], article); } else if (key.startsWith("wikipedia:")) { //wikipedia:[lang]=[lang]:[article] //wikipedia:[lang]=[article] final String lang = key.split(":", 2)[1]; final String[] item = Utils.decodeUrl(value).split(":", 2); final String article = item[item.length == 2 ? 1 : 0].replace("_", " "); return new WikipediaEntry(lang, article); } else { return null; } } public Tag createWikipediaTag() { return new Tag("wikipedia", lang + ":" + article); } public void setWiwosmStatus(Boolean wiwosmStatus) { this.wiwosmStatus = wiwosmStatus; } public Boolean getWiwosmStatus() { return wiwosmStatus; } public String getBrowserUrl() { return WikipediaApp.forLanguage(lang).getSiteUrl() + "/wiki/" + Utils.encodeUrl(article.replace(" ", "_")); } public String getLabelText() { return article; } public String getSearchText() { return article; } @Override public String toString() { return article; } @Override public int compareTo(WikipediaEntry o) { return AlphanumComparator.getInstance().compare(article, o.article); } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; final WikipediaEntry that = (WikipediaEntry) o; return Objects.equals(lang, that.lang) && Objects.equals(article, that.article); } @Override public int hashCode() { return Objects.hash(lang, article); } }