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.

150 lines
4.0 KiB

6 years ago
6 years ago
6 years ago
  1. var OverpassLayer = require('overpass-layer')
  2. var OpeningHours = require('opening_hours')
  3. var colorInterpolate = require('color-interpolate')
  4. var osmParseDate = require('openstreetmap-date-parser')
  5. var osmFormatDate = require('openstreetmap-date-format')
  6. const natsort = require('natsort').default
  7. const md5 = require('md5')
  8. var md5cache = {}
  9. OverpassLayer.twig.extendFunction('tagsPrefix', function (tags, prefix) {
  10. var ret = {}
  11. var count = 0
  12. for (var k in tags) {
  13. if (k.substr(0, prefix.length) === prefix) {
  14. ret[k.substr(prefix.length)] = k
  15. count++
  16. }
  17. }
  18. if (count === 0) {
  19. return null
  20. }
  21. return ret
  22. })
  23. OverpassLayer.twig.extendFunction('openingHoursState', function (openingHours) {
  24. try {
  25. var oh = new OpeningHours(openingHours)
  26. } catch (err) {
  27. console.log('Error in opening_hours: ' + err)
  28. return 'unknown'
  29. }
  30. return oh.getStateString(new Date(), true)
  31. })
  32. OverpassLayer.twig.extendFilter('websiteUrl', function (value) {
  33. if (value.match(/^https?:\/\//)) {
  34. return value
  35. }
  36. return 'http://' + value
  37. })
  38. OverpassLayer.twig.extendFilter('matches', function (value, match) {
  39. if (value === null || typeof value === 'undefined') {
  40. return false
  41. }
  42. return value.toString().match(match)
  43. })
  44. OverpassLayer.twig.extendFilter('natsort', function (values, options) {
  45. return values.sort(natsort(options))
  46. })
  47. OverpassLayer.twig.extendFilter('unique', function (values, options) {
  48. // source: https://stackoverflow.com/a/14438954
  49. function onlyUnique (value, index, self) {
  50. return self.indexOf(value) === index
  51. }
  52. return values.filter(onlyUnique)
  53. })
  54. OverpassLayer.twig.extendFunction('colorInterpolate', function (map, value) {
  55. var colormap = colorInterpolate(map)
  56. return colormap(value)
  57. })
  58. OverpassLayer.twig.extendFilter('osmParseDate', function (value) {
  59. return osmParseDate(value)
  60. })
  61. OverpassLayer.twig.extendFilter('osmFormatDate', function (value, param) {
  62. return osmFormatDate(value, param.length ? param[0] : {})
  63. })
  64. OverpassLayer.twig.extendFilter('md5', function (value) {
  65. if (!(value in md5cache)) {
  66. md5cache[value] = md5(value)
  67. }
  68. return md5cache[value]
  69. })
  70. OverpassLayer.twig.extendFunction('evaluate', function (tags) {
  71. var ob = {
  72. id: 'x0',
  73. isShown: true,
  74. layer_id: global.currentCategory.id,
  75. object: {
  76. id: 'x0',
  77. meta: {},
  78. tags: tags,
  79. type: 'special'
  80. }
  81. }
  82. var d = global.currentCategory.layer.mainlayer.evaluate(ob)
  83. return d
  84. })
  85. function enumerate (list) {
  86. if (!list) {
  87. return ''
  88. }
  89. if (typeof list === 'string') {
  90. list = list.split(/;/g)
  91. }
  92. if (list.length > 2) {
  93. let result = lang_str.enumerate_start.replace('{0}', list[0]).replace('{1}', list[1])
  94. for (let i = 2; i < list.length - 1; i++) {
  95. result = lang_str.enumerate_middle.replace('{0}', result).replace('{1}', list[i])
  96. }
  97. return lang_str.enumerate_end.replace('{0}', result).replace('{1}', list[list.length - 1])
  98. }
  99. else if (list.length == 2) {
  100. return lang_str.enumerate_2.replace('{0}', list[0]).replace('{1}', list[1])
  101. }
  102. else if (list.length > 0) {
  103. return list[0]
  104. }
  105. return ''
  106. }
  107. OverpassLayer.twig.extendFunction('enumerate', (list) => enumerate(list))
  108. OverpassLayer.twig.extendFilter('enumerate', (list) => enumerate(list))
  109. OverpassLayer.twig.extendFilter('ksort', (list) => {
  110. if (Array.isArray(list)) {
  111. return list
  112. }
  113. let keys = list._keys || Object.keys(list)
  114. keys.sort()
  115. let result = Object.assign({}, list)
  116. result._keys = keys
  117. return result
  118. })
  119. OverpassLayer.twig.extendFunction('debug', function () {
  120. console.log.apply(null, arguments)
  121. })
  122. OverpassLayer.twig.extendFilter('debug', function (value, param) {
  123. console.log.apply(null, [ value, ...param ])
  124. return value
  125. })
  126. OverpassLayer.twig.extendFilter('json_pp', function (value, param) {
  127. const options = param[0] || {}
  128. value = JSON.parse(JSON.stringify(value))
  129. delete value._keys // remove TwigJS artefact
  130. return JSON.stringify(value, null, 'indent' in options ? ' '.repeat(options.indent) : ' ')
  131. })