postrunner 0.0.10 → 0.0.11

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 (1225) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +4 -3
  3. data/lib/postrunner/ActivitiesDB.rb +8 -9
  4. data/lib/postrunner/Activity.rb +7 -1
  5. data/lib/postrunner/ActivityView.rb +10 -2
  6. data/lib/postrunner/DataSources.rb +100 -0
  7. data/lib/postrunner/DeviceList.rb +40 -17
  8. data/lib/postrunner/Log.rb +25 -0
  9. data/lib/postrunner/Main.rb +9 -8
  10. data/lib/postrunner/RuntimeConfig.rb +1 -0
  11. data/lib/postrunner/TrackView.rb +39 -62
  12. data/lib/postrunner/version.rb +1 -1
  13. data/misc/openlayers/ol.css +1 -0
  14. data/misc/openlayers/ol.js +948 -0
  15. data/postrunner.gemspec +2 -2
  16. data/spec/PostRunner_spec.rb +22 -23
  17. data/spec/spec_helper.rb +34 -4
  18. metadata +11 -1214
  19. data/misc/openlayers/.gitignore +0 -7
  20. data/misc/openlayers/OpenLayers.debug.js +0 -85622
  21. data/misc/openlayers/OpenLayers.js +0 -1443
  22. data/misc/openlayers/OpenLayers.light.debug.js +0 -37230
  23. data/misc/openlayers/OpenLayers.light.js +0 -592
  24. data/misc/openlayers/OpenLayers.mobile.debug.js +0 -41831
  25. data/misc/openlayers/OpenLayers.mobile.js +0 -681
  26. data/misc/openlayers/apidoc_config/Languages.txt +0 -113
  27. data/misc/openlayers/apidoc_config/Menu.txt +0 -520
  28. data/misc/openlayers/apidoc_config/OL.css +0 -20
  29. data/misc/openlayers/apidoc_config/Topics.txt +0 -105
  30. data/misc/openlayers/art/arrows.svg +0 -127
  31. data/misc/openlayers/art/layer-switcher-maximize.svg +0 -128
  32. data/misc/openlayers/art/layer-switcher-minimize.svg +0 -142
  33. data/misc/openlayers/art/marker.svg +0 -25
  34. data/misc/openlayers/art/measuring-stick-off.svg +0 -36
  35. data/misc/openlayers/art/measuring-stick-on.svg +0 -36
  36. data/misc/openlayers/art/panning-hand-off.svg +0 -44
  37. data/misc/openlayers/art/panning-hand-on.svg +0 -44
  38. data/misc/openlayers/art/slider.svg +0 -71
  39. data/misc/openlayers/art/zoom-world.svg +0 -193
  40. data/misc/openlayers/art/zoombar.svg +0 -73
  41. data/misc/openlayers/authors.txt +0 -56
  42. data/misc/openlayers/build/README.txt +0 -46
  43. data/misc/openlayers/build/build.py +0 -158
  44. data/misc/openlayers/build/buildUncompressed.py +0 -25
  45. data/misc/openlayers/build/closure-compiler/Externs.js +0 -50
  46. data/misc/openlayers/build/full.cfg +0 -14
  47. data/misc/openlayers/build/license.txt +0 -57
  48. data/misc/openlayers/build/light.cfg +0 -32
  49. data/misc/openlayers/build/lite.cfg +0 -17
  50. data/misc/openlayers/build/mobile.cfg +0 -36
  51. data/misc/openlayers/build/tests.cfg +0 -11
  52. data/misc/openlayers/doc_config/Data/ClassHierarchy.nd +0 -0
  53. data/misc/openlayers/doc_config/Data/ConfigFileInfo.nd +0 -0
  54. data/misc/openlayers/doc_config/Data/FileInfo.nd +0 -323
  55. data/misc/openlayers/doc_config/Data/ImageFileInfo.nd +0 -0
  56. data/misc/openlayers/doc_config/Data/ImageReferenceTable.nd +0 -0
  57. data/misc/openlayers/doc_config/Data/IndexInfo.nd +0 -0
  58. data/misc/openlayers/doc_config/Data/PreviousMenuState.nd +0 -0
  59. data/misc/openlayers/doc_config/Data/PreviousSettings.nd +0 -0
  60. data/misc/openlayers/doc_config/Data/SymbolTable.nd +0 -0
  61. data/misc/openlayers/doc_config/Languages.txt +0 -113
  62. data/misc/openlayers/doc_config/Menu.txt +0 -520
  63. data/misc/openlayers/doc_config/OL.css +0 -20
  64. data/misc/openlayers/doc_config/Topics.txt +0 -102
  65. data/misc/openlayers/examples/Jugl.js +0 -8
  66. data/misc/openlayers/examples/KMLParser.html +0 -57
  67. data/misc/openlayers/examples/SLDSelect.html +0 -202
  68. data/misc/openlayers/examples/WMSDescribeLayerParser.html +0 -52
  69. data/misc/openlayers/examples/accelerometer.html +0 -100
  70. data/misc/openlayers/examples/accessible-click-control.html +0 -69
  71. data/misc/openlayers/examples/accessible-click-control.js +0 -199
  72. data/misc/openlayers/examples/accessible-panel.html +0 -130
  73. data/misc/openlayers/examples/accessible-panel.js +0 -64
  74. data/misc/openlayers/examples/accessible.html +0 -167
  75. data/misc/openlayers/examples/all-overlays-google.html +0 -34
  76. data/misc/openlayers/examples/all-overlays-google.js +0 -19
  77. data/misc/openlayers/examples/all-overlays.html +0 -76
  78. data/misc/openlayers/examples/anchor-permalink.html +0 -29
  79. data/misc/openlayers/examples/anchor-permalink.js +0 -13
  80. data/misc/openlayers/examples/animated_panning.html +0 -98
  81. data/misc/openlayers/examples/animator.js +0 -670
  82. data/misc/openlayers/examples/arcgis93rest.html +0 -69
  83. data/misc/openlayers/examples/arcgiscache_ags.html +0 -221
  84. data/misc/openlayers/examples/arcgiscache_direct.html +0 -108
  85. data/misc/openlayers/examples/arcgiscache_jsonp.html +0 -106
  86. data/misc/openlayers/examples/arcims-thematic.html +0 -82
  87. data/misc/openlayers/examples/arcims.html +0 -57
  88. data/misc/openlayers/examples/attribution.html +0 -60
  89. data/misc/openlayers/examples/behavior-fixed-http-gml.html +0 -56
  90. data/misc/openlayers/examples/bing-tiles-restrictedzoom.html +0 -43
  91. data/misc/openlayers/examples/bing-tiles-restrictedzoom.js +0 -37
  92. data/misc/openlayers/examples/bing-tiles.html +0 -39
  93. data/misc/openlayers/examples/bing-tiles.js +0 -31
  94. data/misc/openlayers/examples/bing.html +0 -64
  95. data/misc/openlayers/examples/bootstrap.html +0 -81
  96. data/misc/openlayers/examples/bootstrap.js +0 -31
  97. data/misc/openlayers/examples/boxes-vector.html +0 -59
  98. data/misc/openlayers/examples/boxes.html +0 -58
  99. data/misc/openlayers/examples/browser.html +0 -152
  100. data/misc/openlayers/examples/browser.js +0 -241
  101. data/misc/openlayers/examples/buffer.html +0 -54
  102. data/misc/openlayers/examples/cache-read.html +0 -36
  103. data/misc/openlayers/examples/cache-read.js +0 -36
  104. data/misc/openlayers/examples/cache-write.html +0 -37
  105. data/misc/openlayers/examples/cache-write.js +0 -46
  106. data/misc/openlayers/examples/canvas-hit-detection.html +0 -31
  107. data/misc/openlayers/examples/canvas-hit-detection.js +0 -88
  108. data/misc/openlayers/examples/canvas-inspector.html +0 -53
  109. data/misc/openlayers/examples/canvas-inspector.js +0 -91
  110. data/misc/openlayers/examples/canvas.html +0 -35
  111. data/misc/openlayers/examples/canvas.js +0 -57
  112. data/misc/openlayers/examples/cartodb-geojson.html +0 -71
  113. data/misc/openlayers/examples/click-handler.html +0 -232
  114. data/misc/openlayers/examples/click.html +0 -91
  115. data/misc/openlayers/examples/clientzoom.html +0 -72
  116. data/misc/openlayers/examples/clientzoom.js +0 -39
  117. data/misc/openlayers/examples/controls.html +0 -86
  118. data/misc/openlayers/examples/cql-format.html +0 -54
  119. data/misc/openlayers/examples/cql-format.js +0 -61
  120. data/misc/openlayers/examples/cross-origin-xml.html +0 -32
  121. data/misc/openlayers/examples/cross-origin-xml.js +0 -25
  122. data/misc/openlayers/examples/cross-origin.html +0 -36
  123. data/misc/openlayers/examples/cross-origin.js +0 -39
  124. data/misc/openlayers/examples/custom-control.html +0 -68
  125. data/misc/openlayers/examples/custom-style.html +0 -66
  126. data/misc/openlayers/examples/data/4_m_citylights_lg.gif +0 -0
  127. data/misc/openlayers/examples/data/line.json +0 -10
  128. data/misc/openlayers/examples/data/point.json +0 -8
  129. data/misc/openlayers/examples/data/poly.json +0 -9
  130. data/misc/openlayers/examples/data/roads.json +0 -349
  131. data/misc/openlayers/examples/data/tazdem.tiff +0 -0
  132. data/misc/openlayers/examples/debug.html +0 -77
  133. data/misc/openlayers/examples/document-drag.html +0 -43
  134. data/misc/openlayers/examples/donut.html +0 -62
  135. data/misc/openlayers/examples/donut.js +0 -44
  136. data/misc/openlayers/examples/drag-feature.html +0 -114
  137. data/misc/openlayers/examples/draw-feature.html +0 -143
  138. data/misc/openlayers/examples/draw-undo-redo.html +0 -38
  139. data/misc/openlayers/examples/draw-undo-redo.js +0 -45
  140. data/misc/openlayers/examples/dynamic-text-layer.html +0 -101
  141. data/misc/openlayers/examples/editing-methods.html +0 -58
  142. data/misc/openlayers/examples/editing-methods.js +0 -83
  143. data/misc/openlayers/examples/editingtoolbar-outside.html +0 -56
  144. data/misc/openlayers/examples/editingtoolbar.html +0 -55
  145. data/misc/openlayers/examples/encoded-polyline.html +0 -47
  146. data/misc/openlayers/examples/events.html +0 -155
  147. data/misc/openlayers/examples/example-list.html +0 -302
  148. data/misc/openlayers/examples/example.html +0 -25
  149. data/misc/openlayers/examples/example.js +0 -23
  150. data/misc/openlayers/examples/feature-events.html +0 -46
  151. data/misc/openlayers/examples/feature-events.js +0 -67
  152. data/misc/openlayers/examples/filter-strategy.html +0 -54
  153. data/misc/openlayers/examples/filter-strategy.js +0 -84
  154. data/misc/openlayers/examples/filter.html +0 -107
  155. data/misc/openlayers/examples/fractional-zoom.html +0 -72
  156. data/misc/openlayers/examples/fullScreen.html +0 -53
  157. data/misc/openlayers/examples/fullScreen.js +0 -20
  158. data/misc/openlayers/examples/fusiontables.html +0 -35
  159. data/misc/openlayers/examples/fusiontables.js +0 -51
  160. data/misc/openlayers/examples/game-accel-ball.html +0 -82
  161. data/misc/openlayers/examples/geojson-reprojected.html +0 -46
  162. data/misc/openlayers/examples/geojson-reprojected.js +0 -27
  163. data/misc/openlayers/examples/geojson-reprojected.json +0 -1
  164. data/misc/openlayers/examples/geojson.html +0 -77
  165. data/misc/openlayers/examples/geolocation.html +0 -41
  166. data/misc/openlayers/examples/geolocation.js +0 -112
  167. data/misc/openlayers/examples/georss-flickr.html +0 -119
  168. data/misc/openlayers/examples/georss-markers.html +0 -45
  169. data/misc/openlayers/examples/georss.html +0 -63
  170. data/misc/openlayers/examples/georss.xml +0 -378
  171. data/misc/openlayers/examples/getfeature-wfs.html +0 -84
  172. data/misc/openlayers/examples/getfeatureinfo-control.html +0 -221
  173. data/misc/openlayers/examples/getfeatureinfo-popup.html +0 -96
  174. data/misc/openlayers/examples/gml-layer.html +0 -48
  175. data/misc/openlayers/examples/gml/line.xml +0 -42
  176. data/misc/openlayers/examples/gml/multipoint.xml +0 -70
  177. data/misc/openlayers/examples/gml/multipolygon.xml +0 -106
  178. data/misc/openlayers/examples/gml/owls.xml +0 -156
  179. data/misc/openlayers/examples/gml/point.xml +0 -42
  180. data/misc/openlayers/examples/gml/polygon.xml +0 -89
  181. data/misc/openlayers/examples/google-static.html +0 -39
  182. data/misc/openlayers/examples/google-static.js +0 -61
  183. data/misc/openlayers/examples/google-v3-alloverlays.html +0 -33
  184. data/misc/openlayers/examples/google-v3-alloverlays.js +0 -35
  185. data/misc/openlayers/examples/google-v3.html +0 -35
  186. data/misc/openlayers/examples/google-v3.js +0 -39
  187. data/misc/openlayers/examples/google.html +0 -69
  188. data/misc/openlayers/examples/graphic-name.html +0 -42
  189. data/misc/openlayers/examples/graphic-name.js +0 -67
  190. data/misc/openlayers/examples/graticule.html +0 -116
  191. data/misc/openlayers/examples/gutter.html +0 -55
  192. data/misc/openlayers/examples/highlight-feature.html +0 -88
  193. data/misc/openlayers/examples/hover-handler.html +0 -216
  194. data/misc/openlayers/examples/image-layer.html +0 -76
  195. data/misc/openlayers/examples/img/check-round-green.png +0 -0
  196. data/misc/openlayers/examples/img/check-round-grey.png +0 -0
  197. data/misc/openlayers/examples/img/list.png +0 -0
  198. data/misc/openlayers/examples/img/locate.png +0 -0
  199. data/misc/openlayers/examples/img/marker_shadow.png +0 -0
  200. data/misc/openlayers/examples/img/minus1.png +0 -0
  201. data/misc/openlayers/examples/img/mobile-layers.png +0 -0
  202. data/misc/openlayers/examples/img/mobile-loc.png +0 -0
  203. data/misc/openlayers/examples/img/mobile-zoombar.png +0 -0
  204. data/misc/openlayers/examples/img/openlayers.png +0 -0
  205. data/misc/openlayers/examples/img/popupMatrix.jpg +0 -0
  206. data/misc/openlayers/examples/img/small.jpg +0 -0
  207. data/misc/openlayers/examples/img/thinlong.jpg +0 -0
  208. data/misc/openlayers/examples/img/widelong.jpg +0 -0
  209. data/misc/openlayers/examples/img/wideshort.jpg +0 -0
  210. data/misc/openlayers/examples/intersects.html +0 -193
  211. data/misc/openlayers/examples/kamap.html +0 -45
  212. data/misc/openlayers/examples/kamap.txt +0 -508
  213. data/misc/openlayers/examples/kinetic.html +0 -44
  214. data/misc/openlayers/examples/kinetic.js +0 -27
  215. data/misc/openlayers/examples/kml-layer.html +0 -36
  216. data/misc/openlayers/examples/kml-layer.js +0 -22
  217. data/misc/openlayers/examples/kml-pointtrack.html +0 -40
  218. data/misc/openlayers/examples/kml-pointtrack.js +0 -52
  219. data/misc/openlayers/examples/kml-track.html +0 -42
  220. data/misc/openlayers/examples/kml-track.js +0 -40
  221. data/misc/openlayers/examples/kml-track.kml +0 -3359
  222. data/misc/openlayers/examples/kml/lines.kml +0 -275
  223. data/misc/openlayers/examples/kml/styles.kml +0 -21
  224. data/misc/openlayers/examples/kml/sundials.kml +0 -2273
  225. data/misc/openlayers/examples/label-scale.html +0 -34
  226. data/misc/openlayers/examples/label-scale.js +0 -72
  227. data/misc/openlayers/examples/late-render.html +0 -48
  228. data/misc/openlayers/examples/layer-opacity.html +0 -95
  229. data/misc/openlayers/examples/layerLoadMonitoring.html +0 -135
  230. data/misc/openlayers/examples/layerswitcher.html +0 -60
  231. data/misc/openlayers/examples/light-basic.html +0 -35
  232. data/misc/openlayers/examples/light-basic.js +0 -67
  233. data/misc/openlayers/examples/lite.html +0 -39
  234. data/misc/openlayers/examples/mapbox.html +0 -30
  235. data/misc/openlayers/examples/mapbox.js +0 -21
  236. data/misc/openlayers/examples/mapguide.html +0 -155
  237. data/misc/openlayers/examples/mapquest.html +0 -28
  238. data/misc/openlayers/examples/mapquest.js +0 -36
  239. data/misc/openlayers/examples/mapserver.html +0 -41
  240. data/misc/openlayers/examples/mapserver_untiled.html +0 -43
  241. data/misc/openlayers/examples/marker-shadow.html +0 -152
  242. data/misc/openlayers/examples/markerResize.html +0 -60
  243. data/misc/openlayers/examples/markers.html +0 -59
  244. data/misc/openlayers/examples/markersTextLayer.html +0 -41
  245. data/misc/openlayers/examples/measure.html +0 -203
  246. data/misc/openlayers/examples/mobile-base.js +0 -167
  247. data/misc/openlayers/examples/mobile-drawing.html +0 -52
  248. data/misc/openlayers/examples/mobile-drawing.js +0 -71
  249. data/misc/openlayers/examples/mobile-jq.html +0 -76
  250. data/misc/openlayers/examples/mobile-jq.js +0 -159
  251. data/misc/openlayers/examples/mobile-layers.html +0 -62
  252. data/misc/openlayers/examples/mobile-layers.js +0 -71
  253. data/misc/openlayers/examples/mobile-navigation.html +0 -52
  254. data/misc/openlayers/examples/mobile-navigation.js +0 -24
  255. data/misc/openlayers/examples/mobile-sencha.html +0 -184
  256. data/misc/openlayers/examples/mobile-sencha.js +0 -198
  257. data/misc/openlayers/examples/mobile-wmts-vienna.css +0 -205
  258. data/misc/openlayers/examples/mobile-wmts-vienna.html +0 -27
  259. data/misc/openlayers/examples/mobile-wmts-vienna.js +0 -281
  260. data/misc/openlayers/examples/mobile.html +0 -56
  261. data/misc/openlayers/examples/mobile.js +0 -39
  262. data/misc/openlayers/examples/modify-feature.html +0 -193
  263. data/misc/openlayers/examples/mouse-position.html +0 -67
  264. data/misc/openlayers/examples/mousewheel-interval.html +0 -63
  265. data/misc/openlayers/examples/multiserver.html +0 -52
  266. data/misc/openlayers/examples/multitouch.html +0 -28
  267. data/misc/openlayers/examples/mvs.html +0 -129
  268. data/misc/openlayers/examples/navigation-control.html +0 -44
  269. data/misc/openlayers/examples/navigation-history.html +0 -62
  270. data/misc/openlayers/examples/navtoolbar-alwaysZoom.html +0 -85
  271. data/misc/openlayers/examples/navtoolbar-outsidemap.html +0 -47
  272. data/misc/openlayers/examples/navtoolbar.html +0 -46
  273. data/misc/openlayers/examples/offline-storage.html +0 -44
  274. data/misc/openlayers/examples/offline-storage.js +0 -199
  275. data/misc/openlayers/examples/openls.html +0 -88
  276. data/misc/openlayers/examples/ordering.html +0 -221
  277. data/misc/openlayers/examples/osm-google.html +0 -32
  278. data/misc/openlayers/examples/osm-google.js +0 -23
  279. data/misc/openlayers/examples/osm-grayscale.html +0 -77
  280. data/misc/openlayers/examples/osm-marker-popup.html +0 -32
  281. data/misc/openlayers/examples/osm-marker-popup.js +0 -39
  282. data/misc/openlayers/examples/osm.html +0 -41
  283. data/misc/openlayers/examples/osm/sutton_coldfield.osm +0 -662
  284. data/misc/openlayers/examples/overviewmap.html +0 -120
  285. data/misc/openlayers/examples/pan-zoom-panels.html +0 -97
  286. data/misc/openlayers/examples/panel.html +0 -99
  287. data/misc/openlayers/examples/point-grid.html +0 -75
  288. data/misc/openlayers/examples/point-grid.js +0 -33
  289. data/misc/openlayers/examples/point-track-markers.html +0 -72
  290. data/misc/openlayers/examples/polar-projections.html +0 -41
  291. data/misc/openlayers/examples/polar-projections.js +0 -84
  292. data/misc/openlayers/examples/popupMatrix.html +0 -652
  293. data/misc/openlayers/examples/proxy.cgi +0 -81
  294. data/misc/openlayers/examples/regular-polygons.html +0 -177
  295. data/misc/openlayers/examples/resize-features.html +0 -101
  296. data/misc/openlayers/examples/restricted-extent.html +0 -77
  297. data/misc/openlayers/examples/rotate-features.html +0 -113
  298. data/misc/openlayers/examples/select-feature-multilayer.html +0 -129
  299. data/misc/openlayers/examples/select-feature-openpopup.html +0 -106
  300. data/misc/openlayers/examples/select-feature.html +0 -170
  301. data/misc/openlayers/examples/setextent.html +0 -39
  302. data/misc/openlayers/examples/simplify-linestring.html +0 -103
  303. data/misc/openlayers/examples/simplify-linestring.js +0 -599
  304. data/misc/openlayers/examples/single-tile.html +0 -33
  305. data/misc/openlayers/examples/single-tile.js +0 -20
  306. data/misc/openlayers/examples/sld-parser.html +0 -70
  307. data/misc/openlayers/examples/sld.html +0 -31
  308. data/misc/openlayers/examples/sld.js +0 -102
  309. data/misc/openlayers/examples/snap-grid.html +0 -78
  310. data/misc/openlayers/examples/snap-grid.js +0 -81
  311. data/misc/openlayers/examples/snap-split.html +0 -281
  312. data/misc/openlayers/examples/snapping.html +0 -324
  313. data/misc/openlayers/examples/sos.html +0 -189
  314. data/misc/openlayers/examples/spherical-mercator.html +0 -120
  315. data/misc/openlayers/examples/split-feature.html +0 -116
  316. data/misc/openlayers/examples/strategy-bbox.html +0 -106
  317. data/misc/openlayers/examples/strategy-cluster-extended.html +0 -125
  318. data/misc/openlayers/examples/strategy-cluster-extended.js +0 -247
  319. data/misc/openlayers/examples/strategy-cluster-threshold.html +0 -149
  320. data/misc/openlayers/examples/strategy-cluster.html +0 -238
  321. data/misc/openlayers/examples/strategy-paging.html +0 -115
  322. data/misc/openlayers/examples/style-rules.html +0 -49
  323. data/misc/openlayers/examples/style-rules.js +0 -99
  324. data/misc/openlayers/examples/style.css +0 -143
  325. data/misc/openlayers/examples/style.mobile-jq.css +0 -62
  326. data/misc/openlayers/examples/stylemap.html +0 -100
  327. data/misc/openlayers/examples/styles-context.html +0 -117
  328. data/misc/openlayers/examples/styles-rotation.html +0 -93
  329. data/misc/openlayers/examples/styles-unique.html +0 -109
  330. data/misc/openlayers/examples/sundials-spherical-mercator.html +0 -111
  331. data/misc/openlayers/examples/sundials.html +0 -107
  332. data/misc/openlayers/examples/symbolizers-fill-stroke-graphic.html +0 -141
  333. data/misc/openlayers/examples/tasmania/TasmaniaCities.xml +0 -40
  334. data/misc/openlayers/examples/tasmania/TasmaniaRoads.xml +0 -204
  335. data/misc/openlayers/examples/tasmania/TasmaniaStateBoundaries.xml +0 -92
  336. data/misc/openlayers/examples/tasmania/TasmaniaWaterBodies.xml +0 -162
  337. data/misc/openlayers/examples/tasmania/sld-tasmania.xml +0 -594
  338. data/misc/openlayers/examples/teleportation.html +0 -76
  339. data/misc/openlayers/examples/textfile.txt +0 -4
  340. data/misc/openlayers/examples/tile-origin.html +0 -38
  341. data/misc/openlayers/examples/tile-origin.js +0 -16
  342. data/misc/openlayers/examples/tilecache.html +0 -58
  343. data/misc/openlayers/examples/tms.html +0 -62
  344. data/misc/openlayers/examples/transform-feature.html +0 -123
  345. data/misc/openlayers/examples/transition.html +0 -70
  346. data/misc/openlayers/examples/using-proj4js.html +0 -109
  347. data/misc/openlayers/examples/using-proj4js.js +0 -132
  348. data/misc/openlayers/examples/utfgrid-geography-class.html +0 -51
  349. data/misc/openlayers/examples/utfgrid-geography-class.js +0 -62
  350. data/misc/openlayers/examples/utfgrid.html +0 -64
  351. data/misc/openlayers/examples/utfgrid.js +0 -61
  352. data/misc/openlayers/examples/utfgrid/bio_utfgrid/1/0/0.json +0 -1
  353. data/misc/openlayers/examples/utfgrid/bio_utfgrid/1/0/1.json +0 -1
  354. data/misc/openlayers/examples/utfgrid/bio_utfgrid/1/0/2.json +0 -1
  355. data/misc/openlayers/examples/utfgrid/bio_utfgrid/1/1/0.json +0 -1
  356. data/misc/openlayers/examples/utfgrid/bio_utfgrid/1/1/1.json +0 -1
  357. data/misc/openlayers/examples/utfgrid/bio_utfgrid/1/1/2.json +0 -1
  358. data/misc/openlayers/examples/utfgrid/bio_utfgrid/1/2/0.json +0 -1
  359. data/misc/openlayers/examples/utfgrid/bio_utfgrid/1/2/1.json +0 -1
  360. data/misc/openlayers/examples/utfgrid/bio_utfgrid/1/2/2.json +0 -1
  361. data/misc/openlayers/examples/utfgrid/geography-class/0/0/0.grid.json +0 -1
  362. data/misc/openlayers/examples/utfgrid/geography-class/1/0/0.grid.json +0 -1
  363. data/misc/openlayers/examples/utfgrid/geography-class/1/0/1.grid.json +0 -1
  364. data/misc/openlayers/examples/utfgrid/geography-class/1/1/0.grid.json +0 -1
  365. data/misc/openlayers/examples/utfgrid/geography-class/1/1/1.grid.json +0 -1
  366. data/misc/openlayers/examples/utfgrid/geography-class/2/0/0.grid.json +0 -1
  367. data/misc/openlayers/examples/utfgrid/geography-class/2/0/1.grid.json +0 -1
  368. data/misc/openlayers/examples/utfgrid/geography-class/2/0/2.grid.json +0 -1
  369. data/misc/openlayers/examples/utfgrid/geography-class/2/0/3.grid.json +0 -1
  370. data/misc/openlayers/examples/utfgrid/geography-class/2/1/0.grid.json +0 -1
  371. data/misc/openlayers/examples/utfgrid/geography-class/2/1/1.grid.json +0 -1
  372. data/misc/openlayers/examples/utfgrid/geography-class/2/1/2.grid.json +0 -1
  373. data/misc/openlayers/examples/utfgrid/geography-class/2/1/3.grid.json +0 -1
  374. data/misc/openlayers/examples/utfgrid/geography-class/2/2/0.grid.json +0 -1
  375. data/misc/openlayers/examples/utfgrid/geography-class/2/2/1.grid.json +0 -1
  376. data/misc/openlayers/examples/utfgrid/geography-class/2/2/2.grid.json +0 -1
  377. data/misc/openlayers/examples/utfgrid/geography-class/2/2/3.grid.json +0 -1
  378. data/misc/openlayers/examples/utfgrid/geography-class/2/3/0.grid.json +0 -1
  379. data/misc/openlayers/examples/utfgrid/geography-class/2/3/1.grid.json +0 -1
  380. data/misc/openlayers/examples/utfgrid/geography-class/2/3/2.grid.json +0 -1
  381. data/misc/openlayers/examples/utfgrid/geography-class/2/3/3.grid.json +0 -1
  382. data/misc/openlayers/examples/utfgrid/world_utfgrid/1/0/0.json +0 -1
  383. data/misc/openlayers/examples/utfgrid/world_utfgrid/1/0/1.json +0 -1
  384. data/misc/openlayers/examples/utfgrid/world_utfgrid/1/0/2.json +0 -1
  385. data/misc/openlayers/examples/utfgrid/world_utfgrid/1/1/0.json +0 -1
  386. data/misc/openlayers/examples/utfgrid/world_utfgrid/1/1/1.json +0 -1
  387. data/misc/openlayers/examples/utfgrid/world_utfgrid/1/1/2.json +0 -1
  388. data/misc/openlayers/examples/utfgrid/world_utfgrid/1/2/0.json +0 -1
  389. data/misc/openlayers/examples/utfgrid/world_utfgrid/1/2/1.json +0 -1
  390. data/misc/openlayers/examples/utfgrid/world_utfgrid/1/2/2.json +0 -1
  391. data/misc/openlayers/examples/utfgrid_twogrids.html +0 -51
  392. data/misc/openlayers/examples/utfgrid_twogrids.js +0 -70
  393. data/misc/openlayers/examples/vector-features-with-text.html +0 -138
  394. data/misc/openlayers/examples/vector-features.html +0 -149
  395. data/misc/openlayers/examples/vector-formats.html +0 -240
  396. data/misc/openlayers/examples/web-mercator.html +0 -50
  397. data/misc/openlayers/examples/web-mercator.js +0 -37
  398. data/misc/openlayers/examples/wfs-filter.html +0 -35
  399. data/misc/openlayers/examples/wfs-filter.js +0 -48
  400. data/misc/openlayers/examples/wfs-protocol-transactions.html +0 -104
  401. data/misc/openlayers/examples/wfs-protocol-transactions.js +0 -106
  402. data/misc/openlayers/examples/wfs-protocol.html +0 -55
  403. data/misc/openlayers/examples/wfs-reprojection.html +0 -42
  404. data/misc/openlayers/examples/wfs-reprojection.js +0 -60
  405. data/misc/openlayers/examples/wfs-snap-split.html +0 -292
  406. data/misc/openlayers/examples/wfs-spatial-filter.html +0 -37
  407. data/misc/openlayers/examples/wfs-spatial-filter.js +0 -36
  408. data/misc/openlayers/examples/wfs-states.html +0 -34
  409. data/misc/openlayers/examples/wfs-states.js +0 -35
  410. data/misc/openlayers/examples/wmc.html +0 -150
  411. data/misc/openlayers/examples/wms-long-url.html +0 -44
  412. data/misc/openlayers/examples/wms-long-url.js +0 -26
  413. data/misc/openlayers/examples/wms-untiled.html +0 -48
  414. data/misc/openlayers/examples/wms-v13.html +0 -57
  415. data/misc/openlayers/examples/wms.html +0 -49
  416. data/misc/openlayers/examples/wmst.html +0 -63
  417. data/misc/openlayers/examples/wmts-capabilities.html +0 -43
  418. data/misc/openlayers/examples/wmts-capabilities.js +0 -58
  419. data/misc/openlayers/examples/wmts-getfeatureinfo.html +0 -74
  420. data/misc/openlayers/examples/wmts-getfeatureinfo.js +0 -94
  421. data/misc/openlayers/examples/wmts.html +0 -41
  422. data/misc/openlayers/examples/wmts.js +0 -35
  423. data/misc/openlayers/examples/wps-client.html +0 -31
  424. data/misc/openlayers/examples/wps-client.js +0 -75
  425. data/misc/openlayers/examples/wps.html +0 -89
  426. data/misc/openlayers/examples/wps.js +0 -353
  427. data/misc/openlayers/examples/wrapDateLine.html +0 -73
  428. data/misc/openlayers/examples/xhtml.html +0 -42
  429. data/misc/openlayers/examples/xml.html +0 -161
  430. data/misc/openlayers/examples/xml/features.xml +0 -2
  431. data/misc/openlayers/examples/xml/georss-flickr.xml +0 -730
  432. data/misc/openlayers/examples/xml/track1.xml +0 -98
  433. data/misc/openlayers/examples/xml/wmsdescribelayer.xml +0 -5
  434. data/misc/openlayers/examples/xyz-esri.html +0 -45
  435. data/misc/openlayers/examples/yelp-georss.xml +0 -147
  436. data/misc/openlayers/examples/zoom.html +0 -68
  437. data/misc/openlayers/examples/zoom.js +0 -34
  438. data/misc/openlayers/examples/zoomLevels.html +0 -81
  439. data/misc/openlayers/examples/zoomify.html +0 -70
  440. data/misc/openlayers/img/blank.gif +0 -0
  441. data/misc/openlayers/img/cloud-popup-relative.png +0 -0
  442. data/misc/openlayers/img/drag-rectangle-off.png +0 -0
  443. data/misc/openlayers/img/drag-rectangle-on.png +0 -0
  444. data/misc/openlayers/img/east-mini.png +0 -0
  445. data/misc/openlayers/img/layer-switcher-maximize.png +0 -0
  446. data/misc/openlayers/img/layer-switcher-minimize.png +0 -0
  447. data/misc/openlayers/img/marker-blue.png +0 -0
  448. data/misc/openlayers/img/marker-gold.png +0 -0
  449. data/misc/openlayers/img/marker-green.png +0 -0
  450. data/misc/openlayers/img/marker.png +0 -0
  451. data/misc/openlayers/img/measuring-stick-off.png +0 -0
  452. data/misc/openlayers/img/measuring-stick-on.png +0 -0
  453. data/misc/openlayers/img/north-mini.png +0 -0
  454. data/misc/openlayers/img/panning-hand-off.png +0 -0
  455. data/misc/openlayers/img/panning-hand-on.png +0 -0
  456. data/misc/openlayers/img/slider.png +0 -0
  457. data/misc/openlayers/img/south-mini.png +0 -0
  458. data/misc/openlayers/img/west-mini.png +0 -0
  459. data/misc/openlayers/img/zoom-minus-mini.png +0 -0
  460. data/misc/openlayers/img/zoom-plus-mini.png +0 -0
  461. data/misc/openlayers/img/zoom-world-mini.png +0 -0
  462. data/misc/openlayers/img/zoombar.png +0 -0
  463. data/misc/openlayers/lib/Firebug/errorIcon.png +0 -0
  464. data/misc/openlayers/lib/Firebug/firebug.css +0 -209
  465. data/misc/openlayers/lib/Firebug/firebug.html +0 -23
  466. data/misc/openlayers/lib/Firebug/firebug.js +0 -674
  467. data/misc/openlayers/lib/Firebug/firebugx.js +0 -10
  468. data/misc/openlayers/lib/Firebug/infoIcon.png +0 -0
  469. data/misc/openlayers/lib/Firebug/license.txt +0 -30
  470. data/misc/openlayers/lib/Firebug/readme.txt +0 -13
  471. data/misc/openlayers/lib/Firebug/warningIcon.png +0 -0
  472. data/misc/openlayers/lib/OpenLayers.js +0 -429
  473. data/misc/openlayers/lib/OpenLayers/Animation.js +0 -102
  474. data/misc/openlayers/lib/OpenLayers/BaseTypes.js +0 -463
  475. data/misc/openlayers/lib/OpenLayers/BaseTypes/Bounds.js +0 -837
  476. data/misc/openlayers/lib/OpenLayers/BaseTypes/Class.js +0 -121
  477. data/misc/openlayers/lib/OpenLayers/BaseTypes/Date.js +0 -123
  478. data/misc/openlayers/lib/OpenLayers/BaseTypes/Element.js +0 -189
  479. data/misc/openlayers/lib/OpenLayers/BaseTypes/LonLat.js +0 -215
  480. data/misc/openlayers/lib/OpenLayers/BaseTypes/Pixel.js +0 -143
  481. data/misc/openlayers/lib/OpenLayers/BaseTypes/Size.js +0 -89
  482. data/misc/openlayers/lib/OpenLayers/Console.js +0 -250
  483. data/misc/openlayers/lib/OpenLayers/Control.js +0 -371
  484. data/misc/openlayers/lib/OpenLayers/Control/ArgParser.js +0 -182
  485. data/misc/openlayers/lib/OpenLayers/Control/Attribution.js +0 -104
  486. data/misc/openlayers/lib/OpenLayers/Control/Button.js +0 -44
  487. data/misc/openlayers/lib/OpenLayers/Control/CacheRead.js +0 -156
  488. data/misc/openlayers/lib/OpenLayers/Control/CacheWrite.js +0 -257
  489. data/misc/openlayers/lib/OpenLayers/Control/DragFeature.js +0 -366
  490. data/misc/openlayers/lib/OpenLayers/Control/DragPan.js +0 -156
  491. data/misc/openlayers/lib/OpenLayers/Control/DrawFeature.js +0 -229
  492. data/misc/openlayers/lib/OpenLayers/Control/EditingToolbar.js +0 -81
  493. data/misc/openlayers/lib/OpenLayers/Control/Geolocate.js +0 -192
  494. data/misc/openlayers/lib/OpenLayers/Control/GetFeature.js +0 -597
  495. data/misc/openlayers/lib/OpenLayers/Control/Graticule.js +0 -377
  496. data/misc/openlayers/lib/OpenLayers/Control/KeyboardDefaults.js +0 -142
  497. data/misc/openlayers/lib/OpenLayers/Control/LayerSwitcher.js +0 -521
  498. data/misc/openlayers/lib/OpenLayers/Control/Measure.js +0 -379
  499. data/misc/openlayers/lib/OpenLayers/Control/ModifyFeature.js +0 -835
  500. data/misc/openlayers/lib/OpenLayers/Control/MousePosition.js +0 -227
  501. data/misc/openlayers/lib/OpenLayers/Control/NavToolbar.js +0 -57
  502. data/misc/openlayers/lib/OpenLayers/Control/Navigation.js +0 -345
  503. data/misc/openlayers/lib/OpenLayers/Control/NavigationHistory.js +0 -423
  504. data/misc/openlayers/lib/OpenLayers/Control/OverviewMap.js +0 -750
  505. data/misc/openlayers/lib/OpenLayers/Control/Pan.js +0 -95
  506. data/misc/openlayers/lib/OpenLayers/Control/PanPanel.js +0 -73
  507. data/misc/openlayers/lib/OpenLayers/Control/PanZoom.js +0 -233
  508. data/misc/openlayers/lib/OpenLayers/Control/PanZoomBar.js +0 -408
  509. data/misc/openlayers/lib/OpenLayers/Control/Panel.js +0 -431
  510. data/misc/openlayers/lib/OpenLayers/Control/Permalink.js +0 -257
  511. data/misc/openlayers/lib/OpenLayers/Control/PinchZoom.js +0 -157
  512. data/misc/openlayers/lib/OpenLayers/Control/SLDSelect.js +0 -567
  513. data/misc/openlayers/lib/OpenLayers/Control/Scale.js +0 -100
  514. data/misc/openlayers/lib/OpenLayers/Control/ScaleLine.js +0 -220
  515. data/misc/openlayers/lib/OpenLayers/Control/SelectFeature.js +0 -643
  516. data/misc/openlayers/lib/OpenLayers/Control/Snapping.js +0 -560
  517. data/misc/openlayers/lib/OpenLayers/Control/Split.js +0 -494
  518. data/misc/openlayers/lib/OpenLayers/Control/TouchNavigation.js +0 -182
  519. data/misc/openlayers/lib/OpenLayers/Control/TransformFeature.js +0 -624
  520. data/misc/openlayers/lib/OpenLayers/Control/UTFGrid.js +0 -240
  521. data/misc/openlayers/lib/OpenLayers/Control/WMSGetFeatureInfo.js +0 -532
  522. data/misc/openlayers/lib/OpenLayers/Control/WMTSGetFeatureInfo.js +0 -400
  523. data/misc/openlayers/lib/OpenLayers/Control/Zoom.js +0 -138
  524. data/misc/openlayers/lib/OpenLayers/Control/ZoomBox.js +0 -129
  525. data/misc/openlayers/lib/OpenLayers/Control/ZoomIn.js +0 -29
  526. data/misc/openlayers/lib/OpenLayers/Control/ZoomOut.js +0 -29
  527. data/misc/openlayers/lib/OpenLayers/Control/ZoomPanel.js +0 -54
  528. data/misc/openlayers/lib/OpenLayers/Control/ZoomToMaxExtent.js +0 -35
  529. data/misc/openlayers/lib/OpenLayers/Events.js +0 -1170
  530. data/misc/openlayers/lib/OpenLayers/Events/buttonclick.js +0 -206
  531. data/misc/openlayers/lib/OpenLayers/Events/featureclick.js +0 -321
  532. data/misc/openlayers/lib/OpenLayers/Feature.js +0 -225
  533. data/misc/openlayers/lib/OpenLayers/Feature/Vector.js +0 -510
  534. data/misc/openlayers/lib/OpenLayers/Filter.js +0 -87
  535. data/misc/openlayers/lib/OpenLayers/Filter/Comparison.js +0 -267
  536. data/misc/openlayers/lib/OpenLayers/Filter/FeatureId.js +0 -87
  537. data/misc/openlayers/lib/OpenLayers/Filter/Function.js +0 -49
  538. data/misc/openlayers/lib/OpenLayers/Filter/Logical.js +0 -121
  539. data/misc/openlayers/lib/OpenLayers/Filter/Spatial.js +0 -122
  540. data/misc/openlayers/lib/OpenLayers/Format.js +0 -123
  541. data/misc/openlayers/lib/OpenLayers/Format/ArcXML.js +0 -1028
  542. data/misc/openlayers/lib/OpenLayers/Format/ArcXML/Features.js +0 -46
  543. data/misc/openlayers/lib/OpenLayers/Format/Atom.js +0 -712
  544. data/misc/openlayers/lib/OpenLayers/Format/CQL.js +0 -452
  545. data/misc/openlayers/lib/OpenLayers/Format/CSWGetDomain.js +0 -34
  546. data/misc/openlayers/lib/OpenLayers/Format/CSWGetDomain/v2_0_2.js +0 -240
  547. data/misc/openlayers/lib/OpenLayers/Format/CSWGetRecords.js +0 -34
  548. data/misc/openlayers/lib/OpenLayers/Format/CSWGetRecords/v2_0_2.js +0 -457
  549. data/misc/openlayers/lib/OpenLayers/Format/Context.js +0 -334
  550. data/misc/openlayers/lib/OpenLayers/Format/EncodedPolyline.js +0 -557
  551. data/misc/openlayers/lib/OpenLayers/Format/Filter.js +0 -53
  552. data/misc/openlayers/lib/OpenLayers/Format/Filter/v1.js +0 -504
  553. data/misc/openlayers/lib/OpenLayers/Format/Filter/v1_0_0.js +0 -184
  554. data/misc/openlayers/lib/OpenLayers/Format/Filter/v1_1_0.js +0 -222
  555. data/misc/openlayers/lib/OpenLayers/Format/GML.js +0 -923
  556. data/misc/openlayers/lib/OpenLayers/Format/GML/Base.js +0 -645
  557. data/misc/openlayers/lib/OpenLayers/Format/GML/v2.js +0 -193
  558. data/misc/openlayers/lib/OpenLayers/Format/GML/v3.js +0 -477
  559. data/misc/openlayers/lib/OpenLayers/Format/GPX.js +0 -385
  560. data/misc/openlayers/lib/OpenLayers/Format/GeoJSON.js +0 -716
  561. data/misc/openlayers/lib/OpenLayers/Format/GeoRSS.js +0 -409
  562. data/misc/openlayers/lib/OpenLayers/Format/JSON.js +0 -398
  563. data/misc/openlayers/lib/OpenLayers/Format/KML.js +0 -1517
  564. data/misc/openlayers/lib/OpenLayers/Format/OGCExceptionReport.js +0 -108
  565. data/misc/openlayers/lib/OpenLayers/Format/OSM.js +0 -465
  566. data/misc/openlayers/lib/OpenLayers/Format/OWSCommon.js +0 -78
  567. data/misc/openlayers/lib/OpenLayers/Format/OWSCommon/v1.js +0 -318
  568. data/misc/openlayers/lib/OpenLayers/Format/OWSCommon/v1_0_0.js +0 -62
  569. data/misc/openlayers/lib/OpenLayers/Format/OWSCommon/v1_1_0.js +0 -116
  570. data/misc/openlayers/lib/OpenLayers/Format/OWSContext.js +0 -86
  571. data/misc/openlayers/lib/OpenLayers/Format/OWSContext/v0_3_1.js +0 -595
  572. data/misc/openlayers/lib/OpenLayers/Format/QueryStringFilter.js +0 -183
  573. data/misc/openlayers/lib/OpenLayers/Format/SLD.js +0 -81
  574. data/misc/openlayers/lib/OpenLayers/Format/SLD/v1.js +0 -1309
  575. data/misc/openlayers/lib/OpenLayers/Format/SLD/v1_0_0.js +0 -46
  576. data/misc/openlayers/lib/OpenLayers/Format/SLD/v1_0_0_GeoServer.js +0 -149
  577. data/misc/openlayers/lib/OpenLayers/Format/SOSCapabilities.js +0 -48
  578. data/misc/openlayers/lib/OpenLayers/Format/SOSCapabilities/v1_0_0.js +0 -158
  579. data/misc/openlayers/lib/OpenLayers/Format/SOSGetFeatureOfInterest.js +0 -190
  580. data/misc/openlayers/lib/OpenLayers/Format/SOSGetObservation.js +0 -302
  581. data/misc/openlayers/lib/OpenLayers/Format/Text.js +0 -151
  582. data/misc/openlayers/lib/OpenLayers/Format/WCSCapabilities.js +0 -47
  583. data/misc/openlayers/lib/OpenLayers/Format/WCSCapabilities/v1.js +0 -55
  584. data/misc/openlayers/lib/OpenLayers/Format/WCSCapabilities/v1_0_0.js +0 -170
  585. data/misc/openlayers/lib/OpenLayers/Format/WCSCapabilities/v1_1_0.js +0 -109
  586. data/misc/openlayers/lib/OpenLayers/Format/WCSGetCoverage.js +0 -199
  587. data/misc/openlayers/lib/OpenLayers/Format/WFS.js +0 -223
  588. data/misc/openlayers/lib/OpenLayers/Format/WFSCapabilities.js +0 -47
  589. data/misc/openlayers/lib/OpenLayers/Format/WFSCapabilities/v1.js +0 -129
  590. data/misc/openlayers/lib/OpenLayers/Format/WFSCapabilities/v1_0_0.js +0 -115
  591. data/misc/openlayers/lib/OpenLayers/Format/WFSCapabilities/v1_1_0.js +0 -63
  592. data/misc/openlayers/lib/OpenLayers/Format/WFSDescribeFeatureType.js +0 -234
  593. data/misc/openlayers/lib/OpenLayers/Format/WFST.js +0 -34
  594. data/misc/openlayers/lib/OpenLayers/Format/WFST/v1.js +0 -446
  595. data/misc/openlayers/lib/OpenLayers/Format/WFST/v1_0_0.js +0 -174
  596. data/misc/openlayers/lib/OpenLayers/Format/WFST/v1_1_0.js +0 -189
  597. data/misc/openlayers/lib/OpenLayers/Format/WKT.js +0 -392
  598. data/misc/openlayers/lib/OpenLayers/Format/WMC.js +0 -182
  599. data/misc/openlayers/lib/OpenLayers/Format/WMC/v1.js +0 -1267
  600. data/misc/openlayers/lib/OpenLayers/Format/WMC/v1_0_0.js +0 -104
  601. data/misc/openlayers/lib/OpenLayers/Format/WMC/v1_1_0.js +0 -149
  602. data/misc/openlayers/lib/OpenLayers/Format/WMSCapabilities.js +0 -56
  603. data/misc/openlayers/lib/OpenLayers/Format/WMSCapabilities/v1.js +0 -368
  604. data/misc/openlayers/lib/OpenLayers/Format/WMSCapabilities/v1_1.js +0 -122
  605. data/misc/openlayers/lib/OpenLayers/Format/WMSCapabilities/v1_1_0.js +0 -57
  606. data/misc/openlayers/lib/OpenLayers/Format/WMSCapabilities/v1_1_1.js +0 -60
  607. data/misc/openlayers/lib/OpenLayers/Format/WMSCapabilities/v1_1_1_WMSC.js +0 -85
  608. data/misc/openlayers/lib/OpenLayers/Format/WMSCapabilities/v1_3.js +0 -128
  609. data/misc/openlayers/lib/OpenLayers/Format/WMSCapabilities/v1_3_0.js +0 -30
  610. data/misc/openlayers/lib/OpenLayers/Format/WMSDescribeLayer.js +0 -53
  611. data/misc/openlayers/lib/OpenLayers/Format/WMSDescribeLayer/v1_1.js +0 -122
  612. data/misc/openlayers/lib/OpenLayers/Format/WMSGetFeatureInfo.js +0 -296
  613. data/misc/openlayers/lib/OpenLayers/Format/WMTSCapabilities.js +0 -230
  614. data/misc/openlayers/lib/OpenLayers/Format/WMTSCapabilities/v1_0_0.js +0 -251
  615. data/misc/openlayers/lib/OpenLayers/Format/WPSCapabilities.js +0 -48
  616. data/misc/openlayers/lib/OpenLayers/Format/WPSCapabilities/v1_0_0.js +0 -119
  617. data/misc/openlayers/lib/OpenLayers/Format/WPSDescribeProcess.js +0 -185
  618. data/misc/openlayers/lib/OpenLayers/Format/WPSExecute.js +0 -395
  619. data/misc/openlayers/lib/OpenLayers/Format/XLS.js +0 -68
  620. data/misc/openlayers/lib/OpenLayers/Format/XLS/v1.js +0 -304
  621. data/misc/openlayers/lib/OpenLayers/Format/XLS/v1_1_0.js +0 -48
  622. data/misc/openlayers/lib/OpenLayers/Format/XML.js +0 -897
  623. data/misc/openlayers/lib/OpenLayers/Format/XML/VersionedOGC.js +0 -212
  624. data/misc/openlayers/lib/OpenLayers/Geometry.js +0 -500
  625. data/misc/openlayers/lib/OpenLayers/Geometry/Collection.js +0 -563
  626. data/misc/openlayers/lib/OpenLayers/Geometry/Curve.js +0 -89
  627. data/misc/openlayers/lib/OpenLayers/Geometry/LineString.js +0 -646
  628. data/misc/openlayers/lib/OpenLayers/Geometry/LinearRing.js +0 -433
  629. data/misc/openlayers/lib/OpenLayers/Geometry/MultiLineString.js +0 -258
  630. data/misc/openlayers/lib/OpenLayers/Geometry/MultiPoint.js +0 -66
  631. data/misc/openlayers/lib/OpenLayers/Geometry/MultiPolygon.js +0 -42
  632. data/misc/openlayers/lib/OpenLayers/Geometry/Point.js +0 -283
  633. data/misc/openlayers/lib/OpenLayers/Geometry/Polygon.js +0 -255
  634. data/misc/openlayers/lib/OpenLayers/Handler.js +0 -325
  635. data/misc/openlayers/lib/OpenLayers/Handler/Box.js +0 -244
  636. data/misc/openlayers/lib/OpenLayers/Handler/Click.js +0 -505
  637. data/misc/openlayers/lib/OpenLayers/Handler/Drag.js +0 -547
  638. data/misc/openlayers/lib/OpenLayers/Handler/Feature.js +0 -434
  639. data/misc/openlayers/lib/OpenLayers/Handler/Hover.js +0 -180
  640. data/misc/openlayers/lib/OpenLayers/Handler/Keyboard.js +0 -117
  641. data/misc/openlayers/lib/OpenLayers/Handler/MouseWheel.js +0 -264
  642. data/misc/openlayers/lib/OpenLayers/Handler/Path.js +0 -543
  643. data/misc/openlayers/lib/OpenLayers/Handler/Pinch.js +0 -239
  644. data/misc/openlayers/lib/OpenLayers/Handler/Point.js +0 -556
  645. data/misc/openlayers/lib/OpenLayers/Handler/Polygon.js +0 -305
  646. data/misc/openlayers/lib/OpenLayers/Handler/RegularPolygon.js +0 -429
  647. data/misc/openlayers/lib/OpenLayers/Icon.js +0 -243
  648. data/misc/openlayers/lib/OpenLayers/Kinetic.js +0 -178
  649. data/misc/openlayers/lib/OpenLayers/Lang.js +0 -134
  650. data/misc/openlayers/lib/OpenLayers/Lang/ar.js +0 -32
  651. data/misc/openlayers/lib/OpenLayers/Lang/be-tarask.js +0 -54
  652. data/misc/openlayers/lib/OpenLayers/Lang/bg.js +0 -25
  653. data/misc/openlayers/lib/OpenLayers/Lang/br.js +0 -53
  654. data/misc/openlayers/lib/OpenLayers/Lang/ca.js +0 -89
  655. data/misc/openlayers/lib/OpenLayers/Lang/cs-CZ.js +0 -45
  656. data/misc/openlayers/lib/OpenLayers/Lang/da-DK.js +0 -80
  657. data/misc/openlayers/lib/OpenLayers/Lang/de.js +0 -55
  658. data/misc/openlayers/lib/OpenLayers/Lang/el.js +0 -19
  659. data/misc/openlayers/lib/OpenLayers/Lang/en-CA.js +0 -21
  660. data/misc/openlayers/lib/OpenLayers/Lang/en.js +0 -89
  661. data/misc/openlayers/lib/OpenLayers/Lang/es.js +0 -90
  662. data/misc/openlayers/lib/OpenLayers/Lang/fi.js +0 -32
  663. data/misc/openlayers/lib/OpenLayers/Lang/fr.js +0 -53
  664. data/misc/openlayers/lib/OpenLayers/Lang/fur.js +0 -35
  665. data/misc/openlayers/lib/OpenLayers/Lang/gl.js +0 -53
  666. data/misc/openlayers/lib/OpenLayers/Lang/gsw.js +0 -53
  667. data/misc/openlayers/lib/OpenLayers/Lang/hr.js +0 -37
  668. data/misc/openlayers/lib/OpenLayers/Lang/hsb.js +0 -53
  669. data/misc/openlayers/lib/OpenLayers/Lang/hu.js +0 -54
  670. data/misc/openlayers/lib/OpenLayers/Lang/ia.js +0 -53
  671. data/misc/openlayers/lib/OpenLayers/Lang/id.js +0 -54
  672. data/misc/openlayers/lib/OpenLayers/Lang/io.js +0 -19
  673. data/misc/openlayers/lib/OpenLayers/Lang/is.js +0 -27
  674. data/misc/openlayers/lib/OpenLayers/Lang/it.js +0 -80
  675. data/misc/openlayers/lib/OpenLayers/Lang/ja.js +0 -54
  676. data/misc/openlayers/lib/OpenLayers/Lang/km.js +0 -23
  677. data/misc/openlayers/lib/OpenLayers/Lang/ksh.js +0 -53
  678. data/misc/openlayers/lib/OpenLayers/Lang/lt.js +0 -47
  679. data/misc/openlayers/lib/OpenLayers/Lang/nb.js +0 -82
  680. data/misc/openlayers/lib/OpenLayers/Lang/nds.js +0 -37
  681. data/misc/openlayers/lib/OpenLayers/Lang/nl.js +0 -53
  682. data/misc/openlayers/lib/OpenLayers/Lang/nn.js +0 -19
  683. data/misc/openlayers/lib/OpenLayers/Lang/oc.js +0 -53
  684. data/misc/openlayers/lib/OpenLayers/Lang/pl.js +0 -89
  685. data/misc/openlayers/lib/OpenLayers/Lang/pt-BR.js +0 -54
  686. data/misc/openlayers/lib/OpenLayers/Lang/pt.js +0 -55
  687. data/misc/openlayers/lib/OpenLayers/Lang/ro.js +0 -69
  688. data/misc/openlayers/lib/OpenLayers/Lang/ru.js +0 -56
  689. data/misc/openlayers/lib/OpenLayers/Lang/sk.js +0 -44
  690. data/misc/openlayers/lib/OpenLayers/Lang/sv-SE.js +0 -45
  691. data/misc/openlayers/lib/OpenLayers/Lang/te.js +0 -27
  692. data/misc/openlayers/lib/OpenLayers/Lang/vi.js +0 -53
  693. data/misc/openlayers/lib/OpenLayers/Lang/zh-CN.js +0 -80
  694. data/misc/openlayers/lib/OpenLayers/Lang/zh-TW.js +0 -81
  695. data/misc/openlayers/lib/OpenLayers/Layer.js +0 -1377
  696. data/misc/openlayers/lib/OpenLayers/Layer/ArcGIS93Rest.js +0 -225
  697. data/misc/openlayers/lib/OpenLayers/Layer/ArcGISCache.js +0 -480
  698. data/misc/openlayers/lib/OpenLayers/Layer/ArcIMS.js +0 -425
  699. data/misc/openlayers/lib/OpenLayers/Layer/Bing.js +0 -333
  700. data/misc/openlayers/lib/OpenLayers/Layer/Boxes.js +0 -76
  701. data/misc/openlayers/lib/OpenLayers/Layer/EventPane.js +0 -441
  702. data/misc/openlayers/lib/OpenLayers/Layer/FixedZoomLevels.js +0 -319
  703. data/misc/openlayers/lib/OpenLayers/Layer/GeoRSS.js +0 -265
  704. data/misc/openlayers/lib/OpenLayers/Layer/Google.js +0 -809
  705. data/misc/openlayers/lib/OpenLayers/Layer/Google/v3.js +0 -351
  706. data/misc/openlayers/lib/OpenLayers/Layer/Grid.js +0 -1343
  707. data/misc/openlayers/lib/OpenLayers/Layer/HTTPRequest.js +0 -230
  708. data/misc/openlayers/lib/OpenLayers/Layer/Image.js +0 -259
  709. data/misc/openlayers/lib/OpenLayers/Layer/KaMap.js +0 -192
  710. data/misc/openlayers/lib/OpenLayers/Layer/KaMapCache.js +0 -143
  711. data/misc/openlayers/lib/OpenLayers/Layer/MapGuide.js +0 -443
  712. data/misc/openlayers/lib/OpenLayers/Layer/MapServer.js +0 -181
  713. data/misc/openlayers/lib/OpenLayers/Layer/Markers.js +0 -187
  714. data/misc/openlayers/lib/OpenLayers/Layer/OSM.js +0 -123
  715. data/misc/openlayers/lib/OpenLayers/Layer/PointGrid.js +0 -299
  716. data/misc/openlayers/lib/OpenLayers/Layer/PointTrack.js +0 -125
  717. data/misc/openlayers/lib/OpenLayers/Layer/SphericalMercator.js +0 -146
  718. data/misc/openlayers/lib/OpenLayers/Layer/TMS.js +0 -202
  719. data/misc/openlayers/lib/OpenLayers/Layer/Text.js +0 -267
  720. data/misc/openlayers/lib/OpenLayers/Layer/TileCache.js +0 -140
  721. data/misc/openlayers/lib/OpenLayers/Layer/UTFGrid.js +0 -184
  722. data/misc/openlayers/lib/OpenLayers/Layer/Vector.js +0 -1007
  723. data/misc/openlayers/lib/OpenLayers/Layer/Vector/RootContainer.js +0 -154
  724. data/misc/openlayers/lib/OpenLayers/Layer/WMS.js +0 -267
  725. data/misc/openlayers/lib/OpenLayers/Layer/WMTS.js +0 -510
  726. data/misc/openlayers/lib/OpenLayers/Layer/WorldWind.js +0 -105
  727. data/misc/openlayers/lib/OpenLayers/Layer/XYZ.js +0 -172
  728. data/misc/openlayers/lib/OpenLayers/Layer/Zoomify.js +0 -260
  729. data/misc/openlayers/lib/OpenLayers/Map.js +0 -2867
  730. data/misc/openlayers/lib/OpenLayers/Marker.js +0 -241
  731. data/misc/openlayers/lib/OpenLayers/Marker/Box.js +0 -120
  732. data/misc/openlayers/lib/OpenLayers/Popup.js +0 -1065
  733. data/misc/openlayers/lib/OpenLayers/Popup/Anchored.js +0 -195
  734. data/misc/openlayers/lib/OpenLayers/Popup/Framed.js +0 -343
  735. data/misc/openlayers/lib/OpenLayers/Popup/FramedCloud.js +0 -227
  736. data/misc/openlayers/lib/OpenLayers/Projection.js +0 -322
  737. data/misc/openlayers/lib/OpenLayers/Protocol.js +0 -291
  738. data/misc/openlayers/lib/OpenLayers/Protocol/CSW.js +0 -30
  739. data/misc/openlayers/lib/OpenLayers/Protocol/CSW/v2_0_2.js +0 -127
  740. data/misc/openlayers/lib/OpenLayers/Protocol/HTTP.js +0 -580
  741. data/misc/openlayers/lib/OpenLayers/Protocol/SOS.js +0 -33
  742. data/misc/openlayers/lib/OpenLayers/Protocol/SOS/v1_0_0.js +0 -133
  743. data/misc/openlayers/lib/OpenLayers/Protocol/Script.js +0 -377
  744. data/misc/openlayers/lib/OpenLayers/Protocol/WFS.js +0 -86
  745. data/misc/openlayers/lib/OpenLayers/Protocol/WFS/v1.js +0 -453
  746. data/misc/openlayers/lib/OpenLayers/Protocol/WFS/v1_0_0.js +0 -44
  747. data/misc/openlayers/lib/OpenLayers/Protocol/WFS/v1_1_0.js +0 -68
  748. data/misc/openlayers/lib/OpenLayers/Renderer.js +0 -432
  749. data/misc/openlayers/lib/OpenLayers/Renderer/Canvas.js +0 -906
  750. data/misc/openlayers/lib/OpenLayers/Renderer/Elements.js +0 -1053
  751. data/misc/openlayers/lib/OpenLayers/Renderer/SVG.js +0 -1012
  752. data/misc/openlayers/lib/OpenLayers/Renderer/VML.js +0 -985
  753. data/misc/openlayers/lib/OpenLayers/Request.js +0 -429
  754. data/misc/openlayers/lib/OpenLayers/Request/XMLHttpRequest.js +0 -458
  755. data/misc/openlayers/lib/OpenLayers/Rule.js +0 -236
  756. data/misc/openlayers/lib/OpenLayers/SingleFile.js +0 -78
  757. data/misc/openlayers/lib/OpenLayers/Spherical.js +0 -67
  758. data/misc/openlayers/lib/OpenLayers/Strategy.js +0 -121
  759. data/misc/openlayers/lib/OpenLayers/Strategy/BBOX.js +0 -290
  760. data/misc/openlayers/lib/OpenLayers/Strategy/Cluster.js +0 -283
  761. data/misc/openlayers/lib/OpenLayers/Strategy/Filter.js +0 -159
  762. data/misc/openlayers/lib/OpenLayers/Strategy/Fixed.js +0 -135
  763. data/misc/openlayers/lib/OpenLayers/Strategy/Paging.js +0 -233
  764. data/misc/openlayers/lib/OpenLayers/Strategy/Refresh.js +0 -141
  765. data/misc/openlayers/lib/OpenLayers/Strategy/Save.js +0 -231
  766. data/misc/openlayers/lib/OpenLayers/Style.js +0 -448
  767. data/misc/openlayers/lib/OpenLayers/Style2.js +0 -112
  768. data/misc/openlayers/lib/OpenLayers/StyleMap.js +0 -161
  769. data/misc/openlayers/lib/OpenLayers/Symbolizer.js +0 -55
  770. data/misc/openlayers/lib/OpenLayers/Symbolizer/Line.js +0 -74
  771. data/misc/openlayers/lib/OpenLayers/Symbolizer/Point.js +0 -157
  772. data/misc/openlayers/lib/OpenLayers/Symbolizer/Polygon.js +0 -88
  773. data/misc/openlayers/lib/OpenLayers/Symbolizer/Raster.js +0 -34
  774. data/misc/openlayers/lib/OpenLayers/Symbolizer/Text.js +0 -70
  775. data/misc/openlayers/lib/OpenLayers/Tile.js +0 -292
  776. data/misc/openlayers/lib/OpenLayers/Tile/Image.js +0 -510
  777. data/misc/openlayers/lib/OpenLayers/Tile/Image/IFrame.js +0 -233
  778. data/misc/openlayers/lib/OpenLayers/Tile/UTFGrid.js +0 -252
  779. data/misc/openlayers/lib/OpenLayers/TileManager.js +0 -462
  780. data/misc/openlayers/lib/OpenLayers/Tween.js +0 -361
  781. data/misc/openlayers/lib/OpenLayers/Util.js +0 -1773
  782. data/misc/openlayers/lib/OpenLayers/Util/vendorPrefix.js +0 -131
  783. data/misc/openlayers/lib/OpenLayers/WPSClient.js +0 -223
  784. data/misc/openlayers/lib/OpenLayers/WPSProcess.js +0 -501
  785. data/misc/openlayers/lib/Rico/Color.js +0 -253
  786. data/misc/openlayers/lib/Rico/Corner.js +0 -339
  787. data/misc/openlayers/lib/Rico/license.js +0 -19
  788. data/misc/openlayers/lib/deprecated.js +0 -5842
  789. data/misc/openlayers/license.txt +0 -27
  790. data/misc/openlayers/licenses/APACHE-2.0.txt +0 -202
  791. data/misc/openlayers/licenses/BSD-LICENSE.txt +0 -28
  792. data/misc/openlayers/licenses/MIT-LICENSE.txt +0 -18
  793. data/misc/openlayers/notes/2.12.md +0 -391
  794. data/misc/openlayers/notes/2.13.md +0 -159
  795. data/misc/openlayers/readme.md +0 -79
  796. data/misc/openlayers/tests/Animation.html +0 -96
  797. data/misc/openlayers/tests/BaseTypes.html +0 -387
  798. data/misc/openlayers/tests/BaseTypes/Bounds.html +0 -738
  799. data/misc/openlayers/tests/BaseTypes/Class.html +0 -350
  800. data/misc/openlayers/tests/BaseTypes/Date.html +0 -191
  801. data/misc/openlayers/tests/BaseTypes/Element.html +0 -195
  802. data/misc/openlayers/tests/BaseTypes/LonLat.html +0 -241
  803. data/misc/openlayers/tests/BaseTypes/Pixel.html +0 -123
  804. data/misc/openlayers/tests/BaseTypes/Size.html +0 -67
  805. data/misc/openlayers/tests/Console.html +0 -39
  806. data/misc/openlayers/tests/Control.html +0 -107
  807. data/misc/openlayers/tests/Control/ArgParser.html +0 -26
  808. data/misc/openlayers/tests/Control/Attribution.html +0 -60
  809. data/misc/openlayers/tests/Control/Button.html +0 -17
  810. data/misc/openlayers/tests/Control/CacheRead.html +0 -108
  811. data/misc/openlayers/tests/Control/CacheWrite.html +0 -90
  812. data/misc/openlayers/tests/Control/DragFeature.html +0 -383
  813. data/misc/openlayers/tests/Control/DragPan.html +0 -104
  814. data/misc/openlayers/tests/Control/DrawFeature.html +0 -160
  815. data/misc/openlayers/tests/Control/EditingToolbar.html +0 -33
  816. data/misc/openlayers/tests/Control/Geolocate.html +0 -129
  817. data/misc/openlayers/tests/Control/GetFeature.html +0 -177
  818. data/misc/openlayers/tests/Control/Graticule.html +0 -66
  819. data/misc/openlayers/tests/Control/KeyboardDefaults.html +0 -173
  820. data/misc/openlayers/tests/Control/LayerSwitcher.html +0 -249
  821. data/misc/openlayers/tests/Control/Measure.html +0 -386
  822. data/misc/openlayers/tests/Control/ModifyFeature.html +0 -828
  823. data/misc/openlayers/tests/Control/MousePosition.html +0 -109
  824. data/misc/openlayers/tests/Control/NavToolbar.html +0 -45
  825. data/misc/openlayers/tests/Control/Navigation.html +0 -200
  826. data/misc/openlayers/tests/Control/NavigationHistory.html +0 -245
  827. data/misc/openlayers/tests/Control/OverviewMap.html +0 -266
  828. data/misc/openlayers/tests/Control/Pan.html +0 -201
  829. data/misc/openlayers/tests/Control/PanPanel.html +0 -61
  830. data/misc/openlayers/tests/Control/PanZoom.html +0 -244
  831. data/misc/openlayers/tests/Control/PanZoomBar.html +0 -245
  832. data/misc/openlayers/tests/Control/Panel.html +0 -382
  833. data/misc/openlayers/tests/Control/Permalink.html +0 -453
  834. data/misc/openlayers/tests/Control/PinchZoom.html +0 -134
  835. data/misc/openlayers/tests/Control/SLDSelect.html +0 -239
  836. data/misc/openlayers/tests/Control/Scale.html +0 -54
  837. data/misc/openlayers/tests/Control/ScaleLine.html +0 -187
  838. data/misc/openlayers/tests/Control/SelectFeature.html +0 -632
  839. data/misc/openlayers/tests/Control/Snapping.html +0 -448
  840. data/misc/openlayers/tests/Control/Split.html +0 -319
  841. data/misc/openlayers/tests/Control/TouchNavigation.html +0 -155
  842. data/misc/openlayers/tests/Control/TransformFeature.html +0 -129
  843. data/misc/openlayers/tests/Control/UTFGrid.html +0 -120
  844. data/misc/openlayers/tests/Control/WMSGetFeatureInfo.html +0 -644
  845. data/misc/openlayers/tests/Control/WMTSGetFeatureInfo.html +0 -334
  846. data/misc/openlayers/tests/Control/Zoom.html +0 -83
  847. data/misc/openlayers/tests/Control/ZoomBox.html +0 -54
  848. data/misc/openlayers/tests/Control/ZoomIn.html +0 -101
  849. data/misc/openlayers/tests/Control/ZoomOut.html +0 -100
  850. data/misc/openlayers/tests/Control/ZoomToMaxExtent.html +0 -102
  851. data/misc/openlayers/tests/Events.html +0 -487
  852. data/misc/openlayers/tests/Events/buttonclick.html +0 -214
  853. data/misc/openlayers/tests/Events/featureclick.html +0 -91
  854. data/misc/openlayers/tests/Extras.html +0 -21
  855. data/misc/openlayers/tests/Feature.html +0 -205
  856. data/misc/openlayers/tests/Feature/Vector.html +0 -170
  857. data/misc/openlayers/tests/Filter.html +0 -31
  858. data/misc/openlayers/tests/Filter/Comparison.html +0 -373
  859. data/misc/openlayers/tests/Filter/FeatureId.html +0 -67
  860. data/misc/openlayers/tests/Filter/Logical.html +0 -144
  861. data/misc/openlayers/tests/Filter/Spatial.html +0 -112
  862. data/misc/openlayers/tests/Format.html +0 -23
  863. data/misc/openlayers/tests/Format/ArcXML.html +0 -277
  864. data/misc/openlayers/tests/Format/ArcXML/Features.html +0 -69
  865. data/misc/openlayers/tests/Format/Atom.html +0 -450
  866. data/misc/openlayers/tests/Format/CQL.html +0 -364
  867. data/misc/openlayers/tests/Format/CSWGetDomain.html +0 -23
  868. data/misc/openlayers/tests/Format/CSWGetDomain/v2_0_2.html +0 -56
  869. data/misc/openlayers/tests/Format/CSWGetDomain/v2_0_2.js +0 -18
  870. data/misc/openlayers/tests/Format/CSWGetRecords.html +0 -23
  871. data/misc/openlayers/tests/Format/CSWGetRecords/v2_0_2.html +0 -88
  872. data/misc/openlayers/tests/Format/CSWGetRecords/v2_0_2.js +0 -50
  873. data/misc/openlayers/tests/Format/EncodedPolyline.html +0 -372
  874. data/misc/openlayers/tests/Format/Filter.html +0 -21
  875. data/misc/openlayers/tests/Format/Filter/v1.html +0 -404
  876. data/misc/openlayers/tests/Format/Filter/v1_0_0.html +0 -295
  877. data/misc/openlayers/tests/Format/Filter/v1_1_0.html +0 -402
  878. data/misc/openlayers/tests/Format/GML.html +0 -462
  879. data/misc/openlayers/tests/Format/GML/cases.js +0 -232
  880. data/misc/openlayers/tests/Format/GML/v2.html +0 -684
  881. data/misc/openlayers/tests/Format/GML/v3.html +0 -828
  882. data/misc/openlayers/tests/Format/GPX.html +0 -179
  883. data/misc/openlayers/tests/Format/GeoJSON.html +0 -468
  884. data/misc/openlayers/tests/Format/GeoRSS.html +0 -122
  885. data/misc/openlayers/tests/Format/JSON.html +0 -53
  886. data/misc/openlayers/tests/Format/KML.html +0 -1437
  887. data/misc/openlayers/tests/Format/OGCExceptionReport.html +0 -100
  888. data/misc/openlayers/tests/Format/OSM.html +0 -115
  889. data/misc/openlayers/tests/Format/OWSCommon/v1_0_0.html +0 -34
  890. data/misc/openlayers/tests/Format/OWSCommon/v1_1_0.html +0 -34
  891. data/misc/openlayers/tests/Format/OWSContext/v0_3_1.html +0 -278
  892. data/misc/openlayers/tests/Format/QueryStringFilter.html +0 -306
  893. data/misc/openlayers/tests/Format/SLD.html +0 -36
  894. data/misc/openlayers/tests/Format/SLD/v1_0_0.html +0 -1028
  895. data/misc/openlayers/tests/Format/SLD/v1_0_0_GeoServer.html +0 -228
  896. data/misc/openlayers/tests/Format/SOSCapabilities/v1_0_0.html +0 -80
  897. data/misc/openlayers/tests/Format/SOSCapabilities/v1_0_0.js +0 -484
  898. data/misc/openlayers/tests/Format/SOSGetFeatureOfInterest.html +0 -80
  899. data/misc/openlayers/tests/Format/SOSGetObservation.html +0 -183
  900. data/misc/openlayers/tests/Format/Text.html +0 -49
  901. data/misc/openlayers/tests/Format/WCSCapabilities.html +0 -43
  902. data/misc/openlayers/tests/Format/WCSCapabilities/v1.html +0 -87
  903. data/misc/openlayers/tests/Format/WCSGetCoverage.html +0 -80
  904. data/misc/openlayers/tests/Format/WFS.html +0 -81
  905. data/misc/openlayers/tests/Format/WFSCapabilities.html +0 -43
  906. data/misc/openlayers/tests/Format/WFSCapabilities/v1.html +0 -179
  907. data/misc/openlayers/tests/Format/WFSDescribeFeatureType.html +0 -436
  908. data/misc/openlayers/tests/Format/WFST.html +0 -23
  909. data/misc/openlayers/tests/Format/WFST/v1.html +0 -455
  910. data/misc/openlayers/tests/Format/WFST/v1_0_0.html +0 -135
  911. data/misc/openlayers/tests/Format/WFST/v1_1_0.html +0 -236
  912. data/misc/openlayers/tests/Format/WKT.html +0 -297
  913. data/misc/openlayers/tests/Format/WMC.html +0 -315
  914. data/misc/openlayers/tests/Format/WMC/v1.html +0 -266
  915. data/misc/openlayers/tests/Format/WMC/v1_1_0.html +0 -86
  916. data/misc/openlayers/tests/Format/WMSCapabilities.html +0 -20
  917. data/misc/openlayers/tests/Format/WMSCapabilities/v1_1_1.html +0 -5209
  918. data/misc/openlayers/tests/Format/WMSCapabilities/v1_1_1_WMSC.html +0 -348
  919. data/misc/openlayers/tests/Format/WMSCapabilities/v1_3_0.html +0 -614
  920. data/misc/openlayers/tests/Format/WMSDescribeLayer.html +0 -65
  921. data/misc/openlayers/tests/Format/WMSGetFeatureInfo.html +0 -319
  922. data/misc/openlayers/tests/Format/WMTSCapabilities.html +0 -20
  923. data/misc/openlayers/tests/Format/WMTSCapabilities/v1_0_0.html +0 -1042
  924. data/misc/openlayers/tests/Format/WPSCapabilities/v1_0_0.html +0 -30
  925. data/misc/openlayers/tests/Format/WPSCapabilities/v1_0_0.js +0 -112
  926. data/misc/openlayers/tests/Format/WPSDescribeProcess.html +0 -206
  927. data/misc/openlayers/tests/Format/WPSExecute.html +0 -549
  928. data/misc/openlayers/tests/Format/XLS/v1_1_0.html +0 -98
  929. data/misc/openlayers/tests/Format/XML.html +0 -900
  930. data/misc/openlayers/tests/Format/XML/VersionedOGC.html +0 -51
  931. data/misc/openlayers/tests/Geometry.html +0 -356
  932. data/misc/openlayers/tests/Geometry/Collection.html +0 -431
  933. data/misc/openlayers/tests/Geometry/Curve.html +0 -157
  934. data/misc/openlayers/tests/Geometry/LineString.html +0 -443
  935. data/misc/openlayers/tests/Geometry/LinearRing.html +0 -362
  936. data/misc/openlayers/tests/Geometry/MultiLineString.html +0 -267
  937. data/misc/openlayers/tests/Geometry/MultiPoint.html +0 -130
  938. data/misc/openlayers/tests/Geometry/MultiPolygon.html +0 -34
  939. data/misc/openlayers/tests/Geometry/Point.html +0 -244
  940. data/misc/openlayers/tests/Geometry/Polygon.html +0 -420
  941. data/misc/openlayers/tests/Handler.html +0 -265
  942. data/misc/openlayers/tests/Handler/Box.html +0 -106
  943. data/misc/openlayers/tests/Handler/Click.html +0 -735
  944. data/misc/openlayers/tests/Handler/Drag.html +0 -603
  945. data/misc/openlayers/tests/Handler/Feature.html +0 -698
  946. data/misc/openlayers/tests/Handler/Hover.html +0 -136
  947. data/misc/openlayers/tests/Handler/Keyboard.html +0 -150
  948. data/misc/openlayers/tests/Handler/MouseWheel.html +0 -182
  949. data/misc/openlayers/tests/Handler/Path.html +0 -1464
  950. data/misc/openlayers/tests/Handler/Pinch.html +0 -285
  951. data/misc/openlayers/tests/Handler/Point.html +0 -600
  952. data/misc/openlayers/tests/Handler/Polygon.html +0 -1161
  953. data/misc/openlayers/tests/Handler/RegularPolygon.html +0 -235
  954. data/misc/openlayers/tests/Icon.html +0 -68
  955. data/misc/openlayers/tests/Kinetic.html +0 -132
  956. data/misc/openlayers/tests/Lang.html +0 -106
  957. data/misc/openlayers/tests/Layer.html +0 -910
  958. data/misc/openlayers/tests/Layer/ArcGIS93Rest.html +0 -324
  959. data/misc/openlayers/tests/Layer/ArcGISCache.html +0 -256
  960. data/misc/openlayers/tests/Layer/ArcGISCache.json +0 -334
  961. data/misc/openlayers/tests/Layer/ArcIMS.html +0 -123
  962. data/misc/openlayers/tests/Layer/Bing.html +0 -200
  963. data/misc/openlayers/tests/Layer/EventPane.html +0 -172
  964. data/misc/openlayers/tests/Layer/FixedZoomLevels.html +0 -137
  965. data/misc/openlayers/tests/Layer/GeoRSS.html +0 -210
  966. data/misc/openlayers/tests/Layer/Google.html +0 -369
  967. data/misc/openlayers/tests/Layer/Google/v3.html +0 -337
  968. data/misc/openlayers/tests/Layer/Grid.html +0 -1593
  969. data/misc/openlayers/tests/Layer/HTTPRequest.html +0 -229
  970. data/misc/openlayers/tests/Layer/Image.html +0 -164
  971. data/misc/openlayers/tests/Layer/KaMap.html +0 -287
  972. data/misc/openlayers/tests/Layer/MapGuide.html +0 -177
  973. data/misc/openlayers/tests/Layer/MapServer.html +0 -238
  974. data/misc/openlayers/tests/Layer/Markers.html +0 -156
  975. data/misc/openlayers/tests/Layer/OSM.html +0 -16
  976. data/misc/openlayers/tests/Layer/PointGrid.html +0 -232
  977. data/misc/openlayers/tests/Layer/PointTrack.html +0 -79
  978. data/misc/openlayers/tests/Layer/SphericalMercator.html +0 -126
  979. data/misc/openlayers/tests/Layer/TMS.html +0 -262
  980. data/misc/openlayers/tests/Layer/Text.html +0 -211
  981. data/misc/openlayers/tests/Layer/TileCache.html +0 -203
  982. data/misc/openlayers/tests/Layer/UTFGrid.html +0 -131
  983. data/misc/openlayers/tests/Layer/Vector.html +0 -879
  984. data/misc/openlayers/tests/Layer/Vector/RootContainer.html +0 -63
  985. data/misc/openlayers/tests/Layer/WMS.html +0 -583
  986. data/misc/openlayers/tests/Layer/WMTS.html +0 -1491
  987. data/misc/openlayers/tests/Layer/WrapDateLine.html +0 -188
  988. data/misc/openlayers/tests/Layer/XYZ.html +0 -266
  989. data/misc/openlayers/tests/Layer/atom-1.0.xml +0 -34
  990. data/misc/openlayers/tests/Layer/data_Layer_Text_textfile.txt +0 -3
  991. data/misc/openlayers/tests/Layer/data_Layer_Text_textfile_2.txt +0 -3
  992. data/misc/openlayers/tests/Layer/data_Layer_Text_textfile_overflow.txt +0 -3
  993. data/misc/openlayers/tests/Layer/georss.txt +0 -378
  994. data/misc/openlayers/tests/Map.html +0 -2255
  995. data/misc/openlayers/tests/Marker.html +0 -163
  996. data/misc/openlayers/tests/Marker/Box.html +0 -183
  997. data/misc/openlayers/tests/OLLoader.js +0 -26
  998. data/misc/openlayers/tests/OpenLayers1.html +0 -18
  999. data/misc/openlayers/tests/OpenLayers2.html +0 -19
  1000. data/misc/openlayers/tests/OpenLayers3.html +0 -19
  1001. data/misc/openlayers/tests/OpenLayers4.html +0 -18
  1002. data/misc/openlayers/tests/OpenLayersJsFiles.html +0 -27
  1003. data/misc/openlayers/tests/Popup.html +0 -219
  1004. data/misc/openlayers/tests/Popup/Anchored.html +0 -37
  1005. data/misc/openlayers/tests/Popup/FramedCloud.html +0 -18
  1006. data/misc/openlayers/tests/Projection.html +0 -87
  1007. data/misc/openlayers/tests/Protocol.html +0 -63
  1008. data/misc/openlayers/tests/Protocol/CSW.html +0 -90
  1009. data/misc/openlayers/tests/Protocol/HTTP.html +0 -842
  1010. data/misc/openlayers/tests/Protocol/SOS.html +0 -57
  1011. data/misc/openlayers/tests/Protocol/Script.html +0 -282
  1012. data/misc/openlayers/tests/Protocol/WFS.html +0 -471
  1013. data/misc/openlayers/tests/README.txt +0 -16
  1014. data/misc/openlayers/tests/Renderer.html +0 -96
  1015. data/misc/openlayers/tests/Renderer/Canvas.html +0 -501
  1016. data/misc/openlayers/tests/Renderer/Elements.html +0 -651
  1017. data/misc/openlayers/tests/Renderer/SVG.html +0 -441
  1018. data/misc/openlayers/tests/Renderer/VML.html +0 -454
  1019. data/misc/openlayers/tests/Request.html +0 -524
  1020. data/misc/openlayers/tests/Request/XMLHttpRequest.html +0 -59
  1021. data/misc/openlayers/tests/Rule.html +0 -123
  1022. data/misc/openlayers/tests/SingleFile1.html +0 -15
  1023. data/misc/openlayers/tests/SingleFile2.html +0 -15
  1024. data/misc/openlayers/tests/SingleFile3.html +0 -15
  1025. data/misc/openlayers/tests/Strategy.html +0 -94
  1026. data/misc/openlayers/tests/Strategy/BBOX.html +0 -361
  1027. data/misc/openlayers/tests/Strategy/Cluster.html +0 -148
  1028. data/misc/openlayers/tests/Strategy/Filter.html +0 -135
  1029. data/misc/openlayers/tests/Strategy/Fixed.html +0 -253
  1030. data/misc/openlayers/tests/Strategy/Paging.html +0 -113
  1031. data/misc/openlayers/tests/Strategy/Refresh.html +0 -177
  1032. data/misc/openlayers/tests/Strategy/Save.html +0 -127
  1033. data/misc/openlayers/tests/Style.html +0 -426
  1034. data/misc/openlayers/tests/Style2.html +0 -56
  1035. data/misc/openlayers/tests/StyleMap.html +0 -44
  1036. data/misc/openlayers/tests/Symbolizer.html +0 -31
  1037. data/misc/openlayers/tests/Symbolizer/Line.html +0 -42
  1038. data/misc/openlayers/tests/Symbolizer/Point.html +0 -52
  1039. data/misc/openlayers/tests/Symbolizer/Polygon.html +0 -44
  1040. data/misc/openlayers/tests/Symbolizer/Raster.html +0 -32
  1041. data/misc/openlayers/tests/Symbolizer/Text.html +0 -42
  1042. data/misc/openlayers/tests/Test.AnotherWay.baseadditions.js +0 -191
  1043. data/misc/openlayers/tests/Test.AnotherWay.css +0 -243
  1044. data/misc/openlayers/tests/Test.AnotherWay.geom_eq.js +0 -139
  1045. data/misc/openlayers/tests/Test.AnotherWay.js +0 -2498
  1046. data/misc/openlayers/tests/Test.AnotherWay.xml_eq.js +0 -311
  1047. data/misc/openlayers/tests/Tile.html +0 -130
  1048. data/misc/openlayers/tests/Tile/Image.html +0 -490
  1049. data/misc/openlayers/tests/Tile/Image/IFrame.html +0 -183
  1050. data/misc/openlayers/tests/Tile/UTFGrid.html +0 -306
  1051. data/misc/openlayers/tests/TileManager.html +0 -137
  1052. data/misc/openlayers/tests/Tween.html +0 -116
  1053. data/misc/openlayers/tests/Util.html +0 -1180
  1054. data/misc/openlayers/tests/Util/vendorPrefix.html +0 -117
  1055. data/misc/openlayers/tests/Util_common.js +0 -64
  1056. data/misc/openlayers/tests/Util_w3c.html +0 -35
  1057. data/misc/openlayers/tests/WPSClient.html +0 -108
  1058. data/misc/openlayers/tests/WPSProcess.html +0 -188
  1059. data/misc/openlayers/tests/atom-1.0.xml +0 -34
  1060. data/misc/openlayers/tests/auto-tests.html +0 -2447
  1061. data/misc/openlayers/tests/data/geos_wkt_intersects.js +0 -495
  1062. data/misc/openlayers/tests/data/osm.js +0 -14
  1063. data/misc/openlayers/tests/data/utfgrid/bio_utfgrid/1/0/0.json +0 -1
  1064. data/misc/openlayers/tests/data/utfgrid/bio_utfgrid/1/0/1.json +0 -1
  1065. data/misc/openlayers/tests/data/utfgrid/bio_utfgrid/1/0/2.json +0 -1
  1066. data/misc/openlayers/tests/data/utfgrid/bio_utfgrid/1/1/0.json +0 -1
  1067. data/misc/openlayers/tests/data/utfgrid/bio_utfgrid/1/1/1.json +0 -1
  1068. data/misc/openlayers/tests/data/utfgrid/bio_utfgrid/1/1/2.json +0 -1
  1069. data/misc/openlayers/tests/data/utfgrid/bio_utfgrid/1/2/0.json +0 -1
  1070. data/misc/openlayers/tests/data/utfgrid/bio_utfgrid/1/2/1.json +0 -1
  1071. data/misc/openlayers/tests/data/utfgrid/bio_utfgrid/1/2/2.json +0 -1
  1072. data/misc/openlayers/tests/data/utfgrid/demo-1.1.json +0 -1
  1073. data/misc/openlayers/tests/data/utfgrid/world_utfgrid/1/0/0.json +0 -1
  1074. data/misc/openlayers/tests/data/utfgrid/world_utfgrid/1/0/1.json +0 -1
  1075. data/misc/openlayers/tests/data/utfgrid/world_utfgrid/1/0/2.json +0 -1
  1076. data/misc/openlayers/tests/data/utfgrid/world_utfgrid/1/1/0.json +0 -1
  1077. data/misc/openlayers/tests/data/utfgrid/world_utfgrid/1/1/1.json +0 -1
  1078. data/misc/openlayers/tests/data/utfgrid/world_utfgrid/1/1/2.json +0 -1
  1079. data/misc/openlayers/tests/data/utfgrid/world_utfgrid/1/2/0.json +0 -1
  1080. data/misc/openlayers/tests/data/utfgrid/world_utfgrid/1/2/1.json +0 -1
  1081. data/misc/openlayers/tests/data/utfgrid/world_utfgrid/1/2/2.json +0 -1
  1082. data/misc/openlayers/tests/data_Layer_Text_textfile.txt +0 -3
  1083. data/misc/openlayers/tests/data_Layer_Text_textfile_2.txt +0 -3
  1084. data/misc/openlayers/tests/data_Layer_Text_textfile_overflow.txt +0 -3
  1085. data/misc/openlayers/tests/deprecated/Ajax.html +0 -28
  1086. data/misc/openlayers/tests/deprecated/BaseTypes/Class.html +0 -142
  1087. data/misc/openlayers/tests/deprecated/BaseTypes/Element.html +0 -56
  1088. data/misc/openlayers/tests/deprecated/Control/MouseToolbar.html +0 -60
  1089. data/misc/openlayers/tests/deprecated/Geometry/Rectangle.html +0 -77
  1090. data/misc/openlayers/tests/deprecated/Layer/GML.html +0 -61
  1091. data/misc/openlayers/tests/deprecated/Layer/MapServer.html +0 -59
  1092. data/misc/openlayers/tests/deprecated/Layer/MapServer/Untiled.html +0 -158
  1093. data/misc/openlayers/tests/deprecated/Layer/WFS.html +0 -178
  1094. data/misc/openlayers/tests/deprecated/Layer/WMS.html +0 -60
  1095. data/misc/openlayers/tests/deprecated/Layer/WMS/Post.html +0 -89
  1096. data/misc/openlayers/tests/deprecated/Layer/Yahoo.html +0 -121
  1097. data/misc/openlayers/tests/deprecated/Layer/mice.xml +0 -156
  1098. data/misc/openlayers/tests/deprecated/Layer/owls.xml +0 -156
  1099. data/misc/openlayers/tests/deprecated/Popup/AnchoredBubble.html +0 -61
  1100. data/misc/openlayers/tests/deprecated/Protocol/SQL.html +0 -24
  1101. data/misc/openlayers/tests/deprecated/Protocol/SQL/Gears.html +0 -474
  1102. data/misc/openlayers/tests/deprecated/Renderer/SVG2.html +0 -399
  1103. data/misc/openlayers/tests/deprecated/Tile/WFS.html +0 -215
  1104. data/misc/openlayers/tests/deprecated/Util.html +0 -20
  1105. data/misc/openlayers/tests/georss.txt +0 -378
  1106. data/misc/openlayers/tests/grid_inittiles.html +0 -30
  1107. data/misc/openlayers/tests/index.html +0 -6
  1108. data/misc/openlayers/tests/list-tests.html +0 -260
  1109. data/misc/openlayers/tests/manual/ajax.html +0 -49
  1110. data/misc/openlayers/tests/manual/ajax.txt +0 -1
  1111. data/misc/openlayers/tests/manual/alloverlays-mixed.html +0 -55
  1112. data/misc/openlayers/tests/manual/arcims-2117.html +0 -103
  1113. data/misc/openlayers/tests/manual/arkansas.rss +0 -9
  1114. data/misc/openlayers/tests/manual/big-georss.html +0 -33
  1115. data/misc/openlayers/tests/manual/box-quirks.html +0 -52
  1116. data/misc/openlayers/tests/manual/box-strict.html +0 -46
  1117. data/misc/openlayers/tests/manual/clip-features-svg.html +0 -128
  1118. data/misc/openlayers/tests/manual/dateline-sketch.html +0 -66
  1119. data/misc/openlayers/tests/manual/dateline-smallextent.html +0 -61
  1120. data/misc/openlayers/tests/manual/draw-feature.html +0 -73
  1121. data/misc/openlayers/tests/manual/feature-handler.html +0 -126
  1122. data/misc/openlayers/tests/manual/geodesic.html +0 -160
  1123. data/misc/openlayers/tests/manual/geojson-geomcoll-reprojection.html +0 -74
  1124. data/misc/openlayers/tests/manual/google-fullscreen-overlay.html +0 -54
  1125. data/misc/openlayers/tests/manual/google-panning.html +0 -122
  1126. data/misc/openlayers/tests/manual/google-resize.html +0 -55
  1127. data/misc/openlayers/tests/manual/google-tilt.html +0 -37
  1128. data/misc/openlayers/tests/manual/google-v3-resize.html +0 -54
  1129. data/misc/openlayers/tests/manual/loadend.html +0 -73
  1130. data/misc/openlayers/tests/manual/map-events.html +0 -38
  1131. data/misc/openlayers/tests/manual/memory/Marker-2258.html +0 -60
  1132. data/misc/openlayers/tests/manual/memory/PanZoom-2323.html +0 -41
  1133. data/misc/openlayers/tests/manual/memory/RemoveChild-2170.html +0 -56
  1134. data/misc/openlayers/tests/manual/memory/VML-2170.html +0 -49
  1135. data/misc/openlayers/tests/manual/multiple-google-layers.html +0 -135
  1136. data/misc/openlayers/tests/manual/overviewmap-projection.html +0 -70
  1137. data/misc/openlayers/tests/manual/page-position.html +0 -103
  1138. data/misc/openlayers/tests/manual/pan-redraw-svg.html +0 -58
  1139. data/misc/openlayers/tests/manual/popup-keepInMap.html +0 -100
  1140. data/misc/openlayers/tests/manual/reflow.html +0 -59
  1141. data/misc/openlayers/tests/manual/renderedDimensions.html +0 -113
  1142. data/misc/openlayers/tests/manual/select-feature-right-click.html +0 -86
  1143. data/misc/openlayers/tests/manual/select-feature.html +0 -75
  1144. data/misc/openlayers/tests/manual/tiles-loading.html +0 -122
  1145. data/misc/openlayers/tests/manual/tween.html +0 -82
  1146. data/misc/openlayers/tests/manual/vector-features-performance.html +0 -149
  1147. data/misc/openlayers/tests/manual/vector-layer-zindex.html +0 -143
  1148. data/misc/openlayers/tests/mice.xml +0 -156
  1149. data/misc/openlayers/tests/node.js/mockdom.js +0 -104
  1150. data/misc/openlayers/tests/node.js/node-tests.cfg +0 -12
  1151. data/misc/openlayers/tests/node.js/node.js +0 -1
  1152. data/misc/openlayers/tests/node.js/run-test.js +0 -26
  1153. data/misc/openlayers/tests/node.js/run.sh +0 -10
  1154. data/misc/openlayers/tests/owls.xml +0 -156
  1155. data/misc/openlayers/tests/run-tests.html +0 -155
  1156. data/misc/openlayers/tests/selenium/remotecontrol/config.cfg +0 -48
  1157. data/misc/openlayers/tests/selenium/remotecontrol/selenium.py +0 -1846
  1158. data/misc/openlayers/tests/selenium/remotecontrol/setup.txt +0 -8
  1159. data/misc/openlayers/tests/selenium/remotecontrol/test_ol.py +0 -95
  1160. data/misc/openlayers/tests/speed/geometry.html +0 -43
  1161. data/misc/openlayers/tests/speed/string_format.html +0 -29
  1162. data/misc/openlayers/tests/speed/vector-renderers.html +0 -25
  1163. data/misc/openlayers/tests/speed/vector-renderers.js +0 -70
  1164. data/misc/openlayers/tests/speed/wmc_speed.html +0 -30
  1165. data/misc/openlayers/tests/speed/wmscaps.html +0 -52
  1166. data/misc/openlayers/tests/speed/wmscaps.js +0 -4956
  1167. data/misc/openlayers/tests/speed/wmscaps.xml +0 -4954
  1168. data/misc/openlayers/tests/throws.js +0 -82
  1169. data/misc/openlayers/theme/default/google.css +0 -9
  1170. data/misc/openlayers/theme/default/google.tidy.css +0 -1
  1171. data/misc/openlayers/theme/default/ie6-style.css +0 -10
  1172. data/misc/openlayers/theme/default/ie6-style.tidy.css +0 -1
  1173. data/misc/openlayers/theme/default/img/add_point_off.png +0 -0
  1174. data/misc/openlayers/theme/default/img/add_point_on.png +0 -0
  1175. data/misc/openlayers/theme/default/img/blank.gif +0 -0
  1176. data/misc/openlayers/theme/default/img/close.gif +0 -0
  1177. data/misc/openlayers/theme/default/img/drag-rectangle-off.png +0 -0
  1178. data/misc/openlayers/theme/default/img/drag-rectangle-on.png +0 -0
  1179. data/misc/openlayers/theme/default/img/draw_line_off.png +0 -0
  1180. data/misc/openlayers/theme/default/img/draw_line_on.png +0 -0
  1181. data/misc/openlayers/theme/default/img/draw_point_off.png +0 -0
  1182. data/misc/openlayers/theme/default/img/draw_point_on.png +0 -0
  1183. data/misc/openlayers/theme/default/img/draw_polygon_off.png +0 -0
  1184. data/misc/openlayers/theme/default/img/draw_polygon_on.png +0 -0
  1185. data/misc/openlayers/theme/default/img/editing_tool_bar.png +0 -0
  1186. data/misc/openlayers/theme/default/img/move_feature_off.png +0 -0
  1187. data/misc/openlayers/theme/default/img/move_feature_on.png +0 -0
  1188. data/misc/openlayers/theme/default/img/navigation_history.png +0 -0
  1189. data/misc/openlayers/theme/default/img/overview_replacement.gif +0 -0
  1190. data/misc/openlayers/theme/default/img/pan-panel-NOALPHA.png +0 -0
  1191. data/misc/openlayers/theme/default/img/pan-panel.png +0 -0
  1192. data/misc/openlayers/theme/default/img/pan_off.png +0 -0
  1193. data/misc/openlayers/theme/default/img/pan_on.png +0 -0
  1194. data/misc/openlayers/theme/default/img/panning-hand-off.png +0 -0
  1195. data/misc/openlayers/theme/default/img/panning-hand-on.png +0 -0
  1196. data/misc/openlayers/theme/default/img/remove_point_off.png +0 -0
  1197. data/misc/openlayers/theme/default/img/remove_point_on.png +0 -0
  1198. data/misc/openlayers/theme/default/img/ruler.png +0 -0
  1199. data/misc/openlayers/theme/default/img/save_features_off.png +0 -0
  1200. data/misc/openlayers/theme/default/img/save_features_on.png +0 -0
  1201. data/misc/openlayers/theme/default/img/view_next_off.png +0 -0
  1202. data/misc/openlayers/theme/default/img/view_next_on.png +0 -0
  1203. data/misc/openlayers/theme/default/img/view_previous_off.png +0 -0
  1204. data/misc/openlayers/theme/default/img/view_previous_on.png +0 -0
  1205. data/misc/openlayers/theme/default/img/zoom-panel-NOALPHA.png +0 -0
  1206. data/misc/openlayers/theme/default/img/zoom-panel.png +0 -0
  1207. data/misc/openlayers/theme/default/style.css +0 -516
  1208. data/misc/openlayers/theme/default/style.mobile.css +0 -70
  1209. data/misc/openlayers/theme/default/style.mobile.tidy.css +0 -1
  1210. data/misc/openlayers/theme/default/style.tidy.css +0 -1
  1211. data/misc/openlayers/tools/BeautifulSoup.py +0 -1767
  1212. data/misc/openlayers/tools/README.txt +0 -14
  1213. data/misc/openlayers/tools/closure_library_jscompiler.py +0 -71
  1214. data/misc/openlayers/tools/closure_ws.py +0 -28
  1215. data/misc/openlayers/tools/exampleparser.py +0 -251
  1216. data/misc/openlayers/tools/jsmin.c +0 -272
  1217. data/misc/openlayers/tools/jsmin.py +0 -216
  1218. data/misc/openlayers/tools/mergejs.py +0 -287
  1219. data/misc/openlayers/tools/minimize.py +0 -47
  1220. data/misc/openlayers/tools/oldot.py +0 -43
  1221. data/misc/openlayers/tools/release.sh +0 -71
  1222. data/misc/openlayers/tools/shrinksafe.py +0 -54
  1223. data/misc/openlayers/tools/toposort.py +0 -35
  1224. data/misc/openlayers/tools/uglify_js.py +0 -35
  1225. data/misc/openlayers/tools/update_dev_dir.sh +0 -103
@@ -1,70 +0,0 @@
1
- div.olControlZoom {
2
- position: absolute;
3
- top: 8px;
4
- left: 8px;
5
- background: rgba(255,255,255,0.4);
6
- border-radius: 4px;
7
- padding: 2px;
8
- }
9
- * {
10
- -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
11
- }
12
- div.olControlZoom a {
13
- display: block;
14
- margin: 1px;
15
- padding: 0;
16
- color: white;
17
- font-size: 28px;
18
- font-family: sans-serif;
19
- font-weight: bold;
20
- text-decoration: none;
21
- text-align: center;
22
- height: 32px;
23
- width: 32px;
24
- line-height: 28px;
25
- text-shadow: 0 0 3px rgba(0,0,0,0.8);
26
- background: #130085; /* fallback for IE - IE6 requires background shorthand*/
27
- background: rgba(0, 60, 136, 0.5);
28
- filter: alpha(opacity=80);
29
- }
30
- a.olControlZoomIn {
31
- border-radius: 4px 4px 0 0;
32
- }
33
- a.olControlZoomOut {
34
- border-radius: 0 0 4px 4px;
35
- }
36
- div.olControlZoom a:hover {
37
- background: #130085; /* fallback for IE */
38
- background: rgba(0, 60, 136, 0.7);
39
- filter: alpha(opacity=100);
40
- }
41
- @media only screen and (max-width: 600px) {
42
- div.olControlZoom a:hover {
43
- background: rgba(0, 60, 136, 0.5);
44
- }
45
- }
46
- div.olMapViewport {
47
- -ms-touch-action: none;
48
- }
49
- .olLayerGrid .olTileImage {
50
- -webkit-transition: opacity 0.2s linear;
51
- -moz-transition: opacity 0.2s linear;
52
- -o-transition: opacity 0.2s linear;
53
- transition: opacity 0.2s linear;
54
- }
55
- /* Turn on GPU support where available */
56
- .olTileImage {
57
- -webkit-transform: translateZ(0);
58
- -moz-transform: translateZ(0);
59
- -o-transform: translateZ(0);
60
- -ms-transform: translateZ(0);
61
- transform: translateZ(0);
62
- -webkit-backface-visibility: hidden;
63
- -moz-backface-visibility: hidden;
64
- -ms-backface-visibility: hidden;
65
- backface-visibility: hidden;
66
- -webkit-perspective: 1000;
67
- -moz-perspective: 1000;
68
- -ms-perspective: 1000;
69
- perspective: 1000;
70
- }
@@ -1 +0,0 @@
1
- div.olControlZoom{position:absolute;top:8px;left:8px;background:rgba(255,255,255,0.4);border-radius:4px;padding:2px;}*{-webkit-tap-highlight-color:rgba(0,0,0,0);}div.olControlZoom a{display:block;color:#FFF;font-size:28px;font-family:sans-serif;font-weight:700;text-decoration:none;text-align:center;height:32px;width:32px;line-height:28px;text-shadow:0 0 3px rgba(0,0,0,0.8);background:rgba(0,60,136,0.5);filter:alpha(opacity=80);margin:1px;padding:0;}a.olControlZoomIn{border-radius:4px 4px 0 0;}a.olControlZoomOut{border-radius:0 0 4px 4px;}div.olControlZoom a:hover{background:rgba(0,60,136,0.7);filter:alpha(opacity=100);}div.olMapViewport{-ms-touch-action:none;}.olLayerGrid .olTileImage{-webkit-transition:opacity .2s linear;-moz-transition:opacity .2s linear;-o-transition:opacity .2s linear;transition:opacity .2s linear;}.olTileImage{-webkit-transform:translateZ(0);-moz-transform:translateZ(0);-o-transform:translateZ(0);-ms-transform:translateZ(0);transform:translateZ(0);-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000;-moz-perspective:1000;-ms-perspective:1000;perspective:1000;}@media only screen and max-width 600px{div.olControlZoom a:hover{background:rgba(0,60,136,0.5);}}
@@ -1 +0,0 @@
1
- div.olMap{z-index:0;cursor:default;margin:0!important;padding:0!important;}div.olMapViewport{text-align:left;-ms-touch-action:none;}.olLayerGoogleCopyright{left:2px;bottom:2px;}.olLayerGoogleV3.olLayerGoogleCopyright{right:auto!important;}.olLayerGooglePoweredBy{left:2px;bottom:15px;}.olLayerGoogleV3.olLayerGooglePoweredBy{bottom:15px!important;}.olForeignContainer{opacity:1!important;}.olControlAttribution{font-size:smaller;right:3px;bottom:4.5em;position:absolute;display:block;}.olControlScale{right:3px;bottom:3em;display:block;position:absolute;font-size:smaller;}.olControlScaleLine{display:block;position:absolute;left:10px;bottom:15px;font-size:xx-small;}.olControlScaleLineBottom{border:solid 2px #000;border-bottom:none;margin-top:-2px;text-align:center;}.olControlScaleLineTop{border:solid 2px #000;border-top:none;text-align:center;}.olControlPermalink{right:3px;bottom:1.5em;display:block;position:absolute;font-size:smaller;}div.olControlMousePosition{bottom:0;right:3px;display:block;position:absolute;font-family:Arial;font-size:smaller;}.olControlOverviewMapContainer{position:absolute;bottom:0;right:0;}.olControlOverviewMapElement{background-color:#00008B;-moz-border-radius:1em 0 0;padding:10px 18px 10px 10px;}.olControlOverviewMapMinimizeButton,.olControlOverviewMapMaximizeButton{height:18px;width:18px;right:0;bottom:80px;cursor:pointer;}.olControlOverviewMapExtentRectangle{overflow:hidden;background-image:url(img/blank.gif);cursor:move;border:2px dotted red;}.olControlOverviewMapRectReplacement{overflow:hidden;cursor:move;background-image:url(img/overview_replacement.gif);background-repeat:no-repeat;background-position:center;}.olLayerGeoRSSDescription{float:left;width:100%;overflow:auto;font-size:1em;}.olLayerGeoRSSClose{float:right;color:gray;font-size:1.2em;margin-right:6px;font-family:sans-serif;}.olLayerGeoRSSTitle{float:left;font-size:1.2em;}.olControlNavigationHistory{background-image:url(img/navigation_history.png);background-repeat:no-repeat;width:24px;height:24px;}.olControlNavigationHistoryPreviousItemActive{background-position:0 0;}.olControlNavigationHistoryPreviousItemInactive{background-position:0 -24px;}.olControlNavigationHistoryNextItemActive{background-position:-24px 0;}.olControlNavigationHistoryNextItemInactive{background-position:-24px -24px;}div.olControlSaveFeaturesItemActive{background-image:url(img/save_features_on.png);background-repeat:no-repeat;background-position:0 1px;}div.olControlSaveFeaturesItemInactive{background-image:url(img/save_features_off.png);background-repeat:no-repeat;background-position:0 1px;}.olHandlerBoxZoomBox{border:2px solid red;position:absolute;background-color:#FFF;opacity:.5;font-size:1px;filter:alpha(opacity=50);}.olHandlerBoxSelectFeature{border:2px solid blue;position:absolute;background-color:#FFF;opacity:.5;font-size:1px;filter:alpha(opacity=50);}.olControlPanPanel{top:10px;left:5px;}.olControlPanPanel div{background-image:url(img/pan-panel.png);height:18px;width:18px;cursor:pointer;position:absolute;}.olControlPanPanel .olControlPanNorthItemInactive{top:0;left:9px;background-position:0 0;}.olControlPanPanel .olControlPanSouthItemInactive{top:36px;left:9px;background-position:18px 0;}.olControlPanPanel .olControlPanWestItemInactive{position:absolute;top:18px;left:0;background-position:0 18px;}.olControlPanPanel .olControlPanEastItemInactive{top:18px;left:18px;background-position:18px 18px;}.olControlZoomPanel{top:71px;left:14px;}.olControlZoomPanel div{background-image:url(img/zoom-panel.png);position:absolute;height:18px;width:18px;cursor:pointer;}.olControlZoomPanel .olControlZoomInItemInactive{top:0;left:0;background-position:0 0;}.olControlZoomPanel .olControlZoomToMaxExtentItemInactive{top:18px;left:0;background-position:0 -18px;}.olControlZoomPanel .olControlZoomOutItemInactive{top:36px;left:0;background-position:0 18px;}.olControlPanZoomBar div{font-size:1px;}.olPopupCloseBox{background:url(img/close.gif) no-repeat;cursor:pointer;}.olImageLoadError{background-color:#FFC0CB;opacity:.5;filter:alpha(opacity=50);}.olCursorWait{cursor:wait;}.olDrawBox{cursor:crosshair;}.olControlDragFeatureActive.olControlDragFeatureOver.olDragDown{cursor:0;}.olControlLayerSwitcher{position:absolute;top:25px;right:0;width:20em;font-family:sans-serif;font-weight:700;margin-top:3px;margin-left:3px;margin-bottom:3px;font-size:smaller;color:#FFF;background-color:transparent;}.olControlLayerSwitcher .layersDiv{background-color:#00008B;padding:5px 10px;}.olControlLayerSwitcher .layersDiv .baseLbl,.olControlLayerSwitcher .layersDiv .dataLbl{margin-top:3px;margin-left:3px;margin-bottom:3px;}.olControlLayerSwitcher .layersDiv .baseLayersDiv,.olControlLayerSwitcher .layersDiv .dataLayersDiv{padding-left:10px;}.olControlLayerSwitcher .maximizeDiv,.olControlLayerSwitcher .minimizeDiv{width:18px;height:18px;top:5px;right:0;cursor:pointer;}.olBingAttribution{color:#DDD;}span.olGoogleAttribution a{color:#77C;}.olControlNavToolbar,.olControlEditingToolbar{margin:5px 5px 0 0;}.olControlNavToolbar div,.olControlEditingToolbar div{background-image:url(img/editing_tool_bar.png);background-repeat:no-repeat;width:24px;height:22px;cursor:pointer;margin:0 0 5px 5px;}.olControlEditingToolbar{right:0;top:0;}.olControlNavToolbar{top:295px;left:9px;}.olControlEditingToolbar div{float:right;}.olControlNavToolbar .olControlNavigationItemInactive,.olControlEditingToolbar .olControlNavigationItemInactive{background-position:-103px -1px;}.olControlNavToolbar .olControlNavigationItemActive,.olControlEditingToolbar .olControlNavigationItemActive{background-position:-103px -24px;}.olControlNavToolbar .olControlZoomBoxItemInactive{background-position:-128px -1px;}.olControlNavToolbar .olControlZoomBoxItemActive{background-position:-128px -24px;}.olControlEditingToolbar .olControlDrawFeaturePointItemInactive{background-position:-77px -1px;}.olControlEditingToolbar .olControlDrawFeaturePointItemActive{background-position:-77px -24px;}.olControlEditingToolbar .olControlDrawFeaturePathItemInactive{background-position:-51px -1px;}.olControlEditingToolbar .olControlDrawFeaturePathItemActive{background-position:-51px -24px;}.olControlEditingToolbar .olControlDrawFeaturePolygonItemInactive{background-position:-26px -1px;}.olControlEditingToolbar .olControlDrawFeaturePolygonItemActive{background-position:-26px -24px;}div.olControlZoom{position:absolute;top:8px;left:8px;background:rgba(255,255,255,0.4);border-radius:4px;padding:2px;}div.olControlZoom a{display:block;color:#FFF;font-size:18px;font-family:'Lucida Grande', Verdana, Geneva, Lucida, Arial, Helvetica, sans-serif;font-weight:700;text-decoration:none;text-align:center;height:22px;width:22px;line-height:19px;background:rgba(0,60,136,0.5);filter:alpha(opacity=80);margin:1px;padding:0;}div.olControlZoom a:hover{background:rgba(0,60,136,0.7);filter:alpha(opacity=100);}a.olControlZoomIn{border-radius:4px 4px 0 0;}a.olControlZoomOut{border-radius:0 0 4px 4px;}.olLayerGrid .olTileImage{-webkit-transition:opacity .2s linear;-moz-transition:opacity .2s linear;-o-transition:opacity .2s linear;transition:opacity .2s linear;}.olTileImage{-webkit-transform:translateZ(0);-moz-transform:translateZ(0);-o-transform:translateZ(0);-ms-transform:translateZ(0);transform:translateZ(0);-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000;-moz-perspective:1000;-ms-perspective:1000;perspective:1000;}.olTileReplacing{display:none;}img.olTileImage{max-width:none;}div.olLayerDiv,.olControlNoSelect{-khtml-user-select:none;-moz-user-select:none;}.olPopupContent,.olFramedCloudPopupContent{overflow:auto;padding:5px;}.olDragDown,.olControlDragFeatureOver{cursor:move;}.olBingAttribution.road,.olGoogleAttribution{color:#333;}.olGoogleAttribution.hybrid,.olGoogleAttribution.satellite,span.olGoogleAttribution.hybrid a,span.olGoogleAttribution.satellite a{color:#EEE;}@media only screen and max-width 600px{div.olControlZoom a:hover{background:rgba(0,60,136,0.5);}}
@@ -1,1767 +0,0 @@
1
- """Beautiful Soup
2
- Elixir and Tonic
3
- "The Screen-Scraper's Friend"
4
- http://www.crummy.com/software/BeautifulSoup/
5
-
6
- Beautiful Soup parses a (possibly invalid) XML or HTML document into a
7
- tree representation. It provides methods and Pythonic idioms that make
8
- it easy to navigate, search, and modify the tree.
9
-
10
- A well-formed XML/HTML document yields a well-formed data
11
- structure. An ill-formed XML/HTML document yields a correspondingly
12
- ill-formed data structure. If your document is only locally
13
- well-formed, you can use this library to find and process the
14
- well-formed part of it. The BeautifulSoup class
15
-
16
- Beautiful Soup works with Python 2.2 and up. It has no external
17
- dependencies, but you'll have more success at converting data to UTF-8
18
- if you also install these three packages:
19
-
20
- * chardet, for auto-detecting character encodings
21
- http://chardet.feedparser.org/
22
- * cjkcodecs and iconv_codec, which add more encodings to the ones supported
23
- by stock Python.
24
- http://cjkpython.i18n.org/
25
-
26
- Beautiful Soup defines classes for two main parsing strategies:
27
-
28
- * BeautifulStoneSoup, for parsing XML, SGML, or your domain-specific
29
- language that kind of looks like XML.
30
-
31
- * BeautifulSoup, for parsing run-of-the-mill HTML code, be it valid
32
- or invalid. This class has web browser-like heuristics for
33
- obtaining a sensible parse tree in the face of common HTML errors.
34
-
35
- Beautiful Soup also defines a class (UnicodeDammit) for autodetecting
36
- the encoding of an HTML or XML document, and converting it to
37
- Unicode. Much of this code is taken from Mark Pilgrim's Universal Feed Parser.
38
-
39
- For more than you ever wanted to know about Beautiful Soup, see the
40
- documentation:
41
- http://www.crummy.com/software/BeautifulSoup/documentation.html
42
-
43
- """
44
- from __future__ import generators
45
-
46
- __author__ = "Leonard Richardson (leonardr@segfault.org)"
47
- __version__ = "3.0.4"
48
- __copyright__ = "Copyright (c) 2004-2007 Leonard Richardson"
49
- __license__ = "PSF"
50
-
51
- from sgmllib import SGMLParser, SGMLParseError
52
- import codecs
53
- import types
54
- import re
55
- import sgmllib
56
- try:
57
- from htmlentitydefs import name2codepoint
58
- except ImportError:
59
- name2codepoint = {}
60
-
61
- #This hack makes Beautiful Soup able to parse XML with namespaces
62
- sgmllib.tagfind = re.compile('[a-zA-Z][-_.:a-zA-Z0-9]*')
63
-
64
- DEFAULT_OUTPUT_ENCODING = "utf-8"
65
-
66
- # First, the classes that represent markup elements.
67
-
68
- class PageElement:
69
- """Contains the navigational information for some part of the page
70
- (either a tag or a piece of text)"""
71
-
72
- def setup(self, parent=None, previous=None):
73
- """Sets up the initial relations between this element and
74
- other elements."""
75
- self.parent = parent
76
- self.previous = previous
77
- self.next = None
78
- self.previousSibling = None
79
- self.nextSibling = None
80
- if self.parent and self.parent.contents:
81
- self.previousSibling = self.parent.contents[-1]
82
- self.previousSibling.nextSibling = self
83
-
84
- def replaceWith(self, replaceWith):
85
- oldParent = self.parent
86
- myIndex = self.parent.contents.index(self)
87
- if hasattr(replaceWith, 'parent') and replaceWith.parent == self.parent:
88
- # We're replacing this element with one of its siblings.
89
- index = self.parent.contents.index(replaceWith)
90
- if index and index < myIndex:
91
- # Furthermore, it comes before this element. That
92
- # means that when we extract it, the index of this
93
- # element will change.
94
- myIndex = myIndex - 1
95
- self.extract()
96
- oldParent.insert(myIndex, replaceWith)
97
-
98
- def extract(self):
99
- """Destructively rips this element out of the tree."""
100
- if self.parent:
101
- try:
102
- self.parent.contents.remove(self)
103
- except ValueError:
104
- pass
105
-
106
- #Find the two elements that would be next to each other if
107
- #this element (and any children) hadn't been parsed. Connect
108
- #the two.
109
- lastChild = self._lastRecursiveChild()
110
- nextElement = lastChild.next
111
-
112
- if self.previous:
113
- self.previous.next = nextElement
114
- if nextElement:
115
- nextElement.previous = self.previous
116
- self.previous = None
117
- lastChild.next = None
118
-
119
- self.parent = None
120
- if self.previousSibling:
121
- self.previousSibling.nextSibling = self.nextSibling
122
- if self.nextSibling:
123
- self.nextSibling.previousSibling = self.previousSibling
124
- self.previousSibling = self.nextSibling = None
125
-
126
- def _lastRecursiveChild(self):
127
- "Finds the last element beneath this object to be parsed."
128
- lastChild = self
129
- while hasattr(lastChild, 'contents') and lastChild.contents:
130
- lastChild = lastChild.contents[-1]
131
- return lastChild
132
-
133
- def insert(self, position, newChild):
134
- if (isinstance(newChild, basestring)
135
- or isinstance(newChild, unicode)) \
136
- and not isinstance(newChild, NavigableString):
137
- newChild = NavigableString(newChild)
138
-
139
- position = min(position, len(self.contents))
140
- if hasattr(newChild, 'parent') and newChild.parent != None:
141
- # We're 'inserting' an element that's already one
142
- # of this object's children.
143
- if newChild.parent == self:
144
- index = self.find(newChild)
145
- if index and index < position:
146
- # Furthermore we're moving it further down the
147
- # list of this object's children. That means that
148
- # when we extract this element, our target index
149
- # will jump down one.
150
- position = position - 1
151
- newChild.extract()
152
-
153
- newChild.parent = self
154
- previousChild = None
155
- if position == 0:
156
- newChild.previousSibling = None
157
- newChild.previous = self
158
- else:
159
- previousChild = self.contents[position-1]
160
- newChild.previousSibling = previousChild
161
- newChild.previousSibling.nextSibling = newChild
162
- newChild.previous = previousChild._lastRecursiveChild()
163
- if newChild.previous:
164
- newChild.previous.next = newChild
165
-
166
- newChildsLastElement = newChild._lastRecursiveChild()
167
-
168
- if position >= len(self.contents):
169
- newChild.nextSibling = None
170
-
171
- parent = self
172
- parentsNextSibling = None
173
- while not parentsNextSibling:
174
- parentsNextSibling = parent.nextSibling
175
- parent = parent.parent
176
- if not parent: # This is the last element in the document.
177
- break
178
- if parentsNextSibling:
179
- newChildsLastElement.next = parentsNextSibling
180
- else:
181
- newChildsLastElement.next = None
182
- else:
183
- nextChild = self.contents[position]
184
- newChild.nextSibling = nextChild
185
- if newChild.nextSibling:
186
- newChild.nextSibling.previousSibling = newChild
187
- newChildsLastElement.next = nextChild
188
-
189
- if newChildsLastElement.next:
190
- newChildsLastElement.next.previous = newChildsLastElement
191
- self.contents.insert(position, newChild)
192
-
193
- def findNext(self, name=None, attrs={}, text=None, **kwargs):
194
- """Returns the first item that matches the given criteria and
195
- appears after this Tag in the document."""
196
- return self._findOne(self.findAllNext, name, attrs, text, **kwargs)
197
-
198
- def findAllNext(self, name=None, attrs={}, text=None, limit=None,
199
- **kwargs):
200
- """Returns all items that match the given criteria and appear
201
- before after Tag in the document."""
202
- return self._findAll(name, attrs, text, limit, self.nextGenerator)
203
-
204
- def findNextSibling(self, name=None, attrs={}, text=None, **kwargs):
205
- """Returns the closest sibling to this Tag that matches the
206
- given criteria and appears after this Tag in the document."""
207
- return self._findOne(self.findNextSiblings, name, attrs, text,
208
- **kwargs)
209
-
210
- def findNextSiblings(self, name=None, attrs={}, text=None, limit=None,
211
- **kwargs):
212
- """Returns the siblings of this Tag that match the given
213
- criteria and appear after this Tag in the document."""
214
- return self._findAll(name, attrs, text, limit,
215
- self.nextSiblingGenerator, **kwargs)
216
- fetchNextSiblings = findNextSiblings # Compatibility with pre-3.x
217
-
218
- def findPrevious(self, name=None, attrs={}, text=None, **kwargs):
219
- """Returns the first item that matches the given criteria and
220
- appears before this Tag in the document."""
221
- return self._findOne(self.findAllPrevious, name, attrs, text, **kwargs)
222
-
223
- def findAllPrevious(self, name=None, attrs={}, text=None, limit=None,
224
- **kwargs):
225
- """Returns all items that match the given criteria and appear
226
- before this Tag in the document."""
227
- return self._findAll(name, attrs, text, limit, self.previousGenerator,
228
- **kwargs)
229
- fetchPrevious = findAllPrevious # Compatibility with pre-3.x
230
-
231
- def findPreviousSibling(self, name=None, attrs={}, text=None, **kwargs):
232
- """Returns the closest sibling to this Tag that matches the
233
- given criteria and appears before this Tag in the document."""
234
- return self._findOne(self.findPreviousSiblings, name, attrs, text,
235
- **kwargs)
236
-
237
- def findPreviousSiblings(self, name=None, attrs={}, text=None,
238
- limit=None, **kwargs):
239
- """Returns the siblings of this Tag that match the given
240
- criteria and appear before this Tag in the document."""
241
- return self._findAll(name, attrs, text, limit,
242
- self.previousSiblingGenerator, **kwargs)
243
- fetchPreviousSiblings = findPreviousSiblings # Compatibility with pre-3.x
244
-
245
- def findParent(self, name=None, attrs={}, **kwargs):
246
- """Returns the closest parent of this Tag that matches the given
247
- criteria."""
248
- # NOTE: We can't use _findOne because findParents takes a different
249
- # set of arguments.
250
- r = None
251
- l = self.findParents(name, attrs, 1)
252
- if l:
253
- r = l[0]
254
- return r
255
-
256
- def findParents(self, name=None, attrs={}, limit=None, **kwargs):
257
- """Returns the parents of this Tag that match the given
258
- criteria."""
259
-
260
- return self._findAll(name, attrs, None, limit, self.parentGenerator,
261
- **kwargs)
262
- fetchParents = findParents # Compatibility with pre-3.x
263
-
264
- #These methods do the real heavy lifting.
265
-
266
- def _findOne(self, method, name, attrs, text, **kwargs):
267
- r = None
268
- l = method(name, attrs, text, 1, **kwargs)
269
- if l:
270
- r = l[0]
271
- return r
272
-
273
- def _findAll(self, name, attrs, text, limit, generator, **kwargs):
274
- "Iterates over a generator looking for things that match."
275
-
276
- if isinstance(name, SoupStrainer):
277
- strainer = name
278
- else:
279
- # Build a SoupStrainer
280
- strainer = SoupStrainer(name, attrs, text, **kwargs)
281
- results = ResultSet(strainer)
282
- g = generator()
283
- while True:
284
- try:
285
- i = g.next()
286
- except StopIteration:
287
- break
288
- if i:
289
- found = strainer.search(i)
290
- if found:
291
- results.append(found)
292
- if limit and len(results) >= limit:
293
- break
294
- return results
295
-
296
- #These Generators can be used to navigate starting from both
297
- #NavigableStrings and Tags.
298
- def nextGenerator(self):
299
- i = self
300
- while i:
301
- i = i.next
302
- yield i
303
-
304
- def nextSiblingGenerator(self):
305
- i = self
306
- while i:
307
- i = i.nextSibling
308
- yield i
309
-
310
- def previousGenerator(self):
311
- i = self
312
- while i:
313
- i = i.previous
314
- yield i
315
-
316
- def previousSiblingGenerator(self):
317
- i = self
318
- while i:
319
- i = i.previousSibling
320
- yield i
321
-
322
- def parentGenerator(self):
323
- i = self
324
- while i:
325
- i = i.parent
326
- yield i
327
-
328
- # Utility methods
329
- def substituteEncoding(self, str, encoding=None):
330
- encoding = encoding or "utf-8"
331
- return str.replace("%SOUP-ENCODING%", encoding)
332
-
333
- def toEncoding(self, s, encoding=None):
334
- """Encodes an object to a string in some encoding, or to Unicode.
335
- ."""
336
- if isinstance(s, unicode):
337
- if encoding:
338
- s = s.encode(encoding)
339
- elif isinstance(s, str):
340
- if encoding:
341
- s = s.encode(encoding)
342
- else:
343
- s = unicode(s)
344
- else:
345
- if encoding:
346
- s = self.toEncoding(str(s), encoding)
347
- else:
348
- s = unicode(s)
349
- return s
350
-
351
- class NavigableString(unicode, PageElement):
352
-
353
- def __getattr__(self, attr):
354
- """text.string gives you text. This is for backwards
355
- compatibility for Navigable*String, but for CData* it lets you
356
- get the string without the CData wrapper."""
357
- if attr == 'string':
358
- return self
359
- else:
360
- raise AttributeError, "'%s' object has no attribute '%s'" % (self.__class__.__name__, attr)
361
-
362
- def __unicode__(self):
363
- return self.__str__(None)
364
-
365
- def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING):
366
- if encoding:
367
- return self.encode(encoding)
368
- else:
369
- return self
370
-
371
- class CData(NavigableString):
372
-
373
- def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING):
374
- return "<![CDATA[%s]]>" % NavigableString.__str__(self, encoding)
375
-
376
- class ProcessingInstruction(NavigableString):
377
- def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING):
378
- output = self
379
- if "%SOUP-ENCODING%" in output:
380
- output = self.substituteEncoding(output, encoding)
381
- return "<?%s?>" % self.toEncoding(output, encoding)
382
-
383
- class Comment(NavigableString):
384
- def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING):
385
- return "<!--%s-->" % NavigableString.__str__(self, encoding)
386
-
387
- class Declaration(NavigableString):
388
- def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING):
389
- return "<!%s>" % NavigableString.__str__(self, encoding)
390
-
391
- class Tag(PageElement):
392
-
393
- """Represents a found HTML tag with its attributes and contents."""
394
-
395
- XML_SPECIAL_CHARS_TO_ENTITIES = { "'" : "squot",
396
- '"' : "quote",
397
- "&" : "amp",
398
- "<" : "lt",
399
- ">" : "gt" }
400
-
401
- def __init__(self, parser, name, attrs=None, parent=None,
402
- previous=None):
403
- "Basic constructor."
404
-
405
- # We don't actually store the parser object: that lets extracted
406
- # chunks be garbage-collected
407
- self.parserClass = parser.__class__
408
- self.isSelfClosing = parser.isSelfClosingTag(name)
409
- self.name = name
410
- if attrs == None:
411
- attrs = []
412
- self.attrs = attrs
413
- self.contents = []
414
- self.setup(parent, previous)
415
- self.hidden = False
416
- self.containsSubstitutions = False
417
-
418
- def get(self, key, default=None):
419
- """Returns the value of the 'key' attribute for the tag, or
420
- the value given for 'default' if it doesn't have that
421
- attribute."""
422
- return self._getAttrMap().get(key, default)
423
-
424
- def has_key(self, key):
425
- return self._getAttrMap().has_key(key)
426
-
427
- def __getitem__(self, key):
428
- """tag[key] returns the value of the 'key' attribute for the tag,
429
- and throws an exception if it's not there."""
430
- return self._getAttrMap()[key]
431
-
432
- def __iter__(self):
433
- "Iterating over a tag iterates over its contents."
434
- return iter(self.contents)
435
-
436
- def __len__(self):
437
- "The length of a tag is the length of its list of contents."
438
- return len(self.contents)
439
-
440
- def __contains__(self, x):
441
- return x in self.contents
442
-
443
- def __nonzero__(self):
444
- "A tag is non-None even if it has no contents."
445
- return True
446
-
447
- def __setitem__(self, key, value):
448
- """Setting tag[key] sets the value of the 'key' attribute for the
449
- tag."""
450
- self._getAttrMap()
451
- self.attrMap[key] = value
452
- found = False
453
- for i in range(0, len(self.attrs)):
454
- if self.attrs[i][0] == key:
455
- self.attrs[i] = (key, value)
456
- found = True
457
- if not found:
458
- self.attrs.append((key, value))
459
- self._getAttrMap()[key] = value
460
-
461
- def __delitem__(self, key):
462
- "Deleting tag[key] deletes all 'key' attributes for the tag."
463
- for item in self.attrs:
464
- if item[0] == key:
465
- self.attrs.remove(item)
466
- #We don't break because bad HTML can define the same
467
- #attribute multiple times.
468
- self._getAttrMap()
469
- if self.attrMap.has_key(key):
470
- del self.attrMap[key]
471
-
472
- def __call__(self, *args, **kwargs):
473
- """Calling a tag like a function is the same as calling its
474
- findAll() method. Eg. tag('a') returns a list of all the A tags
475
- found within this tag."""
476
- return apply(self.findAll, args, kwargs)
477
-
478
- def __getattr__(self, tag):
479
- #print "Getattr %s.%s" % (self.__class__, tag)
480
- if len(tag) > 3 and tag.rfind('Tag') == len(tag)-3:
481
- return self.find(tag[:-3])
482
- elif tag.find('__') != 0:
483
- return self.find(tag)
484
-
485
- def __eq__(self, other):
486
- """Returns true iff this tag has the same name, the same attributes,
487
- and the same contents (recursively) as the given tag.
488
-
489
- NOTE: right now this will return false if two tags have the
490
- same attributes in a different order. Should this be fixed?"""
491
- if not hasattr(other, 'name') or not hasattr(other, 'attrs') or not hasattr(other, 'contents') or self.name != other.name or self.attrs != other.attrs or len(self) != len(other):
492
- return False
493
- for i in range(0, len(self.contents)):
494
- if self.contents[i] != other.contents[i]:
495
- return False
496
- return True
497
-
498
- def __ne__(self, other):
499
- """Returns true iff this tag is not identical to the other tag,
500
- as defined in __eq__."""
501
- return not self == other
502
-
503
- def __repr__(self, encoding=DEFAULT_OUTPUT_ENCODING):
504
- """Renders this tag as a string."""
505
- return self.__str__(encoding)
506
-
507
- def __unicode__(self):
508
- return self.__str__(None)
509
-
510
- def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING,
511
- prettyPrint=False, indentLevel=0):
512
- """Returns a string or Unicode representation of this tag and
513
- its contents. To get Unicode, pass None for encoding.
514
-
515
- NOTE: since Python's HTML parser consumes whitespace, this
516
- method is not certain to reproduce the whitespace present in
517
- the original string."""
518
-
519
- encodedName = self.toEncoding(self.name, encoding)
520
-
521
- attrs = []
522
- if self.attrs:
523
- for key, val in self.attrs:
524
- fmt = '%s="%s"'
525
- if isString(val):
526
- if self.containsSubstitutions and '%SOUP-ENCODING%' in val:
527
- val = self.substituteEncoding(val, encoding)
528
-
529
- # The attribute value either:
530
- #
531
- # * Contains no embedded double quotes or single quotes.
532
- # No problem: we enclose it in double quotes.
533
- # * Contains embedded single quotes. No problem:
534
- # double quotes work here too.
535
- # * Contains embedded double quotes. No problem:
536
- # we enclose it in single quotes.
537
- # * Embeds both single _and_ double quotes. This
538
- # can't happen naturally, but it can happen if
539
- # you modify an attribute value after parsing
540
- # the document. Now we have a bit of a
541
- # problem. We solve it by enclosing the
542
- # attribute in single quotes, and escaping any
543
- # embedded single quotes to XML entities.
544
- if '"' in val:
545
- fmt = "%s='%s'"
546
- # This can't happen naturally, but it can happen
547
- # if you modify an attribute value after parsing.
548
- if "'" in val:
549
- val = val.replace("'", "&squot;")
550
-
551
- # Now we're okay w/r/t quotes. But the attribute
552
- # value might also contain angle brackets, or
553
- # ampersands that aren't part of entities. We need
554
- # to escape those to XML entities too.
555
- val = re.sub("([<>]|&(?![^\s]+;))",
556
- lambda x: "&" + self.XML_SPECIAL_CHARS_TO_ENTITIES[x.group(0)[0]] + ";",
557
- val)
558
-
559
- attrs.append(fmt % (self.toEncoding(key, encoding),
560
- self.toEncoding(val, encoding)))
561
- close = ''
562
- closeTag = ''
563
- if self.isSelfClosing:
564
- close = ' /'
565
- else:
566
- closeTag = '</%s>' % encodedName
567
-
568
- indentTag, indentContents = 0, 0
569
- if prettyPrint:
570
- indentTag = indentLevel
571
- space = (' ' * (indentTag-1))
572
- indentContents = indentTag + 1
573
- contents = self.renderContents(encoding, prettyPrint, indentContents)
574
- if self.hidden:
575
- s = contents
576
- else:
577
- s = []
578
- attributeString = ''
579
- if attrs:
580
- attributeString = ' ' + ' '.join(attrs)
581
- if prettyPrint:
582
- s.append(space)
583
- s.append('<%s%s%s>' % (encodedName, attributeString, close))
584
- if prettyPrint:
585
- s.append("\n")
586
- s.append(contents)
587
- if prettyPrint and contents and contents[-1] != "\n":
588
- s.append("\n")
589
- if prettyPrint and closeTag:
590
- s.append(space)
591
- s.append(closeTag)
592
- if prettyPrint and closeTag and self.nextSibling:
593
- s.append("\n")
594
- s = ''.join(s)
595
- return s
596
-
597
- def prettify(self, encoding=DEFAULT_OUTPUT_ENCODING):
598
- return self.__str__(encoding, True)
599
-
600
- def renderContents(self, encoding=DEFAULT_OUTPUT_ENCODING,
601
- prettyPrint=False, indentLevel=0):
602
- """Renders the contents of this tag as a string in the given
603
- encoding. If encoding is None, returns a Unicode string.."""
604
- s=[]
605
- for c in self:
606
- text = None
607
- if isinstance(c, NavigableString):
608
- text = c.__str__(encoding)
609
- elif isinstance(c, Tag):
610
- s.append(c.__str__(encoding, prettyPrint, indentLevel))
611
- if text and prettyPrint:
612
- text = text.strip()
613
- if text:
614
- if prettyPrint:
615
- s.append(" " * (indentLevel-1))
616
- s.append(text)
617
- if prettyPrint:
618
- s.append("\n")
619
- return ''.join(s)
620
-
621
- #Soup methods
622
-
623
- def find(self, name=None, attrs={}, recursive=True, text=None,
624
- **kwargs):
625
- """Return only the first child of this Tag matching the given
626
- criteria."""
627
- r = None
628
- l = self.findAll(name, attrs, recursive, text, 1, **kwargs)
629
- if l:
630
- r = l[0]
631
- return r
632
- findChild = find
633
-
634
- def findAll(self, name=None, attrs={}, recursive=True, text=None,
635
- limit=None, **kwargs):
636
- """Extracts a list of Tag objects that match the given
637
- criteria. You can specify the name of the Tag and any
638
- attributes you want the Tag to have.
639
-
640
- The value of a key-value pair in the 'attrs' map can be a
641
- string, a list of strings, a regular expression object, or a
642
- callable that takes a string and returns whether or not the
643
- string matches for some custom definition of 'matches'. The
644
- same is true of the tag name."""
645
- generator = self.recursiveChildGenerator
646
- if not recursive:
647
- generator = self.childGenerator
648
- return self._findAll(name, attrs, text, limit, generator, **kwargs)
649
- findChildren = findAll
650
-
651
- # Pre-3.x compatibility methods
652
- first = find
653
- fetch = findAll
654
-
655
- def fetchText(self, text=None, recursive=True, limit=None):
656
- return self.findAll(text=text, recursive=recursive, limit=limit)
657
-
658
- def firstText(self, text=None, recursive=True):
659
- return self.find(text=text, recursive=recursive)
660
-
661
- #Utility methods
662
-
663
- def append(self, tag):
664
- """Appends the given tag to the contents of this tag."""
665
- self.contents.append(tag)
666
-
667
- #Private methods
668
-
669
- def _getAttrMap(self):
670
- """Initializes a map representation of this tag's attributes,
671
- if not already initialized."""
672
- if not getattr(self, 'attrMap'):
673
- self.attrMap = {}
674
- for (key, value) in self.attrs:
675
- self.attrMap[key] = value
676
- return self.attrMap
677
-
678
- #Generator methods
679
- def childGenerator(self):
680
- for i in range(0, len(self.contents)):
681
- yield self.contents[i]
682
- raise StopIteration
683
-
684
- def recursiveChildGenerator(self):
685
- stack = [(self, 0)]
686
- while stack:
687
- tag, start = stack.pop()
688
- if isinstance(tag, Tag):
689
- for i in range(start, len(tag.contents)):
690
- a = tag.contents[i]
691
- yield a
692
- if isinstance(a, Tag) and tag.contents:
693
- if i < len(tag.contents) - 1:
694
- stack.append((tag, i+1))
695
- stack.append((a, 0))
696
- break
697
- raise StopIteration
698
-
699
- # Next, a couple classes to represent queries and their results.
700
- class SoupStrainer:
701
- """Encapsulates a number of ways of matching a markup element (tag or
702
- text)."""
703
-
704
- def __init__(self, name=None, attrs={}, text=None, **kwargs):
705
- self.name = name
706
- if isString(attrs):
707
- kwargs['class'] = attrs
708
- attrs = None
709
- if kwargs:
710
- if attrs:
711
- attrs = attrs.copy()
712
- attrs.update(kwargs)
713
- else:
714
- attrs = kwargs
715
- self.attrs = attrs
716
- self.text = text
717
-
718
- def __str__(self):
719
- if self.text:
720
- return self.text
721
- else:
722
- return "%s|%s" % (self.name, self.attrs)
723
-
724
- def searchTag(self, markupName=None, markupAttrs={}):
725
- found = None
726
- markup = None
727
- if isinstance(markupName, Tag):
728
- markup = markupName
729
- markupAttrs = markup
730
- callFunctionWithTagData = callable(self.name) \
731
- and not isinstance(markupName, Tag)
732
-
733
- if (not self.name) \
734
- or callFunctionWithTagData \
735
- or (markup and self._matches(markup, self.name)) \
736
- or (not markup and self._matches(markupName, self.name)):
737
- if callFunctionWithTagData:
738
- match = self.name(markupName, markupAttrs)
739
- else:
740
- match = True
741
- markupAttrMap = None
742
- for attr, matchAgainst in self.attrs.items():
743
- if not markupAttrMap:
744
- if hasattr(markupAttrs, 'get'):
745
- markupAttrMap = markupAttrs
746
- else:
747
- markupAttrMap = {}
748
- for k,v in markupAttrs:
749
- markupAttrMap[k] = v
750
- attrValue = markupAttrMap.get(attr)
751
- if not self._matches(attrValue, matchAgainst):
752
- match = False
753
- break
754
- if match:
755
- if markup:
756
- found = markup
757
- else:
758
- found = markupName
759
- return found
760
-
761
- def search(self, markup):
762
- #print 'looking for %s in %s' % (self, markup)
763
- found = None
764
- # If given a list of items, scan it for a text element that
765
- # matches.
766
- if isList(markup) and not isinstance(markup, Tag):
767
- for element in markup:
768
- if isinstance(element, NavigableString) \
769
- and self.search(element):
770
- found = element
771
- break
772
- # If it's a Tag, make sure its name or attributes match.
773
- # Don't bother with Tags if we're searching for text.
774
- elif isinstance(markup, Tag):
775
- if not self.text:
776
- found = self.searchTag(markup)
777
- # If it's text, make sure the text matches.
778
- elif isinstance(markup, NavigableString) or \
779
- isString(markup):
780
- if self._matches(markup, self.text):
781
- found = markup
782
- else:
783
- raise Exception, "I don't know how to match against a %s" \
784
- % markup.__class__
785
- return found
786
-
787
- def _matches(self, markup, matchAgainst):
788
- #print "Matching %s against %s" % (markup, matchAgainst)
789
- result = False
790
- if matchAgainst == True and type(matchAgainst) == types.BooleanType:
791
- result = markup != None
792
- elif callable(matchAgainst):
793
- result = matchAgainst(markup)
794
- else:
795
- #Custom match methods take the tag as an argument, but all
796
- #other ways of matching match the tag name as a string.
797
- if isinstance(markup, Tag):
798
- markup = markup.name
799
- if markup and not isString(markup):
800
- markup = unicode(markup)
801
- #Now we know that chunk is either a string, or None.
802
- if hasattr(matchAgainst, 'match'):
803
- # It's a regexp object.
804
- result = markup and matchAgainst.search(markup)
805
- elif isList(matchAgainst):
806
- result = markup in matchAgainst
807
- elif hasattr(matchAgainst, 'items'):
808
- result = markup.has_key(matchAgainst)
809
- elif matchAgainst and isString(markup):
810
- if isinstance(markup, unicode):
811
- matchAgainst = unicode(matchAgainst)
812
- else:
813
- matchAgainst = str(matchAgainst)
814
-
815
- if not result:
816
- result = matchAgainst == markup
817
- return result
818
-
819
- class ResultSet(list):
820
- """A ResultSet is just a list that keeps track of the SoupStrainer
821
- that created it."""
822
- def __init__(self, source):
823
- list.__init__([])
824
- self.source = source
825
-
826
- # Now, some helper functions.
827
-
828
- def isList(l):
829
- """Convenience method that works with all 2.x versions of Python
830
- to determine whether or not something is listlike."""
831
- return hasattr(l, '__iter__') \
832
- or (type(l) in (types.ListType, types.TupleType))
833
-
834
- def isString(s):
835
- """Convenience method that works with all 2.x versions of Python
836
- to determine whether or not something is stringlike."""
837
- try:
838
- return isinstance(s, unicode) or isintance(s, basestring)
839
- except NameError:
840
- return isinstance(s, str)
841
-
842
- def buildTagMap(default, *args):
843
- """Turns a list of maps, lists, or scalars into a single map.
844
- Used to build the SELF_CLOSING_TAGS, NESTABLE_TAGS, and
845
- NESTING_RESET_TAGS maps out of lists and partial maps."""
846
- built = {}
847
- for portion in args:
848
- if hasattr(portion, 'items'):
849
- #It's a map. Merge it.
850
- for k,v in portion.items():
851
- built[k] = v
852
- elif isList(portion):
853
- #It's a list. Map each item to the default.
854
- for k in portion:
855
- built[k] = default
856
- else:
857
- #It's a scalar. Map it to the default.
858
- built[portion] = default
859
- return built
860
-
861
- # Now, the parser classes.
862
-
863
- class BeautifulStoneSoup(Tag, SGMLParser):
864
-
865
- """This class contains the basic parser and search code. It defines
866
- a parser that knows nothing about tag behavior except for the
867
- following:
868
-
869
- You can't close a tag without closing all the tags it encloses.
870
- That is, "<foo><bar></foo>" actually means
871
- "<foo><bar></bar></foo>".
872
-
873
- [Another possible explanation is "<foo><bar /></foo>", but since
874
- this class defines no SELF_CLOSING_TAGS, it will never use that
875
- explanation.]
876
-
877
- This class is useful for parsing XML or made-up markup languages,
878
- or when BeautifulSoup makes an assumption counter to what you were
879
- expecting."""
880
-
881
- XML_ENTITY_LIST = {}
882
- for i in Tag.XML_SPECIAL_CHARS_TO_ENTITIES.values():
883
- XML_ENTITY_LIST[i] = True
884
-
885
- SELF_CLOSING_TAGS = {}
886
- NESTABLE_TAGS = {}
887
- RESET_NESTING_TAGS = {}
888
- QUOTE_TAGS = {}
889
-
890
- MARKUP_MASSAGE = [(re.compile('(<[^<>]*)/>'),
891
- lambda x: x.group(1) + ' />'),
892
- (re.compile('<!\s+([^<>]*)>'),
893
- lambda x: '<!' + x.group(1) + '>')
894
- ]
895
-
896
- ROOT_TAG_NAME = u'[document]'
897
-
898
- HTML_ENTITIES = "html"
899
- XML_ENTITIES = "xml"
900
-
901
- def __init__(self, markup="", parseOnlyThese=None, fromEncoding=None,
902
- markupMassage=True, smartQuotesTo=XML_ENTITIES,
903
- convertEntities=None, selfClosingTags=None):
904
- """The Soup object is initialized as the 'root tag', and the
905
- provided markup (which can be a string or a file-like object)
906
- is fed into the underlying parser.
907
-
908
- sgmllib will process most bad HTML, and the BeautifulSoup
909
- class has some tricks for dealing with some HTML that kills
910
- sgmllib, but Beautiful Soup can nonetheless choke or lose data
911
- if your data uses self-closing tags or declarations
912
- incorrectly.
913
-
914
- By default, Beautiful Soup uses regexes to sanitize input,
915
- avoiding the vast majority of these problems. If the problems
916
- don't apply to you, pass in False for markupMassage, and
917
- you'll get better performance.
918
-
919
- The default parser massage techniques fix the two most common
920
- instances of invalid HTML that choke sgmllib:
921
-
922
- <br/> (No space between name of closing tag and tag close)
923
- <! --Comment--> (Extraneous whitespace in declaration)
924
-
925
- You can pass in a custom list of (RE object, replace method)
926
- tuples to get Beautiful Soup to scrub your input the way you
927
- want."""
928
-
929
- self.parseOnlyThese = parseOnlyThese
930
- self.fromEncoding = fromEncoding
931
- self.smartQuotesTo = smartQuotesTo
932
- self.convertEntities = convertEntities
933
- if self.convertEntities:
934
- # It doesn't make sense to convert encoded characters to
935
- # entities even while you're converting entities to Unicode.
936
- # Just convert it all to Unicode.
937
- self.smartQuotesTo = None
938
- self.instanceSelfClosingTags = buildTagMap(None, selfClosingTags)
939
- SGMLParser.__init__(self)
940
-
941
- if hasattr(markup, 'read'): # It's a file-type object.
942
- markup = markup.read()
943
- self.markup = markup
944
- self.markupMassage = markupMassage
945
- try:
946
- self._feed()
947
- except StopParsing:
948
- pass
949
- self.markup = None # The markup can now be GCed
950
-
951
- def _feed(self, inDocumentEncoding=None):
952
- # Convert the document to Unicode.
953
- markup = self.markup
954
- if isinstance(markup, unicode):
955
- if not hasattr(self, 'originalEncoding'):
956
- self.originalEncoding = None
957
- else:
958
- dammit = UnicodeDammit\
959
- (markup, [self.fromEncoding, inDocumentEncoding],
960
- smartQuotesTo=self.smartQuotesTo)
961
- markup = dammit.unicode
962
- self.originalEncoding = dammit.originalEncoding
963
- if markup:
964
- if self.markupMassage:
965
- if not isList(self.markupMassage):
966
- self.markupMassage = self.MARKUP_MASSAGE
967
- for fix, m in self.markupMassage:
968
- markup = fix.sub(m, markup)
969
- self.reset()
970
-
971
- SGMLParser.feed(self, markup)
972
- # Close out any unfinished strings and close all the open tags.
973
- self.endData()
974
- while self.currentTag.name != self.ROOT_TAG_NAME:
975
- self.popTag()
976
-
977
- def __getattr__(self, methodName):
978
- """This method routes method call requests to either the SGMLParser
979
- superclass or the Tag superclass, depending on the method name."""
980
- #print "__getattr__ called on %s.%s" % (self.__class__, methodName)
981
-
982
- if methodName.find('start_') == 0 or methodName.find('end_') == 0 \
983
- or methodName.find('do_') == 0:
984
- return SGMLParser.__getattr__(self, methodName)
985
- elif methodName.find('__') != 0:
986
- return Tag.__getattr__(self, methodName)
987
- else:
988
- raise AttributeError
989
-
990
- def isSelfClosingTag(self, name):
991
- """Returns true iff the given string is the name of a
992
- self-closing tag according to this parser."""
993
- return self.SELF_CLOSING_TAGS.has_key(name) \
994
- or self.instanceSelfClosingTags.has_key(name)
995
-
996
- def reset(self):
997
- Tag.__init__(self, self, self.ROOT_TAG_NAME)
998
- self.hidden = 1
999
- SGMLParser.reset(self)
1000
- self.currentData = []
1001
- self.currentTag = None
1002
- self.tagStack = []
1003
- self.quoteStack = []
1004
- self.pushTag(self)
1005
-
1006
- def popTag(self):
1007
- tag = self.tagStack.pop()
1008
- # Tags with just one string-owning child get the child as a
1009
- # 'string' property, so that soup.tag.string is shorthand for
1010
- # soup.tag.contents[0]
1011
- if len(self.currentTag.contents) == 1 and \
1012
- isinstance(self.currentTag.contents[0], NavigableString):
1013
- self.currentTag.string = self.currentTag.contents[0]
1014
-
1015
- #print "Pop", tag.name
1016
- if self.tagStack:
1017
- self.currentTag = self.tagStack[-1]
1018
- return self.currentTag
1019
-
1020
- def pushTag(self, tag):
1021
- #print "Push", tag.name
1022
- if self.currentTag:
1023
- self.currentTag.append(tag)
1024
- self.tagStack.append(tag)
1025
- self.currentTag = self.tagStack[-1]
1026
-
1027
- def endData(self, containerClass=NavigableString):
1028
- if self.currentData:
1029
- currentData = ''.join(self.currentData)
1030
- if not currentData.strip():
1031
- if '\n' in currentData:
1032
- currentData = '\n'
1033
- else:
1034
- currentData = ' '
1035
- self.currentData = []
1036
- if self.parseOnlyThese and len(self.tagStack) <= 1 and \
1037
- (not self.parseOnlyThese.text or \
1038
- not self.parseOnlyThese.search(currentData)):
1039
- return
1040
- o = containerClass(currentData)
1041
- o.setup(self.currentTag, self.previous)
1042
- if self.previous:
1043
- self.previous.next = o
1044
- self.previous = o
1045
- self.currentTag.contents.append(o)
1046
-
1047
-
1048
- def _popToTag(self, name, inclusivePop=True):
1049
- """Pops the tag stack up to and including the most recent
1050
- instance of the given tag. If inclusivePop is false, pops the tag
1051
- stack up to but *not* including the most recent instqance of
1052
- the given tag."""
1053
- #print "Popping to %s" % name
1054
- if name == self.ROOT_TAG_NAME:
1055
- return
1056
-
1057
- numPops = 0
1058
- mostRecentTag = None
1059
- for i in range(len(self.tagStack)-1, 0, -1):
1060
- if name == self.tagStack[i].name:
1061
- numPops = len(self.tagStack)-i
1062
- break
1063
- if not inclusivePop:
1064
- numPops = numPops - 1
1065
-
1066
- for i in range(0, numPops):
1067
- mostRecentTag = self.popTag()
1068
- return mostRecentTag
1069
-
1070
- def _smartPop(self, name):
1071
-
1072
- """We need to pop up to the previous tag of this type, unless
1073
- one of this tag's nesting reset triggers comes between this
1074
- tag and the previous tag of this type, OR unless this tag is a
1075
- generic nesting trigger and another generic nesting trigger
1076
- comes between this tag and the previous tag of this type.
1077
-
1078
- Examples:
1079
- <p>Foo<b>Bar<p> should pop to 'p', not 'b'.
1080
- <p>Foo<table>Bar<p> should pop to 'table', not 'p'.
1081
- <p>Foo<table><tr>Bar<p> should pop to 'tr', not 'p'.
1082
- <p>Foo<b>Bar<p> should pop to 'p', not 'b'.
1083
-
1084
- <li><ul><li> *<li>* should pop to 'ul', not the first 'li'.
1085
- <tr><table><tr> *<tr>* should pop to 'table', not the first 'tr'
1086
- <td><tr><td> *<td>* should pop to 'tr', not the first 'td'
1087
- """
1088
-
1089
- nestingResetTriggers = self.NESTABLE_TAGS.get(name)
1090
- isNestable = nestingResetTriggers != None
1091
- isResetNesting = self.RESET_NESTING_TAGS.has_key(name)
1092
- popTo = None
1093
- inclusive = True
1094
- for i in range(len(self.tagStack)-1, 0, -1):
1095
- p = self.tagStack[i]
1096
- if (not p or p.name == name) and not isNestable:
1097
- #Non-nestable tags get popped to the top or to their
1098
- #last occurance.
1099
- popTo = name
1100
- break
1101
- if (nestingResetTriggers != None
1102
- and p.name in nestingResetTriggers) \
1103
- or (nestingResetTriggers == None and isResetNesting
1104
- and self.RESET_NESTING_TAGS.has_key(p.name)):
1105
-
1106
- #If we encounter one of the nesting reset triggers
1107
- #peculiar to this tag, or we encounter another tag
1108
- #that causes nesting to reset, pop up to but not
1109
- #including that tag.
1110
- popTo = p.name
1111
- inclusive = False
1112
- break
1113
- p = p.parent
1114
- if popTo:
1115
- self._popToTag(popTo, inclusive)
1116
-
1117
- def unknown_starttag(self, name, attrs, selfClosing=0):
1118
- #print "Start tag %s: %s" % (name, attrs)
1119
- if self.quoteStack:
1120
- #This is not a real tag.
1121
- #print "<%s> is not real!" % name
1122
- attrs = ''.join(map(lambda(x, y): ' %s="%s"' % (x, y), attrs))
1123
- self.handle_data('<%s%s>' % (name, attrs))
1124
- return
1125
- self.endData()
1126
-
1127
- if not self.isSelfClosingTag(name) and not selfClosing:
1128
- self._smartPop(name)
1129
-
1130
- if self.parseOnlyThese and len(self.tagStack) <= 1 \
1131
- and (self.parseOnlyThese.text or not self.parseOnlyThese.searchTag(name, attrs)):
1132
- return
1133
-
1134
- tag = Tag(self, name, attrs, self.currentTag, self.previous)
1135
- if self.previous:
1136
- self.previous.next = tag
1137
- self.previous = tag
1138
- self.pushTag(tag)
1139
- if selfClosing or self.isSelfClosingTag(name):
1140
- self.popTag()
1141
- if name in self.QUOTE_TAGS:
1142
- #print "Beginning quote (%s)" % name
1143
- self.quoteStack.append(name)
1144
- self.literal = 1
1145
- return tag
1146
-
1147
- def unknown_endtag(self, name):
1148
- #print "End tag %s" % name
1149
- if self.quoteStack and self.quoteStack[-1] != name:
1150
- #This is not a real end tag.
1151
- #print "</%s> is not real!" % name
1152
- self.handle_data('</%s>' % name)
1153
- return
1154
- self.endData()
1155
- self._popToTag(name)
1156
- if self.quoteStack and self.quoteStack[-1] == name:
1157
- self.quoteStack.pop()
1158
- self.literal = (len(self.quoteStack) > 0)
1159
-
1160
- def handle_data(self, data):
1161
- self.currentData.append(data)
1162
-
1163
- def _toStringSubclass(self, text, subclass):
1164
- """Adds a certain piece of text to the tree as a NavigableString
1165
- subclass."""
1166
- self.endData()
1167
- self.handle_data(text)
1168
- self.endData(subclass)
1169
-
1170
- def handle_pi(self, text):
1171
- """Handle a processing instruction as a ProcessingInstruction
1172
- object, possibly one with a %SOUP-ENCODING% slot into which an
1173
- encoding will be plugged later."""
1174
- if text[:3] == "xml":
1175
- text = "xml version='1.0' encoding='%SOUP-ENCODING%'"
1176
- self._toStringSubclass(text, ProcessingInstruction)
1177
-
1178
- def handle_comment(self, text):
1179
- "Handle comments as Comment objects."
1180
- self._toStringSubclass(text, Comment)
1181
-
1182
- def handle_charref(self, ref):
1183
- "Handle character references as data."
1184
- if self.convertEntities in [self.HTML_ENTITIES,
1185
- self.XML_ENTITIES]:
1186
- data = unichr(int(ref))
1187
- else:
1188
- data = '&#%s;' % ref
1189
- self.handle_data(data)
1190
-
1191
- def handle_entityref(self, ref):
1192
- """Handle entity references as data, possibly converting known
1193
- HTML entity references to the corresponding Unicode
1194
- characters."""
1195
- data = None
1196
- if self.convertEntities == self.HTML_ENTITIES or \
1197
- (self.convertEntities == self.XML_ENTITIES and \
1198
- self.XML_ENTITY_LIST.get(ref)):
1199
- try:
1200
- data = unichr(name2codepoint[ref])
1201
- except KeyError:
1202
- pass
1203
- if not data:
1204
- data = '&%s;' % ref
1205
- self.handle_data(data)
1206
-
1207
- def handle_decl(self, data):
1208
- "Handle DOCTYPEs and the like as Declaration objects."
1209
- self._toStringSubclass(data, Declaration)
1210
-
1211
- def parse_declaration(self, i):
1212
- """Treat a bogus SGML declaration as raw data. Treat a CDATA
1213
- declaration as a CData object."""
1214
- j = None
1215
- if self.rawdata[i:i+9] == '<![CDATA[':
1216
- k = self.rawdata.find(']]>', i)
1217
- if k == -1:
1218
- k = len(self.rawdata)
1219
- data = self.rawdata[i+9:k]
1220
- j = k+3
1221
- self._toStringSubclass(data, CData)
1222
- else:
1223
- try:
1224
- j = SGMLParser.parse_declaration(self, i)
1225
- except SGMLParseError:
1226
- toHandle = self.rawdata[i:]
1227
- self.handle_data(toHandle)
1228
- j = i + len(toHandle)
1229
- return j
1230
-
1231
- class BeautifulSoup(BeautifulStoneSoup):
1232
-
1233
- """This parser knows the following facts about HTML:
1234
-
1235
- * Some tags have no closing tag and should be interpreted as being
1236
- closed as soon as they are encountered.
1237
-
1238
- * The text inside some tags (ie. 'script') may contain tags which
1239
- are not really part of the document and which should be parsed
1240
- as text, not tags. If you want to parse the text as tags, you can
1241
- always fetch it and parse it explicitly.
1242
-
1243
- * Tag nesting rules:
1244
-
1245
- Most tags can't be nested at all. For instance, the occurance of
1246
- a <p> tag should implicitly close the previous <p> tag.
1247
-
1248
- <p>Para1<p>Para2
1249
- should be transformed into:
1250
- <p>Para1</p><p>Para2
1251
-
1252
- Some tags can be nested arbitrarily. For instance, the occurance
1253
- of a <blockquote> tag should _not_ implicitly close the previous
1254
- <blockquote> tag.
1255
-
1256
- Alice said: <blockquote>Bob said: <blockquote>Blah
1257
- should NOT be transformed into:
1258
- Alice said: <blockquote>Bob said: </blockquote><blockquote>Blah
1259
-
1260
- Some tags can be nested, but the nesting is reset by the
1261
- interposition of other tags. For instance, a <tr> tag should
1262
- implicitly close the previous <tr> tag within the same <table>,
1263
- but not close a <tr> tag in another table.
1264
-
1265
- <table><tr>Blah<tr>Blah
1266
- should be transformed into:
1267
- <table><tr>Blah</tr><tr>Blah
1268
- but,
1269
- <tr>Blah<table><tr>Blah
1270
- should NOT be transformed into
1271
- <tr>Blah<table></tr><tr>Blah
1272
-
1273
- Differing assumptions about tag nesting rules are a major source
1274
- of problems with the BeautifulSoup class. If BeautifulSoup is not
1275
- treating as nestable a tag your page author treats as nestable,
1276
- try ICantBelieveItsBeautifulSoup, MinimalSoup, or
1277
- BeautifulStoneSoup before writing your own subclass."""
1278
-
1279
- def __init__(self, *args, **kwargs):
1280
- if not kwargs.has_key('smartQuotesTo'):
1281
- kwargs['smartQuotesTo'] = self.HTML_ENTITIES
1282
- BeautifulStoneSoup.__init__(self, *args, **kwargs)
1283
-
1284
- SELF_CLOSING_TAGS = buildTagMap(None,
1285
- ['br' , 'hr', 'input', 'img', 'meta',
1286
- 'spacer', 'link', 'frame', 'base'])
1287
-
1288
- QUOTE_TAGS = {'script': None}
1289
-
1290
- #According to the HTML standard, each of these inline tags can
1291
- #contain another tag of the same type. Furthermore, it's common
1292
- #to actually use these tags this way.
1293
- NESTABLE_INLINE_TAGS = ['span', 'font', 'q', 'object', 'bdo', 'sub', 'sup',
1294
- 'center']
1295
-
1296
- #According to the HTML standard, these block tags can contain
1297
- #another tag of the same type. Furthermore, it's common
1298
- #to actually use these tags this way.
1299
- NESTABLE_BLOCK_TAGS = ['blockquote', 'div', 'fieldset', 'ins', 'del']
1300
-
1301
- #Lists can contain other lists, but there are restrictions.
1302
- NESTABLE_LIST_TAGS = { 'ol' : [],
1303
- 'ul' : [],
1304
- 'li' : ['ul', 'ol'],
1305
- 'dl' : [],
1306
- 'dd' : ['dl'],
1307
- 'dt' : ['dl'] }
1308
-
1309
- #Tables can contain other tables, but there are restrictions.
1310
- NESTABLE_TABLE_TAGS = {'table' : [],
1311
- 'tr' : ['table', 'tbody', 'tfoot', 'thead'],
1312
- 'td' : ['tr'],
1313
- 'th' : ['tr'],
1314
- 'thead' : ['table'],
1315
- 'tbody' : ['table'],
1316
- 'tfoot' : ['table'],
1317
- }
1318
-
1319
- NON_NESTABLE_BLOCK_TAGS = ['address', 'form', 'p', 'pre']
1320
-
1321
- #If one of these tags is encountered, all tags up to the next tag of
1322
- #this type are popped.
1323
- RESET_NESTING_TAGS = buildTagMap(None, NESTABLE_BLOCK_TAGS, 'noscript',
1324
- NON_NESTABLE_BLOCK_TAGS,
1325
- NESTABLE_LIST_TAGS,
1326
- NESTABLE_TABLE_TAGS)
1327
-
1328
- NESTABLE_TAGS = buildTagMap([], NESTABLE_INLINE_TAGS, NESTABLE_BLOCK_TAGS,
1329
- NESTABLE_LIST_TAGS, NESTABLE_TABLE_TAGS)
1330
-
1331
- # Used to detect the charset in a META tag; see start_meta
1332
- CHARSET_RE = re.compile("((^|;)\s*charset=)([^;]*)")
1333
-
1334
- def start_meta(self, attrs):
1335
- """Beautiful Soup can detect a charset included in a META tag,
1336
- try to convert the document to that charset, and re-parse the
1337
- document from the beginning."""
1338
- httpEquiv = None
1339
- contentType = None
1340
- contentTypeIndex = None
1341
- tagNeedsEncodingSubstitution = False
1342
-
1343
- for i in range(0, len(attrs)):
1344
- key, value = attrs[i]
1345
- key = key.lower()
1346
- if key == 'http-equiv':
1347
- httpEquiv = value
1348
- elif key == 'content':
1349
- contentType = value
1350
- contentTypeIndex = i
1351
-
1352
- if httpEquiv and contentType: # It's an interesting meta tag.
1353
- match = self.CHARSET_RE.search(contentType)
1354
- if match:
1355
- if getattr(self, 'declaredHTMLEncoding') or \
1356
- (self.originalEncoding == self.fromEncoding):
1357
- # This is our second pass through the document, or
1358
- # else an encoding was specified explicitly and it
1359
- # worked. Rewrite the meta tag.
1360
- newAttr = self.CHARSET_RE.sub\
1361
- (lambda(match):match.group(1) +
1362
- "%SOUP-ENCODING%", value)
1363
- attrs[contentTypeIndex] = (attrs[contentTypeIndex][0],
1364
- newAttr)
1365
- tagNeedsEncodingSubstitution = True
1366
- else:
1367
- # This is our first pass through the document.
1368
- # Go through it again with the new information.
1369
- newCharset = match.group(3)
1370
- if newCharset and newCharset != self.originalEncoding:
1371
- self.declaredHTMLEncoding = newCharset
1372
- self._feed(self.declaredHTMLEncoding)
1373
- raise StopParsing
1374
- tag = self.unknown_starttag("meta", attrs)
1375
- if tag and tagNeedsEncodingSubstitution:
1376
- tag.containsSubstitutions = True
1377
-
1378
- class StopParsing(Exception):
1379
- pass
1380
-
1381
- class ICantBelieveItsBeautifulSoup(BeautifulSoup):
1382
-
1383
- """The BeautifulSoup class is oriented towards skipping over
1384
- common HTML errors like unclosed tags. However, sometimes it makes
1385
- errors of its own. For instance, consider this fragment:
1386
-
1387
- <b>Foo<b>Bar</b></b>
1388
-
1389
- This is perfectly valid (if bizarre) HTML. However, the
1390
- BeautifulSoup class will implicitly close the first b tag when it
1391
- encounters the second 'b'. It will think the author wrote
1392
- "<b>Foo<b>Bar", and didn't close the first 'b' tag, because
1393
- there's no real-world reason to bold something that's already
1394
- bold. When it encounters '</b></b>' it will close two more 'b'
1395
- tags, for a grand total of three tags closed instead of two. This
1396
- can throw off the rest of your document structure. The same is
1397
- true of a number of other tags, listed below.
1398
-
1399
- It's much more common for someone to forget to close a 'b' tag
1400
- than to actually use nested 'b' tags, and the BeautifulSoup class
1401
- handles the common case. This class handles the not-co-common
1402
- case: where you can't believe someone wrote what they did, but
1403
- it's valid HTML and BeautifulSoup screwed up by assuming it
1404
- wouldn't be."""
1405
-
1406
- I_CANT_BELIEVE_THEYRE_NESTABLE_INLINE_TAGS = \
1407
- ['em', 'big', 'i', 'small', 'tt', 'abbr', 'acronym', 'strong',
1408
- 'cite', 'code', 'dfn', 'kbd', 'samp', 'strong', 'var', 'b',
1409
- 'big']
1410
-
1411
- I_CANT_BELIEVE_THEYRE_NESTABLE_BLOCK_TAGS = ['noscript']
1412
-
1413
- NESTABLE_TAGS = buildTagMap([], BeautifulSoup.NESTABLE_TAGS,
1414
- I_CANT_BELIEVE_THEYRE_NESTABLE_BLOCK_TAGS,
1415
- I_CANT_BELIEVE_THEYRE_NESTABLE_INLINE_TAGS)
1416
-
1417
- class MinimalSoup(BeautifulSoup):
1418
- """The MinimalSoup class is for parsing HTML that contains
1419
- pathologically bad markup. It makes no assumptions about tag
1420
- nesting, but it does know which tags are self-closing, that
1421
- <script> tags contain Javascript and should not be parsed, that
1422
- META tags may contain encoding information, and so on.
1423
-
1424
- This also makes it better for subclassing than BeautifulStoneSoup
1425
- or BeautifulSoup."""
1426
-
1427
- RESET_NESTING_TAGS = buildTagMap('noscript')
1428
- NESTABLE_TAGS = {}
1429
-
1430
- class BeautifulSOAP(BeautifulStoneSoup):
1431
- """This class will push a tag with only a single string child into
1432
- the tag's parent as an attribute. The attribute's name is the tag
1433
- name, and the value is the string child. An example should give
1434
- the flavor of the change:
1435
-
1436
- <foo><bar>baz</bar></foo>
1437
- =>
1438
- <foo bar="baz"><bar>baz</bar></foo>
1439
-
1440
- You can then access fooTag['bar'] instead of fooTag.barTag.string.
1441
-
1442
- This is, of course, useful for scraping structures that tend to
1443
- use subelements instead of attributes, such as SOAP messages. Note
1444
- that it modifies its input, so don't print the modified version
1445
- out.
1446
-
1447
- I'm not sure how many people really want to use this class; let me
1448
- know if you do. Mainly I like the name."""
1449
-
1450
- def popTag(self):
1451
- if len(self.tagStack) > 1:
1452
- tag = self.tagStack[-1]
1453
- parent = self.tagStack[-2]
1454
- parent._getAttrMap()
1455
- if (isinstance(tag, Tag) and len(tag.contents) == 1 and
1456
- isinstance(tag.contents[0], NavigableString) and
1457
- not parent.attrMap.has_key(tag.name)):
1458
- parent[tag.name] = tag.contents[0]
1459
- BeautifulStoneSoup.popTag(self)
1460
-
1461
- #Enterprise class names! It has come to our attention that some people
1462
- #think the names of the Beautiful Soup parser classes are too silly
1463
- #and "unprofessional" for use in enterprise screen-scraping. We feel
1464
- #your pain! For such-minded folk, the Beautiful Soup Consortium And
1465
- #All-Night Kosher Bakery recommends renaming this file to
1466
- #"RobustParser.py" (or, in cases of extreme enterprisness,
1467
- #"RobustParserBeanInterface.class") and using the following
1468
- #enterprise-friendly class aliases:
1469
- class RobustXMLParser(BeautifulStoneSoup):
1470
- pass
1471
- class RobustHTMLParser(BeautifulSoup):
1472
- pass
1473
- class RobustWackAssHTMLParser(ICantBelieveItsBeautifulSoup):
1474
- pass
1475
- class RobustInsanelyWackAssHTMLParser(MinimalSoup):
1476
- pass
1477
- class SimplifyingSOAPParser(BeautifulSOAP):
1478
- pass
1479
-
1480
- ######################################################
1481
- #
1482
- # Bonus library: Unicode, Dammit
1483
- #
1484
- # This class forces XML data into a standard format (usually to UTF-8
1485
- # or Unicode). It is heavily based on code from Mark Pilgrim's
1486
- # Universal Feed Parser. It does not rewrite the XML or HTML to
1487
- # reflect a new encoding: that happens in BeautifulStoneSoup.handle_pi
1488
- # (XML) and BeautifulSoup.start_meta (HTML).
1489
-
1490
- # Autodetects character encodings.
1491
- # Download from http://chardet.feedparser.org/
1492
- try:
1493
- import chardet
1494
- # import chardet.constants
1495
- # chardet.constants._debug = 1
1496
- except:
1497
- chardet = None
1498
- chardet = None
1499
-
1500
- # cjkcodecs and iconv_codec make Python know about more character encodings.
1501
- # Both are available from http://cjkpython.i18n.org/
1502
- # They're built in if you use Python 2.4.
1503
- try:
1504
- import cjkcodecs.aliases
1505
- except:
1506
- pass
1507
- try:
1508
- import iconv_codec
1509
- except:
1510
- pass
1511
-
1512
- class UnicodeDammit:
1513
- """A class for detecting the encoding of a *ML document and
1514
- converting it to a Unicode string. If the source encoding is
1515
- windows-1252, can replace MS smart quotes with their HTML or XML
1516
- equivalents."""
1517
-
1518
- # This dictionary maps commonly seen values for "charset" in HTML
1519
- # meta tags to the corresponding Python codec names. It only covers
1520
- # values that aren't in Python's aliases and can't be determined
1521
- # by the heuristics in find_codec.
1522
- CHARSET_ALIASES = { "macintosh" : "mac-roman",
1523
- "x-sjis" : "shift-jis" }
1524
-
1525
- def __init__(self, markup, overrideEncodings=[],
1526
- smartQuotesTo='xml'):
1527
- self.markup, documentEncoding, sniffedEncoding = \
1528
- self._detectEncoding(markup)
1529
- self.smartQuotesTo = smartQuotesTo
1530
- self.triedEncodings = []
1531
- if markup == '' or isinstance(markup, unicode):
1532
- self.originalEncoding = None
1533
- self.unicode = unicode(markup)
1534
- return
1535
-
1536
- u = None
1537
- for proposedEncoding in overrideEncodings:
1538
- u = self._convertFrom(proposedEncoding)
1539
- if u: break
1540
- if not u:
1541
- for proposedEncoding in (documentEncoding, sniffedEncoding):
1542
- u = self._convertFrom(proposedEncoding)
1543
- if u: break
1544
-
1545
- # If no luck and we have auto-detection library, try that:
1546
- if not u and chardet and not isinstance(self.markup, unicode):
1547
- u = self._convertFrom(chardet.detect(self.markup)['encoding'])
1548
-
1549
- # As a last resort, try utf-8 and windows-1252:
1550
- if not u:
1551
- for proposed_encoding in ("utf-8", "windows-1252"):
1552
- u = self._convertFrom(proposed_encoding)
1553
- if u: break
1554
- self.unicode = u
1555
- if not u: self.originalEncoding = None
1556
-
1557
- def _subMSChar(self, orig):
1558
- """Changes a MS smart quote character to an XML or HTML
1559
- entity."""
1560
- sub = self.MS_CHARS.get(orig)
1561
- if type(sub) == types.TupleType:
1562
- if self.smartQuotesTo == 'xml':
1563
- sub = '&#x%s;' % sub[1]
1564
- else:
1565
- sub = '&%s;' % sub[0]
1566
- return sub
1567
-
1568
- def _convertFrom(self, proposed):
1569
- proposed = self.find_codec(proposed)
1570
- if not proposed or proposed in self.triedEncodings:
1571
- return None
1572
- self.triedEncodings.append(proposed)
1573
- markup = self.markup
1574
-
1575
- # Convert smart quotes to HTML if coming from an encoding
1576
- # that might have them.
1577
- if self.smartQuotesTo and proposed.lower() in("windows-1252",
1578
- "iso-8859-1",
1579
- "iso-8859-2"):
1580
- markup = re.compile("([\x80-\x9f])").sub \
1581
- (lambda(x): self._subMSChar(x.group(1)),
1582
- markup)
1583
-
1584
- try:
1585
- # print "Trying to convert document to %s" % proposed
1586
- u = self._toUnicode(markup, proposed)
1587
- self.markup = u
1588
- self.originalEncoding = proposed
1589
- except Exception, e:
1590
- # print "That didn't work!"
1591
- # print e
1592
- return None
1593
- #print "Correct encoding: %s" % proposed
1594
- return self.markup
1595
-
1596
- def _toUnicode(self, data, encoding):
1597
- '''Given a string and its encoding, decodes the string into Unicode.
1598
- %encoding is a string recognized by encodings.aliases'''
1599
-
1600
- # strip Byte Order Mark (if present)
1601
- if (len(data) >= 4) and (data[:2] == '\xfe\xff') \
1602
- and (data[2:4] != '\x00\x00'):
1603
- encoding = 'utf-16be'
1604
- data = data[2:]
1605
- elif (len(data) >= 4) and (data[:2] == '\xff\xfe') \
1606
- and (data[2:4] != '\x00\x00'):
1607
- encoding = 'utf-16le'
1608
- data = data[2:]
1609
- elif data[:3] == '\xef\xbb\xbf':
1610
- encoding = 'utf-8'
1611
- data = data[3:]
1612
- elif data[:4] == '\x00\x00\xfe\xff':
1613
- encoding = 'utf-32be'
1614
- data = data[4:]
1615
- elif data[:4] == '\xff\xfe\x00\x00':
1616
- encoding = 'utf-32le'
1617
- data = data[4:]
1618
- newdata = unicode(data, encoding)
1619
- return newdata
1620
-
1621
- def _detectEncoding(self, xml_data):
1622
- """Given a document, tries to detect its XML encoding."""
1623
- xml_encoding = sniffed_xml_encoding = None
1624
- try:
1625
- if xml_data[:4] == '\x4c\x6f\xa7\x94':
1626
- # EBCDIC
1627
- xml_data = self._ebcdic_to_ascii(xml_data)
1628
- elif xml_data[:4] == '\x00\x3c\x00\x3f':
1629
- # UTF-16BE
1630
- sniffed_xml_encoding = 'utf-16be'
1631
- xml_data = unicode(xml_data, 'utf-16be').encode('utf-8')
1632
- elif (len(xml_data) >= 4) and (xml_data[:2] == '\xfe\xff') \
1633
- and (xml_data[2:4] != '\x00\x00'):
1634
- # UTF-16BE with BOM
1635
- sniffed_xml_encoding = 'utf-16be'
1636
- xml_data = unicode(xml_data[2:], 'utf-16be').encode('utf-8')
1637
- elif xml_data[:4] == '\x3c\x00\x3f\x00':
1638
- # UTF-16LE
1639
- sniffed_xml_encoding = 'utf-16le'
1640
- xml_data = unicode(xml_data, 'utf-16le').encode('utf-8')
1641
- elif (len(xml_data) >= 4) and (xml_data[:2] == '\xff\xfe') and \
1642
- (xml_data[2:4] != '\x00\x00'):
1643
- # UTF-16LE with BOM
1644
- sniffed_xml_encoding = 'utf-16le'
1645
- xml_data = unicode(xml_data[2:], 'utf-16le').encode('utf-8')
1646
- elif xml_data[:4] == '\x00\x00\x00\x3c':
1647
- # UTF-32BE
1648
- sniffed_xml_encoding = 'utf-32be'
1649
- xml_data = unicode(xml_data, 'utf-32be').encode('utf-8')
1650
- elif xml_data[:4] == '\x3c\x00\x00\x00':
1651
- # UTF-32LE
1652
- sniffed_xml_encoding = 'utf-32le'
1653
- xml_data = unicode(xml_data, 'utf-32le').encode('utf-8')
1654
- elif xml_data[:4] == '\x00\x00\xfe\xff':
1655
- # UTF-32BE with BOM
1656
- sniffed_xml_encoding = 'utf-32be'
1657
- xml_data = unicode(xml_data[4:], 'utf-32be').encode('utf-8')
1658
- elif xml_data[:4] == '\xff\xfe\x00\x00':
1659
- # UTF-32LE with BOM
1660
- sniffed_xml_encoding = 'utf-32le'
1661
- xml_data = unicode(xml_data[4:], 'utf-32le').encode('utf-8')
1662
- elif xml_data[:3] == '\xef\xbb\xbf':
1663
- # UTF-8 with BOM
1664
- sniffed_xml_encoding = 'utf-8'
1665
- xml_data = unicode(xml_data[3:], 'utf-8').encode('utf-8')
1666
- else:
1667
- sniffed_xml_encoding = 'ascii'
1668
- pass
1669
- xml_encoding_match = re.compile \
1670
- ('^<\?.*encoding=[\'"](.*?)[\'"].*\?>')\
1671
- .match(xml_data)
1672
- except:
1673
- xml_encoding_match = None
1674
- if xml_encoding_match:
1675
- xml_encoding = xml_encoding_match.groups()[0].lower()
1676
- if sniffed_xml_encoding and \
1677
- (xml_encoding in ('iso-10646-ucs-2', 'ucs-2', 'csunicode',
1678
- 'iso-10646-ucs-4', 'ucs-4', 'csucs4',
1679
- 'utf-16', 'utf-32', 'utf_16', 'utf_32',
1680
- 'utf16', 'u16')):
1681
- xml_encoding = sniffed_xml_encoding
1682
- return xml_data, xml_encoding, sniffed_xml_encoding
1683
-
1684
-
1685
- def find_codec(self, charset):
1686
- return self._codec(self.CHARSET_ALIASES.get(charset, charset)) \
1687
- or (charset and self._codec(charset.replace("-", ""))) \
1688
- or (charset and self._codec(charset.replace("-", "_"))) \
1689
- or charset
1690
-
1691
- def _codec(self, charset):
1692
- if not charset: return charset
1693
- codec = None
1694
- try:
1695
- codecs.lookup(charset)
1696
- codec = charset
1697
- except LookupError:
1698
- pass
1699
- return codec
1700
-
1701
- EBCDIC_TO_ASCII_MAP = None
1702
- def _ebcdic_to_ascii(self, s):
1703
- c = self.__class__
1704
- if not c.EBCDIC_TO_ASCII_MAP:
1705
- emap = (0,1,2,3,156,9,134,127,151,141,142,11,12,13,14,15,
1706
- 16,17,18,19,157,133,8,135,24,25,146,143,28,29,30,31,
1707
- 128,129,130,131,132,10,23,27,136,137,138,139,140,5,6,7,
1708
- 144,145,22,147,148,149,150,4,152,153,154,155,20,21,158,26,
1709
- 32,160,161,162,163,164,165,166,167,168,91,46,60,40,43,33,
1710
- 38,169,170,171,172,173,174,175,176,177,93,36,42,41,59,94,
1711
- 45,47,178,179,180,181,182,183,184,185,124,44,37,95,62,63,
1712
- 186,187,188,189,190,191,192,193,194,96,58,35,64,39,61,34,
1713
- 195,97,98,99,100,101,102,103,104,105,196,197,198,199,200,
1714
- 201,202,106,107,108,109,110,111,112,113,114,203,204,205,
1715
- 206,207,208,209,126,115,116,117,118,119,120,121,122,210,
1716
- 211,212,213,214,215,216,217,218,219,220,221,222,223,224,
1717
- 225,226,227,228,229,230,231,123,65,66,67,68,69,70,71,72,
1718
- 73,232,233,234,235,236,237,125,74,75,76,77,78,79,80,81,
1719
- 82,238,239,240,241,242,243,92,159,83,84,85,86,87,88,89,
1720
- 90,244,245,246,247,248,249,48,49,50,51,52,53,54,55,56,57,
1721
- 250,251,252,253,254,255)
1722
- import string
1723
- c.EBCDIC_TO_ASCII_MAP = string.maketrans( \
1724
- ''.join(map(chr, range(256))), ''.join(map(chr, emap)))
1725
- return s.translate(c.EBCDIC_TO_ASCII_MAP)
1726
-
1727
- MS_CHARS = { '\x80' : ('euro', '20AC'),
1728
- '\x81' : ' ',
1729
- '\x82' : ('sbquo', '201A'),
1730
- '\x83' : ('fnof', '192'),
1731
- '\x84' : ('bdquo', '201E'),
1732
- '\x85' : ('hellip', '2026'),
1733
- '\x86' : ('dagger', '2020'),
1734
- '\x87' : ('Dagger', '2021'),
1735
- '\x88' : ('circ', '2C6'),
1736
- '\x89' : ('permil', '2030'),
1737
- '\x8A' : ('Scaron', '160'),
1738
- '\x8B' : ('lsaquo', '2039'),
1739
- '\x8C' : ('OElig', '152'),
1740
- '\x8D' : '?',
1741
- '\x8E' : ('#x17D', '17D'),
1742
- '\x8F' : '?',
1743
- '\x90' : '?',
1744
- '\x91' : ('lsquo', '2018'),
1745
- '\x92' : ('rsquo', '2019'),
1746
- '\x93' : ('ldquo', '201C'),
1747
- '\x94' : ('rdquo', '201D'),
1748
- '\x95' : ('bull', '2022'),
1749
- '\x96' : ('ndash', '2013'),
1750
- '\x97' : ('mdash', '2014'),
1751
- '\x98' : ('tilde', '2DC'),
1752
- '\x99' : ('trade', '2122'),
1753
- '\x9a' : ('scaron', '161'),
1754
- '\x9b' : ('rsaquo', '203A'),
1755
- '\x9c' : ('oelig', '153'),
1756
- '\x9d' : '?',
1757
- '\x9e' : ('#x17E', '17E'),
1758
- '\x9f' : ('Yuml', ''),}
1759
-
1760
- #######################################################################
1761
-
1762
-
1763
- #By default, act as an HTML pretty-printer.
1764
- if __name__ == '__main__':
1765
- import sys
1766
- soup = BeautifulSoup(sys.stdin.read())
1767
- print soup.prettify()