示例#1
0
    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(' ', '_')))