You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

96 lines
2.6 KiB

const OverpassLayer = require('overpass-layer')
const formatter = [
{
regexp: /^(.*:)?wikidata$/,
link: 'https://wikidata.org/wiki/{{ value }}'
},
{
regexp: /^(.*:)?wikipedia$/,
link: '{% set v = value|split(":") %}https://{{ v[0] }}.wikipedia.org/wiki/{{ v[1]|replace({" ": "_"}) }}'
},
{
regexp: /^(.*:)?wikipedia:([a-zA-Z]+)$/,
link: '{% set v = key|matches(":([a-zA-Z]+)") %}https://{{ v[1] }}.wikipedia.org/wiki/{{ value|replace({" ": "_"}) }}'
},
{
regexp: /^((.*:)?website(:.*)?|(.*:)?url(:.*)?|contact:website)$/,
link: '{{ value|websiteUrl }}'
},
{
regexp: /^(image|wikimedia_commons)$/,
link: '{% if value matches "/^(File|Category):/" %}' +
'https://commons.wikimedia.org/wiki/{{ value|replace({" ": "_"}) }}' +
'{% else %}' +
'{{ value|websiteUrl }}' +
'{% endif %}'
},
{
regexp: /^(species)$/,
link: 'https://species.wikimedia.org/wiki/{{ value|replace({" ": "_"}) }}'
},
{
regexp: /^(phone|contact:phone|fax|contact:fax)(:.*|)$/,
link: 'tel:{{ value }}'
},
{
regexp: /^(email|contact:email)(:.*|)$/,
link: 'mailto:{{ value }}'
}
]
let compiled = false
let defaultTemplate
function tagsDisplay (tags) {
if (!compiled) {
defaultTemplate = OverpassLayer.twig.twig({ data: '{{ value }}', autoescape: true })
for (let i in formatter) {
if (formatter[i].format) {
formatter[i].template = OverpassLayer.twig.twig({ data: formatter[i].format, autoescape: true })
} else {
formatter[i].template = OverpassLayer.twig.twig({ data: '<a target="_blank" href="' + formatter[i].link + '">{{ value }}</a>', autoescape: true })
}
}
compiled = true
}
const div = document.createElement('dl')
div.className = 'tags'
for (let k in tags) {
const dt = document.createElement('dt')
dt.appendChild(document.createTextNode(k))
div.appendChild(dt)
let template = defaultTemplate
const dd = document.createElement('dd')
for (let i = 0; i < formatter.length; i++) {
if (k.match(formatter[i].regexp)) {
template = formatter[i].template
break
}
}
let value = tags[k].split(/;/g)
value = value.map(v => {
// trim whitespace (but add it around the formatted value later)
let m = v.match(/^( *)([^ ].*[^ ]|[^ ])( *)$/)
if (m) {
return m[1] + template.render({ key: k, value: m[2] }) + m[3]
}
return v
}).join(';')
dd.innerHTML = value
div.appendChild(dd)
}
return div
}
module.exports = {
display: tagsDisplay,
formatter
}