From 5eaf5687c8de4c40f9179600a2a4048cac1d9de6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20B=C3=B6sch-Plepelits?= Date: Tue, 8 Oct 2019 06:33:54 +0200 Subject: [PATCH 01/19] Details: move showing tags to separate file (src/tagsDisplay.js) --- src/index.js | 14 ++------------ src/tagsDisplay.js | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 12 deletions(-) create mode 100644 src/tagsDisplay.js diff --git a/src/index.js b/src/index.js index 1696f77c..171d53e2 100644 --- a/src/index.js +++ b/src/index.js @@ -38,6 +38,7 @@ require('./permalink') require('./nominatim-search') require('./CategoryOverpassFilter') let exportAll = require('./exportAll') +const tagsDisplay = require('./tagsDisplay') window.onload = function () { var initState = config.defaultView @@ -314,18 +315,7 @@ window.showDetails = function (data, category) { h.innerHTML = lang('header:attributes') dom.appendChild(h) - div = document.createElement('dl') - div.className = 'tags' - for (k in data.object.tags) { - dt = document.createElement('dt') - dt.appendChild(document.createTextNode(k)) - div.appendChild(dt) - - dd = document.createElement('dd') - dd.appendChild(document.createTextNode(data.object.tags[k])) - div.appendChild(dd) - } - dom.appendChild(div) + dom.appendChild(tagsDisplay(data.object.tags)) h = document.createElement('h3') h.innerHTML = lang('header:osm_meta') diff --git a/src/tagsDisplay.js b/src/tagsDisplay.js new file mode 100644 index 00000000..d81e5c7c --- /dev/null +++ b/src/tagsDisplay.js @@ -0,0 +1,15 @@ +module.exports = function tagsDisplay (tags) { + 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) + + const dd = document.createElement('dd') + dd.appendChild(document.createTextNode(tags[k])) + div.appendChild(dd) + } + + return div +} From 716877eda1800bd730690ca0c7401a49c27021da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20B=C3=B6sch-Plepelits?= Date: Tue, 8 Oct 2019 06:51:39 +0200 Subject: [PATCH 02/19] tagsDisplay: format wikidata values (UNFIN) --- src/tagsDisplay.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/tagsDisplay.js b/src/tagsDisplay.js index d81e5c7c..72445259 100644 --- a/src/tagsDisplay.js +++ b/src/tagsDisplay.js @@ -1,3 +1,7 @@ +const formatter = { + wikidata: value => '' + value + '' +} + module.exports = function tagsDisplay (tags) { const div = document.createElement('dl') div.className = 'tags' @@ -7,7 +11,11 @@ module.exports = function tagsDisplay (tags) { div.appendChild(dt) const dd = document.createElement('dd') - dd.appendChild(document.createTextNode(tags[k])) + if (k in formatter) { + dd.innerHTML = formatter[k](tags[k]) + } else { + dd.appendChild(document.createTextNode(tags[k])) + } div.appendChild(dd) } From fe191ddab30237eecf3f81b437928d957143b434 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20B=C3=B6sch-Plepelits?= Date: Sat, 25 Jan 2020 20:46:41 +0100 Subject: [PATCH 03/19] tagsDisplay: 1. match keys by regexp, 2. use twig to format values --- src/tagsDisplay.js | 36 +++++++++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/src/tagsDisplay.js b/src/tagsDisplay.js index 72445259..32eb530f 100644 --- a/src/tagsDisplay.js +++ b/src/tagsDisplay.js @@ -1,8 +1,25 @@ -const formatter = { - wikidata: value => '' + value + '' -} +const OverpassLayer = require('overpass-layer') + +const formatter = [ + { + regexp: /^(.*:)?wikidata$/, + format: '{{ value }}' + } +] + +let compiled = false +let defaultTemplate module.exports = function tagsDisplay (tags) { + if (!compiled) { + defaultTemplate = OverpassLayer.twig.twig({ data: '{{ value }}', autoescape: true }) + for (let i in formatter) { + formatter[i].template = OverpassLayer.twig.twig({ data: formatter[i].format, autoescape: true }) + } + + compiled = true + } + const div = document.createElement('dl') div.className = 'tags' for (let k in tags) { @@ -10,12 +27,17 @@ module.exports = function tagsDisplay (tags) { dt.appendChild(document.createTextNode(k)) div.appendChild(dt) + let template = defaultTemplate + const dd = document.createElement('dd') - if (k in formatter) { - dd.innerHTML = formatter[k](tags[k]) - } else { - dd.appendChild(document.createTextNode(tags[k])) + for (let i = 0; i < formatter.length; i++) { + if (k.match(formatter[i].regexp)) { + template = formatter[i].template + break + } } + + dd.innerHTML = template.render({ value: tags[k] }) div.appendChild(dd) } From 7f32b183211b98d13a57056e1d9edd68aa784359 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20B=C3=B6sch-Plepelits?= Date: Tue, 26 May 2020 20:48:01 +0200 Subject: [PATCH 04/19] Wiki-Tags: trim whitespace --- src/wikipedia.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/wikipedia.js b/src/wikipedia.js index 55929385..42964353 100644 --- a/src/wikipedia.js +++ b/src/wikipedia.js @@ -128,6 +128,8 @@ register_hook('show-details', function (data, category, dom, callback) { foundPrefixes.push('') ob.tags.wikipedia.split(/;/g).forEach(value => { + value = value.trim() + found++ showWikipedia(value, div, done) }) @@ -145,6 +147,8 @@ register_hook('show-details', function (data, category, dom, callback) { foundPrefixes.push(prefix) ob.tags[k].split(/;/g).forEach(value => { + value = value.trim() + found++ showWikipedia(value, div, done) }) @@ -180,6 +184,8 @@ register_hook('show-details', function (data, category, dom, callback) { foundPrefixes.push('') ob.tags.wikidata.split(/;/g).forEach(value => { + value = value.trim() + found++ wikidata.load(value, function (err, result) { @@ -228,6 +234,8 @@ register_hook('show-details', function (data, category, dom, callback) { div.appendChild(h) ob.tags[k].split(/;/g).forEach(value => { + value = value.trim() + wikidata.load(value, (err, result) => { var x From fb47f9f5948ed5e79c48ee46e8d2ff090bc7f693 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20B=C3=B6sch-Plepelits?= Date: Tue, 26 May 2020 20:56:33 +0200 Subject: [PATCH 05/19] tagsDisplay: allow multiple values, ignore whitespace --- src/tagsDisplay.js | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/tagsDisplay.js b/src/tagsDisplay.js index 32eb530f..5580f52e 100644 --- a/src/tagsDisplay.js +++ b/src/tagsDisplay.js @@ -37,7 +37,17 @@ module.exports = function tagsDisplay (tags) { } } - dd.innerHTML = template.render({ value: tags[k] }) + 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({ value: m[2] }) + m[3] + } + return v + }).join(';') + + dd.innerHTML = value div.appendChild(dd) } From c7653134c62fbf0fb790eb07cd6a467ba56ec0e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20B=C3=B6sch-Plepelits?= Date: Tue, 26 May 2020 21:07:57 +0200 Subject: [PATCH 06/19] tagsDisplay: wikipedia links --- src/tagsDisplay.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/tagsDisplay.js b/src/tagsDisplay.js index 5580f52e..b4067863 100644 --- a/src/tagsDisplay.js +++ b/src/tagsDisplay.js @@ -4,6 +4,10 @@ const formatter = [ { regexp: /^(.*:)?wikidata$/, format: '{{ value }}' + }, + { + regexp: /^(.*:)wikipedia$/, + format: '{% set v = value|split(":") %}{{ value }}' } ] From 49fa525d6dab1567624ef97f005fc89fee8d081b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20B=C3=B6sch-Plepelits?= Date: Wed, 27 May 2020 06:24:11 +0200 Subject: [PATCH 07/19] tagsDisplay: link to website, wikimedia commons, ... --- src/tagsDisplay.js | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/tagsDisplay.js b/src/tagsDisplay.js index b4067863..5bbda592 100644 --- a/src/tagsDisplay.js +++ b/src/tagsDisplay.js @@ -7,7 +7,19 @@ const formatter = [ }, { regexp: /^(.*:)wikipedia$/, - format: '{% set v = value|split(":") %}{{ value }}' + format: '{% set v = value|split(":") %}{{ value }}' + }, + { + regexp: /^(website|url|contact:website)$/, + format: '{{ value }}' + }, + { + regexp: /^(image|wikimedia_commons)$/, + format: '{% if value matches "/^(File|Category):/" %}' + + '{{ value }}' + + '{% else %}' + + '{{ value }}' + + '{% endif %}' } ] From c979bfcd1b4c830ed61c1578bf0b42afb8fa3abd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20B=C3=B6sch-Plepelits?= Date: Wed, 27 May 2020 06:27:54 +0200 Subject: [PATCH 08/19] tagsDisplay: only define link formatter for each known tag --- src/tagsDisplay.js | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/tagsDisplay.js b/src/tagsDisplay.js index 5bbda592..af068c6d 100644 --- a/src/tagsDisplay.js +++ b/src/tagsDisplay.js @@ -3,22 +3,22 @@ const OverpassLayer = require('overpass-layer') const formatter = [ { regexp: /^(.*:)?wikidata$/, - format: '{{ value }}' + link: 'https://wikidata.org/wiki/{{ value|url_encode }}' }, { regexp: /^(.*:)wikipedia$/, - format: '{% set v = value|split(":") %}{{ value }}' + link: '{% set v = value|split(":") %}https://{{ v[0]|url_encode }}.wikipedia.org/wiki/{{ v[1]|replace({" ": "_"}) }}' }, { regexp: /^(website|url|contact:website)$/, - format: '{{ value }}' + link: '{{ value|websiteUrl }}' }, { regexp: /^(image|wikimedia_commons)$/, - format: '{% if value matches "/^(File|Category):/" %}' + - '{{ value }}' + + link: '{% if value matches "/^(File|Category):/" %}' + + 'https://commons.wikimedia.org/wiki/{{ value|replace({" ": "_"}) }}' + '{% else %}' + - '{{ value }}' + + '{{ value }}' + '{% endif %}' } ] @@ -30,7 +30,11 @@ module.exports = function tagsDisplay (tags) { if (!compiled) { defaultTemplate = OverpassLayer.twig.twig({ data: '{{ value }}', autoescape: true }) for (let i in formatter) { - formatter[i].template = OverpassLayer.twig.twig({ data: formatter[i].format, autoescape: true }) + if (formatter[i].format) { + formatter[i].template = OverpassLayer.twig.twig({ data: formatter[i].format, autoescape: true }) + } else { + formatter[i].template = OverpassLayer.twig.twig({ data: '{{ value }}', autoescape: true }) + } } compiled = true From 642b709962af276f80f72ee689921084f3d44ff3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20B=C3=B6sch-Plepelits?= Date: Wed, 27 May 2020 14:41:40 +0200 Subject: [PATCH 09/19] tagsDisplay: add link for 'species' tag --- src/tagsDisplay.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/tagsDisplay.js b/src/tagsDisplay.js index af068c6d..862262f4 100644 --- a/src/tagsDisplay.js +++ b/src/tagsDisplay.js @@ -20,6 +20,10 @@ const formatter = [ '{% else %}' + '{{ value }}' + '{% endif %}' + }, + { + regexp: /^(species)$/, + link: 'https://species.wikimedia.org/wiki/{{ value|replace({" ": "_"}) }}' } ] From 200ee72200097d399589b09bf4cc90466c07d255 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20B=C3=B6sch-Plepelits?= Date: Wed, 27 May 2020 15:20:56 +0200 Subject: [PATCH 10/19] tagsDisplay: improve wikipedia, allow formatter to use key of tag --- src/tagsDisplay.js | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/tagsDisplay.js b/src/tagsDisplay.js index 862262f4..2a53c74b 100644 --- a/src/tagsDisplay.js +++ b/src/tagsDisplay.js @@ -3,11 +3,15 @@ const OverpassLayer = require('overpass-layer') const formatter = [ { regexp: /^(.*:)?wikidata$/, - link: 'https://wikidata.org/wiki/{{ value|url_encode }}' + link: 'https://wikidata.org/wiki/{{ value }}' }, { - regexp: /^(.*:)wikipedia$/, - link: '{% set v = value|split(":") %}https://{{ v[0]|url_encode }}.wikipedia.org/wiki/{{ v[1]|replace({" ": "_"}) }}' + 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)$/, @@ -66,7 +70,7 @@ module.exports = function tagsDisplay (tags) { // trim whitespace (but add it around the formatted value later) let m = v.match(/^( *)([^ ].*[^ ]|[^ ])( *)$/) if (m) { - return m[1] + template.render({ value: m[2] }) + m[3] + return m[1] + template.render({ key: k, value: m[2] }) + m[3] } return v }).join(';') From 1f33e66af5f318a51a73fa66aba6e67d70f2d9f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20B=C3=B6sch-Plepelits?= Date: Wed, 27 May 2020 19:08:16 +0200 Subject: [PATCH 11/19] tag2link: download lists from wikidata and sophox --- bin/download_dependencies | 3 +++ lib/tag2link-sophox.qry | 6 ++++++ lib/tag2link-wikidata.qry | 11 +++++++++++ 3 files changed, 20 insertions(+) create mode 100644 lib/tag2link-sophox.qry create mode 100644 lib/tag2link-wikidata.qry diff --git a/bin/download_dependencies b/bin/download_dependencies index 3b18f8c2..24d42ef9 100755 --- a/bin/download_dependencies +++ b/bin/download_dependencies @@ -1,5 +1,8 @@ #!/bin/sh +curl -H "Accept: application/json" -H "Content-Type: application/sparql-query" -H "User-Agent: OpenStreetBrowser" -XPOST -d @'lib/tag2link-wikidata.qry' https://query.wikidata.org/sparql > data/tag2link-wikidata.json +curl -H "Accept: application/json" -H "Content-Type: application/sparql-query" -H "User-Agent: OpenStreetBrowser" -XPOST -d @'lib/tag2link-sophox.qry' https://sophox.org/sparql > data/tag2link-sophox.json + mkdir -p data/GeoIP cd data/GeoIP wget -O- http://geolite.maxmind.com/download/geoip/database/GeoLite2-City.tar.gz | tar --strip-components=1 -xvzf - diff --git a/lib/tag2link-sophox.qry b/lib/tag2link-sophox.qry new file mode 100644 index 00000000..56304f8f --- /dev/null +++ b/lib/tag2link-sophox.qry @@ -0,0 +1,6 @@ +SELECT ?item (CONCAT("Key:", ?permanent_key_ID) as ?OSM_key) ?formatter_URL WHERE { + FILTER(?permanent_key_ID NOT IN ('image', 'url', 'website', 'wikidata', 'wikimedia_commons')). + ?item osmdt:P2 osmd:Q7. + ?item osmdt:P16 ?permanent_key_ID. + ?item osmdt:P8 ?formatter_URL. +} diff --git a/lib/tag2link-wikidata.qry b/lib/tag2link-wikidata.qry new file mode 100644 index 00000000..313d2443 --- /dev/null +++ b/lib/tag2link-wikidata.qry @@ -0,0 +1,11 @@ +SELECT ?item ?OSM_key ?formatter_URL WHERE { + { ?item wdt:P1282 ?OSM_key. } + FILTER(STRSTARTS(?OSM_key, 'Key:')) . + FILTER(?OSM_key NOT IN ('Key:image', 'Key:url', 'Key:website', 'Key:wikidata', 'Key:wikimedia_commons')) . + + { + { ?item wdt:P1630 ?formatter_URL. } + UNION + { ?item wdt:P3303 ?formatter_URL. } + } +} From 32efd3010417f3b10b04d4548e5080cf71234d44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20B=C3=B6sch-Plepelits?= Date: Thu, 28 May 2020 14:00:39 +0200 Subject: [PATCH 12/19] tag2link: convert tag2link info into dist/tag2link.json --- bin/download_dependencies | 1 + bin/tag2link-converter | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100755 bin/tag2link-converter diff --git a/bin/download_dependencies b/bin/download_dependencies index 24d42ef9..3fb150ba 100755 --- a/bin/download_dependencies +++ b/bin/download_dependencies @@ -2,6 +2,7 @@ curl -H "Accept: application/json" -H "Content-Type: application/sparql-query" -H "User-Agent: OpenStreetBrowser" -XPOST -d @'lib/tag2link-wikidata.qry' https://query.wikidata.org/sparql > data/tag2link-wikidata.json curl -H "Accept: application/json" -H "Content-Type: application/sparql-query" -H "User-Agent: OpenStreetBrowser" -XPOST -d @'lib/tag2link-sophox.qry' https://sophox.org/sparql > data/tag2link-sophox.json +bin/tag2link-converter mkdir -p data/GeoIP cd data/GeoIP diff --git a/bin/tag2link-converter b/bin/tag2link-converter new file mode 100755 index 00000000..401c56d8 --- /dev/null +++ b/bin/tag2link-converter @@ -0,0 +1,39 @@ +#!/usr/bin/php + array(), + ); + } + + $formatter = array( + 'link' => $link, + ); + + if (preg_match("/^https?:\/\/([^\/]*)(\/.*|)$/", $link, $m)) { + $formatter['operator'] = $m[1]; + } + + $tag2link[$key]['formatter'][] = $formatter; + } +} + +file_put_contents('dist/tag2link.json', json_encode($tag2link, JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE)); From c8a7801d0f07d508f0e7fbcad617207fd4798398 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20B=C3=B6sch-Plepelits?= Date: Thu, 28 May 2020 14:01:27 +0200 Subject: [PATCH 13/19] tag2link: also add label --- bin/tag2link-converter | 1 + lib/tag2link-sophox.qry | 3 ++- lib/tag2link-wikidata.qry | 3 ++- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/bin/tag2link-converter b/bin/tag2link-converter index 401c56d8..684f8f84 100755 --- a/bin/tag2link-converter +++ b/bin/tag2link-converter @@ -20,6 +20,7 @@ foreach ($files as $file) { } else { $tag2link[$key] = array( + 'label' => $entry['itemLabel']['value'], 'formatter' => array(), ); } diff --git a/lib/tag2link-sophox.qry b/lib/tag2link-sophox.qry index 56304f8f..1e1c4ca4 100644 --- a/lib/tag2link-sophox.qry +++ b/lib/tag2link-sophox.qry @@ -1,6 +1,7 @@ -SELECT ?item (CONCAT("Key:", ?permanent_key_ID) as ?OSM_key) ?formatter_URL WHERE { +SELECT ?item ?itemLabel (CONCAT("Key:", ?permanent_key_ID) as ?OSM_key) ?formatter_URL WHERE { FILTER(?permanent_key_ID NOT IN ('image', 'url', 'website', 'wikidata', 'wikimedia_commons')). ?item osmdt:P2 osmd:Q7. + SERVICE wikibase:label { bd:serviceParam wikibase:language "en". } ?item osmdt:P16 ?permanent_key_ID. ?item osmdt:P8 ?formatter_URL. } diff --git a/lib/tag2link-wikidata.qry b/lib/tag2link-wikidata.qry index 313d2443..4aa83f89 100644 --- a/lib/tag2link-wikidata.qry +++ b/lib/tag2link-wikidata.qry @@ -1,7 +1,8 @@ -SELECT ?item ?OSM_key ?formatter_URL WHERE { +SELECT ?item ?itemLabel ?OSM_key ?formatter_URL WHERE { { ?item wdt:P1282 ?OSM_key. } FILTER(STRSTARTS(?OSM_key, 'Key:')) . FILTER(?OSM_key NOT IN ('Key:image', 'Key:url', 'Key:website', 'Key:wikidata', 'Key:wikimedia_commons')) . + SERVICE wikibase:label { bd:serviceParam wikibase:language "en". } { { ?item wdt:P1630 ?formatter_URL. } From 221b1646e7a8e927ef5a4a7ca04dd3d964112c23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20B=C3=B6sch-Plepelits?= Date: Thu, 28 May 2020 14:15:10 +0200 Subject: [PATCH 14/19] tagsDisplay: use tag2link information (at least first formatter for each tag) --- src/tagsDisplay.js | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/tagsDisplay.js b/src/tagsDisplay.js index 2a53c74b..08a38220 100644 --- a/src/tagsDisplay.js +++ b/src/tagsDisplay.js @@ -1,5 +1,7 @@ const OverpassLayer = require('overpass-layer') +const httpGet = require('./httpGet') + const formatter = [ { regexp: /^(.*:)?wikidata$/, @@ -81,3 +83,25 @@ module.exports = function tagsDisplay (tags) { return div } + +register_hook('init_callback', (initState, callback) => { + httpGet('dist/tag2link.json', {}, (err, result) => { + if (err) { + console.error('Can\'t read dist/tag2link.json - execute bin/download_dependencies') + return callback() + } + + let tag2link = JSON.parse(result.body) + + Object.keys(tag2link).forEach(key => { + let tag = tag2link[key] + + formatter.push({ + regexp: new RegExp("^" + key + "$"), + link: tag.formatter[0].link.replace('$1', '{{ value }}') + }) + }) + + callback() + }) +}) From 1c1850deadd7963a4c4e4a926b259a27a1a899c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20B=C3=B6sch-Plepelits?= Date: Thu, 28 May 2020 14:59:46 +0200 Subject: [PATCH 15/19] tagsDisplay: for tag2link tags with multiple formatters show selector --- src/category.css | 23 +++++++++++++++++++++++ src/tagsDisplay.js | 42 ++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 63 insertions(+), 2 deletions(-) diff --git a/src/category.css b/src/category.css index 93ef0d8f..31da4eb7 100644 --- a/src/category.css +++ b/src/category.css @@ -161,3 +161,26 @@ .info .infoShowDetails .summary { display: none; } + +dl > dd { + position: relative; +} +.tag2link { + position: absolute; + top: 1em; + left: 0; + border: 1px solid black; + padding: 0.25em; + background: white; + z-index: 1; +} +.tag2link > .closeButton { + float: right; +} +.tag2link > ul { + padding-left: 0; + margin: 0; +} +.tag2link > ul > li { + list-style: none; +} diff --git a/src/tagsDisplay.js b/src/tagsDisplay.js index 08a38220..687af1d3 100644 --- a/src/tagsDisplay.js +++ b/src/tagsDisplay.js @@ -33,6 +33,7 @@ const formatter = [ } ] +let tag2link let compiled = false let defaultTemplate @@ -91,17 +92,54 @@ register_hook('init_callback', (initState, callback) => { return callback() } - let tag2link = JSON.parse(result.body) + tag2link = JSON.parse(result.body) Object.keys(tag2link).forEach(key => { let tag = tag2link[key] + let link = tag.formatter[0].link.replace('$1', '{{ value }}') + + if (tag.formatter.length > 1) { + link = "#\" onclick=\"return tag2link(this, " + JSON.stringify(key).replace(/"/g, '"') + ", {{ value|json_encode }})" + } formatter.push({ regexp: new RegExp("^" + key + "$"), - link: tag.formatter[0].link.replace('$1', '{{ value }}') + link }) }) callback() }) }) + +global.tag2link = function (dom, key, value) { + let div = document.createElement('div') + div.className = 'tag2link' + dom.parentNode.appendChild(div) + + let closeButton = document.createElement('div') + closeButton.className = 'closeButton' + closeButton.innerHTML = '❌' + closeButton.onclick = () => { + dom.parentNode.removeChild(div) + } + div.appendChild(closeButton) + + let selector = document.createElement('ul') + div.appendChild(selector) + + let tag = tag2link[key] + tag.formatter.forEach(formatter => { + let li = document.createElement('li') + + let a = document.createElement('a') + a.target = '_blank' + a.href = formatter.link.replace('$1', value) + a.appendChild(document.createTextNode(formatter.operator)) + + li.appendChild(a) + selector.appendChild(li) + }) + + return false +} From fbad96bd829120b371af5bafdb20002f31b907b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20B=C3=B6sch-Plepelits?= Date: Thu, 28 May 2020 15:33:48 +0200 Subject: [PATCH 16/19] tagsDisplay: convert more tags to links (e.g. phone, email, ...) --- src/tagsDisplay.js | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/tagsDisplay.js b/src/tagsDisplay.js index 687af1d3..8bf40f6d 100644 --- a/src/tagsDisplay.js +++ b/src/tagsDisplay.js @@ -16,7 +16,7 @@ const formatter = [ link: '{% set v = key|matches(":([a-zA-Z]+)") %}https://{{ v[1] }}.wikipedia.org/wiki/{{ value|replace({" ": "_"}) }}' }, { - regexp: /^(website|url|contact:website)$/, + regexp: /^((.*:)?website(:.*)?|(.*:)?url(:.*)?|contact:website)$/, link: '{{ value|websiteUrl }}' }, { @@ -24,12 +24,20 @@ const formatter = [ link: '{% if value matches "/^(File|Category):/" %}' + 'https://commons.wikimedia.org/wiki/{{ value|replace({" ": "_"}) }}' + '{% else %}' + - '{{ value }}' + + '{{ 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 }}' } ] From 0d34360c2427715c9913a94e7f622a2c9d70338e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20B=C3=B6sch-Plepelits?= Date: Thu, 28 May 2020 18:57:48 +0200 Subject: [PATCH 17/19] tag2link: import 'operator' from wikidata formatter urls --- bin/tag2link-converter | 6 +++++- lib/tag2link-wikidata.qry | 19 +++++++++++-------- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/bin/tag2link-converter b/bin/tag2link-converter index 684f8f84..f7ab18d6 100755 --- a/bin/tag2link-converter +++ b/bin/tag2link-converter @@ -29,7 +29,11 @@ foreach ($files as $file) { 'link' => $link, ); - if (preg_match("/^https?:\/\/([^\/]*)(\/.*|)$/", $link, $m)) { + if (array_key_exists('operatorLabel', $entry)) { + $formatter['operator'] = $entry['operatorLabel']['value']; + print "{$formatter['operator']}\n"; + } + else if (preg_match("/^https?:\/\/([^\/]*)(\/.*|)$/", $link, $m)) { $formatter['operator'] = $m[1]; } diff --git a/lib/tag2link-wikidata.qry b/lib/tag2link-wikidata.qry index 4aa83f89..87bdaf57 100644 --- a/lib/tag2link-wikidata.qry +++ b/lib/tag2link-wikidata.qry @@ -1,12 +1,15 @@ -SELECT ?item ?itemLabel ?OSM_key ?formatter_URL WHERE { - { ?item wdt:P1282 ?OSM_key. } - FILTER(STRSTARTS(?OSM_key, 'Key:')) . - FILTER(?OSM_key NOT IN ('Key:image', 'Key:url', 'Key:website', 'Key:wikidata', 'Key:wikimedia_commons')) . +SELECT ?itemLabel ?OSM_key ?formatter_URL ?operatorLabel WHERE { + ?item wdt:P1282 ?OSM_key . + FILTER(?OSM_key NOT IN("Key:image", "Key:url", "Key:website", "Key:wikidata", "Key:wikimedia_commons")) SERVICE wikibase:label { bd:serviceParam wikibase:language "en". } - { - { ?item wdt:P1630 ?formatter_URL. } - UNION - { ?item wdt:P3303 ?formatter_URL. } + ?item p:P1630 ?statement. + ?statement ps:P1630 ?formatter_URL. } + UNION + { + ?item p:P3303 ?statement. + ?statement ps:P3303 ?formatter_URL. + } + OPTIONAL { ?statement pq:P137 ?operator. } } From e20b4d2ea7b65258477b92edc00a632c09903b45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20B=C3=B6sch-Plepelits?= Date: Thu, 28 May 2020 18:58:49 +0200 Subject: [PATCH 18/19] tag2link: when formatterURLs are duplicates, check if we can add operator name --- bin/tag2link-converter | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/bin/tag2link-converter b/bin/tag2link-converter index f7ab18d6..2d3c26d5 100755 --- a/bin/tag2link-converter +++ b/bin/tag2link-converter @@ -12,9 +12,17 @@ foreach ($files as $file) { if (array_key_exists($key, $tag2link)) { // avoid duplicates - if (sizeof(array_filter($tag2link[$key]['formatter'], function ($e) use ($link) { + $duplicates = array_filter($tag2link[$key]['formatter'], function ($e) use ($link) { return $e['link'] === $link; - }))) { + }); + + if (sizeof($duplicates)) { + if (array_key_exists('operatorLabel', $entry)) { + foreach ($duplicates as $i => $d) { + $tag2link[$key]['formatter'][$i]['operator'] = $entry['operatorLabel']['value']; + } + } + continue; } } From 0b79173e2d68cdde960369b235a4a848f7237d6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20B=C3=B6sch-Plepelits?= Date: Thu, 28 May 2020 19:03:20 +0200 Subject: [PATCH 19/19] tag2link: move code to a separate file --- src/index.js | 3 +- src/tagsDisplay-tag2link.js | 63 +++++++++++++++++++++++++++++++++++ src/tagsDisplay.js | 65 +++---------------------------------- 3 files changed, 69 insertions(+), 62 deletions(-) create mode 100644 src/tagsDisplay-tag2link.js diff --git a/src/index.js b/src/index.js index fc810fa3..6d7a7df1 100644 --- a/src/index.js +++ b/src/index.js @@ -42,7 +42,8 @@ require('./GeoInfo') require('./PluginMeasure') require('./PluginGeoLocate') let exportAll = require('./exportAll') -const tagsDisplay = require('./tagsDisplay') +const tagsDisplay = require('./tagsDisplay').display +require('./tagsDisplay-tag2link') window.onload = function () { var initState = config.defaultView diff --git a/src/tagsDisplay-tag2link.js b/src/tagsDisplay-tag2link.js new file mode 100644 index 00000000..3143d2b4 --- /dev/null +++ b/src/tagsDisplay-tag2link.js @@ -0,0 +1,63 @@ +const httpGet = require('./httpGet') +const formatter = require('./tagsDisplay').formatter + +let tag2link + +register_hook('init_callback', (initState, callback) => { + httpGet('dist/tag2link.json', {}, (err, result) => { + if (err) { + console.error('Can\'t read dist/tag2link.json - execute bin/download_dependencies') + return callback() + } + + tag2link = JSON.parse(result.body) + + Object.keys(tag2link).forEach(key => { + let tag = tag2link[key] + let link = tag.formatter[0].link.replace('$1', '{{ value }}') + + if (tag.formatter.length > 1) { + link = "#\" onclick=\"return tag2link(this, " + JSON.stringify(key).replace(/"/g, '"') + ", {{ value|json_encode }})" + } + + formatter.push({ + regexp: new RegExp("^" + key + "$"), + link + }) + }) + + callback() + }) +}) + +global.tag2link = function (dom, key, value) { + let div = document.createElement('div') + div.className = 'tag2link' + dom.parentNode.appendChild(div) + + let closeButton = document.createElement('div') + closeButton.className = 'closeButton' + closeButton.innerHTML = '❌' + closeButton.onclick = () => { + dom.parentNode.removeChild(div) + } + div.appendChild(closeButton) + + let selector = document.createElement('ul') + div.appendChild(selector) + + let tag = tag2link[key] + tag.formatter.forEach(formatter => { + let li = document.createElement('li') + + let a = document.createElement('a') + a.target = '_blank' + a.href = formatter.link.replace('$1', value) + a.appendChild(document.createTextNode(formatter.operator)) + + li.appendChild(a) + selector.appendChild(li) + }) + + return false +} diff --git a/src/tagsDisplay.js b/src/tagsDisplay.js index 8bf40f6d..3a69db38 100644 --- a/src/tagsDisplay.js +++ b/src/tagsDisplay.js @@ -1,7 +1,5 @@ const OverpassLayer = require('overpass-layer') -const httpGet = require('./httpGet') - const formatter = [ { regexp: /^(.*:)?wikidata$/, @@ -41,11 +39,10 @@ const formatter = [ } ] -let tag2link let compiled = false let defaultTemplate -module.exports = function tagsDisplay (tags) { +function tagsDisplay (tags) { if (!compiled) { defaultTemplate = OverpassLayer.twig.twig({ data: '{{ value }}', autoescape: true }) for (let i in formatter) { @@ -93,61 +90,7 @@ module.exports = function tagsDisplay (tags) { return div } -register_hook('init_callback', (initState, callback) => { - httpGet('dist/tag2link.json', {}, (err, result) => { - if (err) { - console.error('Can\'t read dist/tag2link.json - execute bin/download_dependencies') - return callback() - } - - tag2link = JSON.parse(result.body) - - Object.keys(tag2link).forEach(key => { - let tag = tag2link[key] - let link = tag.formatter[0].link.replace('$1', '{{ value }}') - - if (tag.formatter.length > 1) { - link = "#\" onclick=\"return tag2link(this, " + JSON.stringify(key).replace(/"/g, '"') + ", {{ value|json_encode }})" - } - - formatter.push({ - regexp: new RegExp("^" + key + "$"), - link - }) - }) - - callback() - }) -}) - -global.tag2link = function (dom, key, value) { - let div = document.createElement('div') - div.className = 'tag2link' - dom.parentNode.appendChild(div) - - let closeButton = document.createElement('div') - closeButton.className = 'closeButton' - closeButton.innerHTML = '❌' - closeButton.onclick = () => { - dom.parentNode.removeChild(div) - } - div.appendChild(closeButton) - - let selector = document.createElement('ul') - div.appendChild(selector) - - let tag = tag2link[key] - tag.formatter.forEach(formatter => { - let li = document.createElement('li') - - let a = document.createElement('a') - a.target = '_blank' - a.href = formatter.link.replace('$1', value) - a.appendChild(document.createTextNode(formatter.operator)) - - li.appendChild(a) - selector.appendChild(li) - }) - - return false +module.exports = { + display: tagsDisplay, + formatter }