def create_wikilink_response(self, res): if res is None: raise cherrpy.NotFound() wikientries = TagStore(res['tags']).get_wikipedia_tags() if not wikientries: raise cherrypy.NotFound() wikilink = 'https://%s.wikipedia.org/wiki/%s' for lang in cherrypy.request.locales: if lang in wikientries: title = urllib.parse.quote(wikientries[lang].replace(' ', '_')) raise cherrypy.HTTPRedirect(wikilink % (lang, title)) for k, v in wikientries.items(): url = "https://%s.wikipedia.org/w/api.php?action=query&prop=langlinks&titles=%s&llprop=url&&lllang=%s&format=json" % ( k, urllib.parse.quote(v.encode('utf8')), lang) try: req = urllib.request.Request( url, headers={'User-Agent': 'Python-urllib/2.7 Routemaps'}) data = urllib.request.urlopen(req).read().decode('utf-8') data = jsonlib.loads(data) except: continue # oh well, we tried (pgid, data) = data["query"]["pages"].popitem() if 'langlinks' in data: raise cherrypy.HTTPRedirect(data['langlinks'][0]['url']) else: # given up to find a requested language k, v = wikientries.popitem() raise cherrypy.HTTPRedirect( wikilink % (k, urllib.parse.quote(v.replace(' ', '_'))))
def get_wikipedia_link(tags, locales): """ Create a wikipedia link from a list of OSM tags. It scans for wikipedia tags and reformats them to form a full URL. Wikipedia tags with URLs already formed are not accepted. """ wikientries = TagStore(tags or {}).get_wikipedia_tags() if not wikientries: return None for lang in locales: if lang in wikientries: title = quote(wikientries[lang].replace(' ', '_')) return WIKIPEDIA_BASEURL.format(lang, title) for k, v in wikientries.items(): url = WIKIPEDIA_TRANSLATEURL.format(k, quote(v.encode('utf8')), lang) try: req = urllib.request.Request( url, headers={'User-Agent': 'waymarkedtrails.org'}) data = urllib.request.urlopen(req).read().decode('utf-8') data = json.loads(data) except: continue # oh well, we tried (pgid, data) = data["query"]["pages"].popitem() if 'langlinks' in data: return data['langlinks'][0]['url'] else: # given up to find a requested language k, v = wikientries.popitem() return WIKIPEDIA_BASEURL.format(k, quote(v.replace(' ', '_')))