WME Bootstrap

Bootstrap library for custom Waze Map Editor scripts

当前为 2022-09-05 提交的版本,查看 最新版本

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

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

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址