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

  1. const OverpassLayer = require('overpass-layer')
  2. const formatter = [
  3. {
  4. regexp: /^(.*:)?wikidata$/,
  5. link: 'https://wikidata.org/wiki/{{ value }}'
  6. },
  7. {
  8. regexp: /^(.*:)?wikipedia$/,
  9. link: '{% set v = value|split(":") %}https://{{ v[0] }}.wikipedia.org/wiki/{{ v[1]|replace({" ": "_"}) }}'
  10. },
  11. {
  12. regexp: /^(.*:)?wikipedia:([a-zA-Z]+)$/,
  13. link: '{% set v = key|matches(":([a-zA-Z]+)") %}https://{{ v[1] }}.wikipedia.org/wiki/{{ value|replace({" ": "_"}) }}'
  14. },
  15. {
  16. regexp: /^((.*:)?website(:.*)?|(.*:)?url(:.*)?|contact:website)$/,
  17. link: '{{ value|websiteUrl }}'
  18. },
  19. {
  20. regexp: /^(image|wikimedia_commons)$/,
  21. link: '{% if value matches "/^(File|Category):/" %}' +
  22. 'https://commons.wikimedia.org/wiki/{{ value|replace({" ": "_"}) }}' +
  23. '{% else %}' +
  24. '{{ value|websiteUrl }}' +
  25. '{% endif %}'
  26. },
  27. {
  28. regexp: /^(species)$/,
  29. link: 'https://species.wikimedia.org/wiki/{{ value|replace({" ": "_"}) }}'
  30. },
  31. {
  32. regexp: /^(phone|contact:phone|fax|contact:fax)(:.*|)$/,
  33. link: 'tel:{{ value }}'
  34. },
  35. {
  36. regexp: /^(email|contact:email)(:.*|)$/,
  37. link: 'mailto:{{ value }}'
  38. }
  39. ]
  40. let compiled = false
  41. let defaultTemplate
  42. function tagsDisplay (tags) {
  43. if (!compiled) {
  44. defaultTemplate = OverpassLayer.twig.twig({ data: '{{ value }}', autoescape: true })
  45. for (let i in formatter) {
  46. if (formatter[i].format) {
  47. formatter[i].template = OverpassLayer.twig.twig({ data: formatter[i].format, autoescape: true })
  48. } else {
  49. formatter[i].template = OverpassLayer.twig.twig({ data: '<a target="_blank" href="' + formatter[i].link + '">{{ value }}</a>', autoescape: true })
  50. }
  51. }
  52. compiled = true
  53. }
  54. const div = document.createElement('dl')
  55. div.className = 'tags'
  56. for (let k in tags) {
  57. const dt = document.createElement('dt')
  58. dt.appendChild(document.createTextNode(k))
  59. div.appendChild(dt)
  60. let template = defaultTemplate
  61. const dd = document.createElement('dd')
  62. for (let i = 0; i < formatter.length; i++) {
  63. if (k.match(formatter[i].regexp)) {
  64. template = formatter[i].template
  65. break
  66. }
  67. }
  68. let value = tags[k].split(/;/g)
  69. value = value.map(v => {
  70. // trim whitespace (but add it around the formatted value later)
  71. let m = v.match(/^( *)([^ ].*[^ ]|[^ ])( *)$/)
  72. if (m) {
  73. return m[1] + template.render({ key: k, value: m[2] }) + m[3]
  74. }
  75. return v
  76. }).join(';')
  77. dd.innerHTML = value
  78. div.appendChild(dd)
  79. }
  80. return div
  81. }
  82. module.exports = {
  83. display: tagsDisplay,
  84. formatter
  85. }