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.

65 lines
1.5 KiB

6 years ago
6 years ago
  1. const svgToDataURI = require('mini-svg-data-uri')
  2. /* global openstreetbrowserPrefix */
  3. var loadClash = {}
  4. var cache = {}
  5. var paths = {
  6. maki: 'node_modules/@mapbox/maki/icons/ID-SIZE.svg',
  7. temaki: 'node_modules/@ideditor/temaki/icons/ID.svg'
  8. }
  9. function applyOptions (code, options) {
  10. var style = ''
  11. for (var k in options) {
  12. if (k !== 'size') {
  13. style += k + ':' + options[k] + ';'
  14. }
  15. }
  16. let result = code.replace(/<path/i, '<path style="' + style + '"')
  17. return svgToDataURI(result)
  18. }
  19. function maki (set, file, options, callback) {
  20. var m = file.match(/^(.*)-(11|15)/)
  21. if (m) {
  22. file = m[1]
  23. options.size = m[2]
  24. }
  25. var url = (typeof openstreetbrowserPrefix === 'undefined' ? './' : openstreetbrowserPrefix) +
  26. paths[set]
  27. .replace('ID', file)
  28. .replace('SIZE', options.size || 15)
  29. if (url in cache) {
  30. return callback(null, applyOptions(cache[url], options))
  31. }
  32. if (url in loadClash) {
  33. loadClash[url].push([ options, callback ])
  34. return
  35. } else {
  36. loadClash[url] = [ [ options, callback ] ]
  37. }
  38. var req = new XMLHttpRequest()
  39. req.addEventListener('load', function () {
  40. if (req.status !== 200) {
  41. loadClash[url].forEach(p => p[1](req.statusText, null))
  42. delete loadClash[url]
  43. return
  44. }
  45. cache[url] = req.responseText
  46. loadClash[url].forEach(p => p[1](null, applyOptions(cache[url], p[0])))
  47. delete loadClash[url]
  48. })
  49. req.open('GET', url)
  50. req.send()
  51. }
  52. module.exports = maki