WME Bootstrap

Bootstrap library for custom Waze Map Editor scripts

当前为 2022-08-27 提交的版本,查看 最新版本

此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.cn-greasyfork.org/scripts/450160/1086427/WME%20Bootstrap.js

  1. // ==UserScript==
  2. // @name WME Bootstrap
  3. // @namespace https://greasyfork.org/users/227648-anton-shevchuk
  4. // @version 0.0.7
  5. // @description Bootstrap library for custom Waze Map Editor scripts
  6. // @license MIT License
  7. // @match https://www.waze.com/editor*
  8. // @match https://www.waze.com/*/editor*
  9. // @match https://beta.waze.com/editor*
  10. // @match https://beta.waze.com/*/editor*
  11. // @exclude https://www.waze.com/user/editor*
  12. // @exclude https://beta.waze.com/user/editor*
  13. // @icon https://t3.gstatic.com/faviconV2?client=SOCIAL&type=FAVICON&fallback_opts=TYPE,SIZE,URL&url=https://anton.shevchuk.name&size=64
  14. // @grant none
  15. // ==/UserScript==
  16.  
  17. /* jshint esversion: 8 */
  18.  
  19. /* global jQuery, W */
  20.  
  21. (function () {
  22. 'use strict'
  23.  
  24. class Bootstrap {
  25. /**
  26. * Bootstrap it once!
  27. */
  28. constructor () {
  29. const sandbox = typeof unsafeWindow !== 'undefined'
  30. const pageWindow = sandbox ? unsafeWindow : window
  31.  
  32. if (!pageWindow.WMEBootstrap) {
  33. pageWindow.WMEBootstrap = true
  34. this.check()
  35. }
  36. }
  37.  
  38. /**
  39. * Check loading process
  40. * @param tries
  41. */
  42. check (tries = 100) {
  43. this.log('try to initialize')
  44. if (W &&
  45. W.map &&
  46. W.model &&
  47. W.model.countries.top &&
  48. W.loginManager.user
  49. ) {
  50. this.init()
  51. this.log('was initialized')
  52. } else if (tries > 0) {
  53. tries--
  54. setTimeout(() => this.check(tries), 500)
  55. } else {
  56. this.log('initialization failed')
  57. }
  58. }
  59.  
  60. /**
  61. * Initial events and handlers
  62. */
  63. init () {
  64. try {
  65. // setup additional handlers
  66. this.setup()
  67. // fire `bootstrap.wme` event
  68. jQuery(document)
  69. .trigger('bootstrap.wme')
  70. // listen all events
  71. jQuery(document)
  72. .on('segment.wme', () => this.log('🛣️ segment.wme'))
  73. .on('segments.wme', () => this.log('🛣️️ segments.wme'))
  74. .on('node.wme', () => this.log('⭐️ node.wme'))
  75. .on('nodes.wme', () => this.log('⭐️ nodes.wme'))
  76. .on('venue.wme', () => this.log('🏢️ venue.wme'))
  77. .on('venues.wme', () => this.log('🏢️ venues.wme'))
  78. .on('point.wme', () => this.log('📍️ point.wme'))
  79. .on('place.wme', () => this.log('📍️ place.wme'))
  80. .on('residential.wme', () => this.log('🏠 residential.wme'))
  81. } catch (e) {
  82. console.error(e)
  83. }
  84. }
  85.  
  86. /**
  87. * Setup additional handler for `selectionchanged` event
  88. */
  89. setup () {
  90. W.selectionManager.events.register('selectionchanged', null, (event) => this.handler(event.selected))
  91.  
  92. this.handler(W.selectionManager.getSelectedFeatures())
  93. }
  94.  
  95. /**
  96. * Proxy-handler
  97. * @param {Array} selected
  98. */
  99. handler (selected) {
  100. if (selected.length === 0) {
  101. jQuery(document).trigger('none.wme')
  102. return
  103. }
  104.  
  105. let isSingle = (selected.length === 1)
  106. let models = selected.map(x => x.model)
  107. let model = models[0]
  108.  
  109. switch (true) {
  110. case (model.type === 'node' && isSingle):
  111. this.trigger('node.wme', 'node-edit-general', model)
  112. break
  113. case (model.type === 'node'):
  114. this.trigger('nodes.wme', 'node-edit-general', models)
  115. break
  116. case (model.type === 'segment' && isSingle):
  117. this.trigger('segment.wme', 'segment-edit-general', model)
  118. break
  119. case (model.type === 'segment'):
  120. this.trigger('segments.wme', 'segment-edit-general', models)
  121. break
  122. case (model.type === 'venue' && isSingle):
  123. this.trigger('venue.wme', 'venue-edit-general', model)
  124. if (model.isPoint()) {
  125. this.trigger('point.wme', 'venue-edit-general', model)
  126. } else {
  127. this.trigger('place.wme', 'venue-edit-general', model)
  128. }
  129. if (model.isResidential()) {
  130. this.trigger('residential.wme', 'venue-edit-general', model)
  131. }
  132. break
  133. case (model.type === 'venue'):
  134. this.trigger('venues.wme', 'mergeVenuesCollection', models)
  135. break
  136. }
  137. }
  138.  
  139. /**
  140. * Fire new event with context
  141. * @param {String} event
  142. * @param {String} selector
  143. * @param {Object|Array} models
  144. */
  145. trigger (event, selector, models) {
  146. jQuery(document).trigger(event, [document.getElementById(selector), models])
  147. }
  148.  
  149. /**
  150. * Just logger
  151. * @param {String} message
  152. */
  153. log (message) {
  154. console.log('%cBootstrap:%c ' + message, 'color: #0DAD8D; font-weight: bold', 'color: dimgray; font-weight: normal')
  155. }
  156. }
  157.  
  158. new Bootstrap()
  159.  
  160. })()