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.

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