@mapcomponents/react-maplibre 0.1.56 → 0.1.58

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (277) hide show
  1. package/.eslintignore +11 -0
  2. package/.eslintrc.js +20 -0
  3. package/.github/workflows/check-formatting.yml +46 -0
  4. package/.prettierignore +11 -0
  5. package/.prettierrc.json +6 -0
  6. package/CHANGELOG.md +20 -0
  7. package/coverage/clover.xml +232 -80
  8. package/coverage/coverage-final.json +43 -37
  9. package/coverage/lcov-report/index.html +71 -26
  10. package/coverage/lcov-report/src/components/MapLibreMap/MapLibreMap.tsx.html +83 -83
  11. package/coverage/lcov-report/src/components/MapLibreMap/index.html +1 -1
  12. package/coverage/lcov-report/src/components/MlCenterPosition/MlCenterPosition.tsx.html +66 -66
  13. package/coverage/lcov-report/src/components/MlCenterPosition/index.html +1 -1
  14. package/coverage/lcov-report/src/components/MlCreatePdfButton/MlCreatePdfButton.tsx.html +30 -30
  15. package/coverage/lcov-report/src/components/MlCreatePdfButton/index.html +1 -1
  16. package/coverage/lcov-report/src/components/MlCreatePdfForm/MlCreatePdfForm.tsx.html +202 -0
  17. package/coverage/lcov-report/src/components/MlCreatePdfForm/index.html +116 -0
  18. package/coverage/lcov-report/src/components/MlFeatureEditor/MlFeatureEditor.tsx.html +99 -99
  19. package/coverage/lcov-report/src/components/MlFeatureEditor/index.html +1 -1
  20. package/coverage/lcov-report/src/components/MlFillExtrusionLayer/MlFillExtrusionLayer.tsx.html +66 -66
  21. package/coverage/lcov-report/src/components/MlFillExtrusionLayer/index.html +1 -1
  22. package/coverage/lcov-report/src/components/MlFollowGps/MlFollowGps.tsx.html +221 -221
  23. package/coverage/lcov-report/src/components/MlFollowGps/index.html +1 -1
  24. package/coverage/lcov-report/src/components/MlGPXViewer/MlGPXViewer.tsx.html +308 -308
  25. package/coverage/lcov-report/src/components/MlGPXViewer/gpxConverter.js.html +497 -497
  26. package/coverage/lcov-report/src/components/MlGPXViewer/index.html +1 -1
  27. package/coverage/lcov-report/src/components/MlGeoJsonLayer/MlGeoJsonLayer.tsx.html +85 -85
  28. package/coverage/lcov-report/src/components/MlGeoJsonLayer/index.html +1 -1
  29. package/coverage/lcov-report/src/components/MlGeojsonLayerWithSource/MlGeojsonLayerWithSource.tsx.html +469 -0
  30. package/coverage/lcov-report/src/components/MlGeojsonLayerWithSource/index.html +116 -0
  31. package/coverage/lcov-report/src/components/MlImageMarkerLayer/MlImageMarkerLayer.tsx.html +140 -140
  32. package/coverage/lcov-report/src/components/MlImageMarkerLayer/index.html +1 -1
  33. package/coverage/lcov-report/src/components/MlLayer/MlLayer.tsx.html +37 -37
  34. package/coverage/lcov-report/src/components/MlLayer/index.html +1 -1
  35. package/coverage/lcov-report/src/components/MlLayerMagnify/MlLayerMagnify.tsx.html +179 -179
  36. package/coverage/lcov-report/src/components/MlLayerMagnify/index.html +1 -1
  37. package/coverage/lcov-report/src/components/MlLayerSwipe/MlLayerSwipe.tsx.html +113 -113
  38. package/coverage/lcov-report/src/components/MlLayerSwipe/index.html +1 -1
  39. package/coverage/lcov-report/src/components/MlLayerSwitcher/MlLayerSwitcher.js.html +181 -181
  40. package/coverage/lcov-report/src/components/MlLayerSwitcher/components/LayerBox.js.html +58 -58
  41. package/coverage/lcov-report/src/components/MlLayerSwitcher/components/index.html +1 -1
  42. package/coverage/lcov-report/src/components/MlLayerSwitcher/index.html +1 -1
  43. package/coverage/lcov-report/src/components/MlMarker/MlMarker.tsx.html +108 -108
  44. package/coverage/lcov-report/src/components/MlMarker/index.html +1 -1
  45. package/coverage/lcov-report/src/components/MlMeasureTool/MlMeasureTool.tsx.html +39 -39
  46. package/coverage/lcov-report/src/components/MlMeasureTool/index.html +1 -1
  47. package/coverage/lcov-report/src/components/MlNavigationCompass/MlNavigationCompass.tsx.html +183 -183
  48. package/coverage/lcov-report/src/components/MlNavigationCompass/index.html +1 -1
  49. package/coverage/lcov-report/src/components/MlNavigationTools/MlNavigationTools.tsx.html +163 -163
  50. package/coverage/lcov-report/src/components/MlNavigationTools/index.html +1 -1
  51. package/coverage/lcov-report/src/components/MlOsmLayer/MlOsmLayer.js.html +50 -50
  52. package/coverage/lcov-report/src/components/MlOsmLayer/MlOsmLayer.stories_.js.html +30 -30
  53. package/coverage/lcov-report/src/components/MlOsmLayer/index.html +1 -1
  54. package/coverage/lcov-report/src/components/MlScaleReference/MlScaleReference.js.html +89 -89
  55. package/coverage/lcov-report/src/components/MlScaleReference/index.html +11 -11
  56. package/coverage/lcov-report/src/components/MlShareMapState/MlShareMapState.js.html +204 -204
  57. package/coverage/lcov-report/src/components/MlShareMapState/index.html +1 -1
  58. package/coverage/lcov-report/src/components/MlSpatialElevationProfile/MlSpatialElevationProfile.js.html +180 -180
  59. package/coverage/lcov-report/src/components/MlSpatialElevationProfile/index.html +1 -1
  60. package/coverage/lcov-report/src/components/MlThreeJsLayer/MlThreeJsLayer.js.html +163 -163
  61. package/coverage/lcov-report/src/components/MlThreeJsLayer/index.html +1 -1
  62. package/coverage/lcov-report/src/components/MlTransitionGeoJsonLayer/MlTransitionGeoJsonLayer.tsx.html +136 -136
  63. package/coverage/lcov-report/src/components/MlTransitionGeoJsonLayer/index.html +1 -1
  64. package/coverage/lcov-report/src/components/MlUseMapDebugger/MlUseMapDebugger.js.html +53 -53
  65. package/coverage/lcov-report/src/components/MlUseMapDebugger/index.html +1 -1
  66. package/coverage/lcov-report/src/components/MlVectorTileLayer/MlVectorTileLayer.tsx.html +123 -123
  67. package/coverage/lcov-report/src/components/MlVectorTileLayer/index.html +1 -1
  68. package/coverage/lcov-report/src/components/MlWmsFeatureInfoPopup/MlWmsFeatureInfoPopup.js.html +35 -35
  69. package/coverage/lcov-report/src/components/MlWmsFeatureInfoPopup/index.html +1 -1
  70. package/coverage/lcov-report/src/components/MlWmsLayer/MlWmsLayer.tsx.html +155 -155
  71. package/coverage/lcov-report/src/components/MlWmsLayer/index.html +1 -1
  72. package/coverage/lcov-report/src/components/MlWmsLoader/MlWmsLoader.tsx.html +255 -255
  73. package/coverage/lcov-report/src/components/MlWmsLoader/index.html +1 -1
  74. package/coverage/lcov-report/src/contexts/MapContext.tsx.html +66 -66
  75. package/coverage/lcov-report/src/contexts/SimpleDataContext.js.html +1 -1
  76. package/coverage/lcov-report/src/contexts/SimpleDataProvider.js.html +48 -48
  77. package/coverage/lcov-report/src/contexts/index.html +1 -1
  78. package/coverage/lcov-report/src/hooks/exportMap/index.html +131 -0
  79. package/coverage/lcov-report/src/hooks/exportMap/index.ts.html +175 -0
  80. package/coverage/lcov-report/src/hooks/exportMap/lib.ts.html +646 -0
  81. package/coverage/lcov-report/src/hooks/index.html +48 -18
  82. package/coverage/lcov-report/src/hooks/useLayer.ts.html +230 -188
  83. package/coverage/lcov-report/src/hooks/useLayerEvent.js.html +232 -0
  84. package/coverage/lcov-report/src/hooks/useMap.ts.html +72 -69
  85. package/coverage/lcov-report/src/hooks/useMapState.ts.html +145 -145
  86. package/coverage/lcov-report/src/hooks/useSource.ts.html +337 -0
  87. package/coverage/lcov-report/src/hooks/useWms.js.html +72 -72
  88. package/coverage/lcov-report/src/index.html +1 -1
  89. package/coverage/lcov-report/src/index.ts.html +14 -2
  90. package/coverage/lcov.info +450 -153
  91. package/dist/components/MlCreatePdfForm/MlCreatePdfForm.d.ts +24 -0
  92. package/dist/components/MlCreatePdfForm/MlCreatePdfForm.stories.d.ts +13 -0
  93. package/dist/components/MlCreatePdfForm/lib/PdfContext.d.ts +21 -0
  94. package/dist/components/MlCreatePdfForm/lib/PdfForm.d.ts +10 -0
  95. package/dist/components/MlCreatePdfForm/lib/PdfPreview.d.ts +13 -0
  96. package/dist/components/MlCreatePdfForm/lib/pdf.templates.d.ts +11 -0
  97. package/dist/components/MlFeatureEditor/lib/create_vertex.d.ts +1 -1
  98. package/dist/components/MlGeojsonLayerWithSource/MlGeojsonLayerWithSource.d.ts +22 -0
  99. package/dist/components/MlGeojsonLayerWithSource/MlGeojsonLayerWithSource.stories.d.ts +10 -0
  100. package/dist/components/MlLayerSwipe/MlLayerSwipe.d.ts +1 -1
  101. package/dist/components/MlWmsLayer/MlWmsLayer.d.ts +2 -2
  102. package/dist/decorators/MapContextDecoratorHooks.d.ts +2 -0
  103. package/dist/decorators/ThemeWrapper.d.ts +1 -0
  104. package/dist/hooks/exportMap/index.d.ts +11 -0
  105. package/dist/hooks/exportMap/lib.d.ts +36 -0
  106. package/dist/hooks/useLayer.d.ts +6 -5
  107. package/dist/hooks/useLayerEvent.d.ts +2 -0
  108. package/dist/hooks/useMap.d.ts +1 -1
  109. package/dist/hooks/useMapState.stories.d.ts +2 -2
  110. package/dist/hooks/useSource.d.ts +17 -0
  111. package/dist/hooks/useSources.stories.d.ts +13 -0
  112. package/dist/index.d.ts +4 -0
  113. package/dist/index.esm.js +479 -190
  114. package/dist/index.esm.js.map +1 -1
  115. package/eslintErrorTest.js +10 -0
  116. package/package.json +7 -1
  117. package/public/thumbnails/MlCreatePdfForm.png +0 -0
  118. package/src/components/MapLibreMap/MapLibreMap.stories.js +72 -72
  119. package/src/components/MapLibreMap/MapLibreMap.test.js +60 -60
  120. package/src/components/MapLibreMap/MapLibreMap.tsx +82 -82
  121. package/src/components/MapLibreMap/lib/MapLibreGlWrapper.test.js +343 -343
  122. package/src/components/MapLibreMap/lib/MapLibreGlWrapper.ts +619 -619
  123. package/src/components/MlBasicComponent.js +25 -25
  124. package/src/components/MlCenterPosition/MlCenterPosition.stories.js +6 -6
  125. package/src/components/MlCenterPosition/MlCenterPosition.tsx +65 -65
  126. package/src/components/MlComponentTemplate/MlComponentTemplate.stories.js +5 -5
  127. package/src/components/MlComponentTemplate/MlComponentTemplate.tsx +23 -23
  128. package/src/components/MlCreatePdfButton/{MlCreatePdfButton.meta.json → MlCreatePdfButton.meta_.json} +0 -0
  129. package/src/components/MlCreatePdfButton/MlCreatePdfButton.stories.js +16 -16
  130. package/src/components/MlCreatePdfButton/MlCreatePdfButton.tsx +29 -29
  131. package/src/components/MlCreatePdfButton/lib/createPdf.ts +175 -175
  132. package/src/components/MlCreatePdfButton/lib/nominatimMap.ts +51 -51
  133. package/src/components/MlCreatePdfForm/MlCreatePdfForm.doc.de.md +3 -0
  134. package/src/components/MlCreatePdfForm/MlCreatePdfForm.meta.json +15 -0
  135. package/src/components/MlCreatePdfForm/MlCreatePdfForm.stories.tsx +152 -0
  136. package/src/components/MlCreatePdfForm/MlCreatePdfForm.tsx +39 -0
  137. package/src/components/MlCreatePdfForm/lib/PdfContext.tsx +53 -0
  138. package/src/components/MlCreatePdfForm/lib/PdfForm.tsx +161 -0
  139. package/src/components/MlCreatePdfForm/lib/PdfPreview.tsx +399 -0
  140. package/src/components/MlCreatePdfForm/lib/pdf.templates.ts +82 -0
  141. package/src/components/MlFeatureEditor/MlFeatureEditor.stories.js +55 -55
  142. package/src/components/MlFeatureEditor/MlFeatureEditor.test.js +105 -105
  143. package/src/components/MlFeatureEditor/MlFeatureEditor.tsx +119 -119
  144. package/src/components/MlFeatureEditor/custom-direct-select-mode.js +208 -208
  145. package/src/components/MlFeatureEditor/custom-polygon-mode.js +148 -148
  146. package/src/components/MlFeatureEditor/custom-select-mode.js +314 -314
  147. package/src/components/MlFeatureEditor/lib/common_selectors.js +34 -34
  148. package/src/components/MlFeatureEditor/lib/constants.js +61 -61
  149. package/src/components/MlFeatureEditor/lib/constrain_feature_movement.js +51 -51
  150. package/src/components/MlFeatureEditor/lib/create_midpoint.js +30 -30
  151. package/src/components/MlFeatureEditor/lib/create_supplementary_points.js +82 -82
  152. package/src/components/MlFeatureEditor/lib/create_vertex.js +16 -16
  153. package/src/components/MlFeatureEditor/lib/double_click_zoom.js +23 -23
  154. package/src/components/MlFeatureEditor/lib/euclidean_distance.js +3 -3
  155. package/src/components/MlFeatureEditor/lib/features_at.js +23 -23
  156. package/src/components/MlFeatureEditor/lib/get_features_and_set_cursor.js +15 -15
  157. package/src/components/MlFeatureEditor/lib/is_click.js +8 -8
  158. package/src/components/MlFeatureEditor/lib/is_event_at_coordinates.js +2 -2
  159. package/src/components/MlFeatureEditor/lib/is_tap.js +6 -6
  160. package/src/components/MlFeatureEditor/lib/map_event_to_bounding_box.js +4 -4
  161. package/src/components/MlFeatureEditor/lib/mode_handler.js +105 -105
  162. package/src/components/MlFeatureEditor/lib/mouse_event_point.js +5 -5
  163. package/src/components/MlFeatureEditor/lib/move_features.js +33 -33
  164. package/src/components/MlFeatureEditor/lib/sort_features.js +25 -25
  165. package/src/components/MlFeatureEditor/lib/string_set.js +36 -36
  166. package/src/components/MlFeatureEditor/lib/string_sets_are_equal.js +2 -2
  167. package/src/components/MlFeatureEditor/lib/theme.js +230 -230
  168. package/src/components/MlFeatureEditor/lib/to_dense_array.js +1 -1
  169. package/src/components/MlFeatureEditor/lib/utils.js +40 -40
  170. package/src/components/MlFillExtrusionLayer/MlFillExtrusionLayer.stories.js +9 -9
  171. package/src/components/MlFillExtrusionLayer/MlFillExtrusionLayer.test.js +4 -4
  172. package/src/components/MlFillExtrusionLayer/MlFillExtrusionLayer.tsx +65 -65
  173. package/src/components/MlFollowGps/MlFollowGps.stories.js +6 -6
  174. package/src/components/MlFollowGps/MlFollowGps.test.js +44 -44
  175. package/src/components/MlFollowGps/MlFollowGps.tsx +220 -220
  176. package/src/components/MlGPXViewer/MlGPXViewer.stories.js +15 -15
  177. package/src/components/MlGPXViewer/MlGPXViewer.test.js +12 -12
  178. package/src/components/MlGPXViewer/MlGPXViewer.tsx +345 -345
  179. package/src/components/MlGPXViewer/gpxConverter.js +496 -496
  180. package/src/components/MlGPXViewer/util/GeoJsonContext.ts +4 -4
  181. package/src/components/MlGPXViewer/util/GeoJsonProvider.tsx +16 -16
  182. package/src/components/MlGeoJsonLayer/MlGeoJsonLayer.stories.js +34 -34
  183. package/src/components/MlGeoJsonLayer/MlGeoJsonLayer.test.js +8 -8
  184. package/src/components/MlGeoJsonLayer/MlGeoJsonLayer.tsx +84 -84
  185. package/src/components/MlGeoJsonLayer/util/getDefaultLayerTypeByGeometry.ts +21 -21
  186. package/src/components/MlGeoJsonLayer/util/getDefaultPaintPropsByType.ts +27 -27
  187. package/src/components/MlGeojsonLayerWithSource/MlGeojsonLayerWithSource.doc.de.md +3 -0
  188. package/src/components/MlGeojsonLayerWithSource/MlGeojsonLayerWithSource.meta_.json +15 -0
  189. package/src/components/MlGeojsonLayerWithSource/MlGeojsonLayerWithSource.stories.js +19 -0
  190. package/src/components/MlGeojsonLayerWithSource/MlGeojsonLayerWithSource.tsx +128 -0
  191. package/src/components/MlImageMarkerLayer/MlImageMarkerLayer.stories.js +28 -28
  192. package/src/components/MlImageMarkerLayer/MlImageMarkerLayer.test.js +8 -8
  193. package/src/components/MlImageMarkerLayer/MlImageMarkerLayer.tsx +162 -162
  194. package/src/components/MlLayer/MlLayer.stories.js +5 -5
  195. package/src/components/MlLayer/MlLayer.test.js +86 -86
  196. package/src/components/MlLayer/MlLayer.tsx +36 -36
  197. package/src/components/MlLayerMagnify/MlLayerMagnify.stories.js +21 -21
  198. package/src/components/MlLayerMagnify/MlLayerMagnify.test.js +54 -54
  199. package/src/components/MlLayerMagnify/MlLayerMagnify.tsx +201 -201
  200. package/src/components/MlLayerSwipe/MlLayerSwipe.stories.js +20 -20
  201. package/src/components/MlLayerSwipe/MlLayerSwipe.test.js +54 -54
  202. package/src/components/MlLayerSwipe/MlLayerSwipe.tsx +130 -130
  203. package/src/components/MlLayerSwitcher/MlLayerSwitcher.js +194 -194
  204. package/src/components/MlLayerSwitcher/MlLayerSwitcher.stories.js +85 -85
  205. package/src/components/MlLayerSwitcher/components/LayerBox.js +57 -57
  206. package/src/components/MlMarker/MlMarker.stories.js +7 -7
  207. package/src/components/MlMarker/MlMarker.tsx +119 -119
  208. package/src/components/MlMeasureTool/MlMeasureTool.stories.js +64 -64
  209. package/src/components/MlMeasureTool/MlMeasureTool.tsx +38 -38
  210. package/src/components/MlNavigationCompass/MlNavigationCompass.stories.js +45 -45
  211. package/src/components/MlNavigationCompass/MlNavigationCompass.test.js +40 -40
  212. package/src/components/MlNavigationCompass/MlNavigationCompass.tsx +192 -192
  213. package/src/components/MlNavigationTools/MlNavigationTools.stories.js +18 -18
  214. package/src/components/MlNavigationTools/MlNavigationTools.tsx +173 -173
  215. package/src/components/MlOsmLayer/MlOsmLayer.js +49 -49
  216. package/src/components/MlOsmLayer/MlOsmLayer.stories_.js +29 -29
  217. package/src/components/MlOsmLayer/MlOsmLayer.test.js +8 -8
  218. package/src/components/MlScaleReference/MlScaleReference.js +82 -82
  219. package/src/components/MlScaleReference/MlScaleReference.stories.js +33 -35
  220. package/src/components/MlShareMapState/MlShareMapState.js +203 -203
  221. package/src/components/MlShareMapState/MlShareMapState.stories.js +68 -68
  222. package/src/components/MlSpatialElevationProfile/MlSpatialElevationProfile.js +201 -201
  223. package/src/components/MlSpatialElevationProfile/MlSpatialElevationProfile.stories.js +35 -35
  224. package/src/components/MlSpatialElevationProfile/MlSpatialElevationProfile.test.js +8 -8
  225. package/src/components/MlThreeJsLayer/MlThreeJsLayer.js +186 -186
  226. package/src/components/MlThreeJsLayer/MlThreeJsLayer.stories.js +21 -21
  227. package/src/components/MlThreeJsLayer/MlThreeJsLayer.test.js +24 -24
  228. package/src/components/MlThreeJsLayer/lib/GLTFLoader.js +3327 -3327
  229. package/src/components/MlTransitionGeoJsonLayer/MlTransitionGeoJsonLayer.stories.js +31 -30
  230. package/src/components/MlTransitionGeoJsonLayer/MlTransitionGeoJsonLayer.test.js +8 -8
  231. package/src/components/MlTransitionGeoJsonLayer/MlTransitionGeoJsonLayer.tsx +146 -146
  232. package/src/components/MlTransitionGeoJsonLayer/util/transitionFunctions.js +207 -207
  233. package/src/components/MlUseMapDebugger/MlUseMapDebugger.js +52 -52
  234. package/src/components/MlUseMapDebugger/MlUseMapDebugger.stories.js +13 -13
  235. package/src/components/MlVectorTileLayer/MlVectorTileLayer.stories.js +27 -27
  236. package/src/components/MlVectorTileLayer/MlVectorTileLayer.test.js +27 -27
  237. package/src/components/MlVectorTileLayer/MlVectorTileLayer.tsx +137 -137
  238. package/src/components/MlWmsFeatureInfoPopup/MlWmsFeatureInfoPopup.js +34 -34
  239. package/src/components/MlWmsFeatureInfoPopup/MlWmsFeatureInfoPopup.stories.js +7 -7
  240. package/src/components/MlWmsLayer/MlWmsLayer.stories.js +26 -26
  241. package/src/components/MlWmsLayer/MlWmsLayer.test.js +8 -8
  242. package/src/components/MlWmsLayer/MlWmsLayer.tsx +167 -167
  243. package/src/components/MlWmsLoader/MlWmsLoader.stories.js +27 -27
  244. package/src/components/MlWmsLoader/MlWmsLoader.tsx +254 -254
  245. package/src/contexts/MapComponentsProvider.test.js +229 -229
  246. package/src/contexts/MapContext.tsx +65 -65
  247. package/src/contexts/SimpleDataProvider.js +47 -47
  248. package/src/contexts/SimpleDataProvider.test.js +29 -29
  249. package/src/custom.d.tsx +14 -14
  250. package/src/decorators/MapContextDecorator.js +23 -25
  251. package/src/decorators/MapContextDecoratorHooks.js +34 -0
  252. package/src/decorators/MultiMapContextDecorator.js +63 -63
  253. package/src/decorators/NoNavToolsDecorator.js +17 -17
  254. package/src/decorators/ThemeWrapper.jsx +9 -0
  255. package/src/hooks/assets/pointWG.json +13 -0
  256. package/src/hooks/exportMap/index.ts +30 -0
  257. package/src/hooks/exportMap/lib.ts +187 -0
  258. package/src/hooks/useLayer.test.js +188 -188
  259. package/src/hooks/useLayer.ts +194 -180
  260. package/src/hooks/useLayerEvent.js +49 -0
  261. package/src/hooks/useMap.ts +67 -66
  262. package/src/hooks/useMapState.stories.js +78 -78
  263. package/src/hooks/useMapState.ts +161 -161
  264. package/src/hooks/useSource.ts +84 -0
  265. package/src/hooks/useSources.stories.js +232 -0
  266. package/src/hooks/useWms.js +71 -71
  267. package/src/index.ts +4 -0
  268. package/src/setupTests.js +86 -86
  269. package/src/ui_components/ImageLoader.js +62 -62
  270. package/src/ui_components/Legend.js +34 -34
  271. package/src/ui_components/LoadingOverlay.js +29 -29
  272. package/src/ui_components/LoadingOverlayContext.js +68 -68
  273. package/src/ui_components/Sidebar.js +80 -80
  274. package/src/ui_components/Tooltip.js +9 -9
  275. package/src/ui_components/TopToolbar.js +23 -23
  276. package/src/util/layerRemovalTest.js +111 -111
  277. package/src/util/sourceRemovalTest.js +103 -103
@@ -1117,509 +1117,509 @@
1117
1117
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1118
1118
  */
1119
1119
  var toGeoJSON = (function () {
1120
- var removeSpace = /\s*/g,
1121
- trimSpace = /^\s*|\s*$/g,
1122
- splitSpace = /\s+/;
1123
- // generate a short, numeric hash of a string
1124
- function <span class="fstat-no" title="function not covered" >okhash(</span>x) {
1125
- <span class="cstat-no" title="statement not covered" > if (!x || !x.length) <span class="cstat-no" title="statement not covered" >return 0;</span></span>
1126
- <span class="cstat-no" title="statement not covered" > for (var i = <span class="cstat-no" title="statement not covered" >0,</span> h = <span class="cstat-no" title="statement not covered" >0;</span> i &lt; x.length; i++) {</span>
1127
- <span class="cstat-no" title="statement not covered" > h = ((h &lt;&lt; 5) - h + x.charCodeAt(i)) | 0;</span>
1128
- }
1129
- <span class="cstat-no" title="statement not covered" > return h;</span>
1130
- }
1131
- // all Y children of X
1132
- function <span class="fstat-no" title="function not covered" >get(</span>x, y) {
1133
- <span class="cstat-no" title="statement not covered" > return x.getElementsByTagName(y);</span>
1134
- }
1135
- function <span class="fstat-no" title="function not covered" >attr(</span>x, y) {
1136
- <span class="cstat-no" title="statement not covered" > return x.getAttribute(y);</span>
1137
- }
1138
- function <span class="fstat-no" title="function not covered" >attrf(</span>x, y) {
1139
- <span class="cstat-no" title="statement not covered" > return parseFloat(attr(x, y));</span>
1140
- }
1141
- // one Y child of X, if any, otherwise null
1142
- function <span class="fstat-no" title="function not covered" >get1(</span>x, y) {
1143
- var n = <span class="cstat-no" title="statement not covered" >get(x, y);</span>
1144
- <span class="cstat-no" title="statement not covered" > return n.length ? n[0] : null;</span>
1145
- }
1146
- // https://developer.mozilla.org/en-US/docs/Web/API/Node.normalize
1147
- function <span class="fstat-no" title="function not covered" >norm(</span>el) {
1148
- <span class="cstat-no" title="statement not covered" > if (el.normalize) {</span>
1149
- <span class="cstat-no" title="statement not covered" > el.normalize();</span>
1150
- }
1151
- <span class="cstat-no" title="statement not covered" > return el;</span>
1152
- }
1153
- // cast array x into numbers
1154
- function <span class="fstat-no" title="function not covered" >numarray(</span>x) {
1155
- <span class="cstat-no" title="statement not covered" > for (var j = <span class="cstat-no" title="statement not covered" >0,</span> o = <span class="cstat-no" title="statement not covered" >[];</span> j &lt; x.length; j++) {</span>
1156
- <span class="cstat-no" title="statement not covered" > o[j] = parseFloat(x[j]);</span>
1157
- }
1158
- <span class="cstat-no" title="statement not covered" > return o;</span>
1159
- }
1160
- // get the content of a text node, if any
1161
- function <span class="fstat-no" title="function not covered" >nodeVal(</span>x) {
1162
- <span class="cstat-no" title="statement not covered" > if (x) {</span>
1163
- <span class="cstat-no" title="statement not covered" > norm(x);</span>
1164
- }
1165
- <span class="cstat-no" title="statement not covered" > return (x &amp;&amp; x.textContent) || "";</span>
1166
- }
1167
- // get the contents of multiple text nodes, if present
1168
- function <span class="fstat-no" title="function not covered" >getMulti(</span>x, ys) {
1169
- var o = <span class="cstat-no" title="statement not covered" >{},</span>
1170
- n,
1171
- k;
1172
- <span class="cstat-no" title="statement not covered" > for (k = 0; k &lt; ys.length; k++) {</span>
1173
- <span class="cstat-no" title="statement not covered" > n = get1(x, ys[k]);</span>
1174
- <span class="cstat-no" title="statement not covered" > if (n) <span class="cstat-no" title="statement not covered" >o[ys[k]] = nodeVal(n);</span></span>
1175
- }
1176
- <span class="cstat-no" title="statement not covered" > return o;</span>
1177
- }
1178
- // add properties of Y to X, overwriting if present in both
1179
- function <span class="fstat-no" title="function not covered" >extend(</span>x, y) {
1180
- <span class="cstat-no" title="statement not covered" > for (var k in y) <span class="cstat-no" title="statement not covered" >x[k] = y[k];</span></span>
1181
- }
1182
- // get one coordinate from a coordinate array, if any
1183
- function <span class="fstat-no" title="function not covered" >coord1(</span>v) {
1184
- <span class="cstat-no" title="statement not covered" > return numarray(v.replace(removeSpace, "").split(","));</span>
1185
- }
1186
- // get all coordinates from a coordinate array as [[],[]]
1187
- function <span class="fstat-no" title="function not covered" >coord(</span>v) {
1188
- var coords = <span class="cstat-no" title="statement not covered" >v.replace(trimSpace, "").split(splitSpace),</span>
1189
- o = <span class="cstat-no" title="statement not covered" >[];</span>
1190
- <span class="cstat-no" title="statement not covered" > for (var i = <span class="cstat-no" title="statement not covered" >0;</span> i &lt; coords.length; i++) {</span>
1191
- <span class="cstat-no" title="statement not covered" > o.push(coord1(coords[i]));</span>
1192
- }
1193
- <span class="cstat-no" title="statement not covered" > return o;</span>
1194
- }
1195
- function <span class="fstat-no" title="function not covered" >coordPair(</span>x) {
1196
- var ll = <span class="cstat-no" title="statement not covered" >[attrf(x, "lon"), attrf(x, "lat")],</span>
1197
- ele = <span class="cstat-no" title="statement not covered" >get1(x, "ele"),</span>
1198
- // handle namespaced attribute in browser
1199
- heartRate = <span class="cstat-no" title="statement not covered" >get1(x, "gpxtpx:hr") || get1(x, "hr"),</span>
1200
- time = <span class="cstat-no" title="statement not covered" >get1(x, "time"),</span>
1201
- e;
1202
- <span class="cstat-no" title="statement not covered" > if (ele) {</span>
1203
- <span class="cstat-no" title="statement not covered" > e = parseFloat(nodeVal(ele));</span>
1204
- <span class="cstat-no" title="statement not covered" > if (!isNaN(e)) {</span>
1205
- <span class="cstat-no" title="statement not covered" > ll.push(e);</span>
1206
- }
1207
- }
1208
- <span class="cstat-no" title="statement not covered" > return {</span>
1209
- coordinates: ll,
1210
- time: time ? nodeVal(time) : null,
1211
- heartRate: heartRate ? parseFloat(nodeVal(heartRate)) : null,
1212
- };
1213
- }
1120
+ var removeSpace = /\s*/g,
1121
+ trimSpace = /^\s*|\s*$/g,
1122
+ splitSpace = /\s+/;
1123
+ // generate a short, numeric hash of a string
1124
+ function <span class="fstat-no" title="function not covered" >okhash(</span>x) {
1125
+ <span class="cstat-no" title="statement not covered" > if (!x || !x.length) <span class="cstat-no" title="statement not covered" >return 0;</span></span>
1126
+ <span class="cstat-no" title="statement not covered" > for (var i = <span class="cstat-no" title="statement not covered" >0,</span> h = <span class="cstat-no" title="statement not covered" >0;</span> i &lt; x.length; i++) {</span>
1127
+ <span class="cstat-no" title="statement not covered" > h = ((h &lt;&lt; 5) - h + x.charCodeAt(i)) | 0;</span>
1128
+ }
1129
+ <span class="cstat-no" title="statement not covered" > return h;</span>
1130
+ }
1131
+ // all Y children of X
1132
+ function <span class="fstat-no" title="function not covered" >get(</span>x, y) {
1133
+ <span class="cstat-no" title="statement not covered" > return x.getElementsByTagName(y);</span>
1134
+ }
1135
+ function <span class="fstat-no" title="function not covered" >attr(</span>x, y) {
1136
+ <span class="cstat-no" title="statement not covered" > return x.getAttribute(y);</span>
1137
+ }
1138
+ function <span class="fstat-no" title="function not covered" >attrf(</span>x, y) {
1139
+ <span class="cstat-no" title="statement not covered" > return parseFloat(attr(x, y));</span>
1140
+ }
1141
+ // one Y child of X, if any, otherwise null
1142
+ function <span class="fstat-no" title="function not covered" >get1(</span>x, y) {
1143
+ var n = <span class="cstat-no" title="statement not covered" >get(x, y);</span>
1144
+ <span class="cstat-no" title="statement not covered" > return n.length ? n[0] : null;</span>
1145
+ }
1146
+ // https://developer.mozilla.org/en-US/docs/Web/API/Node.normalize
1147
+ function <span class="fstat-no" title="function not covered" >norm(</span>el) {
1148
+ <span class="cstat-no" title="statement not covered" > if (el.normalize) {</span>
1149
+ <span class="cstat-no" title="statement not covered" > el.normalize();</span>
1150
+ }
1151
+ <span class="cstat-no" title="statement not covered" > return el;</span>
1152
+ }
1153
+ // cast array x into numbers
1154
+ function <span class="fstat-no" title="function not covered" >numarray(</span>x) {
1155
+ <span class="cstat-no" title="statement not covered" > for (var j = <span class="cstat-no" title="statement not covered" >0,</span> o = <span class="cstat-no" title="statement not covered" >[];</span> j &lt; x.length; j++) {</span>
1156
+ <span class="cstat-no" title="statement not covered" > o[j] = parseFloat(x[j]);</span>
1157
+ }
1158
+ <span class="cstat-no" title="statement not covered" > return o;</span>
1159
+ }
1160
+ // get the content of a text node, if any
1161
+ function <span class="fstat-no" title="function not covered" >nodeVal(</span>x) {
1162
+ <span class="cstat-no" title="statement not covered" > if (x) {</span>
1163
+ <span class="cstat-no" title="statement not covered" > norm(x);</span>
1164
+ }
1165
+ <span class="cstat-no" title="statement not covered" > return (x &amp;&amp; x.textContent) || "";</span>
1166
+ }
1167
+ // get the contents of multiple text nodes, if present
1168
+ function <span class="fstat-no" title="function not covered" >getMulti(</span>x, ys) {
1169
+ var o = <span class="cstat-no" title="statement not covered" >{},</span>
1170
+ n,
1171
+ k;
1172
+ <span class="cstat-no" title="statement not covered" > for (k = 0; k &lt; ys.length; k++) {</span>
1173
+ <span class="cstat-no" title="statement not covered" > n = get1(x, ys[k]);</span>
1174
+ <span class="cstat-no" title="statement not covered" > if (n) <span class="cstat-no" title="statement not covered" >o[ys[k]] = nodeVal(n);</span></span>
1175
+ }
1176
+ <span class="cstat-no" title="statement not covered" > return o;</span>
1177
+ }
1178
+ // add properties of Y to X, overwriting if present in both
1179
+ function <span class="fstat-no" title="function not covered" >extend(</span>x, y) {
1180
+ <span class="cstat-no" title="statement not covered" > for (var k in y) <span class="cstat-no" title="statement not covered" >x[k] = y[k];</span></span>
1181
+ }
1182
+ // get one coordinate from a coordinate array, if any
1183
+ function <span class="fstat-no" title="function not covered" >coord1(</span>v) {
1184
+ <span class="cstat-no" title="statement not covered" > return numarray(v.replace(removeSpace, "").split(","));</span>
1185
+ }
1186
+ // get all coordinates from a coordinate array as [[],[]]
1187
+ function <span class="fstat-no" title="function not covered" >coord(</span>v) {
1188
+ var coords = <span class="cstat-no" title="statement not covered" >v.replace(trimSpace, "").split(splitSpace),</span>
1189
+ o = <span class="cstat-no" title="statement not covered" >[];</span>
1190
+ <span class="cstat-no" title="statement not covered" > for (var i = <span class="cstat-no" title="statement not covered" >0;</span> i &lt; coords.length; i++) {</span>
1191
+ <span class="cstat-no" title="statement not covered" > o.push(coord1(coords[i]));</span>
1192
+ }
1193
+ <span class="cstat-no" title="statement not covered" > return o;</span>
1194
+ }
1195
+ function <span class="fstat-no" title="function not covered" >coordPair(</span>x) {
1196
+ var ll = <span class="cstat-no" title="statement not covered" >[attrf(x, "lon"), attrf(x, "lat")],</span>
1197
+ ele = <span class="cstat-no" title="statement not covered" >get1(x, "ele"),</span>
1198
+ // handle namespaced attribute in browser
1199
+ heartRate = <span class="cstat-no" title="statement not covered" >get1(x, "gpxtpx:hr") || get1(x, "hr"),</span>
1200
+ time = <span class="cstat-no" title="statement not covered" >get1(x, "time"),</span>
1201
+ e;
1202
+ <span class="cstat-no" title="statement not covered" > if (ele) {</span>
1203
+ <span class="cstat-no" title="statement not covered" > e = parseFloat(nodeVal(ele));</span>
1204
+ <span class="cstat-no" title="statement not covered" > if (!isNaN(e)) {</span>
1205
+ <span class="cstat-no" title="statement not covered" > ll.push(e);</span>
1206
+ }
1207
+ }
1208
+ <span class="cstat-no" title="statement not covered" > return {</span>
1209
+ coordinates: ll,
1210
+ time: time ? nodeVal(time) : null,
1211
+ heartRate: heartRate ? parseFloat(nodeVal(heartRate)) : null,
1212
+ };
1213
+ }
1214
1214
  &nbsp;
1215
- // create a new feature collection parent object
1216
- function <span class="fstat-no" title="function not covered" >fc(</span>) {
1217
- <span class="cstat-no" title="statement not covered" > return {</span>
1218
- type: "FeatureCollection",
1219
- features: [],
1220
- };
1221
- }
1215
+ // create a new feature collection parent object
1216
+ function <span class="fstat-no" title="function not covered" >fc(</span>) {
1217
+ <span class="cstat-no" title="statement not covered" > return {</span>
1218
+ type: "FeatureCollection",
1219
+ features: [],
1220
+ };
1221
+ }
1222
1222
  &nbsp;
1223
- var serializer;
1224
- if (typeof XMLSerializer !== "undefined") {
1225
- /* istanbul ignore next */
1226
- serializer = new XMLSerializer();
1227
- } else <span class="missing-if-branch" title="else path not taken" >E</span>{
1228
- var isNodeEnv = <span class="cstat-no" title="statement not covered" >typeof process === "object" &amp;&amp; !process.browser;</span>
1229
- var isTitaniumEnv = <span class="cstat-no" title="statement not covered" >typeof Titanium === "object";</span>
1230
- <span class="cstat-no" title="statement not covered" > if (typeof exports === "object" &amp;&amp; (isNodeEnv || isTitaniumEnv)) {</span>
1231
- <span class="cstat-no" title="statement not covered" > serializer = new (require("xmldom").XMLSerializer)();</span>
1232
- } else {
1233
- <span class="cstat-no" title="statement not covered" > throw new Error("Unable to initialize serializer");</span>
1234
- }
1235
- }
1236
- function <span class="fstat-no" title="function not covered" >xml2str(</span>str) {
1237
- // IE9 will create a new XMLSerializer but it'll crash immediately.
1238
- // This line is ignored because we don't run coverage tests in IE9
1239
- /* istanbul ignore next */
1240
- if (str.xml !== undefined) return str.xml;
1241
- <span class="cstat-no" title="statement not covered" > return serializer.serializeToString(str);</span>
1242
- }
1223
+ var serializer;
1224
+ if (typeof XMLSerializer !== "undefined") {
1225
+ /* istanbul ignore next */
1226
+ serializer = new XMLSerializer();
1227
+ } else <span class="missing-if-branch" title="else path not taken" >E</span>{
1228
+ var isNodeEnv = <span class="cstat-no" title="statement not covered" >typeof process === "object" &amp;&amp; !process.browser;</span>
1229
+ var isTitaniumEnv = <span class="cstat-no" title="statement not covered" >typeof Titanium === "object";</span>
1230
+ <span class="cstat-no" title="statement not covered" > if (typeof exports === "object" &amp;&amp; (isNodeEnv || isTitaniumEnv)) {</span>
1231
+ <span class="cstat-no" title="statement not covered" > serializer = new (require("xmldom").XMLSerializer)();</span>
1232
+ } else {
1233
+ <span class="cstat-no" title="statement not covered" > throw new Error("Unable to initialize serializer");</span>
1234
+ }
1235
+ }
1236
+ function <span class="fstat-no" title="function not covered" >xml2str(</span>str) {
1237
+ // IE9 will create a new XMLSerializer but it'll crash immediately.
1238
+ // This line is ignored because we don't run coverage tests in IE9
1239
+ /* istanbul ignore next */
1240
+ if (str.xml !== undefined) return str.xml;
1241
+ <span class="cstat-no" title="statement not covered" > return serializer.serializeToString(str);</span>
1242
+ }
1243
1243
  &nbsp;
1244
- var t = {
1245
- kml: <span class="fstat-no" title="function not covered" >fu</span>nction (doc) {
1246
- var gj = <span class="cstat-no" title="statement not covered" >fc(),</span>
1247
- // styleindex keeps track of hashed styles in order to match features
1248
- styleIndex = <span class="cstat-no" title="statement not covered" >{},</span>
1249
- styleByHash = <span class="cstat-no" title="statement not covered" >{},</span>
1250
- // stylemapindex keeps track of style maps to expose in properties
1251
- styleMapIndex = <span class="cstat-no" title="statement not covered" >{},</span>
1252
- // atomic geospatial types supported by KML - MultiGeometry is
1253
- // handled separately
1254
- geotypes = <span class="cstat-no" title="statement not covered" >["Polygon", "LineString", "Point", "Track", "gx:Track"],</span>
1255
- // all root placemarks in the file
1256
- placemarks = <span class="cstat-no" title="statement not covered" >get(doc, "Placemark"),</span>
1257
- styles = <span class="cstat-no" title="statement not covered" >get(doc, "Style"),</span>
1258
- styleMaps = <span class="cstat-no" title="statement not covered" >get(doc, "StyleMap");</span>
1244
+ var t = {
1245
+ kml: <span class="fstat-no" title="function not covered" >fu</span>nction (doc) {
1246
+ var gj = <span class="cstat-no" title="statement not covered" >fc(),</span>
1247
+ // styleindex keeps track of hashed styles in order to match features
1248
+ styleIndex = <span class="cstat-no" title="statement not covered" >{},</span>
1249
+ styleByHash = <span class="cstat-no" title="statement not covered" >{},</span>
1250
+ // stylemapindex keeps track of style maps to expose in properties
1251
+ styleMapIndex = <span class="cstat-no" title="statement not covered" >{},</span>
1252
+ // atomic geospatial types supported by KML - MultiGeometry is
1253
+ // handled separately
1254
+ geotypes = <span class="cstat-no" title="statement not covered" >["Polygon", "LineString", "Point", "Track", "gx:Track"],</span>
1255
+ // all root placemarks in the file
1256
+ placemarks = <span class="cstat-no" title="statement not covered" >get(doc, "Placemark"),</span>
1257
+ styles = <span class="cstat-no" title="statement not covered" >get(doc, "Style"),</span>
1258
+ styleMaps = <span class="cstat-no" title="statement not covered" >get(doc, "StyleMap");</span>
1259
1259
  &nbsp;
1260
- <span class="cstat-no" title="statement not covered" > for (var k = <span class="cstat-no" title="statement not covered" >0;</span> k &lt; styles.length; k++) {</span>
1261
- var hash = <span class="cstat-no" title="statement not covered" >okhash(xml2str(styles[k])).toString(16);</span>
1262
- <span class="cstat-no" title="statement not covered" > styleIndex["#" + attr(styles[k], "id")] = hash;</span>
1263
- <span class="cstat-no" title="statement not covered" > styleByHash[hash] = styles[k];</span>
1264
- }
1265
- <span class="cstat-no" title="statement not covered" > for (var l = <span class="cstat-no" title="statement not covered" >0;</span> l &lt; styleMaps.length; l++) {</span>
1266
- <span class="cstat-no" title="statement not covered" > styleIndex["#" + attr(styleMaps[l], "id")] = okhash(xml2str(styleMaps[l])).toString(16);</span>
1267
- var pairs = <span class="cstat-no" title="statement not covered" >get(styleMaps[l], "Pair");</span>
1268
- var pairsMap = <span class="cstat-no" title="statement not covered" >{};</span>
1269
- <span class="cstat-no" title="statement not covered" > for (var m = <span class="cstat-no" title="statement not covered" >0;</span> m &lt; pairs.length; m++) {</span>
1270
- <span class="cstat-no" title="statement not covered" > pairsMap[nodeVal(get1(pairs[m], "key"))] = nodeVal(get1(pairs[m], "styleUrl"));</span>
1271
- }
1272
- <span class="cstat-no" title="statement not covered" > styleMapIndex["#" + attr(styleMaps[l], "id")] = pairsMap;</span>
1273
- }
1274
- <span class="cstat-no" title="statement not covered" > for (var j = <span class="cstat-no" title="statement not covered" >0;</span> j &lt; placemarks.length; j++) {</span>
1275
- <span class="cstat-no" title="statement not covered" > gj.features = gj.features.concat(getPlacemark(placemarks[j]));</span>
1276
- }
1277
- function <span class="fstat-no" title="function not covered" >kmlColor(</span>v) {
1278
- var color, opacity;
1279
- <span class="cstat-no" title="statement not covered" > v = v || "";</span>
1280
- <span class="cstat-no" title="statement not covered" > if (v.substr(0, 1) === "#") {</span>
1281
- <span class="cstat-no" title="statement not covered" > v = v.substr(1);</span>
1282
- }
1283
- <span class="cstat-no" title="statement not covered" > if (v.length === 6 || v.length === 3) {</span>
1284
- <span class="cstat-no" title="statement not covered" > color = v;</span>
1285
- }
1286
- <span class="cstat-no" title="statement not covered" > if (v.length === 8) {</span>
1287
- <span class="cstat-no" title="statement not covered" > opacity = parseInt(v.substr(0, 2), 16) / 255;</span>
1288
- <span class="cstat-no" title="statement not covered" > color = "#" + v.substr(6, 2) + v.substr(4, 2) + v.substr(2, 2);</span>
1289
- }
1290
- <span class="cstat-no" title="statement not covered" > return [color, isNaN(opacity) ? undefined : opacity];</span>
1291
- }
1292
- function <span class="fstat-no" title="function not covered" >gxCoord(</span>v) {
1293
- <span class="cstat-no" title="statement not covered" > return numarray(v.split(" "));</span>
1294
- }
1295
- function <span class="fstat-no" title="function not covered" >gxCoords(</span>root) {
1296
- var elems = <span class="cstat-no" title="statement not covered" >get(root, "coord", "gx"),</span>
1297
- coords = <span class="cstat-no" title="statement not covered" >[],</span>
1298
- times = <span class="cstat-no" title="statement not covered" >[];</span>
1299
- <span class="cstat-no" title="statement not covered" > if (elems.length === 0) <span class="cstat-no" title="statement not covered" >elems = get(root, "gx:coord");</span></span>
1300
- <span class="cstat-no" title="statement not covered" > for (var i = <span class="cstat-no" title="statement not covered" >0;</span> i &lt; elems.length; i++) <span class="cstat-no" title="statement not covered" >coords.push(gxCoord(nodeVal(elems[i])));</span></span>
1301
- var timeElems = <span class="cstat-no" title="statement not covered" >get(root, "when");</span>
1302
- <span class="cstat-no" title="statement not covered" > for (var j = <span class="cstat-no" title="statement not covered" >0;</span> j &lt; timeElems.length; j++) <span class="cstat-no" title="statement not covered" >times.push(nodeVal(timeElems[j]));</span></span>
1303
- <span class="cstat-no" title="statement not covered" > return {</span>
1304
- coords: coords,
1305
- times: times,
1306
- };
1307
- }
1308
- function <span class="fstat-no" title="function not covered" >getGeometry(</span>root) {
1309
- var geomNode,
1310
- geomNodes,
1311
- i,
1312
- j,
1313
- k,
1314
- geoms = <span class="cstat-no" title="statement not covered" >[],</span>
1315
- coordTimes = <span class="cstat-no" title="statement not covered" >[];</span>
1316
- <span class="cstat-no" title="statement not covered" > if (get1(root, "MultiGeometry")) {</span>
1317
- <span class="cstat-no" title="statement not covered" > return getGeometry(get1(root, "MultiGeometry"));</span>
1318
- }
1319
- <span class="cstat-no" title="statement not covered" > if (get1(root, "MultiTrack")) {</span>
1320
- <span class="cstat-no" title="statement not covered" > return getGeometry(get1(root, "MultiTrack"));</span>
1321
- }
1322
- <span class="cstat-no" title="statement not covered" > if (get1(root, "gx:MultiTrack")) {</span>
1323
- <span class="cstat-no" title="statement not covered" > return getGeometry(get1(root, "gx:MultiTrack"));</span>
1324
- }
1325
- <span class="cstat-no" title="statement not covered" > for (i = 0; i &lt; geotypes.length; i++) {</span>
1326
- <span class="cstat-no" title="statement not covered" > geomNodes = get(root, geotypes[i]);</span>
1327
- <span class="cstat-no" title="statement not covered" > if (geomNodes) {</span>
1328
- <span class="cstat-no" title="statement not covered" > for (j = 0; j &lt; geomNodes.length; j++) {</span>
1329
- <span class="cstat-no" title="statement not covered" > geomNode = geomNodes[j];</span>
1330
- <span class="cstat-no" title="statement not covered" > if (geotypes[i] === "Point") {</span>
1331
- <span class="cstat-no" title="statement not covered" > geoms.push({</span>
1332
- type: "Point",
1333
- coordinates: coord1(nodeVal(get1(geomNode, "coordinates"))),
1334
- });
1335
- } else <span class="cstat-no" title="statement not covered" >if (geotypes[i] === "LineString") {</span>
1336
- <span class="cstat-no" title="statement not covered" > geoms.push({</span>
1337
- type: "LineString",
1338
- coordinates: coord(nodeVal(get1(geomNode, "coordinates"))),
1339
- });
1340
- } else <span class="cstat-no" title="statement not covered" >if (geotypes[i] === "Polygon") {</span>
1341
- var rings = <span class="cstat-no" title="statement not covered" >get(geomNode, "LinearRing"),</span>
1342
- coords = <span class="cstat-no" title="statement not covered" >[];</span>
1343
- <span class="cstat-no" title="statement not covered" > for (k = 0; k &lt; rings.length; k++) {</span>
1344
- <span class="cstat-no" title="statement not covered" > coords.push(coord(nodeVal(get1(rings[k], "coordinates"))));</span>
1345
- }
1346
- <span class="cstat-no" title="statement not covered" > geoms.push({</span>
1347
- type: "Polygon",
1348
- coordinates: coords,
1349
- });
1350
- } else <span class="cstat-no" title="statement not covered" >if (geotypes[i] === "Track" || geotypes[i] === "gx:Track") {</span>
1351
- var track = <span class="cstat-no" title="statement not covered" >gxCoords(geomNode);</span>
1352
- <span class="cstat-no" title="statement not covered" > geoms.push({</span>
1353
- type: "LineString",
1354
- coordinates: track.coords,
1355
- });
1356
- <span class="cstat-no" title="statement not covered" > if (track.times.length) <span class="cstat-no" title="statement not covered" >coordTimes.push(track.times);</span></span>
1357
- }
1358
- }
1359
- }
1360
- }
1361
- <span class="cstat-no" title="statement not covered" > return {</span>
1362
- geoms: geoms,
1363
- coordTimes: coordTimes,
1364
- };
1365
- }
1366
- function <span class="fstat-no" title="function not covered" >getPlacemark(</span>root) {
1367
- var geomsAndTimes = <span class="cstat-no" title="statement not covered" >getGeometry(root),</span>
1368
- i,
1369
- properties = <span class="cstat-no" title="statement not covered" >{},</span>
1370
- name = <span class="cstat-no" title="statement not covered" >nodeVal(get1(root, "name")),</span>
1371
- address = <span class="cstat-no" title="statement not covered" >nodeVal(get1(root, "address")),</span>
1372
- styleUrl = <span class="cstat-no" title="statement not covered" >nodeVal(get1(root, "styleUrl")),</span>
1373
- description = <span class="cstat-no" title="statement not covered" >nodeVal(get1(root, "description")),</span>
1374
- timeSpan = <span class="cstat-no" title="statement not covered" >get1(root, "TimeSpan"),</span>
1375
- timeStamp = <span class="cstat-no" title="statement not covered" >get1(root, "TimeStamp"),</span>
1376
- extendedData = <span class="cstat-no" title="statement not covered" >get1(root, "ExtendedData"),</span>
1377
- lineStyle = <span class="cstat-no" title="statement not covered" >get1(root, "LineStyle"),</span>
1378
- polyStyle = <span class="cstat-no" title="statement not covered" >get1(root, "PolyStyle"),</span>
1379
- visibility = <span class="cstat-no" title="statement not covered" >get1(root, "visibility");</span>
1260
+ <span class="cstat-no" title="statement not covered" > for (var k = <span class="cstat-no" title="statement not covered" >0;</span> k &lt; styles.length; k++) {</span>
1261
+ var hash = <span class="cstat-no" title="statement not covered" >okhash(xml2str(styles[k])).toString(16);</span>
1262
+ <span class="cstat-no" title="statement not covered" > styleIndex["#" + attr(styles[k], "id")] = hash;</span>
1263
+ <span class="cstat-no" title="statement not covered" > styleByHash[hash] = styles[k];</span>
1264
+ }
1265
+ <span class="cstat-no" title="statement not covered" > for (var l = <span class="cstat-no" title="statement not covered" >0;</span> l &lt; styleMaps.length; l++) {</span>
1266
+ <span class="cstat-no" title="statement not covered" > styleIndex["#" + attr(styleMaps[l], "id")] = okhash(xml2str(styleMaps[l])).toString(16);</span>
1267
+ var pairs = <span class="cstat-no" title="statement not covered" >get(styleMaps[l], "Pair");</span>
1268
+ var pairsMap = <span class="cstat-no" title="statement not covered" >{};</span>
1269
+ <span class="cstat-no" title="statement not covered" > for (var m = <span class="cstat-no" title="statement not covered" >0;</span> m &lt; pairs.length; m++) {</span>
1270
+ <span class="cstat-no" title="statement not covered" > pairsMap[nodeVal(get1(pairs[m], "key"))] = nodeVal(get1(pairs[m], "styleUrl"));</span>
1271
+ }
1272
+ <span class="cstat-no" title="statement not covered" > styleMapIndex["#" + attr(styleMaps[l], "id")] = pairsMap;</span>
1273
+ }
1274
+ <span class="cstat-no" title="statement not covered" > for (var j = <span class="cstat-no" title="statement not covered" >0;</span> j &lt; placemarks.length; j++) {</span>
1275
+ <span class="cstat-no" title="statement not covered" > gj.features = gj.features.concat(getPlacemark(placemarks[j]));</span>
1276
+ }
1277
+ function <span class="fstat-no" title="function not covered" >kmlColor(</span>v) {
1278
+ var color, opacity;
1279
+ <span class="cstat-no" title="statement not covered" > v = v || "";</span>
1280
+ <span class="cstat-no" title="statement not covered" > if (v.substr(0, 1) === "#") {</span>
1281
+ <span class="cstat-no" title="statement not covered" > v = v.substr(1);</span>
1282
+ }
1283
+ <span class="cstat-no" title="statement not covered" > if (v.length === 6 || v.length === 3) {</span>
1284
+ <span class="cstat-no" title="statement not covered" > color = v;</span>
1285
+ }
1286
+ <span class="cstat-no" title="statement not covered" > if (v.length === 8) {</span>
1287
+ <span class="cstat-no" title="statement not covered" > opacity = parseInt(v.substr(0, 2), 16) / 255;</span>
1288
+ <span class="cstat-no" title="statement not covered" > color = "#" + v.substr(6, 2) + v.substr(4, 2) + v.substr(2, 2);</span>
1289
+ }
1290
+ <span class="cstat-no" title="statement not covered" > return [color, isNaN(opacity) ? undefined : opacity];</span>
1291
+ }
1292
+ function <span class="fstat-no" title="function not covered" >gxCoord(</span>v) {
1293
+ <span class="cstat-no" title="statement not covered" > return numarray(v.split(" "));</span>
1294
+ }
1295
+ function <span class="fstat-no" title="function not covered" >gxCoords(</span>root) {
1296
+ var elems = <span class="cstat-no" title="statement not covered" >get(root, "coord", "gx"),</span>
1297
+ coords = <span class="cstat-no" title="statement not covered" >[],</span>
1298
+ times = <span class="cstat-no" title="statement not covered" >[];</span>
1299
+ <span class="cstat-no" title="statement not covered" > if (elems.length === 0) <span class="cstat-no" title="statement not covered" >elems = get(root, "gx:coord");</span></span>
1300
+ <span class="cstat-no" title="statement not covered" > for (var i = <span class="cstat-no" title="statement not covered" >0;</span> i &lt; elems.length; i++) <span class="cstat-no" title="statement not covered" >coords.push(gxCoord(nodeVal(elems[i])));</span></span>
1301
+ var timeElems = <span class="cstat-no" title="statement not covered" >get(root, "when");</span>
1302
+ <span class="cstat-no" title="statement not covered" > for (var j = <span class="cstat-no" title="statement not covered" >0;</span> j &lt; timeElems.length; j++) <span class="cstat-no" title="statement not covered" >times.push(nodeVal(timeElems[j]));</span></span>
1303
+ <span class="cstat-no" title="statement not covered" > return {</span>
1304
+ coords: coords,
1305
+ times: times,
1306
+ };
1307
+ }
1308
+ function <span class="fstat-no" title="function not covered" >getGeometry(</span>root) {
1309
+ var geomNode,
1310
+ geomNodes,
1311
+ i,
1312
+ j,
1313
+ k,
1314
+ geoms = <span class="cstat-no" title="statement not covered" >[],</span>
1315
+ coordTimes = <span class="cstat-no" title="statement not covered" >[];</span>
1316
+ <span class="cstat-no" title="statement not covered" > if (get1(root, "MultiGeometry")) {</span>
1317
+ <span class="cstat-no" title="statement not covered" > return getGeometry(get1(root, "MultiGeometry"));</span>
1318
+ }
1319
+ <span class="cstat-no" title="statement not covered" > if (get1(root, "MultiTrack")) {</span>
1320
+ <span class="cstat-no" title="statement not covered" > return getGeometry(get1(root, "MultiTrack"));</span>
1321
+ }
1322
+ <span class="cstat-no" title="statement not covered" > if (get1(root, "gx:MultiTrack")) {</span>
1323
+ <span class="cstat-no" title="statement not covered" > return getGeometry(get1(root, "gx:MultiTrack"));</span>
1324
+ }
1325
+ <span class="cstat-no" title="statement not covered" > for (i = 0; i &lt; geotypes.length; i++) {</span>
1326
+ <span class="cstat-no" title="statement not covered" > geomNodes = get(root, geotypes[i]);</span>
1327
+ <span class="cstat-no" title="statement not covered" > if (geomNodes) {</span>
1328
+ <span class="cstat-no" title="statement not covered" > for (j = 0; j &lt; geomNodes.length; j++) {</span>
1329
+ <span class="cstat-no" title="statement not covered" > geomNode = geomNodes[j];</span>
1330
+ <span class="cstat-no" title="statement not covered" > if (geotypes[i] === "Point") {</span>
1331
+ <span class="cstat-no" title="statement not covered" > geoms.push({</span>
1332
+ type: "Point",
1333
+ coordinates: coord1(nodeVal(get1(geomNode, "coordinates"))),
1334
+ });
1335
+ } else <span class="cstat-no" title="statement not covered" >if (geotypes[i] === "LineString") {</span>
1336
+ <span class="cstat-no" title="statement not covered" > geoms.push({</span>
1337
+ type: "LineString",
1338
+ coordinates: coord(nodeVal(get1(geomNode, "coordinates"))),
1339
+ });
1340
+ } else <span class="cstat-no" title="statement not covered" >if (geotypes[i] === "Polygon") {</span>
1341
+ var rings = <span class="cstat-no" title="statement not covered" >get(geomNode, "LinearRing"),</span>
1342
+ coords = <span class="cstat-no" title="statement not covered" >[];</span>
1343
+ <span class="cstat-no" title="statement not covered" > for (k = 0; k &lt; rings.length; k++) {</span>
1344
+ <span class="cstat-no" title="statement not covered" > coords.push(coord(nodeVal(get1(rings[k], "coordinates"))));</span>
1345
+ }
1346
+ <span class="cstat-no" title="statement not covered" > geoms.push({</span>
1347
+ type: "Polygon",
1348
+ coordinates: coords,
1349
+ });
1350
+ } else <span class="cstat-no" title="statement not covered" >if (geotypes[i] === "Track" || geotypes[i] === "gx:Track") {</span>
1351
+ var track = <span class="cstat-no" title="statement not covered" >gxCoords(geomNode);</span>
1352
+ <span class="cstat-no" title="statement not covered" > geoms.push({</span>
1353
+ type: "LineString",
1354
+ coordinates: track.coords,
1355
+ });
1356
+ <span class="cstat-no" title="statement not covered" > if (track.times.length) <span class="cstat-no" title="statement not covered" >coordTimes.push(track.times);</span></span>
1357
+ }
1358
+ }
1359
+ }
1360
+ }
1361
+ <span class="cstat-no" title="statement not covered" > return {</span>
1362
+ geoms: geoms,
1363
+ coordTimes: coordTimes,
1364
+ };
1365
+ }
1366
+ function <span class="fstat-no" title="function not covered" >getPlacemark(</span>root) {
1367
+ var geomsAndTimes = <span class="cstat-no" title="statement not covered" >getGeometry(root),</span>
1368
+ i,
1369
+ properties = <span class="cstat-no" title="statement not covered" >{},</span>
1370
+ name = <span class="cstat-no" title="statement not covered" >nodeVal(get1(root, "name")),</span>
1371
+ address = <span class="cstat-no" title="statement not covered" >nodeVal(get1(root, "address")),</span>
1372
+ styleUrl = <span class="cstat-no" title="statement not covered" >nodeVal(get1(root, "styleUrl")),</span>
1373
+ description = <span class="cstat-no" title="statement not covered" >nodeVal(get1(root, "description")),</span>
1374
+ timeSpan = <span class="cstat-no" title="statement not covered" >get1(root, "TimeSpan"),</span>
1375
+ timeStamp = <span class="cstat-no" title="statement not covered" >get1(root, "TimeStamp"),</span>
1376
+ extendedData = <span class="cstat-no" title="statement not covered" >get1(root, "ExtendedData"),</span>
1377
+ lineStyle = <span class="cstat-no" title="statement not covered" >get1(root, "LineStyle"),</span>
1378
+ polyStyle = <span class="cstat-no" title="statement not covered" >get1(root, "PolyStyle"),</span>
1379
+ visibility = <span class="cstat-no" title="statement not covered" >get1(root, "visibility");</span>
1380
1380
  &nbsp;
1381
- <span class="cstat-no" title="statement not covered" > if (!geomsAndTimes.geoms.length) <span class="cstat-no" title="statement not covered" >return [];</span></span>
1382
- <span class="cstat-no" title="statement not covered" > if (name) <span class="cstat-no" title="statement not covered" >properties.name = name;</span></span>
1383
- <span class="cstat-no" title="statement not covered" > if (address) <span class="cstat-no" title="statement not covered" >properties.address = address;</span></span>
1384
- <span class="cstat-no" title="statement not covered" > if (styleUrl) {</span>
1385
- <span class="cstat-no" title="statement not covered" > if (styleUrl[0] !== "#") {</span>
1386
- <span class="cstat-no" title="statement not covered" > styleUrl = "#" + styleUrl;</span>
1387
- }
1381
+ <span class="cstat-no" title="statement not covered" > if (!geomsAndTimes.geoms.length) <span class="cstat-no" title="statement not covered" >return [];</span></span>
1382
+ <span class="cstat-no" title="statement not covered" > if (name) <span class="cstat-no" title="statement not covered" >properties.name = name;</span></span>
1383
+ <span class="cstat-no" title="statement not covered" > if (address) <span class="cstat-no" title="statement not covered" >properties.address = address;</span></span>
1384
+ <span class="cstat-no" title="statement not covered" > if (styleUrl) {</span>
1385
+ <span class="cstat-no" title="statement not covered" > if (styleUrl[0] !== "#") {</span>
1386
+ <span class="cstat-no" title="statement not covered" > styleUrl = "#" + styleUrl;</span>
1387
+ }
1388
1388
  &nbsp;
1389
- <span class="cstat-no" title="statement not covered" > properties.styleUrl = styleUrl;</span>
1390
- <span class="cstat-no" title="statement not covered" > if (styleIndex[styleUrl]) {</span>
1391
- <span class="cstat-no" title="statement not covered" > properties.styleHash = styleIndex[styleUrl];</span>
1392
- }
1393
- <span class="cstat-no" title="statement not covered" > if (styleMapIndex[styleUrl]) {</span>
1394
- <span class="cstat-no" title="statement not covered" > properties.styleMapHash = styleMapIndex[styleUrl];</span>
1395
- <span class="cstat-no" title="statement not covered" > properties.styleHash = styleIndex[styleMapIndex[styleUrl].normal];</span>
1396
- }
1397
- // Try to populate the lineStyle or polyStyle since we got the style hash
1398
- var style = <span class="cstat-no" title="statement not covered" >styleByHash[properties.styleHash];</span>
1399
- <span class="cstat-no" title="statement not covered" > if (style) {</span>
1400
- <span class="cstat-no" title="statement not covered" > if (!lineStyle) <span class="cstat-no" title="statement not covered" >lineStyle = get1(style, "LineStyle");</span></span>
1401
- <span class="cstat-no" title="statement not covered" > if (!polyStyle) <span class="cstat-no" title="statement not covered" >polyStyle = get1(style, "PolyStyle");</span></span>
1402
- var iconStyle = <span class="cstat-no" title="statement not covered" >get1(style, "IconStyle");</span>
1403
- <span class="cstat-no" title="statement not covered" > if (iconStyle) {</span>
1404
- var icon = <span class="cstat-no" title="statement not covered" >get1(iconStyle, "Icon");</span>
1405
- <span class="cstat-no" title="statement not covered" > if (icon) {</span>
1406
- var href = <span class="cstat-no" title="statement not covered" >nodeVal(get1(icon, "href"));</span>
1407
- <span class="cstat-no" title="statement not covered" > if (href) <span class="cstat-no" title="statement not covered" >properties.icon = href;</span></span>
1408
- }
1409
- }
1410
- }
1411
- }
1412
- <span class="cstat-no" title="statement not covered" > if (description) <span class="cstat-no" title="statement not covered" >properties.description = description;</span></span>
1413
- <span class="cstat-no" title="statement not covered" > if (timeSpan) {</span>
1414
- var begin = <span class="cstat-no" title="statement not covered" >nodeVal(get1(timeSpan, "begin"));</span>
1415
- var end = <span class="cstat-no" title="statement not covered" >nodeVal(get1(timeSpan, "end"));</span>
1416
- <span class="cstat-no" title="statement not covered" > properties.timespan = { begin: begin, end: end };</span>
1417
- }
1418
- <span class="cstat-no" title="statement not covered" > if (timeStamp) {</span>
1419
- <span class="cstat-no" title="statement not covered" > properties.timestamp = nodeVal(get1(timeStamp, "when"));</span>
1420
- }
1421
- <span class="cstat-no" title="statement not covered" > if (lineStyle) {</span>
1422
- var linestyles = <span class="cstat-no" title="statement not covered" >kmlColor(nodeVal(get1(lineStyle, "color"))),</span>
1423
- color = <span class="cstat-no" title="statement not covered" >linestyles[0],</span>
1424
- opacity = <span class="cstat-no" title="statement not covered" >linestyles[1],</span>
1425
- width = <span class="cstat-no" title="statement not covered" >parseFloat(nodeVal(get1(lineStyle, "width")));</span>
1426
- <span class="cstat-no" title="statement not covered" > if (color) <span class="cstat-no" title="statement not covered" >properties.stroke = color;</span></span>
1427
- <span class="cstat-no" title="statement not covered" > if (!isNaN(opacity)) <span class="cstat-no" title="statement not covered" >properties["stroke-opacity"] = opacity;</span></span>
1428
- <span class="cstat-no" title="statement not covered" > if (!isNaN(width)) <span class="cstat-no" title="statement not covered" >properties["stroke-width"] = width;</span></span>
1429
- }
1430
- <span class="cstat-no" title="statement not covered" > if (polyStyle) {</span>
1431
- var polystyles = <span class="cstat-no" title="statement not covered" >kmlColor(nodeVal(get1(polyStyle, "color"))),</span>
1432
- pcolor = <span class="cstat-no" title="statement not covered" >polystyles[0],</span>
1433
- popacity = <span class="cstat-no" title="statement not covered" >polystyles[1],</span>
1434
- fill = <span class="cstat-no" title="statement not covered" >nodeVal(get1(polyStyle, "fill")),</span>
1435
- outline = <span class="cstat-no" title="statement not covered" >nodeVal(get1(polyStyle, "outline"));</span>
1436
- <span class="cstat-no" title="statement not covered" > if (pcolor) <span class="cstat-no" title="statement not covered" >properties.fill = pcolor;</span></span>
1437
- <span class="cstat-no" title="statement not covered" > if (!isNaN(popacity)) <span class="cstat-no" title="statement not covered" >properties["fill-opacity"] = popacity;</span></span>
1438
- <span class="cstat-no" title="statement not covered" > if (fill) <span class="cstat-no" title="statement not covered" >properties["fill-opacity"] = fill === "1" ? properties["fill-opacity"] || 1 : 0;</span></span>
1439
- <span class="cstat-no" title="statement not covered" > if (outline)</span>
1440
- <span class="cstat-no" title="statement not covered" > properties["stroke-opacity"] = outline === "1" ? properties["stroke-opacity"] || 1 : 0;</span>
1441
- }
1442
- <span class="cstat-no" title="statement not covered" > if (extendedData) {</span>
1443
- var datas = <span class="cstat-no" title="statement not covered" >get(extendedData, "Data"),</span>
1444
- simpleDatas = <span class="cstat-no" title="statement not covered" >get(extendedData, "SimpleData");</span>
1389
+ <span class="cstat-no" title="statement not covered" > properties.styleUrl = styleUrl;</span>
1390
+ <span class="cstat-no" title="statement not covered" > if (styleIndex[styleUrl]) {</span>
1391
+ <span class="cstat-no" title="statement not covered" > properties.styleHash = styleIndex[styleUrl];</span>
1392
+ }
1393
+ <span class="cstat-no" title="statement not covered" > if (styleMapIndex[styleUrl]) {</span>
1394
+ <span class="cstat-no" title="statement not covered" > properties.styleMapHash = styleMapIndex[styleUrl];</span>
1395
+ <span class="cstat-no" title="statement not covered" > properties.styleHash = styleIndex[styleMapIndex[styleUrl].normal];</span>
1396
+ }
1397
+ // Try to populate the lineStyle or polyStyle since we got the style hash
1398
+ var style = <span class="cstat-no" title="statement not covered" >styleByHash[properties.styleHash];</span>
1399
+ <span class="cstat-no" title="statement not covered" > if (style) {</span>
1400
+ <span class="cstat-no" title="statement not covered" > if (!lineStyle) <span class="cstat-no" title="statement not covered" >lineStyle = get1(style, "LineStyle");</span></span>
1401
+ <span class="cstat-no" title="statement not covered" > if (!polyStyle) <span class="cstat-no" title="statement not covered" >polyStyle = get1(style, "PolyStyle");</span></span>
1402
+ var iconStyle = <span class="cstat-no" title="statement not covered" >get1(style, "IconStyle");</span>
1403
+ <span class="cstat-no" title="statement not covered" > if (iconStyle) {</span>
1404
+ var icon = <span class="cstat-no" title="statement not covered" >get1(iconStyle, "Icon");</span>
1405
+ <span class="cstat-no" title="statement not covered" > if (icon) {</span>
1406
+ var href = <span class="cstat-no" title="statement not covered" >nodeVal(get1(icon, "href"));</span>
1407
+ <span class="cstat-no" title="statement not covered" > if (href) <span class="cstat-no" title="statement not covered" >properties.icon = href;</span></span>
1408
+ }
1409
+ }
1410
+ }
1411
+ }
1412
+ <span class="cstat-no" title="statement not covered" > if (description) <span class="cstat-no" title="statement not covered" >properties.description = description;</span></span>
1413
+ <span class="cstat-no" title="statement not covered" > if (timeSpan) {</span>
1414
+ var begin = <span class="cstat-no" title="statement not covered" >nodeVal(get1(timeSpan, "begin"));</span>
1415
+ var end = <span class="cstat-no" title="statement not covered" >nodeVal(get1(timeSpan, "end"));</span>
1416
+ <span class="cstat-no" title="statement not covered" > properties.timespan = { begin: begin, end: end };</span>
1417
+ }
1418
+ <span class="cstat-no" title="statement not covered" > if (timeStamp) {</span>
1419
+ <span class="cstat-no" title="statement not covered" > properties.timestamp = nodeVal(get1(timeStamp, "when"));</span>
1420
+ }
1421
+ <span class="cstat-no" title="statement not covered" > if (lineStyle) {</span>
1422
+ var linestyles = <span class="cstat-no" title="statement not covered" >kmlColor(nodeVal(get1(lineStyle, "color"))),</span>
1423
+ color = <span class="cstat-no" title="statement not covered" >linestyles[0],</span>
1424
+ opacity = <span class="cstat-no" title="statement not covered" >linestyles[1],</span>
1425
+ width = <span class="cstat-no" title="statement not covered" >parseFloat(nodeVal(get1(lineStyle, "width")));</span>
1426
+ <span class="cstat-no" title="statement not covered" > if (color) <span class="cstat-no" title="statement not covered" >properties.stroke = color;</span></span>
1427
+ <span class="cstat-no" title="statement not covered" > if (!isNaN(opacity)) <span class="cstat-no" title="statement not covered" >properties["stroke-opacity"] = opacity;</span></span>
1428
+ <span class="cstat-no" title="statement not covered" > if (!isNaN(width)) <span class="cstat-no" title="statement not covered" >properties["stroke-width"] = width;</span></span>
1429
+ }
1430
+ <span class="cstat-no" title="statement not covered" > if (polyStyle) {</span>
1431
+ var polystyles = <span class="cstat-no" title="statement not covered" >kmlColor(nodeVal(get1(polyStyle, "color"))),</span>
1432
+ pcolor = <span class="cstat-no" title="statement not covered" >polystyles[0],</span>
1433
+ popacity = <span class="cstat-no" title="statement not covered" >polystyles[1],</span>
1434
+ fill = <span class="cstat-no" title="statement not covered" >nodeVal(get1(polyStyle, "fill")),</span>
1435
+ outline = <span class="cstat-no" title="statement not covered" >nodeVal(get1(polyStyle, "outline"));</span>
1436
+ <span class="cstat-no" title="statement not covered" > if (pcolor) <span class="cstat-no" title="statement not covered" >properties.fill = pcolor;</span></span>
1437
+ <span class="cstat-no" title="statement not covered" > if (!isNaN(popacity)) <span class="cstat-no" title="statement not covered" >properties["fill-opacity"] = popacity;</span></span>
1438
+ <span class="cstat-no" title="statement not covered" > if (fill) <span class="cstat-no" title="statement not covered" >properties["fill-opacity"] = fill === "1" ? properties["fill-opacity"] || 1 : 0;</span></span>
1439
+ <span class="cstat-no" title="statement not covered" > if (outline)</span>
1440
+ <span class="cstat-no" title="statement not covered" > properties["stroke-opacity"] = outline === "1" ? properties["stroke-opacity"] || 1 : 0;</span>
1441
+ }
1442
+ <span class="cstat-no" title="statement not covered" > if (extendedData) {</span>
1443
+ var datas = <span class="cstat-no" title="statement not covered" >get(extendedData, "Data"),</span>
1444
+ simpleDatas = <span class="cstat-no" title="statement not covered" >get(extendedData, "SimpleData");</span>
1445
1445
  &nbsp;
1446
- <span class="cstat-no" title="statement not covered" > for (i = 0; i &lt; datas.length; i++) {</span>
1447
- <span class="cstat-no" title="statement not covered" > properties[datas[i].getAttribute("name")] = nodeVal(get1(datas[i], "value"));</span>
1448
- }
1449
- <span class="cstat-no" title="statement not covered" > for (i = 0; i &lt; simpleDatas.length; i++) {</span>
1450
- <span class="cstat-no" title="statement not covered" > properties[simpleDatas[i].getAttribute("name")] = nodeVal(simpleDatas[i]);</span>
1451
- }
1452
- }
1453
- <span class="cstat-no" title="statement not covered" > if (visibility) {</span>
1454
- <span class="cstat-no" title="statement not covered" > properties.visibility = nodeVal(visibility);</span>
1455
- }
1456
- <span class="cstat-no" title="statement not covered" > if (geomsAndTimes.coordTimes.length) {</span>
1457
- <span class="cstat-no" title="statement not covered" > properties.coordTimes =</span>
1458
- geomsAndTimes.coordTimes.length === 1
1459
- ? geomsAndTimes.coordTimes[0]
1460
- : geomsAndTimes.coordTimes;
1461
- }
1462
- var feature = <span class="cstat-no" title="statement not covered" >{</span>
1463
- type: "Feature",
1464
- geometry:
1465
- geomsAndTimes.geoms.length === 1
1466
- ? geomsAndTimes.geoms[0]
1467
- : {
1468
- type: "GeometryCollection",
1469
- geometries: geomsAndTimes.geoms,
1470
- },
1471
- properties: properties,
1472
- };
1473
- <span class="cstat-no" title="statement not covered" > if (attr(root, "id")) <span class="cstat-no" title="statement not covered" >feature.id = attr(root, "id");</span></span>
1474
- <span class="cstat-no" title="statement not covered" > return [feature];</span>
1475
- }
1476
- <span class="cstat-no" title="statement not covered" > return gj;</span>
1477
- },
1478
- gpx: <span class="fstat-no" title="function not covered" >fu</span>nction (doc) {
1479
- var i,
1480
- tracks = <span class="cstat-no" title="statement not covered" >get(doc, "trk"),</span>
1481
- routes = <span class="cstat-no" title="statement not covered" >get(doc, "rte"),</span>
1482
- waypoints = <span class="cstat-no" title="statement not covered" >get(doc, "wpt"),</span>
1483
- // a feature collection
1484
- gj = <span class="cstat-no" title="statement not covered" >fc(),</span>
1485
- feature;
1486
- <span class="cstat-no" title="statement not covered" > for (i = 0; i &lt; tracks.length; i++) {</span>
1487
- <span class="cstat-no" title="statement not covered" > feature = getTrack(tracks[i]);</span>
1488
- <span class="cstat-no" title="statement not covered" > if (feature) <span class="cstat-no" title="statement not covered" >gj.features.push(feature);</span></span>
1489
- }
1490
- <span class="cstat-no" title="statement not covered" > for (i = 0; i &lt; routes.length; i++) {</span>
1491
- <span class="cstat-no" title="statement not covered" > feature = getRoute(routes[i]);</span>
1492
- <span class="cstat-no" title="statement not covered" > if (feature) <span class="cstat-no" title="statement not covered" >gj.features.push(feature);</span></span>
1493
- }
1494
- <span class="cstat-no" title="statement not covered" > for (i = 0; i &lt; waypoints.length; i++) {</span>
1495
- <span class="cstat-no" title="statement not covered" > gj.features.push(getPoint(waypoints[i]));</span>
1496
- }
1497
- function <span class="fstat-no" title="function not covered" >initializeArray(</span>arr, size) {
1498
- <span class="cstat-no" title="statement not covered" > for (var h = <span class="cstat-no" title="statement not covered" >0;</span> h &lt; size; h++) {</span>
1499
- <span class="cstat-no" title="statement not covered" > arr.push(null);</span>
1500
- }
1501
- <span class="cstat-no" title="statement not covered" > return arr;</span>
1502
- }
1503
- function <span class="fstat-no" title="function not covered" >getPoints(</span>node, pointname) {
1504
- var pts = <span class="cstat-no" title="statement not covered" >get(node, pointname),</span>
1505
- line = <span class="cstat-no" title="statement not covered" >[],</span>
1506
- times = <span class="cstat-no" title="statement not covered" >[],</span>
1507
- heartRates = <span class="cstat-no" title="statement not covered" >[],</span>
1508
- l = <span class="cstat-no" title="statement not covered" >pts.length;</span>
1509
- <span class="cstat-no" title="statement not covered" > if (l &lt; 2) <span class="cstat-no" title="statement not covered" >return {}; </span></span>// Invalid line in GeoJSON
1510
- <span class="cstat-no" title="statement not covered" > for (var i = <span class="cstat-no" title="statement not covered" >0;</span> i &lt; l; i++) {</span>
1511
- var c = <span class="cstat-no" title="statement not covered" >coordPair(pts[i]);</span>
1512
- <span class="cstat-no" title="statement not covered" > line.push(c.coordinates);</span>
1513
- <span class="cstat-no" title="statement not covered" > if (c.time) <span class="cstat-no" title="statement not covered" >times.push(c.time);</span></span>
1514
- <span class="cstat-no" title="statement not covered" > if (c.heartRate || heartRates.length) {</span>
1515
- <span class="cstat-no" title="statement not covered" > if (!heartRates.length) <span class="cstat-no" title="statement not covered" >initializeArray(heartRates, i);</span></span>
1516
- <span class="cstat-no" title="statement not covered" > heartRates.push(c.heartRate || null);</span>
1517
- }
1518
- }
1519
- <span class="cstat-no" title="statement not covered" > return {</span>
1520
- line: line,
1521
- times: times,
1522
- heartRates: heartRates,
1523
- };
1524
- }
1525
- function <span class="fstat-no" title="function not covered" >getTrack(</span>node) {
1526
- var segments = <span class="cstat-no" title="statement not covered" >get(node, "trkseg"),</span>
1527
- track = <span class="cstat-no" title="statement not covered" >[],</span>
1528
- times = <span class="cstat-no" title="statement not covered" >[],</span>
1529
- heartRates = <span class="cstat-no" title="statement not covered" >[],</span>
1530
- line;
1531
- <span class="cstat-no" title="statement not covered" > for (var i = <span class="cstat-no" title="statement not covered" >0;</span> i &lt; segments.length; i++) {</span>
1532
- <span class="cstat-no" title="statement not covered" > line = getPoints(segments[i], "trkpt");</span>
1533
- <span class="cstat-no" title="statement not covered" > if (line) {</span>
1534
- <span class="cstat-no" title="statement not covered" > if (line.line) <span class="cstat-no" title="statement not covered" >track.push(line.line);</span></span>
1535
- <span class="cstat-no" title="statement not covered" > if (line.times &amp;&amp; line.times.length) <span class="cstat-no" title="statement not covered" >times.push(line.times);</span></span>
1536
- <span class="cstat-no" title="statement not covered" > if (heartRates.length || (line.heartRates &amp;&amp; line.heartRates.length)) {</span>
1537
- <span class="cstat-no" title="statement not covered" > if (!heartRates.length) {</span>
1538
- <span class="cstat-no" title="statement not covered" > for (var s = <span class="cstat-no" title="statement not covered" >0;</span> s &lt; i; s++) {</span>
1539
- <span class="cstat-no" title="statement not covered" > heartRates.push(initializeArray([], track[s].length));</span>
1540
- }
1541
- }
1542
- <span class="cstat-no" title="statement not covered" > if (line.heartRates &amp;&amp; line.heartRates.length) {</span>
1543
- <span class="cstat-no" title="statement not covered" > heartRates.push(line.heartRates);</span>
1544
- } else {
1545
- <span class="cstat-no" title="statement not covered" > heartRates.push(initializeArray([], line.line.length || 0));</span>
1546
- }
1547
- }
1548
- }
1549
- }
1550
- <span class="cstat-no" title="statement not covered" > if (track.length === 0) <span class="cstat-no" title="statement not covered" >return;</span></span>
1551
- var properties = <span class="cstat-no" title="statement not covered" >getProperties(node);</span>
1552
- <span class="cstat-no" title="statement not covered" > extend(properties, getLineStyle(get1(node, "extensions")));</span>
1553
- <span class="cstat-no" title="statement not covered" > if (times.length) <span class="cstat-no" title="statement not covered" >properties.coordTimes = track.length === 1 ? times[0] : times;</span></span>
1554
- <span class="cstat-no" title="statement not covered" > if (heartRates.length)</span>
1555
- <span class="cstat-no" title="statement not covered" > properties.heartRates = track.length === 1 ? heartRates[0] : heartRates;</span>
1556
- <span class="cstat-no" title="statement not covered" > return {</span>
1557
- type: "Feature",
1558
- properties: properties,
1559
- geometry: {
1560
- type: track.length === 1 ? "LineString" : "MultiLineString",
1561
- coordinates: track.length === 1 ? track[0] : track,
1562
- },
1563
- };
1564
- }
1565
- function <span class="fstat-no" title="function not covered" >getRoute(</span>node) {
1566
- var line = <span class="cstat-no" title="statement not covered" >getPoints(node, "rtept");</span>
1567
- <span class="cstat-no" title="statement not covered" > if (!line.line) <span class="cstat-no" title="statement not covered" >return;</span></span>
1568
- var prop = <span class="cstat-no" title="statement not covered" >getProperties(node);</span>
1569
- <span class="cstat-no" title="statement not covered" > extend(prop, getLineStyle(get1(node, "extensions")));</span>
1570
- var routeObj = <span class="cstat-no" title="statement not covered" >{</span>
1571
- type: "Feature",
1572
- properties: prop,
1573
- geometry: {
1574
- type: "LineString",
1575
- coordinates: line.line,
1576
- },
1577
- };
1578
- <span class="cstat-no" title="statement not covered" > return routeObj;</span>
1579
- }
1580
- function <span class="fstat-no" title="function not covered" >getPoint(</span>node) {
1581
- var prop = <span class="cstat-no" title="statement not covered" >getProperties(node);</span>
1582
- <span class="cstat-no" title="statement not covered" > extend(prop, getMulti(node, ["sym"]));</span>
1583
- <span class="cstat-no" title="statement not covered" > return {</span>
1584
- type: "Feature",
1585
- properties: prop,
1586
- geometry: {
1587
- type: "Point",
1588
- coordinates: coordPair(node).coordinates,
1589
- },
1590
- };
1591
- }
1592
- function <span class="fstat-no" title="function not covered" >getLineStyle(</span>extensions) {
1593
- var style = <span class="cstat-no" title="statement not covered" >{};</span>
1594
- <span class="cstat-no" title="statement not covered" > if (extensions) {</span>
1595
- var lineStyle = <span class="cstat-no" title="statement not covered" >get1(extensions, "line");</span>
1596
- <span class="cstat-no" title="statement not covered" > if (lineStyle) {</span>
1597
- var color = <span class="cstat-no" title="statement not covered" >nodeVal(get1(lineStyle, "color")),</span>
1598
- opacity = <span class="cstat-no" title="statement not covered" >parseFloat(nodeVal(get1(lineStyle, "opacity"))),</span>
1599
- width = <span class="cstat-no" title="statement not covered" >parseFloat(nodeVal(get1(lineStyle, "width")));</span>
1600
- <span class="cstat-no" title="statement not covered" > if (color) <span class="cstat-no" title="statement not covered" >style.stroke = color;</span></span>
1601
- <span class="cstat-no" title="statement not covered" > if (!isNaN(opacity)) <span class="cstat-no" title="statement not covered" >style["stroke-opacity"] = opacity;</span></span>
1602
- // GPX width is in mm, convert to px with 96 px per inch
1603
- <span class="cstat-no" title="statement not covered" > if (!isNaN(width)) <span class="cstat-no" title="statement not covered" >style["stroke-width"] = (width * 96) / 25.4;</span></span>
1604
- }
1605
- }
1606
- <span class="cstat-no" title="statement not covered" > return style;</span>
1607
- }
1608
- function <span class="fstat-no" title="function not covered" >getProperties(</span>node) {
1609
- var prop = <span class="cstat-no" title="statement not covered" >getMulti(node, ["name", "cmt", "desc", "type", "time", "keywords"]),</span>
1610
- links = <span class="cstat-no" title="statement not covered" >get(node, "link");</span>
1611
- <span class="cstat-no" title="statement not covered" > if (links.length) <span class="cstat-no" title="statement not covered" >prop.links = [];</span></span>
1612
- <span class="cstat-no" title="statement not covered" > for (var i = <span class="cstat-no" title="statement not covered" >0,</span> link; i &lt; links.length; i++) {</span>
1613
- <span class="cstat-no" title="statement not covered" > link = { href: attr(links[i], "href") };</span>
1614
- <span class="cstat-no" title="statement not covered" > extend(link, getMulti(links[i], ["text", "type"]));</span>
1615
- <span class="cstat-no" title="statement not covered" > prop.links.push(link);</span>
1616
- }
1617
- <span class="cstat-no" title="statement not covered" > return prop;</span>
1618
- }
1619
- <span class="cstat-no" title="statement not covered" > return gj;</span>
1620
- },
1621
- };
1622
- return t;
1446
+ <span class="cstat-no" title="statement not covered" > for (i = 0; i &lt; datas.length; i++) {</span>
1447
+ <span class="cstat-no" title="statement not covered" > properties[datas[i].getAttribute("name")] = nodeVal(get1(datas[i], "value"));</span>
1448
+ }
1449
+ <span class="cstat-no" title="statement not covered" > for (i = 0; i &lt; simpleDatas.length; i++) {</span>
1450
+ <span class="cstat-no" title="statement not covered" > properties[simpleDatas[i].getAttribute("name")] = nodeVal(simpleDatas[i]);</span>
1451
+ }
1452
+ }
1453
+ <span class="cstat-no" title="statement not covered" > if (visibility) {</span>
1454
+ <span class="cstat-no" title="statement not covered" > properties.visibility = nodeVal(visibility);</span>
1455
+ }
1456
+ <span class="cstat-no" title="statement not covered" > if (geomsAndTimes.coordTimes.length) {</span>
1457
+ <span class="cstat-no" title="statement not covered" > properties.coordTimes =</span>
1458
+ geomsAndTimes.coordTimes.length === 1
1459
+ ? geomsAndTimes.coordTimes[0]
1460
+ : geomsAndTimes.coordTimes;
1461
+ }
1462
+ var feature = <span class="cstat-no" title="statement not covered" >{</span>
1463
+ type: "Feature",
1464
+ geometry:
1465
+ geomsAndTimes.geoms.length === 1
1466
+ ? geomsAndTimes.geoms[0]
1467
+ : {
1468
+ type: "GeometryCollection",
1469
+ geometries: geomsAndTimes.geoms,
1470
+ },
1471
+ properties: properties,
1472
+ };
1473
+ <span class="cstat-no" title="statement not covered" > if (attr(root, "id")) <span class="cstat-no" title="statement not covered" >feature.id = attr(root, "id");</span></span>
1474
+ <span class="cstat-no" title="statement not covered" > return [feature];</span>
1475
+ }
1476
+ <span class="cstat-no" title="statement not covered" > return gj;</span>
1477
+ },
1478
+ gpx: <span class="fstat-no" title="function not covered" >fu</span>nction (doc) {
1479
+ var i,
1480
+ tracks = <span class="cstat-no" title="statement not covered" >get(doc, "trk"),</span>
1481
+ routes = <span class="cstat-no" title="statement not covered" >get(doc, "rte"),</span>
1482
+ waypoints = <span class="cstat-no" title="statement not covered" >get(doc, "wpt"),</span>
1483
+ // a feature collection
1484
+ gj = <span class="cstat-no" title="statement not covered" >fc(),</span>
1485
+ feature;
1486
+ <span class="cstat-no" title="statement not covered" > for (i = 0; i &lt; tracks.length; i++) {</span>
1487
+ <span class="cstat-no" title="statement not covered" > feature = getTrack(tracks[i]);</span>
1488
+ <span class="cstat-no" title="statement not covered" > if (feature) <span class="cstat-no" title="statement not covered" >gj.features.push(feature);</span></span>
1489
+ }
1490
+ <span class="cstat-no" title="statement not covered" > for (i = 0; i &lt; routes.length; i++) {</span>
1491
+ <span class="cstat-no" title="statement not covered" > feature = getRoute(routes[i]);</span>
1492
+ <span class="cstat-no" title="statement not covered" > if (feature) <span class="cstat-no" title="statement not covered" >gj.features.push(feature);</span></span>
1493
+ }
1494
+ <span class="cstat-no" title="statement not covered" > for (i = 0; i &lt; waypoints.length; i++) {</span>
1495
+ <span class="cstat-no" title="statement not covered" > gj.features.push(getPoint(waypoints[i]));</span>
1496
+ }
1497
+ function <span class="fstat-no" title="function not covered" >initializeArray(</span>arr, size) {
1498
+ <span class="cstat-no" title="statement not covered" > for (var h = <span class="cstat-no" title="statement not covered" >0;</span> h &lt; size; h++) {</span>
1499
+ <span class="cstat-no" title="statement not covered" > arr.push(null);</span>
1500
+ }
1501
+ <span class="cstat-no" title="statement not covered" > return arr;</span>
1502
+ }
1503
+ function <span class="fstat-no" title="function not covered" >getPoints(</span>node, pointname) {
1504
+ var pts = <span class="cstat-no" title="statement not covered" >get(node, pointname),</span>
1505
+ line = <span class="cstat-no" title="statement not covered" >[],</span>
1506
+ times = <span class="cstat-no" title="statement not covered" >[],</span>
1507
+ heartRates = <span class="cstat-no" title="statement not covered" >[],</span>
1508
+ l = <span class="cstat-no" title="statement not covered" >pts.length;</span>
1509
+ <span class="cstat-no" title="statement not covered" > if (l &lt; 2) <span class="cstat-no" title="statement not covered" >return {}; </span></span>// Invalid line in GeoJSON
1510
+ <span class="cstat-no" title="statement not covered" > for (var i = <span class="cstat-no" title="statement not covered" >0;</span> i &lt; l; i++) {</span>
1511
+ var c = <span class="cstat-no" title="statement not covered" >coordPair(pts[i]);</span>
1512
+ <span class="cstat-no" title="statement not covered" > line.push(c.coordinates);</span>
1513
+ <span class="cstat-no" title="statement not covered" > if (c.time) <span class="cstat-no" title="statement not covered" >times.push(c.time);</span></span>
1514
+ <span class="cstat-no" title="statement not covered" > if (c.heartRate || heartRates.length) {</span>
1515
+ <span class="cstat-no" title="statement not covered" > if (!heartRates.length) <span class="cstat-no" title="statement not covered" >initializeArray(heartRates, i);</span></span>
1516
+ <span class="cstat-no" title="statement not covered" > heartRates.push(c.heartRate || null);</span>
1517
+ }
1518
+ }
1519
+ <span class="cstat-no" title="statement not covered" > return {</span>
1520
+ line: line,
1521
+ times: times,
1522
+ heartRates: heartRates,
1523
+ };
1524
+ }
1525
+ function <span class="fstat-no" title="function not covered" >getTrack(</span>node) {
1526
+ var segments = <span class="cstat-no" title="statement not covered" >get(node, "trkseg"),</span>
1527
+ track = <span class="cstat-no" title="statement not covered" >[],</span>
1528
+ times = <span class="cstat-no" title="statement not covered" >[],</span>
1529
+ heartRates = <span class="cstat-no" title="statement not covered" >[],</span>
1530
+ line;
1531
+ <span class="cstat-no" title="statement not covered" > for (var i = <span class="cstat-no" title="statement not covered" >0;</span> i &lt; segments.length; i++) {</span>
1532
+ <span class="cstat-no" title="statement not covered" > line = getPoints(segments[i], "trkpt");</span>
1533
+ <span class="cstat-no" title="statement not covered" > if (line) {</span>
1534
+ <span class="cstat-no" title="statement not covered" > if (line.line) <span class="cstat-no" title="statement not covered" >track.push(line.line);</span></span>
1535
+ <span class="cstat-no" title="statement not covered" > if (line.times &amp;&amp; line.times.length) <span class="cstat-no" title="statement not covered" >times.push(line.times);</span></span>
1536
+ <span class="cstat-no" title="statement not covered" > if (heartRates.length || (line.heartRates &amp;&amp; line.heartRates.length)) {</span>
1537
+ <span class="cstat-no" title="statement not covered" > if (!heartRates.length) {</span>
1538
+ <span class="cstat-no" title="statement not covered" > for (var s = <span class="cstat-no" title="statement not covered" >0;</span> s &lt; i; s++) {</span>
1539
+ <span class="cstat-no" title="statement not covered" > heartRates.push(initializeArray([], track[s].length));</span>
1540
+ }
1541
+ }
1542
+ <span class="cstat-no" title="statement not covered" > if (line.heartRates &amp;&amp; line.heartRates.length) {</span>
1543
+ <span class="cstat-no" title="statement not covered" > heartRates.push(line.heartRates);</span>
1544
+ } else {
1545
+ <span class="cstat-no" title="statement not covered" > heartRates.push(initializeArray([], line.line.length || 0));</span>
1546
+ }
1547
+ }
1548
+ }
1549
+ }
1550
+ <span class="cstat-no" title="statement not covered" > if (track.length === 0) <span class="cstat-no" title="statement not covered" >return;</span></span>
1551
+ var properties = <span class="cstat-no" title="statement not covered" >getProperties(node);</span>
1552
+ <span class="cstat-no" title="statement not covered" > extend(properties, getLineStyle(get1(node, "extensions")));</span>
1553
+ <span class="cstat-no" title="statement not covered" > if (times.length) <span class="cstat-no" title="statement not covered" >properties.coordTimes = track.length === 1 ? times[0] : times;</span></span>
1554
+ <span class="cstat-no" title="statement not covered" > if (heartRates.length)</span>
1555
+ <span class="cstat-no" title="statement not covered" > properties.heartRates = track.length === 1 ? heartRates[0] : heartRates;</span>
1556
+ <span class="cstat-no" title="statement not covered" > return {</span>
1557
+ type: "Feature",
1558
+ properties: properties,
1559
+ geometry: {
1560
+ type: track.length === 1 ? "LineString" : "MultiLineString",
1561
+ coordinates: track.length === 1 ? track[0] : track,
1562
+ },
1563
+ };
1564
+ }
1565
+ function <span class="fstat-no" title="function not covered" >getRoute(</span>node) {
1566
+ var line = <span class="cstat-no" title="statement not covered" >getPoints(node, "rtept");</span>
1567
+ <span class="cstat-no" title="statement not covered" > if (!line.line) <span class="cstat-no" title="statement not covered" >return;</span></span>
1568
+ var prop = <span class="cstat-no" title="statement not covered" >getProperties(node);</span>
1569
+ <span class="cstat-no" title="statement not covered" > extend(prop, getLineStyle(get1(node, "extensions")));</span>
1570
+ var routeObj = <span class="cstat-no" title="statement not covered" >{</span>
1571
+ type: "Feature",
1572
+ properties: prop,
1573
+ geometry: {
1574
+ type: "LineString",
1575
+ coordinates: line.line,
1576
+ },
1577
+ };
1578
+ <span class="cstat-no" title="statement not covered" > return routeObj;</span>
1579
+ }
1580
+ function <span class="fstat-no" title="function not covered" >getPoint(</span>node) {
1581
+ var prop = <span class="cstat-no" title="statement not covered" >getProperties(node);</span>
1582
+ <span class="cstat-no" title="statement not covered" > extend(prop, getMulti(node, ["sym"]));</span>
1583
+ <span class="cstat-no" title="statement not covered" > return {</span>
1584
+ type: "Feature",
1585
+ properties: prop,
1586
+ geometry: {
1587
+ type: "Point",
1588
+ coordinates: coordPair(node).coordinates,
1589
+ },
1590
+ };
1591
+ }
1592
+ function <span class="fstat-no" title="function not covered" >getLineStyle(</span>extensions) {
1593
+ var style = <span class="cstat-no" title="statement not covered" >{};</span>
1594
+ <span class="cstat-no" title="statement not covered" > if (extensions) {</span>
1595
+ var lineStyle = <span class="cstat-no" title="statement not covered" >get1(extensions, "line");</span>
1596
+ <span class="cstat-no" title="statement not covered" > if (lineStyle) {</span>
1597
+ var color = <span class="cstat-no" title="statement not covered" >nodeVal(get1(lineStyle, "color")),</span>
1598
+ opacity = <span class="cstat-no" title="statement not covered" >parseFloat(nodeVal(get1(lineStyle, "opacity"))),</span>
1599
+ width = <span class="cstat-no" title="statement not covered" >parseFloat(nodeVal(get1(lineStyle, "width")));</span>
1600
+ <span class="cstat-no" title="statement not covered" > if (color) <span class="cstat-no" title="statement not covered" >style.stroke = color;</span></span>
1601
+ <span class="cstat-no" title="statement not covered" > if (!isNaN(opacity)) <span class="cstat-no" title="statement not covered" >style["stroke-opacity"] = opacity;</span></span>
1602
+ // GPX width is in mm, convert to px with 96 px per inch
1603
+ <span class="cstat-no" title="statement not covered" > if (!isNaN(width)) <span class="cstat-no" title="statement not covered" >style["stroke-width"] = (width * 96) / 25.4;</span></span>
1604
+ }
1605
+ }
1606
+ <span class="cstat-no" title="statement not covered" > return style;</span>
1607
+ }
1608
+ function <span class="fstat-no" title="function not covered" >getProperties(</span>node) {
1609
+ var prop = <span class="cstat-no" title="statement not covered" >getMulti(node, ["name", "cmt", "desc", "type", "time", "keywords"]),</span>
1610
+ links = <span class="cstat-no" title="statement not covered" >get(node, "link");</span>
1611
+ <span class="cstat-no" title="statement not covered" > if (links.length) <span class="cstat-no" title="statement not covered" >prop.links = [];</span></span>
1612
+ <span class="cstat-no" title="statement not covered" > for (var i = <span class="cstat-no" title="statement not covered" >0,</span> link; i &lt; links.length; i++) {</span>
1613
+ <span class="cstat-no" title="statement not covered" > link = { href: attr(links[i], "href") };</span>
1614
+ <span class="cstat-no" title="statement not covered" > extend(link, getMulti(links[i], ["text", "type"]));</span>
1615
+ <span class="cstat-no" title="statement not covered" > prop.links.push(link);</span>
1616
+ }
1617
+ <span class="cstat-no" title="statement not covered" > return prop;</span>
1618
+ }
1619
+ <span class="cstat-no" title="statement not covered" > return gj;</span>
1620
+ },
1621
+ };
1622
+ return t;
1623
1623
  })();
1624
1624
  &nbsp;
1625
1625
  export default toGeoJSON;
@@ -1630,7 +1630,7 @@ export default toGeoJSON;
1630
1630
  <div class='footer quiet pad2 space-top1 center small'>
1631
1631
  Code coverage generated by
1632
1632
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1633
- at Thu Aug 11 2022 13:20:32 GMT+0000 (Coordinated Universal Time)
1633
+ at Tue Oct 04 2022 11:59:51 GMT+0000 (Coordinated Universal Time)
1634
1634
  </div>
1635
1635
  <script src="../../../prettify.js"></script>
1636
1636
  <script>