Index: /sandbox/fvanderbiest/openlayers/apidoc_config/Topics.txt =================================================================== --- /sandbox/fvanderbiest/openlayers/apidoc_config/Topics.txt (revision 1941) +++ /sandbox/fvanderbiest/openlayers/apidoc_config/Topics.txt (revision 1941) @@ -0,0 +1,105 @@ +Format: Development Release 12-07-2007 (1.35 base) + +# This is the Natural Docs topics file for this project. If you change anything +# here, it will apply to THIS PROJECT ONLY. If you'd like to change something +# for all your projects, edit the Topics.txt in Natural Docs' Config directory +# instead. + + +Ignore Keywords: + function, functions + func, funcs + procedure, procedures + proc, procs + routine, routines + subroutine, subroutines + sub, subs + method, methods + callback, callbacks + property, properties + prop, props + + +#------------------------------------------------------------------------------- +# SYNTAX: +# +# Topic Type: [name] +# Alter Topic Type: [name] +# Creates a new topic type or alters one from the main file. Each type gets +# its own index and behavior settings. Its name can have letters, numbers, +# spaces, and these charaters: - / . ' +# +# Plural: [name] +# Sets the plural name of the topic type, if different. +# +# Keywords: +# [keyword] +# [keyword], [plural keyword] +# ... +# Defines or adds to the list of keywords for the topic type. They may only +# contain letters, numbers, and spaces and are not case sensitive. Plural +# keywords are used for list topics. You can redefine keywords found in the +# main topics file. +# +# Index: [yes|no] +# Whether the topics get their own index. Defaults to yes. Everything is +# included in the general index regardless of this setting. +# +# Scope: [normal|start|end|always global] +# How the topics affects scope. Defaults to normal. +# normal - Topics stay within the current scope. +# start - Topics start a new scope for all the topics beneath it, +# like class topics. +# end - Topics reset the scope back to global for all the topics +# beneath it. +# always global - Topics are defined as global, but do not change the scope +# for any other topics. +# +# Class Hierarchy: [yes|no] +# Whether the topics are part of the class hierarchy. Defaults to no. +# +# Page Title If First: [yes|no] +# Whether the topic's title becomes the page title if it's the first one in +# a file. Defaults to no. +# +# Break Lists: [yes|no] +# Whether list topics should be broken into individual topics in the output. +# Defaults to no. +# +# Can Group With: [type], [type], ... +# Defines a list of topic types that this one can possibly be grouped with. +# Defaults to none. +#------------------------------------------------------------------------------- + +# The following topics are defined in the main file, if you'd like to alter +# their behavior or add keywords: +# +# Generic, Class, Interface, Section, File, Group, Function, Variable, +# Property, Type, Constant, Enumeration, Event, Delegate, Macro, +# Database, Database Table, Database View, Database Index, Database +# Cursor, Database Trigger, Cookie, Build Target + +# If you add something that you think would be useful to other developers +# and should be included in Natural Docs by default, please e-mail it to +# topics [at] naturaldocs [dot] org. + + +Topic Type: Constructor + + Class Hierarchy: Yes + Keywords: + constructor + initialize + + +Alter Topic Type: Function + + Add Keywords: + apimethod + apifunction + + +Alter Topic Type: Property + + Add Keywords: + apiproperty Index: /sandbox/fvanderbiest/openlayers/apidoc_config/OL.css =================================================================== --- /sandbox/fvanderbiest/openlayers/apidoc_config/OL.css (revision 1941) +++ /sandbox/fvanderbiest/openlayers/apidoc_config/OL.css (revision 1941) @@ -0,0 +1,20 @@ +p { + text-indent: 0; margin-bottom: 1em; +} + +.MGroup { + font-variant: normal; + margin: 0.4em 0 0em 10px +} + +.MTitle { + font-variant: normal; +} + +.CGroup .CTitle { + font-variant: normal; +} + +.SGroup .SEntry { + font-variant: normal; +} Index: /sandbox/fvanderbiest/openlayers/apidoc_config/Menu.txt =================================================================== --- /sandbox/fvanderbiest/openlayers/apidoc_config/Menu.txt (revision 1941) +++ /sandbox/fvanderbiest/openlayers/apidoc_config/Menu.txt (revision 1941) @@ -0,0 +1,435 @@ +Format: Development Release 12-07-2007 (1.35 base) + + +Title: OpenLayers +SubTitle: JavaScript Mapping Library + +# You can add a footer to your documentation like this: +# Footer: [text] +# If you want to add a copyright notice, this would be the place to do it. + +# You can add a timestamp to your documentation like one of these: +# Timestamp: Generated on month day, year +# Timestamp: Updated mm/dd/yyyy +# Timestamp: Last updated mon day +# +# m - One or two digit month. January is "1" +# mm - Always two digit month. January is "01" +# mon - Short month word. January is "Jan" +# month - Long month word. January is "January" +# d - One or two digit day. 1 is "1" +# dd - Always two digit day. 1 is "01" +# day - Day with letter extension. 1 is "1st" +# yy - Two digit year. 2006 is "06" +# yyyy - Four digit year. 2006 is "2006" +# year - Four digit year. 2006 is "2006" + + +# -------------------------------------------------------------------------- +# +# Cut and paste the lines below to change the order in which your files +# appear on the menu. Don't worry about adding or removing files, Natural +# Docs will take care of that. +# +# You can further organize the menu by grouping the entries. Add a +# "Group: [name] {" line to start a group, and add a "}" to end it. +# +# You can add text and web links to the menu by adding "Text: [text]" and +# "Link: [name] ([URL])" lines, respectively. +# +# The formatting and comments are auto-generated, so don't worry about +# neatness when editing the file. Natural Docs will clean it up the next +# time it is run. When working with groups, just deal with the braces and +# forget about the indentation and comments. +# +# -------------------------------------------------------------------------- + + +Group: OpenLayers { + + File: OpenLayers (no auto-title, OpenLayers.js) + File: Ajax (no auto-title, OpenLayers/Ajax.js) + + Group: BaseTypes { + + File: Base Types (no auto-title, OpenLayers/BaseTypes.js) + File: Bounds (no auto-title, OpenLayers/BaseTypes/Bounds.js) + File: Class (no auto-title, OpenLayers/BaseTypes/Class.js) + File: Element (no auto-title, OpenLayers/BaseTypes/Element.js) + File: LonLat (no auto-title, OpenLayers/BaseTypes/LonLat.js) + File: Pixel (no auto-title, OpenLayers/BaseTypes/Pixel.js) + File: Size (no auto-title, OpenLayers/BaseTypes/Size.js) + } # Group: BaseTypes + + File: Console (no auto-title, OpenLayers/Console.js) + + Group: Control { + + File: Control (no auto-title, OpenLayers/Control.js) + File: ArgParser (no auto-title, OpenLayers/Control/ArgParser.js) + File: Attribution (no auto-title, OpenLayers/Control/Attribution.js) + File: Button (no auto-title, OpenLayers/Control/Button.js) + File: DragFeature (no auto-title, OpenLayers/Control/DragFeature.js) + File: DragPan (no auto-title, OpenLayers/Control/DragPan.js) + File: DrawFeature (no auto-title, OpenLayers/Control/DrawFeature.js) + File: EditingToolbar (no auto-title, OpenLayers/Control/EditingToolbar.js) + File: GetFeature (no auto-title, OpenLayers/Control/GetFeature.js) + File: Graticule (OpenLayers/Control/Graticule.js) + File: KeyboardDefaults (no auto-title, OpenLayers/Control/KeyboardDefaults.js) + File: LayerSwitcher (no auto-title, OpenLayers/Control/LayerSwitcher.js) + File: Measure (no auto-title, OpenLayers/Control/Measure.js) + File: ModifyFeature (no auto-title, OpenLayers/Control/ModifyFeature.js) + File: MouseDefaults (no auto-title, OpenLayers/Control/MouseDefaults.js) + File: MousePosition (no auto-title, OpenLayers/Control/MousePosition.js) + File: MouseToolbar (no auto-title, OpenLayers/Control/MouseToolbar.js) + File: Navigation (no auto-title, OpenLayers/Control/Navigation.js) + File: NavigationHistory (no auto-title, OpenLayers/Control/NavigationHistory.js) + File: NavToolbar (no auto-title, OpenLayers/Control/NavToolbar.js) + File: OverviewMap (no auto-title, OpenLayers/Control/OverviewMap.js) + File: Pan (no auto-title, OpenLayers/Control/Pan.js) + File: Panel (no auto-title, OpenLayers/Control/Panel.js) + File: PanPanel (no auto-title, OpenLayers/Control/PanPanel.js) + File: PanZoom (no auto-title, OpenLayers/Control/PanZoom.js) + File: PanZoomBar (no auto-title, OpenLayers/Control/PanZoomBar.js) + File: Permalink (no auto-title, OpenLayers/Control/Permalink.js) + File: Scale (no auto-title, OpenLayers/Control/Scale.js) + File: ScaleLine (no auto-title, OpenLayers/Control/ScaleLine.js) + File: SelectFeature (no auto-title, OpenLayers/Control/SelectFeature.js) + File: Snapping (no auto-title, OpenLayers/Control/Snapping.js) + File: Split (no auto-title, OpenLayers/Control/Split.js) + File: WMSGetFeatureInfo (OpenLayers/Control/WMSGetFeatureInfo.js) + File: ZoomBox (no auto-title, OpenLayers/Control/ZoomBox.js) + File: ZoomIn (no auto-title, OpenLayers/Control/ZoomIn.js) + File: ZoomOut (no auto-title, OpenLayers/Control/ZoomOut.js) + File: ZoomPanel (no auto-title, OpenLayers/Control/ZoomPanel.js) + File: ZoomToMaxExtent (no auto-title, OpenLayers/Control/ZoomToMaxExtent.js) + } # Group: Control + + File: Events (no auto-title, OpenLayers/Events.js) + + Group: Feature { + + File: Feature (no auto-title, OpenLayers/Feature.js) + File: Vector (no auto-title, OpenLayers/Feature/Vector.js) + File: WFS (no auto-title, OpenLayers/Feature/WFS.js) + } # Group: Feature + + Group: Filter { + + File: Filter (no auto-title, OpenLayers/Filter.js) + File: Comparison (no auto-title, OpenLayers/Filter/Comparison.js) + File: FeatureId (no auto-title, OpenLayers/Filter/FeatureId.js) + File: Logical (no auto-title, OpenLayers/Filter/Logical.js) + File: Spatial (no auto-title, OpenLayers/Filter/Spatial.js) + } # Group: Filter + + Group: Format { + + File: Format (no auto-title, OpenLayers/Format.js) + File: ArcXML (no auto-title, OpenLayers/Format/ArcXML.js) + File: ArcXML.Features (no auto-title, OpenLayers/Format/ArcXML/Features.js) + File: Atom (no auto-title, OpenLayers/Format/Atom.js) + File: CSWGetDomain.DEFAULTS (no auto-title, OpenLayers/Format/CSWGetDomain.js) + File: CSWGetDomain.v2_0_2 (no auto-title, OpenLayers/Format/CSWGetDomain/v2_0_2.js) + File: CSWGetRecords.DEFAULTS (no auto-title, OpenLayers/Format/CSWGetRecords.js) + File: CSWGetRecords.v2_0_2 (no auto-title, OpenLayers/Format/CSWGetRecords/v2_0_2.js) + + Group: Filter { + + File: Filter (no auto-title, OpenLayers/Format/Filter.js) + File: v1 (no auto-title, OpenLayers/Format/Filter/v1.js) + File: v1_0_0 (no auto-title, OpenLayers/Format/Filter/v1_0_0.js) + File: v1_1_0 (OpenLayers/Format/Filter/v1_1_0.js) + } # Group: Filter + + File: GeoJSON (no auto-title, OpenLayers/Format/GeoJSON.js) + File: GeoRSS (no auto-title, OpenLayers/Format/GeoRSS.js) + + Group: GML { + + File: GML (no auto-title, OpenLayers/Format/GML.js) + File: Base (no auto-title, OpenLayers/Format/GML/Base.js) + File: v2 (no auto-title, OpenLayers/Format/GML/v2.js) + File: v3 (no auto-title, OpenLayers/Format/GML/v3.js) + } # Group: GML + + File: GPX (no auto-title, OpenLayers/Format/GPX.js) + File: JSON (no auto-title, OpenLayers/Format/JSON.js) + File: KML (no auto-title, OpenLayers/Format/KML.js) + File: OSM (no auto-title, OpenLayers/Format/OSM.js) + File: OWSCommon.v1_1_0 (OpenLayers/Format/OWSCommon/v1_1_0.js) + + Group: SLD { + + File: SLD (no auto-title, OpenLayers/Format/SLD.js) + File: v1 (no auto-title, OpenLayers/Format/SLD/v1.js) + File: v1_0_0 (no auto-title, OpenLayers/Format/SLD/v1_0_0.js) + } # Group: SLD + + File: SOSCapabilities (OpenLayers/Format/SOSCapabilities.js) + File: SOSCapabilities.v1_0_0 (OpenLayers/Format/SOSCapabilities/v1_0_0.js) + File: SOSGetObservation (OpenLayers/Format/SOSGetObservation.js) + File: Text (no auto-title, OpenLayers/Format/Text.js) + File: WFS (no auto-title, OpenLayers/Format/WFS.js) + + Group: WFSCapabilities { + + File: WFSCapabilities (no auto-title, OpenLayers/Format/WFSCapabilities.js) + File: v1 (no auto-title, OpenLayers/Format/WFSCapabilities/v1.js) + File: v1_0_0 (no auto-title, OpenLayers/Format/WFSCapabilities/v1_0_0.js) + File: v1_1_0 (no auto-title, OpenLayers/Format/WFSCapabilities/v1_1_0.js) + } # Group: WFSCapabilities + + File: WFSDescribeFeatureType (no auto-title, OpenLayers/Format/WFSDescribeFeatureType.js) + + Group: WFST { + + File: WFST (no auto-title, OpenLayers/Format/WFST.js) + File: v1 (OpenLayers/Format/WFST/v1.js) + File: v1_0_0 (OpenLayers/Format/WFST/v1_0_0.js) + File: v1_1_0 (OpenLayers/Format/WFST/v1_1_0.js) + } # Group: WFST + + File: WKT (no auto-title, OpenLayers/Format/WKT.js) + + Group: WMC { + + File: WMC (no auto-title, OpenLayers/Format/WMC.js) + File: v1 (no auto-title, OpenLayers/Format/WMC/v1.js) + File: v1_0_0 (no auto-title, OpenLayers/Format/WMC/v1_0_0.js) + File: v1_1_0 (no auto-title, OpenLayers/Format/WMC/v1_1_0.js) + } # Group: WMC + + Group: WMSCapabilities { + + File: WMSCapabilities (no auto-title, OpenLayers/Format/WMSCapabilities.js) + File: v1 (no auto-title, OpenLayers/Format/WMSCapabilities/v1.js) + File: v1_1 (no auto-title, OpenLayers/Format/WMSCapabilities/v1_1.js) + File: v1_1_0 (no auto-title, OpenLayers/Format/WMSCapabilities/v1_1_0.js) + File: v1_1_1 (no auto-title, OpenLayers/Format/WMSCapabilities/v1_1_1.js) + File: v1_3 (no auto-title, OpenLayers/Format/WMSCapabilities/v1_3.js) + File: v1_3_0 (no auto-title, OpenLayers/Format/WMSCapabilities/v1_3_0.js) + } # Group: WMSCapabilities + + Group: WMSDescribeLayer { + + File: WMSDescribeLayer (no auto-title, OpenLayers/Format/WMSDescribeLayer.js) + File: v1_1 (no auto-title, OpenLayers/Format/WMSDescribeLayer/v1_1.js) + } # Group: WMSDescribeLayer + + File: WMSGetFeatureInfo (no auto-title, OpenLayers/Format/WMSGetFeatureInfo.js) + File: XML (no auto-title, OpenLayers/Format/XML.js) + } # Group: Format + + Group: Geometry { + + File: Geometry (no auto-title, OpenLayers/Geometry.js) + File: Collection (no auto-title, OpenLayers/Geometry/Collection.js) + File: Curve (no auto-title, OpenLayers/Geometry/Curve.js) + File: LinearRing (no auto-title, OpenLayers/Geometry/LinearRing.js) + File: LineString (no auto-title, OpenLayers/Geometry/LineString.js) + File: MultiLineString (no auto-title, OpenLayers/Geometry/MultiLineString.js) + File: MultiPoint (no auto-title, OpenLayers/Geometry/MultiPoint.js) + File: MultiPolygon (no auto-title, OpenLayers/Geometry/MultiPolygon.js) + File: Point (no auto-title, OpenLayers/Geometry/Point.js) + File: Polygon (no auto-title, OpenLayers/Geometry/Polygon.js) + File: Rectangle (no auto-title, OpenLayers/Geometry/Rectangle.js) + } # Group: Geometry + + Group: Handler { + + File: Handler (no auto-title, OpenLayers/Handler.js) + File: Box (no auto-title, OpenLayers/Handler/Box.js) + File: Click (no auto-title, OpenLayers/Handler/Click.js) + File: Drag (no auto-title, OpenLayers/Handler/Drag.js) + File: Feature (no auto-title, OpenLayers/Handler/Feature.js) + File: Hover (no auto-title, OpenLayers/Handler/Hover.js) + File: Keyboard (no auto-title, OpenLayers/Handler/Keyboard.js) + File: MouseWheel (no auto-title, OpenLayers/Handler/MouseWheel.js) + File: Path (no auto-title, OpenLayers/Handler/Path.js) + File: Point (no auto-title, OpenLayers/Handler/Point.js) + File: Polygon (no auto-title, OpenLayers/Handler/Polygon.js) + File: RegularPolygon (no auto-title, OpenLayers/Handler/RegularPolygon.js) + } # Group: Handler + + File: Icon (no auto-title, OpenLayers/Icon.js) + + Group: Lang { + + File: Lang (no auto-title, OpenLayers/Lang.js) + File: ar (no auto-title, OpenLayers/Lang/ar.js) + File: be-tarask (no auto-title, OpenLayers/Lang/be-tarask.js) + File: bg (no auto-title, OpenLayers/Lang/bg.js) + File: br (no auto-title, OpenLayers/Lang/br.js) + File: ca (no auto-title, OpenLayers/Lang/ca.js) + File: cs-CZ (no auto-title, OpenLayers/Lang/cs-CZ.js) + File: da-DK (no auto-title, OpenLayers/Lang/da-DK.js) + File: de (no auto-title, OpenLayers/Lang/de.js) + File: en (no auto-title, OpenLayers/Lang/en.js) + File: en-CA (no auto-title, OpenLayers/Lang/en-CA.js) + File: es (no auto-title, OpenLayers/Lang/es.js) + File: el (no auto-title, OpenLayers/Lang/el.js) + File: fi (no auto-title, OpenLayers/Lang/fi.js) + File: fr (no auto-title, OpenLayers/Lang/fr.js) + File: fur (no auto-title, OpenLayers/Lang/fur.js) + File: gl (no auto-title, OpenLayers/Lang/gl.js) + File: gsw (no auto-title, OpenLayers/Lang/gsw.js) + File: hr (no auto-title, OpenLayers/Lang/hr.js) + File: hsb (no auto-title, OpenLayers/Lang/hsb.js) + File: hu (no auto-title, OpenLayers/Lang/hu.js) + File: ia (no auto-title, OpenLayers/Lang/ia.js) + File: id (no auto-title, OpenLayers/Lang/id.js) + File: io (no auto-title, OpenLayers/Lang/io.js) + File: is (no auto-title, OpenLayers/Lang/is.js) + File: it (no auto-title, OpenLayers/Lang/it.js) + File: ja (no auto-title, OpenLayers/Lang/ja.js) + File: km (no auto-title, OpenLayers/Lang/km.js) + File: ksh (no auto-title, OpenLayers/Lang/ksh.js) + File: nds (no auto-title, OpenLayers/Lang/nds.js) + File: nb (no auto-title, OpenLayers/Lang/nb.js) + File: nl (no auto-title, OpenLayers/Lang/nl.js) + File: nn (no auto-title, OpenLayers/Lang/nn.js) + File: oc (no auto-title, OpenLayers/Lang/oc.js) + File: pt (no auto-title, OpenLayers/Lang/pt.js) + File: pt-BR (no auto-title, OpenLayers/Lang/pt-BR.js) + File: ru (no auto-title, OpenLayers/Lang/ru.js) + File: sk (no auto-title, OpenLayers/Lang/sk.js) + File: sv-SE (no auto-title, OpenLayers/Lang/sv-SE.js) + File: te (no auto-title, OpenLayers/Lang/te.js) + File: vi (no auto-title, OpenLayers/Lang/vi.js) + File: zh-CN (no auto-title, OpenLayers/Lang/zh-CN.js) + File: zh-TW (no auto-title, OpenLayers/Lang/zh-TW.js) + } # Group: Lang + + Group: Layer { + + File: Layer (no auto-title, OpenLayers/Layer.js) + File: ArcGIS93Rest (no auto-title, OpenLayers/Layer/ArcGIS93Rest.js) + File: ArcIMS (no auto-title, OpenLayers/Layer/ArcIMS.js) + File: Boxes (no auto-title, OpenLayers/Layer/Boxes.js) + File: EventPane (no auto-title, OpenLayers/Layer/EventPane.js) + File: FixedZoomLevels (no auto-title, OpenLayers/Layer/FixedZoomLevels.js) + File: GeoRSS (no auto-title, OpenLayers/Layer/GeoRSS.js) + File: GML (no auto-title, OpenLayers/Layer/GML.js) + File: Google (no auto-title, OpenLayers/Layer/Google.js) + File: Grid (no auto-title, OpenLayers/Layer/Grid.js) + File: HTTPRequest (no auto-title, OpenLayers/Layer/HTTPRequest.js) + File: Image (no auto-title, OpenLayers/Layer/Image.js) + File: KaMap (no auto-title, OpenLayers/Layer/KaMap.js) + File: KaMapCache (no auto-title, OpenLayers/Layer/KaMapCache.js) + File: MapGuide (no auto-title, OpenLayers/Layer/MapGuide.js) + File: MapServer (no auto-title, OpenLayers/Layer/MapServer.js) + File: MapServer.Untiled (no auto-title, OpenLayers/Layer/MapServer/Untiled.js) + File: Markers (no auto-title, OpenLayers/Layer/Markers.js) + File: MultiMap (no auto-title, OpenLayers/Layer/MultiMap.js) + File: PointTrack (no auto-title, OpenLayers/Layer/PointTrack.js) + File: SphericalMercator (no auto-title, OpenLayers/Layer/SphericalMercator.js) + File: Text (no auto-title, OpenLayers/Layer/Text.js) + File: TileCache (no auto-title, OpenLayers/Layer/TileCache.js) + File: TMS (no auto-title, OpenLayers/Layer/TMS.js) + File: Vector (no auto-title, OpenLayers/Layer/Vector.js) + File: Vector.RootContainer (no auto-title, OpenLayers/Layer/Vector/RootContainer.js) + File: VirtualEarth (no auto-title, OpenLayers/Layer/VirtualEarth.js) + File: WFS (no auto-title, OpenLayers/Layer/WFS.js) + File: WMS (no auto-title, OpenLayers/Layer/WMS.js) + File: WMS.Untiled (no auto-title, OpenLayers/Layer/WMS/Untiled.js) + File: WMS.Post (no auto-title, OpenLayers/Layer/WMS/Post.js) + File: WorldWind (no auto-title, OpenLayers/Layer/WorldWind.js) + File: Yahoo (no auto-title, OpenLayers/Layer/Yahoo.js) + File: XYZ (no auto-title, OpenLayers/Layer/XYZ.js) + } # Group: Layer + + File: Map (no auto-title, OpenLayers/Map.js) + + Group: Marker { + + File: Marker (no auto-title, OpenLayers/Marker.js) + File: Box (no auto-title, OpenLayers/Marker/Box.js) + } # Group: Marker + + Group: Popup { + + File: Popup (no auto-title, OpenLayers/Popup.js) + File: Anchored (no auto-title, OpenLayers/Popup/Anchored.js) + File: AnchoredBubble (no auto-title, OpenLayers/Popup/AnchoredBubble.js) + File: Framed (no auto-title, OpenLayers/Popup/Framed.js) + File: FramedCloud (no auto-title, OpenLayers/Popup/FramedCloud.js) + } # Group: Popup + + File: Projection (no auto-title, OpenLayers/Projection.js) + + Group: Protocol { + + File: Protocol (no auto-title, OpenLayers/Protocol.js) + File: HTTP (no auto-title, OpenLayers/Protocol/HTTP.js) + + Group: SQL { + + File: SQL (no auto-title, OpenLayers/Protocol/SQL.js) + File: Gears (no auto-title, OpenLayers/Protocol/SQL/Gears.js) + } # Group: SQL + + Group: WFS { + + File: WFS (no auto-title, OpenLayers/Protocol/WFS.js) + File: v1 (no auto-title, OpenLayers/Protocol/WFS/v1.js) + File: v1_0_0 (no auto-title, OpenLayers/Protocol/WFS/v1_0_0.js) + File: v1_1_0 (no auto-title, OpenLayers/Protocol/WFS/v1_1_0.js) + } # Group: WFS + + } # Group: Protocol + + Group: Renderer { + + File: Renderer (no auto-title, OpenLayers/Renderer.js) + File: Canvas (no auto-title, OpenLayers/Renderer/Canvas.js) + File: Elements (no auto-title, OpenLayers/Renderer/Elements.js) + File: SVG (no auto-title, OpenLayers/Renderer/SVG.js) + File: VML (no auto-title, OpenLayers/Renderer/VML.js) + } # Group: Renderer + + Group: Request { + + File: Request (no auto-title, OpenLayers/Request.js) + File: XMLHttpRequest (no auto-title, OpenLayers/Request/XMLHttpRequest.js) + } # Group: Request + + File: Rule (no auto-title, OpenLayers/Rule.js) + + Group: Strategy { + + File: Strategy (no auto-title, OpenLayers/Strategy.js) + File: BBOX (no auto-title, OpenLayers/Strategy/BBOX.js) + File: Cluster (no auto-title, OpenLayers/Strategy/Cluster.js) + File: Fixed (no auto-title, OpenLayers/Strategy/Fixed.js) + File: Paging (no auto-title, OpenLayers/Strategy/Paging.js) + File: Refresh (OpenLayers/Strategy/Refresh.js) + File: Save (OpenLayers/Strategy/Save.js) + } # Group: Strategy + + File: Style (no auto-title, OpenLayers/Style.js) + File: StyleMap (no auto-title, OpenLayers/StyleMap.js) + + Group: Tile { + + File: Tile (no auto-title, OpenLayers/Tile.js) + File: Image (no auto-title, OpenLayers/Tile/Image.js) + File: WFS (no auto-title, OpenLayers/Tile/WFS.js) + File: IFrame (OpenLayers/Tile/Image/IFrame.js) + } # Group: Tile + + File: Tween (no auto-title, OpenLayers/Tween.js) + File: Util (no auto-title, OpenLayers/Util.js) + } # Group: OpenLayers + +Group: Index { + + Index: Everything + Class Index: Classes + Constant Index: Constants + Function Index: Functions + Property Index: Properties + File Index: Files + Constructor Index: Constructor + } # Group: Index + Index: /sandbox/fvanderbiest/openlayers/apidoc_config/Languages.txt =================================================================== --- /sandbox/fvanderbiest/openlayers/apidoc_config/Languages.txt (revision 1941) +++ /sandbox/fvanderbiest/openlayers/apidoc_config/Languages.txt (revision 1941) @@ -0,0 +1,113 @@ +Format: Development Release 12-07-2007 (1.35 base) + +# This is the Natural Docs languages file for this project. If you change +# anything here, it will apply to THIS PROJECT ONLY. If you'd like to change +# something for all your projects, edit the Languages.txt in Natural Docs' +# Config directory instead. + + +# You can prevent certain file extensions from being scanned like this: +# Ignore Extensions: [extension] [extension] ... + + +#------------------------------------------------------------------------------- +# SYNTAX: +# +# Unlike other Natural Docs configuration files, in this file all comments +# MUST be alone on a line. Some languages deal with the # character, so you +# cannot put comments on the same line as content. +# +# Also, all lists are separated with spaces, not commas, again because some +# languages may need to use them. +# +# Language: [name] +# Alter Language: [name] +# Defines a new language or alters an existing one. Its name can use any +# characters. If any of the properties below have an add/replace form, you +# must use that when using Alter Language. +# +# The language Shebang Script is special. It's entry is only used for +# extensions, and files with those extensions have their shebang (#!) lines +# read to determine the real language of the file. Extensionless files are +# always treated this way. +# +# The language Text File is also special. It's treated as one big comment +# so you can put Natural Docs content in them without special symbols. Also, +# if you don't specify a package separator, ignored prefixes, or enum value +# behavior, it will copy those settings from the language that is used most +# in the source tree. +# +# Extensions: [extension] [extension] ... +# [Add/Replace] Extensions: [extension] [extension] ... +# Defines the file extensions of the language's source files. You can +# redefine extensions found in the main languages file. You can use * to +# mean any undefined extension. +# +# Shebang Strings: [string] [string] ... +# [Add/Replace] Shebang Strings: [string] [string] ... +# Defines a list of strings that can appear in the shebang (#!) line to +# designate that it's part of the language. You can redefine strings found +# in the main languages file. +# +# Ignore Prefixes in Index: [prefix] [prefix] ... +# [Add/Replace] Ignored Prefixes in Index: [prefix] [prefix] ... +# +# Ignore [Topic Type] Prefixes in Index: [prefix] [prefix] ... +# [Add/Replace] Ignored [Topic Type] Prefixes in Index: [prefix] [prefix] ... +# Specifies prefixes that should be ignored when sorting symbols in an +# index. Can be specified in general or for a specific topic type. +# +#------------------------------------------------------------------------------ +# For basic language support only: +# +# Line Comments: [symbol] [symbol] ... +# Defines a space-separated list of symbols that are used for line comments, +# if any. +# +# Block Comments: [opening sym] [closing sym] [opening sym] [closing sym] ... +# Defines a space-separated list of symbol pairs that are used for block +# comments, if any. +# +# Package Separator: [symbol] +# Defines the default package separator symbol. The default is a dot. +# +# [Topic Type] Prototype Enders: [symbol] [symbol] ... +# When defined, Natural Docs will attempt to get a prototype from the code +# immediately following the topic type. It stops when it reaches one of +# these symbols. Use \n for line breaks. +# +# Line Extender: [symbol] +# Defines the symbol that allows a prototype to span multiple lines if +# normally a line break would end it. +# +# Enum Values: [global|under type|under parent] +# Defines how enum values are referenced. The default is global. +# global - Values are always global, referenced as 'value'. +# under type - Values are under the enum type, referenced as +# 'package.enum.value'. +# under parent - Values are under the enum's parent, referenced as +# 'package.value'. +# +# Perl Package: [perl package] +# Specifies the Perl package used to fine-tune the language behavior in ways +# too complex to do in this file. +# +#------------------------------------------------------------------------------ +# For full language support only: +# +# Full Language Support: [perl package] +# Specifies the Perl package that has the parsing routines necessary for full +# language support. +# +#------------------------------------------------------------------------------- + +# The following languages are defined in the main file, if you'd like to alter +# them: +# +# Text File, Shebang Script, C/C++, C#, Java, JavaScript, Perl, Python, +# PHP, SQL, Visual Basic, Pascal, Assembly, Ada, Tcl, Ruby, Makefile, +# ActionScript, ColdFusion, R, Fortran + +# If you add a language that you think would be useful to other developers +# and should be included in Natural Docs by default, please e-mail it to +# languages [at] naturaldocs [dot] org. Index: /sandbox/fvanderbiest/openlayers/art/layer-switcher-minimize.svg =================================================================== --- /sandbox/fvanderbiest/openlayers/art/layer-switcher-minimize.svg (revision 1941) +++ /sandbox/fvanderbiest/openlayers/art/layer-switcher-minimize.svg (revision 1941) @@ -0,0 +1,142 @@ + + + + + + + + + image/svg+xml + + + + + + + + + - + + + + + + Index: /sandbox/fvanderbiest/openlayers/art/marker.svg =================================================================== --- /sandbox/fvanderbiest/openlayers/art/marker.svg (revision 1941) +++ /sandbox/fvanderbiest/openlayers/art/marker.svg (revision 1941) @@ -0,0 +1,25 @@ + + + + +]> + + + + + + + + + + + + + + + + + Index: /sandbox/fvanderbiest/openlayers/art/slider.svg =================================================================== --- /sandbox/fvanderbiest/openlayers/art/slider.svg (revision 1941) +++ /sandbox/fvanderbiest/openlayers/art/slider.svg (revision 1941) @@ -0,0 +1,71 @@ + + + + + + + + + image/svg+xml + + + + + + + + + Index: /sandbox/fvanderbiest/openlayers/art/layer-switcher-maximize.svg =================================================================== --- /sandbox/fvanderbiest/openlayers/art/layer-switcher-maximize.svg (revision 1941) +++ /sandbox/fvanderbiest/openlayers/art/layer-switcher-maximize.svg (revision 1941) @@ -0,0 +1,128 @@ + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + Index: /sandbox/fvanderbiest/openlayers/art/zoom-world.svg =================================================================== --- /sandbox/fvanderbiest/openlayers/art/zoom-world.svg (revision 1941) +++ /sandbox/fvanderbiest/openlayers/art/zoom-world.svg (revision 1941) @@ -0,0 +1,193 @@ + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + Index: /sandbox/fvanderbiest/openlayers/art/zoombar.svg =================================================================== --- /sandbox/fvanderbiest/openlayers/art/zoombar.svg (revision 1941) +++ /sandbox/fvanderbiest/openlayers/art/zoombar.svg (revision 1941) @@ -0,0 +1,73 @@ + + + + + + + + + image/svg+xml + + + + + + + + + + Index: /sandbox/fvanderbiest/openlayers/art/panning-hand-off.svg =================================================================== --- /sandbox/fvanderbiest/openlayers/art/panning-hand-off.svg (revision 1941) +++ /sandbox/fvanderbiest/openlayers/art/panning-hand-off.svg (revision 1941) @@ -0,0 +1,44 @@ + + + + + + + + + + + + +]> + + + + + + + + + + + + + + + Index: /sandbox/fvanderbiest/openlayers/art/panning-hand-on.svg =================================================================== --- /sandbox/fvanderbiest/openlayers/art/panning-hand-on.svg (revision 1941) +++ /sandbox/fvanderbiest/openlayers/art/panning-hand-on.svg (revision 1941) @@ -0,0 +1,44 @@ + + + + + + + + + + + + +]> + + + + + + + + + + + + + + + Index: /sandbox/fvanderbiest/openlayers/art/arrows.svg =================================================================== --- /sandbox/fvanderbiest/openlayers/art/arrows.svg (revision 1941) +++ /sandbox/fvanderbiest/openlayers/art/arrows.svg (revision 1941) @@ -0,0 +1,127 @@ + + + + + + + + + image/svg+xml + + + + + + + + + + + + − + + + + Index: /sandbox/fvanderbiest/openlayers/art/measuring-stick-off.svg =================================================================== --- /sandbox/fvanderbiest/openlayers/art/measuring-stick-off.svg (revision 1941) +++ /sandbox/fvanderbiest/openlayers/art/measuring-stick-off.svg (revision 1941) @@ -0,0 +1,36 @@ + + + + + + + + + + + + +]> + + + + + + + + + + + + + + + + + + + + Index: /sandbox/fvanderbiest/openlayers/art/measuring-stick-on.svg =================================================================== --- /sandbox/fvanderbiest/openlayers/art/measuring-stick-on.svg (revision 1941) +++ /sandbox/fvanderbiest/openlayers/art/measuring-stick-on.svg (revision 1941) @@ -0,0 +1,36 @@ + + + + + + + + + + + + +]> + + + + + + + + + + + + + + + + + + + + Index: /sandbox/fvanderbiest/openlayers/news.txt =================================================================== --- /sandbox/fvanderbiest/openlayers/news.txt (revision 1941) +++ /sandbox/fvanderbiest/openlayers/news.txt (revision 1941) @@ -0,0 +1,44 @@ +OpenLayers 2.7: + r8063 + Released 09/29/08 + http://trac.openlayers.org/wiki/Release/2.7/Notes + +OpenLayers 2.6: + r6945 + Released 04/15/08 + http://trac.openlayers.org/wiki/Release/2.6/Notes + +OpenLayers 2.5: + r4899 + Released 10/09/07 + http://trac.openlayers.org/wiki/Release/2.5/Notes + +OpenLayers 2.4: + r3198 + Released 05/29/07 + http://trac.openlayers.org/wiki/Release/2.4/Notes + +OpenLayers 2.3: + r2255 + Released 02/21/07 + http://trac.openlayers.org/wiki/Release/2.3/Notes + +OpenLayers 2.2: + r1866 + Released 11/15/06 + http://trac.openlayers.org/wiki/Release/2.2/Notes + +OpenLayers 2.1: + r1521 + Released 10/02/06 + http://trac.openlayers.org/wiki/Release/2.1/Notes + +OpenLayers 2.0: + r1368 + Released 08/25/06 + http://trac.openlayers.org/wiki/Release/2.0/Notes + +OpenLayers 1.0 + r787 + Released 06/27/06 + Initial release. Index: /sandbox/fvanderbiest/openlayers/doc_config/Topics.txt =================================================================== --- /sandbox/fvanderbiest/openlayers/doc_config/Topics.txt (revision 1941) +++ /sandbox/fvanderbiest/openlayers/doc_config/Topics.txt (revision 1941) @@ -0,0 +1,102 @@ +Format: Development Release 12-07-2007 (1.35 base) + +# This is the Natural Docs topics file for this project. If you change anything +# here, it will apply to THIS PROJECT ONLY. If you'd like to change something +# for all your projects, edit the Topics.txt in Natural Docs' Config directory +# instead. + + +# If you'd like to prevent keywords from being recognized by Natural Docs, you +# can do it like this: +# Ignore Keywords: [keyword], [keyword], ... +# +# Or you can use the list syntax like how they are defined: +# Ignore Keywords: +# [keyword] +# [keyword], [plural keyword] +# ... + + +#------------------------------------------------------------------------------- +# SYNTAX: +# +# Topic Type: [name] +# Alter Topic Type: [name] +# Creates a new topic type or alters one from the main file. Each type gets +# its own index and behavior settings. Its name can have letters, numbers, +# spaces, and these charaters: - / . ' +# +# Plural: [name] +# Sets the plural name of the topic type, if different. +# +# Keywords: +# [keyword] +# [keyword], [plural keyword] +# ... +# Defines or adds to the list of keywords for the topic type. They may only +# contain letters, numbers, and spaces and are not case sensitive. Plural +# keywords are used for list topics. You can redefine keywords found in the +# main topics file. +# +# Index: [yes|no] +# Whether the topics get their own index. Defaults to yes. Everything is +# included in the general index regardless of this setting. +# +# Scope: [normal|start|end|always global] +# How the topics affects scope. Defaults to normal. +# normal - Topics stay within the current scope. +# start - Topics start a new scope for all the topics beneath it, +# like class topics. +# end - Topics reset the scope back to global for all the topics +# beneath it. +# always global - Topics are defined as global, but do not change the scope +# for any other topics. +# +# Class Hierarchy: [yes|no] +# Whether the topics are part of the class hierarchy. Defaults to no. +# +# Page Title If First: [yes|no] +# Whether the topic's title becomes the page title if it's the first one in +# a file. Defaults to no. +# +# Break Lists: [yes|no] +# Whether list topics should be broken into individual topics in the output. +# Defaults to no. +# +# Can Group With: [type], [type], ... +# Defines a list of topic types that this one can possibly be grouped with. +# Defaults to none. +#------------------------------------------------------------------------------- + +# The following topics are defined in the main file, if you'd like to alter +# their behavior or add keywords: +# +# Generic, Class, Interface, Section, File, Group, Function, Variable, +# Property, Type, Constant, Enumeration, Event, Delegate, Macro, +# Database, Database Table, Database View, Database Index, Database +# Cursor, Database Trigger, Cookie, Build Target + +# If you add something that you think would be useful to other developers +# and should be included in Natural Docs by default, please e-mail it to +# topics [at] naturaldocs [dot] org. + + +Topic Type: Constructor + + Class Hierarchy: Yes + Keywords: + constructor + initialize + + +Alter Topic Type: Function + + Add Keywords: + apimethod + apifunction + + +Alter Topic Type: Property + + Add Keywords: + apiproperty Index: /sandbox/fvanderbiest/openlayers/doc_config/OL.css =================================================================== --- /sandbox/fvanderbiest/openlayers/doc_config/OL.css (revision 1941) +++ /sandbox/fvanderbiest/openlayers/doc_config/OL.css (revision 1941) @@ -0,0 +1,20 @@ +p { + text-indent: 0; margin-bottom: 1em; +} + +.MGroup { + font-variant: normal; + margin: 0.4em 0 0em 10px +} + +.MTitle { + font-variant: normal; +} + +.CGroup .CTitle { + font-variant: normal; +} + +.SGroup .SEntry { + font-variant: normal; +} Index: /sandbox/fvanderbiest/openlayers/doc_config/Menu.txt =================================================================== --- /sandbox/fvanderbiest/openlayers/doc_config/Menu.txt (revision 1941) +++ /sandbox/fvanderbiest/openlayers/doc_config/Menu.txt (revision 1941) @@ -0,0 +1,435 @@ +Format: Development Release 12-07-2007 (1.35 base) + + +Title: OpenLayers +SubTitle: JavaScript Mapping Library + +# You can add a footer to your documentation like this: +# Footer: [text] +# If you want to add a copyright notice, this would be the place to do it. + +# You can add a timestamp to your documentation like one of these: +# Timestamp: Generated on month day, year +# Timestamp: Updated mm/dd/yyyy +# Timestamp: Last updated mon day +# +# m - One or two digit month. January is "1" +# mm - Always two digit month. January is "01" +# mon - Short month word. January is "Jan" +# month - Long month word. January is "January" +# d - One or two digit day. 1 is "1" +# dd - Always two digit day. 1 is "01" +# day - Day with letter extension. 1 is "1st" +# yy - Two digit year. 2006 is "06" +# yyyy - Four digit year. 2006 is "2006" +# year - Four digit year. 2006 is "2006" + + +# -------------------------------------------------------------------------- +# +# Cut and paste the lines below to change the order in which your files +# appear on the menu. Don't worry about adding or removing files, Natural +# Docs will take care of that. +# +# You can further organize the menu by grouping the entries. Add a +# "Group: [name] {" line to start a group, and add a "}" to end it. +# +# You can add text and web links to the menu by adding "Text: [text]" and +# "Link: [name] ([URL])" lines, respectively. +# +# The formatting and comments are auto-generated, so don't worry about +# neatness when editing the file. Natural Docs will clean it up the next +# time it is run. When working with groups, just deal with the braces and +# forget about the indentation and comments. +# +# -------------------------------------------------------------------------- + + +Group: OpenLayers { + + File: OpenLayers (no auto-title, OpenLayers.js) + File: Ajax (no auto-title, OpenLayers/Ajax.js) + + Group: BaseTypes { + + File: Base Types (no auto-title, OpenLayers/BaseTypes.js) + File: Bounds (no auto-title, OpenLayers/BaseTypes/Bounds.js) + File: Class (no auto-title, OpenLayers/BaseTypes/Class.js) + File: Element (no auto-title, OpenLayers/BaseTypes/Element.js) + File: LonLat (no auto-title, OpenLayers/BaseTypes/LonLat.js) + File: Pixel (no auto-title, OpenLayers/BaseTypes/Pixel.js) + File: Size (no auto-title, OpenLayers/BaseTypes/Size.js) + } # Group: BaseTypes + + File: Console (no auto-title, OpenLayers/Console.js) + + Group: Control { + + File: Control (no auto-title, OpenLayers/Control.js) + File: ArgParser (no auto-title, OpenLayers/Control/ArgParser.js) + File: Attribution (no auto-title, OpenLayers/Control/Attribution.js) + File: Button (no auto-title, OpenLayers/Control/Button.js) + File: DragFeature (no auto-title, OpenLayers/Control/DragFeature.js) + File: DragPan (no auto-title, OpenLayers/Control/DragPan.js) + File: DrawFeature (no auto-title, OpenLayers/Control/DrawFeature.js) + File: EditingToolbar (no auto-title, OpenLayers/Control/EditingToolbar.js) + File: GetFeature (no auto-title, OpenLayers/Control/GetFeature.js) + File: Graticule (OpenLayers/Control/Graticule.js) + File: KeyboardDefaults (no auto-title, OpenLayers/Control/KeyboardDefaults.js) + File: LayerSwitcher (no auto-title, OpenLayers/Control/LayerSwitcher.js) + File: Measure (no auto-title, OpenLayers/Control/Measure.js) + File: ModifyFeature (no auto-title, OpenLayers/Control/ModifyFeature.js) + File: MouseDefaults (no auto-title, OpenLayers/Control/MouseDefaults.js) + File: MousePosition (no auto-title, OpenLayers/Control/MousePosition.js) + File: MouseToolbar (no auto-title, OpenLayers/Control/MouseToolbar.js) + File: Navigation (no auto-title, OpenLayers/Control/Navigation.js) + File: NavigationHistory (no auto-title, OpenLayers/Control/NavigationHistory.js) + File: NavToolbar (no auto-title, OpenLayers/Control/NavToolbar.js) + File: OverviewMap (no auto-title, OpenLayers/Control/OverviewMap.js) + File: Pan (no auto-title, OpenLayers/Control/Pan.js) + File: Panel (no auto-title, OpenLayers/Control/Panel.js) + File: PanPanel (no auto-title, OpenLayers/Control/PanPanel.js) + File: PanZoom (no auto-title, OpenLayers/Control/PanZoom.js) + File: PanZoomBar (no auto-title, OpenLayers/Control/PanZoomBar.js) + File: Permalink (no auto-title, OpenLayers/Control/Permalink.js) + File: Scale (no auto-title, OpenLayers/Control/Scale.js) + File: ScaleLine (no auto-title, OpenLayers/Control/ScaleLine.js) + File: SelectFeature (no auto-title, OpenLayers/Control/SelectFeature.js) + File: Snapping (no auto-title, OpenLayers/Control/Snapping.js) + File: Split (no auto-title, OpenLayers/Control/Split.js) + File: WMSGetFeatureInfo (OpenLayers/Control/WMSGetFeatureInfo.js) + File: ZoomBox (no auto-title, OpenLayers/Control/ZoomBox.js) + File: ZoomIn (no auto-title, OpenLayers/Control/ZoomIn.js) + File: ZoomOut (no auto-title, OpenLayers/Control/ZoomOut.js) + File: ZoomPanel (no auto-title, OpenLayers/Control/ZoomPanel.js) + File: ZoomToMaxExtent (no auto-title, OpenLayers/Control/ZoomToMaxExtent.js) + } # Group: Control + + File: Events (no auto-title, OpenLayers/Events.js) + + Group: Feature { + + File: Feature (no auto-title, OpenLayers/Feature.js) + File: Vector (no auto-title, OpenLayers/Feature/Vector.js) + File: WFS (no auto-title, OpenLayers/Feature/WFS.js) + } # Group: Feature + + Group: Filter { + + File: Filter (no auto-title, OpenLayers/Filter.js) + File: Comparison (no auto-title, OpenLayers/Filter/Comparison.js) + File: FeatureId (no auto-title, OpenLayers/Filter/FeatureId.js) + File: Logical (no auto-title, OpenLayers/Filter/Logical.js) + File: Spatial (no auto-title, OpenLayers/Filter/Spatial.js) + } # Group: Filter + + Group: Format { + + File: Format (no auto-title, OpenLayers/Format.js) + File: ArcXML (no auto-title, OpenLayers/Format/ArcXML.js) + File: ArcXML.Features (no auto-title, OpenLayers/Format/ArcXML/Features.js) + File: Atom (no auto-title, OpenLayers/Format/Atom.js) + File: CSWGetDomain.DEFAULTS (no auto-title, OpenLayers/Format/CSWGetDomain.js) + File: CSWGetDomain.v2_0_2 (no auto-title, OpenLayers/Format/CSWGetDomain/v2_0_2.js) + File: CSWGetRecords.DEFAULTS (no auto-title, OpenLayers/Format/CSWGetRecords.js) + File: CSWGetRecords.v2_0_2 (no auto-title, OpenLayers/Format/CSWGetRecords/v2_0_2.js) + + Group: Filter { + + File: Filter (no auto-title, OpenLayers/Format/Filter.js) + File: v1 (no auto-title, OpenLayers/Format/Filter/v1.js) + File: v1_0_0 (no auto-title, OpenLayers/Format/Filter/v1_0_0.js) + File: v1_1_0 (OpenLayers/Format/Filter/v1_1_0.js) + } # Group: Filter + + File: GeoJSON (no auto-title, OpenLayers/Format/GeoJSON.js) + File: GeoRSS (no auto-title, OpenLayers/Format/GeoRSS.js) + + Group: GML { + + File: GML (no auto-title, OpenLayers/Format/GML.js) + File: Base (no auto-title, OpenLayers/Format/GML/Base.js) + File: v2 (no auto-title, OpenLayers/Format/GML/v2.js) + File: v3 (no auto-title, OpenLayers/Format/GML/v3.js) + } # Group: GML + + File: GPX (no auto-title, OpenLayers/Format/GPX.js) + File: JSON (no auto-title, OpenLayers/Format/JSON.js) + File: KML (no auto-title, OpenLayers/Format/KML.js) + File: OSM (no auto-title, OpenLayers/Format/OSM.js) + File: OWSCommon.v1_1_0 (OpenLayers/Format/OWSCommon/v1_1_0.js) + + Group: SLD { + + File: SLD (no auto-title, OpenLayers/Format/SLD.js) + File: v1 (no auto-title, OpenLayers/Format/SLD/v1.js) + File: v1_0_0 (no auto-title, OpenLayers/Format/SLD/v1_0_0.js) + } # Group: SLD + + File: SOSCapabilities (OpenLayers/Format/SOSCapabilities.js) + File: SOSCapabilities.v1_0_0 (OpenLayers/Format/SOSCapabilities/v1_0_0.js) + File: SOSGetObservation (OpenLayers/Format/SOSGetObservation.js) + File: Text (no auto-title, OpenLayers/Format/Text.js) + File: WFS (no auto-title, OpenLayers/Format/WFS.js) + + Group: WFSCapabilities { + + File: WFSCapabilities (no auto-title, OpenLayers/Format/WFSCapabilities.js) + File: v1 (no auto-title, OpenLayers/Format/WFSCapabilities/v1.js) + File: v1_0_0 (no auto-title, OpenLayers/Format/WFSCapabilities/v1_0_0.js) + File: v1_1_0 (no auto-title, OpenLayers/Format/WFSCapabilities/v1_1_0.js) + } # Group: WFSCapabilities + + File: WFSDescribeFeatureType (no auto-title, OpenLayers/Format/WFSDescribeFeatureType.js) + + Group: WFST { + + File: WFST (no auto-title, OpenLayers/Format/WFST.js) + File: v1 (OpenLayers/Format/WFST/v1.js) + File: v1_0_0 (OpenLayers/Format/WFST/v1_0_0.js) + File: v1_1_0 (OpenLayers/Format/WFST/v1_1_0.js) + } # Group: WFST + + File: WKT (no auto-title, OpenLayers/Format/WKT.js) + + Group: WMC { + + File: WMC (no auto-title, OpenLayers/Format/WMC.js) + File: v1 (no auto-title, OpenLayers/Format/WMC/v1.js) + File: v1_0_0 (no auto-title, OpenLayers/Format/WMC/v1_0_0.js) + File: v1_1_0 (no auto-title, OpenLayers/Format/WMC/v1_1_0.js) + } # Group: WMC + + Group: WMSCapabilities { + + File: WMSCapabilities (no auto-title, OpenLayers/Format/WMSCapabilities.js) + File: v1 (no auto-title, OpenLayers/Format/WMSCapabilities/v1.js) + File: v1_1 (no auto-title, OpenLayers/Format/WMSCapabilities/v1_1.js) + File: v1_1_0 (no auto-title, OpenLayers/Format/WMSCapabilities/v1_1_0.js) + File: v1_1_1 (no auto-title, OpenLayers/Format/WMSCapabilities/v1_1_1.js) + File: v1_3 (no auto-title, OpenLayers/Format/WMSCapabilities/v1_3.js) + File: v1_3_0 (no auto-title, OpenLayers/Format/WMSCapabilities/v1_3_0.js) + } # Group: WMSCapabilities + + Group: WMSDescribeLayer { + + File: WMSDescribeLayer (no auto-title, OpenLayers/Format/WMSDescribeLayer.js) + File: v1_1 (no auto-title, OpenLayers/Format/WMSDescribeLayer/v1_1.js) + } # Group: WMSDescribeLayer + + File: WMSGetFeatureInfo (no auto-title, OpenLayers/Format/WMSGetFeatureInfo.js) + File: XML (no auto-title, OpenLayers/Format/XML.js) + } # Group: Format + + Group: Geometry { + + File: Geometry (no auto-title, OpenLayers/Geometry.js) + File: Collection (no auto-title, OpenLayers/Geometry/Collection.js) + File: Curve (no auto-title, OpenLayers/Geometry/Curve.js) + File: LinearRing (no auto-title, OpenLayers/Geometry/LinearRing.js) + File: LineString (no auto-title, OpenLayers/Geometry/LineString.js) + File: MultiLineString (no auto-title, OpenLayers/Geometry/MultiLineString.js) + File: MultiPoint (no auto-title, OpenLayers/Geometry/MultiPoint.js) + File: MultiPolygon (no auto-title, OpenLayers/Geometry/MultiPolygon.js) + File: Point (no auto-title, OpenLayers/Geometry/Point.js) + File: Polygon (no auto-title, OpenLayers/Geometry/Polygon.js) + File: Rectangle (no auto-title, OpenLayers/Geometry/Rectangle.js) + } # Group: Geometry + + Group: Handler { + + File: Handler (no auto-title, OpenLayers/Handler.js) + File: Box (no auto-title, OpenLayers/Handler/Box.js) + File: Click (no auto-title, OpenLayers/Handler/Click.js) + File: Drag (no auto-title, OpenLayers/Handler/Drag.js) + File: Feature (no auto-title, OpenLayers/Handler/Feature.js) + File: Hover (no auto-title, OpenLayers/Handler/Hover.js) + File: Keyboard (no auto-title, OpenLayers/Handler/Keyboard.js) + File: MouseWheel (no auto-title, OpenLayers/Handler/MouseWheel.js) + File: Path (no auto-title, OpenLayers/Handler/Path.js) + File: Point (no auto-title, OpenLayers/Handler/Point.js) + File: Polygon (no auto-title, OpenLayers/Handler/Polygon.js) + File: RegularPolygon (no auto-title, OpenLayers/Handler/RegularPolygon.js) + } # Group: Handler + + File: Icon (no auto-title, OpenLayers/Icon.js) + + Group: Lang { + + File: Lang (no auto-title, OpenLayers/Lang.js) + File: ar (no auto-title, OpenLayers/Lang/ar.js) + File: be-tarask (no auto-title, OpenLayers/Lang/be-tarask.js) + File: bg (no auto-title, OpenLayers/Lang/bg.js) + File: br (no auto-title, OpenLayers/Lang/br.js) + File: ca (no auto-title, OpenLayers/Lang/ca.js) + File: cs-CZ (no auto-title, OpenLayers/Lang/cs-CZ.js) + File: da-DK (no auto-title, OpenLayers/Lang/da-DK.js) + File: de (no auto-title, OpenLayers/Lang/de.js) + File: en (no auto-title, OpenLayers/Lang/en.js) + File: en-CA (no auto-title, OpenLayers/Lang/en-CA.js) + File: es (no auto-title, OpenLayers/Lang/es.js) + File: el (no auto-title, OpenLayers/Lang/el.js) + File: fi (no auto-title, OpenLayers/Lang/fi.js) + File: fr (no auto-title, OpenLayers/Lang/fr.js) + File: fur (no auto-title, OpenLayers/Lang/fur.js) + File: gl (no auto-title, OpenLayers/Lang/gl.js) + File: gsw (no auto-title, OpenLayers/Lang/gsw.js) + File: hr (no auto-title, OpenLayers/Lang/hr.js) + File: hsb (no auto-title, OpenLayers/Lang/hsb.js) + File: hu (no auto-title, OpenLayers/Lang/hu.js) + File: ia (no auto-title, OpenLayers/Lang/ia.js) + File: id (no auto-title, OpenLayers/Lang/id.js) + File: io (no auto-title, OpenLayers/Lang/io.js) + File: is (no auto-title, OpenLayers/Lang/is.js) + File: it (no auto-title, OpenLayers/Lang/it.js) + File: ja (no auto-title, OpenLayers/Lang/ja.js) + File: km (no auto-title, OpenLayers/Lang/km.js) + File: ksh (no auto-title, OpenLayers/Lang/ksh.js) + File: nds (no auto-title, OpenLayers/Lang/nds.js) + File: nb (no auto-title, OpenLayers/Lang/nb.js) + File: nl (no auto-title, OpenLayers/Lang/nl.js) + File: nn (no auto-title, OpenLayers/Lang/nn.js) + File: oc (no auto-title, OpenLayers/Lang/oc.js) + File: pt (no auto-title, OpenLayers/Lang/pt.js) + File: pt-BR (no auto-title, OpenLayers/Lang/pt-BR.js) + File: ru (no auto-title, OpenLayers/Lang/ru.js) + File: sk (no auto-title, OpenLayers/Lang/sk.js) + File: sv-SE (no auto-title, OpenLayers/Lang/sv-SE.js) + File: te (no auto-title, OpenLayers/Lang/te.js) + File: vi (no auto-title, OpenLayers/Lang/vi.js) + File: zh-CN (no auto-title, OpenLayers/Lang/zh-CN.js) + File: zh-TW (no auto-title, OpenLayers/Lang/zh-TW.js) + } # Group: Lang + + Group: Layer { + + File: Layer (no auto-title, OpenLayers/Layer.js) + File: ArcGIS93Rest (no auto-title, OpenLayers/Layer/ArcGIS93Rest.js) + File: ArcIMS (no auto-title, OpenLayers/Layer/ArcIMS.js) + File: Boxes (no auto-title, OpenLayers/Layer/Boxes.js) + File: EventPane (no auto-title, OpenLayers/Layer/EventPane.js) + File: FixedZoomLevels (no auto-title, OpenLayers/Layer/FixedZoomLevels.js) + File: GeoRSS (no auto-title, OpenLayers/Layer/GeoRSS.js) + File: GML (no auto-title, OpenLayers/Layer/GML.js) + File: Google (no auto-title, OpenLayers/Layer/Google.js) + File: Grid (no auto-title, OpenLayers/Layer/Grid.js) + File: HTTPRequest (no auto-title, OpenLayers/Layer/HTTPRequest.js) + File: Image (no auto-title, OpenLayers/Layer/Image.js) + File: KaMap (no auto-title, OpenLayers/Layer/KaMap.js) + File: KaMapCache (no auto-title, OpenLayers/Layer/KaMapCache.js) + File: MapGuide (no auto-title, OpenLayers/Layer/MapGuide.js) + File: MapServer (no auto-title, OpenLayers/Layer/MapServer.js) + File: MapServer.Untiled (no auto-title, OpenLayers/Layer/MapServer/Untiled.js) + File: Markers (no auto-title, OpenLayers/Layer/Markers.js) + File: MultiMap (no auto-title, OpenLayers/Layer/MultiMap.js) + File: PointTrack (no auto-title, OpenLayers/Layer/PointTrack.js) + File: SphericalMercator (no auto-title, OpenLayers/Layer/SphericalMercator.js) + File: Text (no auto-title, OpenLayers/Layer/Text.js) + File: TileCache (no auto-title, OpenLayers/Layer/TileCache.js) + File: TMS (no auto-title, OpenLayers/Layer/TMS.js) + File: Vector (no auto-title, OpenLayers/Layer/Vector.js) + File: Vector.RootContainer (no auto-title, OpenLayers/Layer/Vector/RootContainer.js) + File: VirtualEarth (no auto-title, OpenLayers/Layer/VirtualEarth.js) + File: WFS (no auto-title, OpenLayers/Layer/WFS.js) + File: WMS (no auto-title, OpenLayers/Layer/WMS.js) + File: WMS.Untiled (no auto-title, OpenLayers/Layer/WMS/Untiled.js) + File: WMS.Post (no auto-title, OpenLayers/Layer/WMS/Post.js) + File: WorldWind (no auto-title, OpenLayers/Layer/WorldWind.js) + File: Yahoo (no auto-title, OpenLayers/Layer/Yahoo.js) + File: XYZ (no auto-title, OpenLayers/Layer/XYZ.js) + } # Group: Layer + + File: Map (no auto-title, OpenLayers/Map.js) + + Group: Marker { + + File: Marker (no auto-title, OpenLayers/Marker.js) + File: Box (no auto-title, OpenLayers/Marker/Box.js) + } # Group: Marker + + Group: Popup { + + File: Popup (no auto-title, OpenLayers/Popup.js) + File: Anchored (no auto-title, OpenLayers/Popup/Anchored.js) + File: AnchoredBubble (no auto-title, OpenLayers/Popup/AnchoredBubble.js) + File: Framed (no auto-title, OpenLayers/Popup/Framed.js) + File: FramedCloud (no auto-title, OpenLayers/Popup/FramedCloud.js) + } # Group: Popup + + File: Projection (no auto-title, OpenLayers/Projection.js) + + Group: Protocol { + + File: Protocol (no auto-title, OpenLayers/Protocol.js) + File: HTTP (no auto-title, OpenLayers/Protocol/HTTP.js) + + Group: SQL { + + File: SQL (no auto-title, OpenLayers/Protocol/SQL.js) + File: Gears (no auto-title, OpenLayers/Protocol/SQL/Gears.js) + } # Group: SQL + + Group: WFS { + + File: WFS (no auto-title, OpenLayers/Protocol/WFS.js) + File: v1 (no auto-title, OpenLayers/Protocol/WFS/v1.js) + File: v1_0_0 (no auto-title, OpenLayers/Protocol/WFS/v1_0_0.js) + File: v1_1_0 (no auto-title, OpenLayers/Protocol/WFS/v1_1_0.js) + } # Group: WFS + + } # Group: Protocol + + Group: Renderer { + + File: Renderer (no auto-title, OpenLayers/Renderer.js) + File: Canvas (no auto-title, OpenLayers/Renderer/Canvas.js) + File: Elements (no auto-title, OpenLayers/Renderer/Elements.js) + File: SVG (no auto-title, OpenLayers/Renderer/SVG.js) + File: VML (no auto-title, OpenLayers/Renderer/VML.js) + } # Group: Renderer + + Group: Request { + + File: Request (no auto-title, OpenLayers/Request.js) + File: XMLHttpRequest (no auto-title, OpenLayers/Request/XMLHttpRequest.js) + } # Group: Request + + File: Rule (no auto-title, OpenLayers/Rule.js) + + Group: Strategy { + + File: Strategy (no auto-title, OpenLayers/Strategy.js) + File: BBOX (no auto-title, OpenLayers/Strategy/BBOX.js) + File: Cluster (no auto-title, OpenLayers/Strategy/Cluster.js) + File: Fixed (no auto-title, OpenLayers/Strategy/Fixed.js) + File: Paging (no auto-title, OpenLayers/Strategy/Paging.js) + File: Refresh (OpenLayers/Strategy/Refresh.js) + File: Save (OpenLayers/Strategy/Save.js) + } # Group: Strategy + + File: Style (no auto-title, OpenLayers/Style.js) + File: StyleMap (no auto-title, OpenLayers/StyleMap.js) + + Group: Tile { + + File: Tile (no auto-title, OpenLayers/Tile.js) + File: Image (no auto-title, OpenLayers/Tile/Image.js) + File: WFS (no auto-title, OpenLayers/Tile/WFS.js) + File: IFrame (OpenLayers/Tile/Image/IFrame.js) + } # Group: Tile + + File: Tween (no auto-title, OpenLayers/Tween.js) + File: Util (no auto-title, OpenLayers/Util.js) + } # Group: OpenLayers + +Group: Index { + + Index: Everything + Class Index: Classes + Constant Index: Constants + Function Index: Functions + Property Index: Properties + File Index: Files + Constructor Index: Constructor + } # Group: Index + Index: /sandbox/fvanderbiest/openlayers/doc_config/Languages.txt =================================================================== --- /sandbox/fvanderbiest/openlayers/doc_config/Languages.txt (revision 1941) +++ /sandbox/fvanderbiest/openlayers/doc_config/Languages.txt (revision 1941) @@ -0,0 +1,113 @@ +Format: Development Release 12-07-2007 (1.35 base) + +# This is the Natural Docs languages file for this project. If you change +# anything here, it will apply to THIS PROJECT ONLY. If you'd like to change +# something for all your projects, edit the Languages.txt in Natural Docs' +# Config directory instead. + + +# You can prevent certain file extensions from being scanned like this: +# Ignore Extensions: [extension] [extension] ... + + +#------------------------------------------------------------------------------- +# SYNTAX: +# +# Unlike other Natural Docs configuration files, in this file all comments +# MUST be alone on a line. Some languages deal with the # character, so you +# cannot put comments on the same line as content. +# +# Also, all lists are separated with spaces, not commas, again because some +# languages may need to use them. +# +# Language: [name] +# Alter Language: [name] +# Defines a new language or alters an existing one. Its name can use any +# characters. If any of the properties below have an add/replace form, you +# must use that when using Alter Language. +# +# The language Shebang Script is special. It's entry is only used for +# extensions, and files with those extensions have their shebang (#!) lines +# read to determine the real language of the file. Extensionless files are +# always treated this way. +# +# The language Text File is also special. It's treated as one big comment +# so you can put Natural Docs content in them without special symbols. Also, +# if you don't specify a package separator, ignored prefixes, or enum value +# behavior, it will copy those settings from the language that is used most +# in the source tree. +# +# Extensions: [extension] [extension] ... +# [Add/Replace] Extensions: [extension] [extension] ... +# Defines the file extensions of the language's source files. You can +# redefine extensions found in the main languages file. You can use * to +# mean any undefined extension. +# +# Shebang Strings: [string] [string] ... +# [Add/Replace] Shebang Strings: [string] [string] ... +# Defines a list of strings that can appear in the shebang (#!) line to +# designate that it's part of the language. You can redefine strings found +# in the main languages file. +# +# Ignore Prefixes in Index: [prefix] [prefix] ... +# [Add/Replace] Ignored Prefixes in Index: [prefix] [prefix] ... +# +# Ignore [Topic Type] Prefixes in Index: [prefix] [prefix] ... +# [Add/Replace] Ignored [Topic Type] Prefixes in Index: [prefix] [prefix] ... +# Specifies prefixes that should be ignored when sorting symbols in an +# index. Can be specified in general or for a specific topic type. +# +#------------------------------------------------------------------------------ +# For basic language support only: +# +# Line Comments: [symbol] [symbol] ... +# Defines a space-separated list of symbols that are used for line comments, +# if any. +# +# Block Comments: [opening sym] [closing sym] [opening sym] [closing sym] ... +# Defines a space-separated list of symbol pairs that are used for block +# comments, if any. +# +# Package Separator: [symbol] +# Defines the default package separator symbol. The default is a dot. +# +# [Topic Type] Prototype Enders: [symbol] [symbol] ... +# When defined, Natural Docs will attempt to get a prototype from the code +# immediately following the topic type. It stops when it reaches one of +# these symbols. Use \n for line breaks. +# +# Line Extender: [symbol] +# Defines the symbol that allows a prototype to span multiple lines if +# normally a line break would end it. +# +# Enum Values: [global|under type|under parent] +# Defines how enum values are referenced. The default is global. +# global - Values are always global, referenced as 'value'. +# under type - Values are under the enum type, referenced as +# 'package.enum.value'. +# under parent - Values are under the enum's parent, referenced as +# 'package.value'. +# +# Perl Package: [perl package] +# Specifies the Perl package used to fine-tune the language behavior in ways +# too complex to do in this file. +# +#------------------------------------------------------------------------------ +# For full language support only: +# +# Full Language Support: [perl package] +# Specifies the Perl package that has the parsing routines necessary for full +# language support. +# +#------------------------------------------------------------------------------- + +# The following languages are defined in the main file, if you'd like to alter +# them: +# +# Text File, Shebang Script, C/C++, C#, Java, JavaScript, Perl, Python, +# PHP, SQL, Visual Basic, Pascal, Assembly, Ada, Tcl, Ruby, Makefile, +# ActionScript, ColdFusion, R, Fortran + +# If you add a language that you think would be useful to other developers +# and should be included in Natural Docs by default, please e-mail it to +# languages [at] naturaldocs [dot] org. Index: /sandbox/fvanderbiest/openlayers/build/full.cfg =================================================================== --- /sandbox/fvanderbiest/openlayers/build/full.cfg (revision 1941) +++ /sandbox/fvanderbiest/openlayers/build/full.cfg (revision 1941) @@ -0,0 +1,32 @@ +# This is the full build with all files: this includes the vector-related files +# like Renderers and Formats. + +[first] +OpenLayers/SingleFile.js +OpenLayers.js +OpenLayers/BaseTypes.js +OpenLayers/BaseTypes/Class.js +OpenLayers/Util.js +Rico/Corner.js + +[last] + +[include] + +[exclude] +Firebug/firebug.js +Firebug/firebugx.js +OpenLayers/Lang/ca.js +OpenLayers/Lang/cs-CZ.js +OpenLayers/Lang/da-DK.js +OpenLayers/Lang/de.js +OpenLayers/Lang/en-CA.js +OpenLayers/Lang/es.js +OpenLayers/Lang/fr.js +OpenLayers/Lang/it.js +OpenLayers/Lang/nb.js +OpenLayers/Lang/nl.js +OpenLayers/Lang/pt-BR.js +OpenLayers/Lang/sv-SE.js +OpenLayers/Lang/zh-TW.js +OpenLayers/Lang/zh-CN.js Index: /sandbox/fvanderbiest/openlayers/build/license.txt =================================================================== --- /sandbox/fvanderbiest/openlayers/build/license.txt (revision 1941) +++ /sandbox/fvanderbiest/openlayers/build/license.txt (revision 1941) @@ -0,0 +1,92 @@ +/* + + OpenLayers.js -- OpenLayers Map Viewer Library + + Copyright 2005-2008 MetaCarta, Inc., released under the Clear BSD license. + Please see http://svn.openlayers.org/trunk/openlayers/license.txt + for the full text of the license. + + Includes compressed code under the following licenses: + + (For uncompressed versions of the code used please see the + OpenLayers SVN repository: ) + +*/ + +/* Contains portions of Prototype.js: + * + * Prototype JavaScript framework, version 1.4.0 + * (c) 2005 Sam Stephenson + * + * Prototype is freely distributable under the terms of an MIT-style license. + * For details, see the Prototype web site: http://prototype.conio.net/ + * + *--------------------------------------------------------------------------*/ + +/** +* +* Contains portions of Rico +* +* Copyright 2005 Sabre Airline Solutions +* +* Licensed under the Apache License, Version 2.0 (the "License"); you +* may not use this file except in compliance with the License. You +* may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or +* implied. See the License for the specific language governing +* permissions and limitations under the License. +* +**/ + +/** + * Contains XMLHttpRequest.js + * Copyright 2007 Sergey Ilinsky (http://www.ilinsky.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + */ + +/** + * Contains portions of Gears + * + * Copyright 2007, Google Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of Google Inc. nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Sets up google.gears.*, which is *the only* supported way to access Gears. + * + * Circumvent this file at your own risk! + * + * In the future, Gears may automatically define google.gears.* without this + * file. Gears may use these objects to transparently fix bugs and compatibility + * issues. Applications that use the code below will continue to work seamlessly + * when that happens. + */ Index: /sandbox/fvanderbiest/openlayers/build/library.cfg =================================================================== --- /sandbox/fvanderbiest/openlayers/build/library.cfg (revision 1941) +++ /sandbox/fvanderbiest/openlayers/build/library.cfg (revision 1941) @@ -0,0 +1,68 @@ +# This file includes the OpenLayers code to create a build for everything that +# does not require vector support. build.py uses this profile if no other one +# is specified. + +[first] +OpenLayers/SingleFile.js +OpenLayers.js +OpenLayers/BaseTypes.js +OpenLayers/BaseTypes/Class.js +OpenLayers/Util.js +Rico/Corner.js + +[last] + +[include] + +[exclude] +Firebug/firebug.js +Firebug/firebugx.js +OpenLayers/Format/GeoRSS.js +OpenLayers/Format/GML.js +OpenLayers/Format/WKT.js +OpenLayers/Format/KML.js +OpenLayers/Format/WFS.js +OpenLayers/Format.js +OpenLayers/Handler/Path.js +OpenLayers/Handler/Point.js +OpenLayers/Handler/Polygon.js +OpenLayers/Handler/Select.js +OpenLayers/Geometry/Collection.js +OpenLayers/Geometry/Curve.js +OpenLayers/Geometry/LinearRing.js +OpenLayers/Geometry/LineString.js +OpenLayers/Geometry/MultiLineString.js +OpenLayers/Geometry/MultiPoint.js +OpenLayers/Geometry/MultiPolygon.js +OpenLayers/Geometry/Point.js +OpenLayers/Geometry/Polygon.js +OpenLayers/Geometry/Rectangle.js +OpenLayers/Geometry/Surface.js +OpenLayers/Geometry.js +OpenLayers/Layer/GML.js +OpenLayers/Layer/Vector.js +OpenLayers/Control/DrawFeature.js +OpenLayers/Control/EditingToolbar.js +OpenLayers/Control/SelectFeature.js +OpenLayers/Feature/Vector.js +OpenLayers/Renderer +OpenLayers/Renderer/Elements.js +OpenLayers/Renderer/SVG.js +OpenLayers/Renderer/VML.js +OpenLayers/Renderer.js +OpenLayers/Lang/ca.js +OpenLayers/Lang/cs-CZ.js +OpenLayers/Lang/da-DK.js +OpenLayers/Lang/de.js +OpenLayers/Lang/en-CA.js +OpenLayers/Lang/es.js +OpenLayers/Lang/fr.js +OpenLayers/Lang/it.js +OpenLayers/Lang/nb.js +OpenLayers/Lang/nl.js +OpenLayers/Lang/pt-BR.js +OpenLayers/Lang/sv-SE.js +OpenLayers/Lang/zh-TW.js +OpenLayers/Lang/zh-CN.js + + Index: /sandbox/fvanderbiest/openlayers/build/build.py =================================================================== --- /sandbox/fvanderbiest/openlayers/build/build.py (revision 1941) +++ /sandbox/fvanderbiest/openlayers/build/build.py (revision 1941) @@ -0,0 +1,50 @@ +#!/usr/bin/env python + +import sys +sys.path.append("../tools") +import mergejs + +have_compressor = None +try: + import jsmin + have_compressor = "jsmin" +except ImportError: + try: + import minimize + have_compressor = "minimize" + except Exception, E: + print E + pass + +sourceDirectory = "../lib" +configFilename = "full.cfg" +outputFilename = "OpenLayers.js" + +if len(sys.argv) > 1: + configFilename = sys.argv[1] + extension = configFilename[-4:] + + if extension != ".cfg": + configFilename = sys.argv[1] + ".cfg" + +if len(sys.argv) > 2: + outputFilename = sys.argv[2] + +print "Merging libraries." +merged = mergejs.run(sourceDirectory, None, configFilename) +if have_compressor == "jsmin": + print "Compressing using jsmin." + minimized = jsmin.jsmin(merged) +elif have_compressor == "minimize": + print "Compressing using minimize." + minimized = minimize.minimize(merged) +else: # fallback + print "Not compressing." + minimized = merged +print "Adding license file." +minimized = file("license.txt").read() + minimized + +print "Writing to %s." % outputFilename +file(outputFilename, "w").write(minimized) + +print "Done." Index: /sandbox/fvanderbiest/openlayers/build/README.txt =================================================================== --- /sandbox/fvanderbiest/openlayers/build/README.txt (revision 1941) +++ /sandbox/fvanderbiest/openlayers/build/README.txt (revision 1941) @@ -0,0 +1,14 @@ + +## HowTo: Build & deploy "Shrunk" Single File Library version of OpenLayers ## + + * Build: + + cd build + ./build.py + cd .. + + * Upload the result to the server: e.g. + + scp build/OpenLayers.js openlayers@openlayers.org:openlayers.org/htdocs/code/ + + Index: /sandbox/fvanderbiest/openlayers/build/lite.cfg =================================================================== --- /sandbox/fvanderbiest/openlayers/build/lite.cfg (revision 1941) +++ /sandbox/fvanderbiest/openlayers/build/lite.cfg (revision 1941) @@ -0,0 +1,22 @@ +# This file includes a small subset of OpenLayers code, designed to be +# integrated into another application. It includes only the Layer types +# neccesary to create tiled or untiled WMS, and does not include any Controls. +# This is the result of what was at the time called "Webmap.js" at the FOSS4G +# Web Mapping BOF. + +[first] +OpenLayers/SingleFile.js +OpenLayers.js +OpenLayers/BaseTypes.js +OpenLayers/BaseTypes/Class.js +OpenLayers/Util.js + +[last] + +[include] +OpenLayers/Map.js +OpenLayers/Layer/WMS.js + +[exclude] + + Index: /sandbox/fvanderbiest/openlayers/build/buildUncompressed.py =================================================================== --- /sandbox/fvanderbiest/openlayers/build/buildUncompressed.py (revision 1941) +++ /sandbox/fvanderbiest/openlayers/build/buildUncompressed.py (revision 1941) @@ -0,0 +1,25 @@ +#!/usr/bin/env python + +import sys +sys.path.append("../tools") + +import jsmin, mergejs + +sourceDirectory = "../lib" +configFilename = "full.cfg" +outputFilename = "OpenLayers.js" + +if len(sys.argv) > 1: + configFilename = sys.argv[1] + ".cfg" +if len(sys.argv) > 2: + outputFilename = sys.argv[2] + +print "Merging libraries." +merged = mergejs.run(sourceDirectory, None, configFilename) +print "Adding license file." +merged = file("license.txt").read() + merged + +print "Writing to %s." % outputFilename +file(outputFilename, "w").write(merged) + +print "Done." Index: /sandbox/fvanderbiest/openlayers/tools/exampleparser.py =================================================================== --- /sandbox/fvanderbiest/openlayers/tools/exampleparser.py (revision 1941) +++ /sandbox/fvanderbiest/openlayers/tools/exampleparser.py (revision 1941) @@ -0,0 +1,251 @@ +#!/usr/bin/env python + +import sys +import os +import re +import urllib2 +import time +from xml.dom.minidom import Document + +try: + import xml.etree.ElementTree as ElementTree +except ImportError: + try: + import cElementTree as ElementTree + except ImportError: + try: + import elementtree.ElementTree as ElementTree + except ImportError: + import lxml.etree as ElementTree + +missing_deps = False +try: + import simplejson + from BeautifulSoup import BeautifulSoup +except ImportError, E: + missing_deps = E + +feedName = "example-list.xml" +feedPath = "http://openlayers.org/dev/examples/" + +def getListOfOnlineExamples(baseUrl): + """ + useful if you want to get a list of examples a url. not used by default. + """ + html = urllib2.urlopen(baseUrl) + soup = BeautifulSoup(html) + examples = soup.findAll('li') + examples = [example.find('a').get('href') for example in examples] + examples = [example for example in examples if example.endswith('.html')] + examples = [example for example in examples] + return examples + +def getListOfExamples(relPath): + """ + returns list of .html filenames within a given path - excludes example-list.html + """ + examples = os.listdir(relPath) + examples = [example for example in examples if example.endswith('.html') and example != "example-list.html"] + return examples + + +def getExampleHtml(location): + """ + returns html of a specific example that is available online or locally + """ + print '.', + if location.startswith('http'): + return urllib2.urlopen(location).read() + else: + f = open(location) + html = f.read() + f.close() + return html + + +def extractById(soup, tagId, value=None): + """ + returns full contents of a particular tag id + """ + beautifulTag = soup.find(id=tagId) + if beautifulTag: + if beautifulTag.contents: + value = str(beautifulTag.renderContents()).strip() + value = value.replace('\t','') + value = value.replace('\n','') + return value + +def getRelatedClasses(html): + """ + parses the html, and returns a list of all OpenLayers Classes + used within (ie what parts of OL the javascript uses). + """ + rawstr = r'''(?POpenLayers\..*?)\(''' + return re.findall(rawstr, html) + +def parseHtml(html,ids): + """ + returns dictionary of items of interest + """ + soup = BeautifulSoup(html) + d = {} + for tagId in ids: + d[tagId] = extractById(soup,tagId) + #classes should eventually be parsed from docs - not automatically created. + classes = getRelatedClasses(html) + d['classes'] = classes + return d + +def getSvnInfo(path): + h = os.popen("svn info %s --xml" % path) + tree = ElementTree.fromstring(h.read()) + h.close() + d = { + 'url': tree.findtext('entry/url'), + 'author': tree.findtext('entry/commit/author'), + 'date': tree.findtext('entry/commit/date') + } + return d + +def createFeed(examples): + doc = Document() + atomuri = "http://www.w3.org/2005/Atom" + feed = doc.createElementNS(atomuri, "feed") + feed.setAttribute("xmlns", atomuri) + title = doc.createElementNS(atomuri, "title") + title.appendChild(doc.createTextNode("OpenLayers Examples")) + feed.appendChild(title) + link = doc.createElementNS(atomuri, "link") + link.setAttribute("rel", "self") + link.setAttribute("href", feedPath + feedName) + + modtime = time.strftime("%Y-%m-%dT%I:%M:%SZ", time.gmtime()) + id = doc.createElementNS(atomuri, "id") + id.appendChild(doc.createTextNode("%s%s#%s" % (feedPath, feedName, modtime))) + feed.appendChild(id) + + updated = doc.createElementNS(atomuri, "updated") + updated.appendChild(doc.createTextNode(modtime)) + feed.appendChild(updated) + + examples.sort(key=lambda x:x["modified"]) + for example in sorted(examples, key=lambda x:x["modified"], reverse=True): + entry = doc.createElementNS(atomuri, "entry") + + title = doc.createElementNS(atomuri, "title") + title.appendChild(doc.createTextNode(example["title"] or example["example"])) + entry.appendChild(title) + + link = doc.createElementNS(atomuri, "link") + link.setAttribute("href", "%s%s" % (feedPath, example["example"])) + entry.appendChild(link) + + summary = doc.createElementNS(atomuri, "summary") + summary.appendChild(doc.createTextNode(example["shortdesc"] or example["example"])) + entry.appendChild(summary) + + updated = doc.createElementNS(atomuri, "updated") + updated.appendChild(doc.createTextNode(example["modified"])) + entry.appendChild(updated) + + author = doc.createElementNS(atomuri, "author") + name = doc.createElementNS(atomuri, "name") + name.appendChild(doc.createTextNode(example["author"])) + author.appendChild(name) + entry.appendChild(author) + + id = doc.createElementNS(atomuri, "id") + id.appendChild(doc.createTextNode("%s%s#%s" % (feedPath, example["example"], example["modified"]))) + entry.appendChild(id) + + feed.appendChild(entry) + + doc.appendChild(feed) + return doc + +def wordIndex(examples): + """ + Create an inverted index based on words in title and shortdesc. Keys are + lower cased words. Values are dictionaries with example index keys and + count values. + """ + index = {} + unword = re.compile("\\W+") + keys = ["shortdesc", "title"] + for i in range(len(examples)): + for key in keys: + text = examples[i][key] + if text: + words = unword.split(text) + for word in words: + if word: + word = word.lower() + if index.has_key(word): + if index[word].has_key(i): + index[word][i] += 1 + else: + index[word][i] = 1 + else: + index[word] = {i: 1} + return index + +if __name__ == "__main__": + + if missing_deps: + print "This script requires simplejson and BeautifulSoup. You don't have them. \n(%s)" % E + sys.exit() + + if len(sys.argv) > 1: + outFile = open(sys.argv[1],'w') + else: + outFile = open('../examples/example-list.js','w') + + examplesLocation = '../examples' + print 'Reading examples from %s and writing out to %s' % (examplesLocation, outFile.name) + + exampleList = [] + docIds = ['title','shortdesc'] + + #comment out option to create docs from online resource + #examplesLocation = 'http://svn.openlayers.org/sandbox/docs/examples/' + #examples = getListOfOnlineExamples(examplesLocation) + + examples = getListOfExamples(examplesLocation) + + modtime = time.strftime("%Y-%m-%dT%I:%M:%SZ", time.gmtime()) + + for example in examples: + url = os.path.join(examplesLocation,example) + html = getExampleHtml(url) + tagvalues = parseHtml(html,docIds) + tagvalues['example'] = example + # add in svn info + d = getSvnInfo(url) + tagvalues["modified"] = d["date"] or modtime + tagvalues["author"] = d["author"] or "anonymous" + tagvalues['link'] = example + + exampleList.append(tagvalues) + + print + + exampleList.sort(key=lambda x:x['example'].lower()) + + index = wordIndex(exampleList) + + json = simplejson.dumps({"examples": exampleList, "index": index}) + #give the json a global variable we can use in our js. This should be replaced or made optional. + json = 'var info=' + json + outFile.write(json) + outFile.close() + + print "writing feed to ../examples/%s " % feedName + atom = open('../examples/%s' % feedName, 'w') + doc = createFeed(exampleList) + atom.write(doc.toxml()) + atom.close() + + + print 'complete' + + Index: /sandbox/fvanderbiest/openlayers/tools/toposort.py =================================================================== --- /sandbox/fvanderbiest/openlayers/tools/toposort.py (revision 1941) +++ /sandbox/fvanderbiest/openlayers/tools/toposort.py (revision 1941) @@ -0,0 +1,260 @@ +# +# According to this file +# is licensed under a BSD-style license. We only use the section +# originally by Tim Peters. +# +# TODO: The use of this code needs to be okayed by someone. +# + +class RecursionError( OverflowError, ValueError ): + '''Unable to calculate result because of recursive structure''' + + +def sort(nodes, routes, noRecursion=1): + '''Passed a list of node IDs and a list of source,dest ID routes + attempt to create a list of stages where each sub list + is one stage in a process. + ''' + children, parents = _buildChildrenLists(routes) + # first stage is those nodes + # having no incoming routes... + stage = [] + stages = [stage] + taken = [] + for node in nodes: + if (not parents.get(node)): + stage.append (node) + if nodes and not stage: + # there is no element which does not depend on + # some other element!!! + stage.append( nodes[0]) + taken.extend( stage ) + nodes = filter ( lambda x, l=stage: x not in l, nodes ) + while nodes: + previousStageChildren = [] + nodelen = len(nodes) + # second stage are those nodes + # which are direct children of the first stage + for node in stage: + for child in children.get (node, []): + if child not in previousStageChildren and child not in taken: + previousStageChildren.append(child) + elif child in taken and noRecursion: + raise RecursionError( (child, node) ) + # unless they are children of other direct children... + # TODO, actually do that... + stage = previousStageChildren + removes = [] + for current in stage: + currentParents = parents.get( current, [] ) + for parent in currentParents: + if parent in stage and parent != current: + # might wind up removing current... + if not current in parents.get(parent, []): + # is not mutually dependent... + removes.append( current ) + for remove in removes: + while remove in stage: + stage.remove( remove ) + stages.append( stage) + taken.extend( stage ) + nodes = filter ( lambda x, l=stage: x not in l, nodes ) + if nodelen == len(nodes): + if noRecursion: + raise RecursionError( nodes ) + else: + stages.append( nodes[:] ) + nodes = [] + return stages + +def _buildChildrenLists (routes): + childrenTable = {} + parentTable = {} + for sourceID,destinationID in routes: + currentChildren = childrenTable.get( sourceID, []) + currentParents = parentTable.get( destinationID, []) + if not destinationID in currentChildren: + currentChildren.append ( destinationID) + if not sourceID in currentParents: + currentParents.append ( sourceID) + childrenTable[sourceID] = currentChildren + parentTable[destinationID] = currentParents + return childrenTable, parentTable + + +def toposort (nodes, routes, noRecursion=1): + '''Topological sort from Tim Peters, fairly efficient + in comparison (it seems).''' + #first calculate the recursion depth + + dependencies = {} + inversedependencies = {} + if not nodes: + return [] + if not routes: + return [nodes] + for node in nodes: + dependencies[ node ] = (0, node) + inversedependencies[ node ] = [] + + + for depended, depends in routes: + # is it a null rule + try: + newdependencylevel, object = dependencies.get ( depends, (0, depends)) + except TypeError: + print depends + raise + dependencies[ depends ] = (newdependencylevel + 1, depends) + # "dependency (existence) of depended-on" + newdependencylevel,object = dependencies.get ( depended, (0, depended) ) + dependencies[ depended ] = (newdependencylevel, depended) + # Inverse dependency set up + dependencieslist = inversedependencies.get ( depended, []) + dependencieslist.append (depends) + inversedependencies[depended] = dependencieslist + ### Now we do the actual sorting + # The first task is to create the sortable + # list of dependency-levels + sortinglist = dependencies.values() + sortinglist.sort () + output = [] + while sortinglist: + deletelist = [] + generation = [] + output.append( generation) + while sortinglist and sortinglist[0][0] == 0: + number, object = sortinglist[0] + generation.append ( object ) + deletelist.append( object ) + for inverse in inversedependencies.get(object, () ): + try: + oldcount, inverse = dependencies [ inverse] + if oldcount > 0: + # will be dealt with on later pass + dependencies [ inverse] = (oldcount-1, inverse) + else: + # will be dealt with on this pass, + # so needs not to be in the sorting list next time + deletelist.append( inverse ) + # just in case a loop comes through + inversedependencies[object] = [] + except KeyError: + # dealing with a recursion-breaking run... + pass + del sortinglist [0] + # if no elements could be deleted, then + # there is something which depends upon itself + if not deletelist: + if noRecursion: + raise RecursionError( sortinglist ) + else: + # hack so that something gets deleted... +## import pdb +## pdb.set_trace() + dependencies[sortinglist[0][1]] = (0,sortinglist[0][1]) + # delete the items that were dealt with + for item in deletelist: + try: + del dependencies [ item ] + except KeyError: + pass + # need to recreate the sortinglist + sortinglist = dependencies.values() + if not generation: + output.remove( generation ) + sortinglist.sort () + return output + + + + + +if __name__ == "__main__": + + nodes = ['a', 'b', 'c', 'd', 'e', 'f'] + route = [('a', 'b'), ('b', 'c'), ('b', 'd'), ('e','f')] + + for x in toposort( nodes, route): + for a in x: + print a + + raise SystemExit + + + + import pprint, traceback + nodes= [ 0,1,2,3,4,5 ] + testingValues = [ + [ (0,1),(1,2),(2,3),(3,4),(4,5)], + [ (0,1),(0,2),(1,2),(3,4),(4,5)], + [ + (0,1), + (0,2), + (0,2), + (2,4), + (2,5), + (3,2), + (0,3)], + [ + (0,1), # 3-element cycle test, no orphan nodes + (1,2), + (2,0), + (2,4), + (2,5), + (3,2), + (0,3)], + [ + (0,1), + (1,1), + (1,1), + (1,4), + (1,5), + (1,2), + (3,1), + (2,1), + (2,0)], + [ + (0,1), + (1,0), + (0,2), + (0,3), + ], + [ + (0,1), + (1,0), + (0,2), + (3,1), + ], + ] + print 'sort, no recursion allowed' + for index in range(len(testingValues)): +## print ' %s -- %s'%( index, testingValues[index]) + try: + print ' ', sort( nodes, testingValues[index] ) + except: + print 'exception raised' + print 'toposort, no recursion allowed' + for index in range(len(testingValues)): +## print ' %s -- %s'%( index, testingValues[index]) + try: + print ' ', toposort( nodes, testingValues[index] ) + except: + print 'exception raised' + print 'sort, recursion allowed' + for index in range(len(testingValues)): +## print ' %s -- %s'%( index, testingValues[index]) + try: + print ' ', sort( nodes, testingValues[index],0 ) + except: + print 'exception raised' + print 'toposort, recursion allowed' + for index in range(len(testingValues)): +## print ' %s -- %s'%( index, testingValues[index]) + try: + print ' ', toposort( nodes, testingValues[index],0 ) + except: + print 'exception raised' + + + Index: /sandbox/fvanderbiest/openlayers/tools/jsmin.c =================================================================== --- /sandbox/fvanderbiest/openlayers/tools/jsmin.c (revision 1941) +++ /sandbox/fvanderbiest/openlayers/tools/jsmin.c (revision 1941) @@ -0,0 +1,272 @@ +/* jsmin.c + 2006-05-04 + +Copyright (c) 2002 Douglas Crockford (www.crockford.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +The Software shall be used for Good, not Evil. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ + +#include +#include + +static int theA; +static int theB; +static int theLookahead = EOF; + + +/* isAlphanum -- return true if the character is a letter, digit, underscore, + dollar sign, or non-ASCII character. +*/ + +static int +isAlphanum(int c) +{ + return ((c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || + (c >= 'A' && c <= 'Z') || c == '_' || c == '$' || c == '\\' || + c > 126); +} + + +/* get -- return the next character from stdin. Watch out for lookahead. If + the character is a control character, translate it to a space or + linefeed. +*/ + +static int +get() +{ + int c = theLookahead; + theLookahead = EOF; + if (c == EOF) { + c = getc(stdin); + } + if (c >= ' ' || c == '\n' || c == EOF) { + return c; + } + if (c == '\r') { + return '\n'; + } + return ' '; +} + + +/* peek -- get the next character without getting it. +*/ + +static int +peek() +{ + theLookahead = get(); + return theLookahead; +} + + +/* next -- get the next character, excluding comments. peek() is used to see + if a '/' is followed by a '/' or '*'. +*/ + +static int +next() +{ + int c = get(); + if (c == '/') { + switch (peek()) { + case '/': + for (;;) { + c = get(); + if (c <= '\n') { + return c; + } + } + case '*': + get(); + for (;;) { + switch (get()) { + case '*': + if (peek() == '/') { + get(); + return ' '; + } + break; + case EOF: + fprintf(stderr, "Error: JSMIN Unterminated comment.\n"); + exit(1); + } + } + default: + return c; + } + } + return c; +} + + +/* action -- do something! What you do is determined by the argument: + 1 Output A. Copy B to A. Get the next B. + 2 Copy B to A. Get the next B. (Delete A). + 3 Get the next B. (Delete B). + action treats a string as a single character. Wow! + action recognizes a regular expression if it is preceded by ( or , or =. +*/ + +static void +action(int d) +{ + switch (d) { + case 1: + putc(theA, stdout); + case 2: + theA = theB; + if (theA == '\'' || theA == '"') { + for (;;) { + putc(theA, stdout); + theA = get(); + if (theA == theB) { + break; + } + if (theA <= '\n') { + fprintf(stderr, +"Error: JSMIN unterminated string literal: %c\n", theA); + exit(1); + } + if (theA == '\\') { + putc(theA, stdout); + theA = get(); + } + } + } + case 3: + theB = next(); + if (theB == '/' && (theA == '(' || theA == ',' || theA == '=' || + theA == ':' || theA == '[' || theA == '!' || theA == '&' || + theA == '|')) { + putc(theA, stdout); + putc(theB, stdout); + for (;;) { + theA = get(); + if (theA == '/') { + break; + } else if (theA =='\\') { + putc(theA, stdout); + theA = get(); + } else if (theA <= '\n') { + fprintf(stderr, +"Error: JSMIN unterminated Regular Expression literal.\n", theA); + exit(1); + } + putc(theA, stdout); + } + theB = next(); + } + } +} + + +/* jsmin -- Copy the input to the output, deleting the characters which are + insignificant to JavaScript. Comments will be removed. Tabs will be + replaced with spaces. Carriage returns will be replaced with linefeeds. + Most spaces and linefeeds will be removed. +*/ + +static void +jsmin() +{ + theA = '\n'; + action(3); + while (theA != EOF) { + switch (theA) { + case ' ': + if (isAlphanum(theB)) { + action(1); + } else { + action(2); + } + break; + case '\n': + switch (theB) { + case '{': + case '[': + case '(': + case '+': + case '-': + action(1); + break; + case ' ': + action(3); + break; + default: + if (isAlphanum(theB)) { + action(1); + } else { + action(2); + } + } + break; + default: + switch (theB) { + case ' ': + if (isAlphanum(theA)) { + action(1); + break; + } + action(3); + break; + case '\n': + switch (theA) { + case '}': + case ']': + case ')': + case '+': + case '-': + case '"': + case '\'': + action(1); + break; + default: + if (isAlphanum(theA)) { + action(1); + } else { + action(3); + } + } + break; + default: + action(1); + break; + } + } + } +} + + +/* main -- Output any command line arguments as comments + and then minify the input. +*/ +extern int +main(int argc, char* argv[]) +{ + int i; + for (i = 1; i < argc; i += 1) { + fprintf(stdout, "// %s\n", argv[i]); + } + jsmin(); + return 0; +} Index: /sandbox/fvanderbiest/openlayers/tools/mergejs.py =================================================================== --- /sandbox/fvanderbiest/openlayers/tools/mergejs.py (revision 1941) +++ /sandbox/fvanderbiest/openlayers/tools/mergejs.py (revision 1941) @@ -0,0 +1,252 @@ +#!/usr/bin/env python +# +# Merge multiple JavaScript source code files into one. +# +# Usage: +# This script requires source files to have dependencies specified in them. +# +# Dependencies are specified with a comment of the form: +# +# // @requires +# +# e.g. +# +# // @requires Geo/DataSource.js +# +# This script should be executed like so: +# +# mergejs.py [...] +# +# e.g. +# +# mergejs.py openlayers.js Geo/ CrossBrowser/ +# +# This example will cause the script to walk the `Geo` and +# `CrossBrowser` directories--and subdirectories thereof--and import +# all `*.js` files encountered. The dependency declarations will be extracted +# and then the source code from imported files will be output to +# a file named `openlayers.js` in an order which fulfils the dependencies +# specified. +# +# +# Note: This is a very rough initial version of this code. +# +# -- Copyright 2005-2008 MetaCarta, Inc. / OpenLayers project -- +# + +# TODO: Allow files to be excluded. e.g. `Crossbrowser/DebugMode.js`? +# TODO: Report error when dependency can not be found rather than KeyError. + +import re +import os +import sys + +SUFFIX_JAVASCRIPT = ".js" + +RE_REQUIRE = "@requires:? (.*)\n" # TODO: Ensure in comment? +class SourceFile: + """ + Represents a Javascript source code file. + """ + + def __init__(self, filepath, source): + """ + """ + self.filepath = filepath + self.source = source + + self.requiredBy = [] + + + def _getRequirements(self): + """ + Extracts the dependencies specified in the source code and returns + a list of them. + """ + # TODO: Cache? + return re.findall(RE_REQUIRE, self.source) + + requires = property(fget=_getRequirements, doc="") + + + +def usage(filename): + """ + Displays a usage message. + """ + print "%s [-c ] [...]" % filename + + +class Config: + """ + Represents a parsed configuration file. + + A configuration file should be of the following form: + + [first] + 3rd/prototype.js + core/application.js + core/params.js + # A comment + + [last] + core/api.js # Another comment + + [exclude] + 3rd/logger.js + + All headings are required. + + The files listed in the `first` section will be forced to load + *before* all other files (in the order listed). The files in `last` + section will be forced to load *after* all the other files (in the + order listed). + + The files list in the `exclude` section will not be imported. + + Any text appearing after a # symbol indicates a comment. + + """ + + def __init__(self, filename): + """ + Parses the content of the named file and stores the values. + """ + lines = [re.sub("#.*?$", "", line).strip() # Assumes end-of-line character is present + for line in open(filename) + if line.strip() and not line.strip().startswith("#")] # Skip blank lines and comments + + self.forceFirst = lines[lines.index("[first]") + 1:lines.index("[last]")] + + self.forceLast = lines[lines.index("[last]") + 1:lines.index("[include]")] + self.include = lines[lines.index("[include]") + 1:lines.index("[exclude]")] + self.exclude = lines[lines.index("[exclude]") + 1:] + +def run (sourceDirectory, outputFilename = None, configFile = None): + cfg = None + if configFile: + cfg = Config(configFile) + + allFiles = [] + + ## Find all the Javascript source files + for root, dirs, files in os.walk(sourceDirectory): + for filename in files: + if filename.endswith(SUFFIX_JAVASCRIPT) and not filename.startswith("."): + filepath = os.path.join(root, filename)[len(sourceDirectory)+1:] + filepath = filepath.replace("\\", "/") + if cfg and cfg.include: + if filepath in cfg.include or filepath in cfg.forceFirst: + allFiles.append(filepath) + elif (not cfg) or (filepath not in cfg.exclude): + allFiles.append(filepath) + + ## Header inserted at the start of each file in the output + HEADER = "/* " + "=" * 70 + "\n %s\n" + " " + "=" * 70 + " */\n\n" + + files = {} + + order = [] # List of filepaths to output, in a dependency satisfying order + + ## Import file source code + ## TODO: Do import when we walk the directories above? + for filepath in allFiles: + print "Importing: %s" % filepath + fullpath = os.path.join(sourceDirectory, filepath).strip() + content = open(fullpath, "U").read() # TODO: Ensure end of line @ EOF? + files[filepath] = SourceFile(filepath, content) # TODO: Chop path? + + print + + from toposort import toposort + + complete = False + resolution_pass = 1 + + while not complete: + order = [] # List of filepaths to output, in a dependency satisfying order + nodes = [] + routes = [] + ## Resolve the dependencies + print "Resolution pass %s... " % resolution_pass + resolution_pass += 1 + + for filepath, info in files.items(): + nodes.append(filepath) + for neededFilePath in info.requires: + routes.append((neededFilePath, filepath)) + + for dependencyLevel in toposort(nodes, routes): + for filepath in dependencyLevel: + order.append(filepath) + if not files.has_key(filepath): + print "Importing: %s" % filepath + fullpath = os.path.join(sourceDirectory, filepath).strip() + content = open(fullpath, "U").read() # TODO: Ensure end of line @ EOF? + files[filepath] = SourceFile(filepath, content) # TODO: Chop path? + + + + # Double check all dependencies have been met + complete = True + try: + for fp in order: + if max([order.index(rfp) for rfp in files[fp].requires] + + [order.index(fp)]) != order.index(fp): + complete = False + except: + complete = False + + print + + + ## Move forced first and last files to the required position + if cfg: + print "Re-ordering files..." + order = cfg.forceFirst + [item + for item in order + if ((item not in cfg.forceFirst) and + (item not in cfg.forceLast))] + cfg.forceLast + + print + ## Output the files in the determined order + result = [] + + for fp in order: + f = files[fp] + print "Exporting: ", f.filepath + result.append(HEADER % f.filepath) + source = f.source + result.append(source) + if not source.endswith("\n"): + result.append("\n") + + print "\nTotal files merged: %d " % len(files) + + if outputFilename: + print "\nGenerating: %s" % (outputFilename) + open(outputFilename, "w").write("".join(result)) + return "".join(result) + +if __name__ == "__main__": + import getopt + + options, args = getopt.getopt(sys.argv[1:], "-c:") + + try: + outputFilename = args[0] + except IndexError: + usage(sys.argv[0]) + raise SystemExit + else: + sourceDirectory = args[1] + if not sourceDirectory: + usage(sys.argv[0]) + raise SystemExit + + configFile = None + if options and options[0][0] == "-c": + configFile = options[0][1] + print "Parsing configuration file: %s" % filename + + run( sourceDirectory, outputFilename, configFile ) Index: /sandbox/fvanderbiest/openlayers/tools/shrinksafe.py =================================================================== --- /sandbox/fvanderbiest/openlayers/tools/shrinksafe.py (revision 1941) +++ /sandbox/fvanderbiest/openlayers/tools/shrinksafe.py (revision 1941) @@ -0,0 +1,54 @@ +#!/usr/bin/env python +# +# Script to provide a wrapper around the ShrinkSafe "web service" +# +# + +# +# We use this script for two reasons: +# +# * This avoids having to install and configure Java and the standalone +# ShrinkSafe utility. +# +# * The current ShrinkSafe standalone utility was broken when we last +# used it. +# + +import sys + +import urllib +import urllib2 + +URL_SHRINK_SAFE = "http://shrinksafe.dojotoolkit.org/shrinksafe.php" + +# This would normally be dynamically generated: +BOUNDARY_MARKER = "---------------------------72288400411964641492083565382" + +if __name__ == "__main__": + ## Grab the source code + try: + sourceFilename = sys.argv[1] + except: + print "Usage: %s (|-)" % sys.argv[0] + raise SystemExit + + if sourceFilename == "-": + sourceCode = sys.stdin.read() + sourceFilename = "stdin.js" + else: + sourceCode = open(sourceFilename).read() + + ## Create the request replicating posting of the form from the web page + request = urllib2.Request(url=URL_SHRINK_SAFE) + request.add_header("Content-Type", + "multipart/form-data; boundary=%s" % BOUNDARY_MARKER) + request.add_data(""" +--%s +Content-Disposition: form-data; name="shrinkfile[]"; filename="%s" +Content-Type: application/x-javascript + +%s +""" % (BOUNDARY_MARKER, sourceFilename, sourceCode)) + + ## Deliver the result + print urllib2.urlopen(request).read(), Index: /sandbox/fvanderbiest/openlayers/tools/jsmin.py =================================================================== --- /sandbox/fvanderbiest/openlayers/tools/jsmin.py (revision 1941) +++ /sandbox/fvanderbiest/openlayers/tools/jsmin.py (revision 1941) @@ -0,0 +1,216 @@ +#!/usr/bin/python + +# This code is original from jsmin by Douglas Crockford, it was translated to +# Python by Baruch Even. The original code had the following copyright and +# license. +# +# /* jsmin.c +# 2007-01-08 +# +# Copyright (c) 2002 Douglas Crockford (www.crockford.com) +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is furnished to do +# so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# The Software shall be used for Good, not Evil. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# */ + +from StringIO import StringIO + +def jsmin(js): + ins = StringIO(js) + outs = StringIO() + JavascriptMinify().minify(ins, outs) + str = outs.getvalue() + if len(str) > 0 and str[0] == '\n': + str = str[1:] + return str + +def isAlphanum(c): + """return true if the character is a letter, digit, underscore, + dollar sign, or non-ASCII character. + """ + return ((c >= 'a' and c <= 'z') or (c >= '0' and c <= '9') or + (c >= 'A' and c <= 'Z') or c == '_' or c == '$' or c == '\\' or (c is not None and ord(c) > 126)); + +class UnterminatedComment(Exception): + pass + +class UnterminatedStringLiteral(Exception): + pass + +class UnterminatedRegularExpression(Exception): + pass + +class JavascriptMinify(object): + + def _outA(self): + self.outstream.write(self.theA) + def _outB(self): + self.outstream.write(self.theB) + + def _get(self): + """return the next character from stdin. Watch out for lookahead. If + the character is a control character, translate it to a space or + linefeed. + """ + c = self.theLookahead + self.theLookahead = None + if c == None: + c = self.instream.read(1) + if c >= ' ' or c == '\n': + return c + if c == '': # EOF + return '\000' + if c == '\r': + return '\n' + return ' ' + + def _peek(self): + self.theLookahead = self._get() + return self.theLookahead + + def _next(self): + """get the next character, excluding comments. peek() is used to see + if a '/' is followed by a '/' or '*'. + """ + c = self._get() + if c == '/': + p = self._peek() + if p == '/': + c = self._get() + while c > '\n': + c = self._get() + return c + if p == '*': + c = self._get() + while 1: + c = self._get() + if c == '*': + if self._peek() == '/': + self._get() + return ' ' + if c == '\000': + raise UnterminatedComment() + + return c + + def _action(self, action): + """do something! What you do is determined by the argument: + 1 Output A. Copy B to A. Get the next B. + 2 Copy B to A. Get the next B. (Delete A). + 3 Get the next B. (Delete B). + action treats a string as a single character. Wow! + action recognizes a regular expression if it is preceded by ( or , or =. + """ + if action <= 1: + self._outA() + + if action <= 2: + self.theA = self.theB + if self.theA == "'" or self.theA == '"': + while 1: + self._outA() + self.theA = self._get() + if self.theA == self.theB: + break + if self.theA <= '\n': + raise UnterminatedStringLiteral() + if self.theA == '\\': + self._outA() + self.theA = self._get() + + + if action <= 3: + self.theB = self._next() + if self.theB == '/' and (self.theA == '(' or self.theA == ',' or + self.theA == '=' or self.theA == ':' or + self.theA == '[' or self.theA == '?' or + self.theA == '!' or self.theA == '&' or + self.theA == '|'): + self._outA() + self._outB() + while 1: + self.theA = self._get() + if self.theA == '/': + break + elif self.theA == '\\': + self._outA() + self.theA = self._get() + elif self.theA <= '\n': + raise UnterminatedRegularExpression() + self._outA() + self.theB = self._next() + + + def _jsmin(self): + """Copy the input to the output, deleting the characters which are + insignificant to JavaScript. Comments will be removed. Tabs will be + replaced with spaces. Carriage returns will be replaced with linefeeds. + Most spaces and linefeeds will be removed. + """ + self.theA = '\n' + self._action(3) + + while self.theA != '\000': + if self.theA == ' ': + if isAlphanum(self.theB): + self._action(1) + else: + self._action(2) + elif self.theA == '\n': + if self.theB in ['{', '[', '(', '+', '-']: + self._action(1) + elif self.theB == ' ': + self._action(3) + else: + if isAlphanum(self.theB): + self._action(1) + else: + self._action(2) + else: + if self.theB == ' ': + if isAlphanum(self.theA): + self._action(1) + else: + self._action(3) + elif self.theB == '\n': + if self.theA in ['}', ']', ')', '+', '-', '"', '\'']: + self._action(1) + else: + if isAlphanum(self.theA): + self._action(1) + else: + self._action(3) + else: + self._action(1) + + def minify(self, instream, outstream): + self.instream = instream + self.outstream = outstream + self.theA = None + self.thaB = None + self.theLookahead = None + + self._jsmin() + self.instream.close() + +if __name__ == '__main__': + import sys + jsm = JavascriptMinify() + jsm.minify(sys.stdin, sys.stdout) Index: /sandbox/fvanderbiest/openlayers/tools/update_dev_dir.sh =================================================================== --- /sandbox/fvanderbiest/openlayers/tools/update_dev_dir.sh (revision 1941) +++ /sandbox/fvanderbiest/openlayers/tools/update_dev_dir.sh (revision 1941) @@ -0,0 +1,45 @@ +#!/bin/sh + +# Used to update http://openlayers.org/dev/ + +svn up /www/openlayers/docs/dev; + +# Get current 'Last Changed Rev' +REV=`svn info /www/openlayers/docs/dev/ | grep 'Last Changed Rev' | awk '{print $4}'` + +# Get the last svn rev +touch /tmp/ol_svn_rev +OLD_REV="o`cat /tmp/ol_svn_rev`" + +# If they're not equal, do some work. +if [ ! o$REV = $OLD_REV ]; then + + cd /www/openlayers/docs/dev/tools/ + python exampleparser.py + cd /www/openlayers/docs/dev/build + ./build.py + + cp OpenLayers.js .. + cd .. + + sed -i -e 's!../lib/OpenLayers.js!../OpenLayers.js!' examples/*.html + perl /home/crschmidt/NaturalDocs -i /www/openlayers/docs/dev/lib -o HTML /www/openlayers/dev/apidocs -p /www/openlayers/docs/dev/apidoc_config -s Default OL >/dev/null + perl /home/crschmidt/NaturalDocs -i /www/openlayers/docs/dev/lib -o HTML /www/openlayers/dev/docs -p /www/openlayers/docs/dev/doc_config -s Default OL >/dev/null + + # Record the revision + echo -n $REV > /tmp/ol_svn_rev +fi + +svn up /www/openlayers/documentation-checkout +REV=`svn info /www/openlayers/documentation-checkout | grep 'Last Changed Rev' | awk '{print $4}'` +# Get the last svn rev +touch /tmp/ol_doc_rev +OLD_REV="o`cat /tmp/ol_doc_rev`" +# If they're not equal, do some work. +if [ ! o$REV = $OLD_REV ]; then + cd /www/openlayers/documentation-checkout + make html > /dev/null + cp -r _build/html/* /www/openlayers/documentation + + echo -n $REV > /tmp/ol_doc_rev +fi Index: /sandbox/fvanderbiest/openlayers/tools/minimize.py =================================================================== --- /sandbox/fvanderbiest/openlayers/tools/minimize.py (revision 1941) +++ /sandbox/fvanderbiest/openlayers/tools/minimize.py (revision 1941) @@ -0,0 +1,47 @@ +# Minimal Python Minimizer +# Copyright 2008, Christopher Schmidt +# Released under the MIT License +# +# Taken from: http://svn.crschmidt.net/personal/python/minimize.py +# $Id: minimize.py 6 2008-01-03 06:33:35Z crschmidt $ +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +import re + +def strip_comments_helper(data): + """remove all /* */ format comments and surrounding whitespace.""" + p = re.compile(r'[\s]*/\*.*?\*/[\s]*', re.DOTALL) + return p.sub('',data) + +def minimize(data, exclude=None): + """Central function call. This will call all other compression + functions. To add further compression algorithms, simply add + functions whose names end in _helper which take a string as input + and return a more compressed string as output.""" + for key, item in globals().iteritems(): + if key.endswith("_helper"): + func_key = key[:-7] + if not exclude or not func_key in exclude: + data = item(data) + return data + +if __name__ == "__main__": + import sys + print minimize(open(sys.argv[1]).read()) Index: /sandbox/fvanderbiest/openlayers/tools/oldot.py =================================================================== --- /sandbox/fvanderbiest/openlayers/tools/oldot.py (revision 1941) +++ /sandbox/fvanderbiest/openlayers/tools/oldot.py (revision 1941) @@ -0,0 +1,43 @@ +import re +import os +def run(): + sourceDirectory = "../lib/OpenLayers" + allFiles = [] + SUFFIX_JAVASCRIPT = ".js" + ## Find all the Javascript source files + for root, dirs, files in os.walk(sourceDirectory): + for filename in files: + if filename.endswith(SUFFIX_JAVASCRIPT) and not filename.startswith("."): + filepath = os.path.join(root, filename)[len(sourceDirectory)+1:] + filepath = filepath.replace("\\", "/") + data = open(os.path.join(sourceDirectory, filepath)).read() + parents = re.search("OpenLayers.Class\((.*?){", data, + re.DOTALL) + if parents: + parents = [x.strip() for x in parents.group(1).strip().strip(",").split(",")] + else: + parents = [] + cls = "OpenLayers.%s" % filepath.strip(".js").replace("/", ".") + allFiles.append([cls, parents]) + return allFiles +print """ +digraph name { + fontname = "Helvetica" + fontsize = 8 + K = 0.6 + + node [ + fontname = "Helvetica" + fontsize = 8 + shape = "plaintext" + ] +""" + +for i in run(): + print i[0].replace(".", "_") + for item in i[1]: + if not item: continue + print "%s -> %s" % (i[0].replace(".","_"), item.replace(".", "_")) + print "; " + +print """}""" Index: /sandbox/fvanderbiest/openlayers/tools/release.sh =================================================================== --- /sandbox/fvanderbiest/openlayers/tools/release.sh (revision 1941) +++ /sandbox/fvanderbiest/openlayers/tools/release.sh (revision 1941) @@ -0,0 +1,29 @@ +#!/bin/sh + +VERSION=$1 + +svn export http://svn.openlayers.org/tags/openlayers/release-$VERSION OpenLayers-$VERSION +cd OpenLayers-$VERSION/build +./build.py full +cp OpenLayers.js .. + +cd .. + +mkdir doc/devdocs +mkdir doc/apidocs +rm tools/*.pyc + +mkdir /www/openlayers/htdocs/api/$VERSION +cp OpenLayers.js /www/openlayers/htdocs/api/$VERSION +cp -a img/ /www/openlayers/htdocs/api/$VERSION +cp -a theme/ /www/openlayers/htdocs/api/$VERSION + +cd .. + +~/nd/NaturalDocs -i OpenLayers-$VERSION/lib -o HTML OpenLayers-$VERSION/doc/devdocs -p OpenLayers-$VERSION/doc_config -s Small OL +~/nd/NaturalDocs -i OpenLayers-$VERSION/lib -o HTML OpenLayers-$VERSION/doc/apidocs -p OpenLayers-$VERSION/apidoc_config -s Small OL + +tar cvfz OpenLayers-$VERSION.tar.gz OpenLayers-$VERSION/ +zip -9r OpenLayers-$VERSION.zip OpenLayers-$VERSION/ + +cp OpenLayers-$VERSION.* /www/openlayers/htdocs/download Index: /sandbox/fvanderbiest/openlayers/tools/README.txt =================================================================== --- /sandbox/fvanderbiest/openlayers/tools/README.txt (revision 1941) +++ /sandbox/fvanderbiest/openlayers/tools/README.txt (revision 1941) @@ -0,0 +1,14 @@ +This directory contains tools used in the packaging or deployment of OpenLayers. + +Javascript minimizing tools: + + * jsmin.c, jsmin.py: + jsmin.py is a direct translation of the jsmin.c code into Python. jsmin.py + will therefore run anyplace Python runs... but at significantly slower speed. + + * shrinksafe.py + shrinksafe.py calls out to a third party javascript shrinking service. This + creates file sizes about 4% smaller (as of commit 501) of the OpenLayers + code. However, this also has the side effect of making you dependant on the + web service -- and since that service sometimes goes dead, it's risky to + depend on it. Index: /sandbox/fvanderbiest/openlayers/tools/BeautifulSoup.py =================================================================== --- /sandbox/fvanderbiest/openlayers/tools/BeautifulSoup.py (revision 1941) +++ /sandbox/fvanderbiest/openlayers/tools/BeautifulSoup.py (revision 1941) @@ -0,0 +1,1767 @@ +"""Beautiful Soup +Elixir and Tonic +"The Screen-Scraper's Friend" +http://www.crummy.com/software/BeautifulSoup/ + +Beautiful Soup parses a (possibly invalid) XML or HTML document into a +tree representation. It provides methods and Pythonic idioms that make +it easy to navigate, search, and modify the tree. + +A well-formed XML/HTML document yields a well-formed data +structure. An ill-formed XML/HTML document yields a correspondingly +ill-formed data structure. If your document is only locally +well-formed, you can use this library to find and process the +well-formed part of it. The BeautifulSoup class + +Beautiful Soup works with Python 2.2 and up. It has no external +dependencies, but you'll have more success at converting data to UTF-8 +if you also install these three packages: + +* chardet, for auto-detecting character encodings + http://chardet.feedparser.org/ +* cjkcodecs and iconv_codec, which add more encodings to the ones supported + by stock Python. + http://cjkpython.i18n.org/ + +Beautiful Soup defines classes for two main parsing strategies: + + * BeautifulStoneSoup, for parsing XML, SGML, or your domain-specific + language that kind of looks like XML. + + * BeautifulSoup, for parsing run-of-the-mill HTML code, be it valid + or invalid. This class has web browser-like heuristics for + obtaining a sensible parse tree in the face of common HTML errors. + +Beautiful Soup also defines a class (UnicodeDammit) for autodetecting +the encoding of an HTML or XML document, and converting it to +Unicode. Much of this code is taken from Mark Pilgrim's Universal Feed Parser. + +For more than you ever wanted to know about Beautiful Soup, see the +documentation: +http://www.crummy.com/software/BeautifulSoup/documentation.html + +""" +from __future__ import generators + +__author__ = "Leonard Richardson (leonardr@segfault.org)" +__version__ = "3.0.4" +__copyright__ = "Copyright (c) 2004-2007 Leonard Richardson" +__license__ = "PSF" + +from sgmllib import SGMLParser, SGMLParseError +import codecs +import types +import re +import sgmllib +try: + from htmlentitydefs import name2codepoint +except ImportError: + name2codepoint = {} + +#This hack makes Beautiful Soup able to parse XML with namespaces +sgmllib.tagfind = re.compile('[a-zA-Z][-_.:a-zA-Z0-9]*') + +DEFAULT_OUTPUT_ENCODING = "utf-8" + +# First, the classes that represent markup elements. + +class PageElement: + """Contains the navigational information for some part of the page + (either a tag or a piece of text)""" + + def setup(self, parent=None, previous=None): + """Sets up the initial relations between this element and + other elements.""" + self.parent = parent + self.previous = previous + self.next = None + self.previousSibling = None + self.nextSibling = None + if self.parent and self.parent.contents: + self.previousSibling = self.parent.contents[-1] + self.previousSibling.nextSibling = self + + def replaceWith(self, replaceWith): + oldParent = self.parent + myIndex = self.parent.contents.index(self) + if hasattr(replaceWith, 'parent') and replaceWith.parent == self.parent: + # We're replacing this element with one of its siblings. + index = self.parent.contents.index(replaceWith) + if index and index < myIndex: + # Furthermore, it comes before this element. That + # means that when we extract it, the index of this + # element will change. + myIndex = myIndex - 1 + self.extract() + oldParent.insert(myIndex, replaceWith) + + def extract(self): + """Destructively rips this element out of the tree.""" + if self.parent: + try: + self.parent.contents.remove(self) + except ValueError: + pass + + #Find the two elements that would be next to each other if + #this element (and any children) hadn't been parsed. Connect + #the two. + lastChild = self._lastRecursiveChild() + nextElement = lastChild.next + + if self.previous: + self.previous.next = nextElement + if nextElement: + nextElement.previous = self.previous + self.previous = None + lastChild.next = None + + self.parent = None + if self.previousSibling: + self.previousSibling.nextSibling = self.nextSibling + if self.nextSibling: + self.nextSibling.previousSibling = self.previousSibling + self.previousSibling = self.nextSibling = None + + def _lastRecursiveChild(self): + "Finds the last element beneath this object to be parsed." + lastChild = self + while hasattr(lastChild, 'contents') and lastChild.contents: + lastChild = lastChild.contents[-1] + return lastChild + + def insert(self, position, newChild): + if (isinstance(newChild, basestring) + or isinstance(newChild, unicode)) \ + and not isinstance(newChild, NavigableString): + newChild = NavigableString(newChild) + + position = min(position, len(self.contents)) + if hasattr(newChild, 'parent') and newChild.parent != None: + # We're 'inserting' an element that's already one + # of this object's children. + if newChild.parent == self: + index = self.find(newChild) + if index and index < position: + # Furthermore we're moving it further down the + # list of this object's children. That means that + # when we extract this element, our target index + # will jump down one. + position = position - 1 + newChild.extract() + + newChild.parent = self + previousChild = None + if position == 0: + newChild.previousSibling = None + newChild.previous = self + else: + previousChild = self.contents[position-1] + newChild.previousSibling = previousChild + newChild.previousSibling.nextSibling = newChild + newChild.previous = previousChild._lastRecursiveChild() + if newChild.previous: + newChild.previous.next = newChild + + newChildsLastElement = newChild._lastRecursiveChild() + + if position >= len(self.contents): + newChild.nextSibling = None + + parent = self + parentsNextSibling = None + while not parentsNextSibling: + parentsNextSibling = parent.nextSibling + parent = parent.parent + if not parent: # This is the last element in the document. + break + if parentsNextSibling: + newChildsLastElement.next = parentsNextSibling + else: + newChildsLastElement.next = None + else: + nextChild = self.contents[position] + newChild.nextSibling = nextChild + if newChild.nextSibling: + newChild.nextSibling.previousSibling = newChild + newChildsLastElement.next = nextChild + + if newChildsLastElement.next: + newChildsLastElement.next.previous = newChildsLastElement + self.contents.insert(position, newChild) + + def findNext(self, name=None, attrs={}, text=None, **kwargs): + """Returns the first item that matches the given criteria and + appears after this Tag in the document.""" + return self._findOne(self.findAllNext, name, attrs, text, **kwargs) + + def findAllNext(self, name=None, attrs={}, text=None, limit=None, + **kwargs): + """Returns all items that match the given criteria and appear + before after Tag in the document.""" + return self._findAll(name, attrs, text, limit, self.nextGenerator) + + def findNextSibling(self, name=None, attrs={}, text=None, **kwargs): + """Returns the closest sibling to this Tag that matches the + given criteria and appears after this Tag in the document.""" + return self._findOne(self.findNextSiblings, name, attrs, text, + **kwargs) + + def findNextSiblings(self, name=None, attrs={}, text=None, limit=None, + **kwargs): + """Returns the siblings of this Tag that match the given + criteria and appear after this Tag in the document.""" + return self._findAll(name, attrs, text, limit, + self.nextSiblingGenerator, **kwargs) + fetchNextSiblings = findNextSiblings # Compatibility with pre-3.x + + def findPrevious(self, name=None, attrs={}, text=None, **kwargs): + """Returns the first item that matches the given criteria and + appears before this Tag in the document.""" + return self._findOne(self.findAllPrevious, name, attrs, text, **kwargs) + + def findAllPrevious(self, name=None, attrs={}, text=None, limit=None, + **kwargs): + """Returns all items that match the given criteria and appear + before this Tag in the document.""" + return self._findAll(name, attrs, text, limit, self.previousGenerator, + **kwargs) + fetchPrevious = findAllPrevious # Compatibility with pre-3.x + + def findPreviousSibling(self, name=None, attrs={}, text=None, **kwargs): + """Returns the closest sibling to this Tag that matches the + given criteria and appears before this Tag in the document.""" + return self._findOne(self.findPreviousSiblings, name, attrs, text, + **kwargs) + + def findPreviousSiblings(self, name=None, attrs={}, text=None, + limit=None, **kwargs): + """Returns the siblings of this Tag that match the given + criteria and appear before this Tag in the document.""" + return self._findAll(name, attrs, text, limit, + self.previousSiblingGenerator, **kwargs) + fetchPreviousSiblings = findPreviousSiblings # Compatibility with pre-3.x + + def findParent(self, name=None, attrs={}, **kwargs): + """Returns the closest parent of this Tag that matches the given + criteria.""" + # NOTE: We can't use _findOne because findParents takes a different + # set of arguments. + r = None + l = self.findParents(name, attrs, 1) + if l: + r = l[0] + return r + + def findParents(self, name=None, attrs={}, limit=None, **kwargs): + """Returns the parents of this Tag that match the given + criteria.""" + + return self._findAll(name, attrs, None, limit, self.parentGenerator, + **kwargs) + fetchParents = findParents # Compatibility with pre-3.x + + #These methods do the real heavy lifting. + + def _findOne(self, method, name, attrs, text, **kwargs): + r = None + l = method(name, attrs, text, 1, **kwargs) + if l: + r = l[0] + return r + + def _findAll(self, name, attrs, text, limit, generator, **kwargs): + "Iterates over a generator looking for things that match." + + if isinstance(name, SoupStrainer): + strainer = name + else: + # Build a SoupStrainer + strainer = SoupStrainer(name, attrs, text, **kwargs) + results = ResultSet(strainer) + g = generator() + while True: + try: + i = g.next() + except StopIteration: + break + if i: + found = strainer.search(i) + if found: + results.append(found) + if limit and len(results) >= limit: + break + return results + + #These Generators can be used to navigate starting from both + #NavigableStrings and Tags. + def nextGenerator(self): + i = self + while i: + i = i.next + yield i + + def nextSiblingGenerator(self): + i = self + while i: + i = i.nextSibling + yield i + + def previousGenerator(self): + i = self + while i: + i = i.previous + yield i + + def previousSiblingGenerator(self): + i = self + while i: + i = i.previousSibling + yield i + + def parentGenerator(self): + i = self + while i: + i = i.parent + yield i + + # Utility methods + def substituteEncoding(self, str, encoding=None): + encoding = encoding or "utf-8" + return str.replace("%SOUP-ENCODING%", encoding) + + def toEncoding(self, s, encoding=None): + """Encodes an object to a string in some encoding, or to Unicode. + .""" + if isinstance(s, unicode): + if encoding: + s = s.encode(encoding) + elif isinstance(s, str): + if encoding: + s = s.encode(encoding) + else: + s = unicode(s) + else: + if encoding: + s = self.toEncoding(str(s), encoding) + else: + s = unicode(s) + return s + +class NavigableString(unicode, PageElement): + + def __getattr__(self, attr): + """text.string gives you text. This is for backwards + compatibility for Navigable*String, but for CData* it lets you + get the string without the CData wrapper.""" + if attr == 'string': + return self + else: + raise AttributeError, "'%s' object has no attribute '%s'" % (self.__class__.__name__, attr) + + def __unicode__(self): + return self.__str__(None) + + def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING): + if encoding: + return self.encode(encoding) + else: + return self + +class CData(NavigableString): + + def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING): + return "" % NavigableString.__str__(self, encoding) + +class ProcessingInstruction(NavigableString): + def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING): + output = self + if "%SOUP-ENCODING%" in output: + output = self.substituteEncoding(output, encoding) + return "" % self.toEncoding(output, encoding) + +class Comment(NavigableString): + def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING): + return "" % NavigableString.__str__(self, encoding) + +class Declaration(NavigableString): + def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING): + return "" % NavigableString.__str__(self, encoding) + +class Tag(PageElement): + + """Represents a found HTML tag with its attributes and contents.""" + + XML_SPECIAL_CHARS_TO_ENTITIES = { "'" : "squot", + '"' : "quote", + "&" : "amp", + "<" : "lt", + ">" : "gt" } + + def __init__(self, parser, name, attrs=None, parent=None, + previous=None): + "Basic constructor." + + # We don't actually store the parser object: that lets extracted + # chunks be garbage-collected + self.parserClass = parser.__class__ + self.isSelfClosing = parser.isSelfClosingTag(name) + self.name = name + if attrs == None: + attrs = [] + self.attrs = attrs + self.contents = [] + self.setup(parent, previous) + self.hidden = False + self.containsSubstitutions = False + + def get(self, key, default=None): + """Returns the value of the 'key' attribute for the tag, or + the value given for 'default' if it doesn't have that + attribute.""" + return self._getAttrMap().get(key, default) + + def has_key(self, key): + return self._getAttrMap().has_key(key) + + def __getitem__(self, key): + """tag[key] returns the value of the 'key' attribute for the tag, + and throws an exception if it's not there.""" + return self._getAttrMap()[key] + + def __iter__(self): + "Iterating over a tag iterates over its contents." + return iter(self.contents) + + def __len__(self): + "The length of a tag is the length of its list of contents." + return len(self.contents) + + def __contains__(self, x): + return x in self.contents + + def __nonzero__(self): + "A tag is non-None even if it has no contents." + return True + + def __setitem__(self, key, value): + """Setting tag[key] sets the value of the 'key' attribute for the + tag.""" + self._getAttrMap() + self.attrMap[key] = value + found = False + for i in range(0, len(self.attrs)): + if self.attrs[i][0] == key: + self.attrs[i] = (key, value) + found = True + if not found: + self.attrs.append((key, value)) + self._getAttrMap()[key] = value + + def __delitem__(self, key): + "Deleting tag[key] deletes all 'key' attributes for the tag." + for item in self.attrs: + if item[0] == key: + self.attrs.remove(item) + #We don't break because bad HTML can define the same + #attribute multiple times. + self._getAttrMap() + if self.attrMap.has_key(key): + del self.attrMap[key] + + def __call__(self, *args, **kwargs): + """Calling a tag like a function is the same as calling its + findAll() method. Eg. tag('a') returns a list of all the A tags + found within this tag.""" + return apply(self.findAll, args, kwargs) + + def __getattr__(self, tag): + #print "Getattr %s.%s" % (self.__class__, tag) + if len(tag) > 3 and tag.rfind('Tag') == len(tag)-3: + return self.find(tag[:-3]) + elif tag.find('__') != 0: + return self.find(tag) + + def __eq__(self, other): + """Returns true iff this tag has the same name, the same attributes, + and the same contents (recursively) as the given tag. + + NOTE: right now this will return false if two tags have the + same attributes in a different order. Should this be fixed?""" + 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): + return False + for i in range(0, len(self.contents)): + if self.contents[i] != other.contents[i]: + return False + return True + + def __ne__(self, other): + """Returns true iff this tag is not identical to the other tag, + as defined in __eq__.""" + return not self == other + + def __repr__(self, encoding=DEFAULT_OUTPUT_ENCODING): + """Renders this tag as a string.""" + return self.__str__(encoding) + + def __unicode__(self): + return self.__str__(None) + + def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING, + prettyPrint=False, indentLevel=0): + """Returns a string or Unicode representation of this tag and + its contents. To get Unicode, pass None for encoding. + + NOTE: since Python's HTML parser consumes whitespace, this + method is not certain to reproduce the whitespace present in + the original string.""" + + encodedName = self.toEncoding(self.name, encoding) + + attrs = [] + if self.attrs: + for key, val in self.attrs: + fmt = '%s="%s"' + if isString(val): + if self.containsSubstitutions and '%SOUP-ENCODING%' in val: + val = self.substituteEncoding(val, encoding) + + # The attribute value either: + # + # * Contains no embedded double quotes or single quotes. + # No problem: we enclose it in double quotes. + # * Contains embedded single quotes. No problem: + # double quotes work here too. + # * Contains embedded double quotes. No problem: + # we enclose it in single quotes. + # * Embeds both single _and_ double quotes. This + # can't happen naturally, but it can happen if + # you modify an attribute value after parsing + # the document. Now we have a bit of a + # problem. We solve it by enclosing the + # attribute in single quotes, and escaping any + # embedded single quotes to XML entities. + if '"' in val: + fmt = "%s='%s'" + # This can't happen naturally, but it can happen + # if you modify an attribute value after parsing. + if "'" in val: + val = val.replace("'", "&squot;") + + # Now we're okay w/r/t quotes. But the attribute + # value might also contain angle brackets, or + # ampersands that aren't part of entities. We need + # to escape those to XML entities too. + val = re.sub("([<>]|&(?![^\s]+;))", + lambda x: "&" + self.XML_SPECIAL_CHARS_TO_ENTITIES[x.group(0)[0]] + ";", + val) + + attrs.append(fmt % (self.toEncoding(key, encoding), + self.toEncoding(val, encoding))) + close = '' + closeTag = '' + if self.isSelfClosing: + close = ' /' + else: + closeTag = '' % encodedName + + indentTag, indentContents = 0, 0 + if prettyPrint: + indentTag = indentLevel + space = (' ' * (indentTag-1)) + indentContents = indentTag + 1 + contents = self.renderContents(encoding, prettyPrint, indentContents) + if self.hidden: + s = contents + else: + s = [] + attributeString = '' + if attrs: + attributeString = ' ' + ' '.join(attrs) + if prettyPrint: + s.append(space) + s.append('<%s%s%s>' % (encodedName, attributeString, close)) + if prettyPrint: + s.append("\n") + s.append(contents) + if prettyPrint and contents and contents[-1] != "\n": + s.append("\n") + if prettyPrint and closeTag: + s.append(space) + s.append(closeTag) + if prettyPrint and closeTag and self.nextSibling: + s.append("\n") + s = ''.join(s) + return s + + def prettify(self, encoding=DEFAULT_OUTPUT_ENCODING): + return self.__str__(encoding, True) + + def renderContents(self, encoding=DEFAULT_OUTPUT_ENCODING, + prettyPrint=False, indentLevel=0): + """Renders the contents of this tag as a string in the given + encoding. If encoding is None, returns a Unicode string..""" + s=[] + for c in self: + text = None + if isinstance(c, NavigableString): + text = c.__str__(encoding) + elif isinstance(c, Tag): + s.append(c.__str__(encoding, prettyPrint, indentLevel)) + if text and prettyPrint: + text = text.strip() + if text: + if prettyPrint: + s.append(" " * (indentLevel-1)) + s.append(text) + if prettyPrint: + s.append("\n") + return ''.join(s) + + #Soup methods + + def find(self, name=None, attrs={}, recursive=True, text=None, + **kwargs): + """Return only the first child of this Tag matching the given + criteria.""" + r = None + l = self.findAll(name, attrs, recursive, text, 1, **kwargs) + if l: + r = l[0] + return r + findChild = find + + def findAll(self, name=None, attrs={}, recursive=True, text=None, + limit=None, **kwargs): + """Extracts a list of Tag objects that match the given + criteria. You can specify the name of the Tag and any + attributes you want the Tag to have. + + The value of a key-value pair in the 'attrs' map can be a + string, a list of strings, a regular expression object, or a + callable that takes a string and returns whether or not the + string matches for some custom definition of 'matches'. The + same is true of the tag name.""" + generator = self.recursiveChildGenerator + if not recursive: + generator = self.childGenerator + return self._findAll(name, attrs, text, limit, generator, **kwargs) + findChildren = findAll + + # Pre-3.x compatibility methods + first = find + fetch = findAll + + def fetchText(self, text=None, recursive=True, limit=None): + return self.findAll(text=text, recursive=recursive, limit=limit) + + def firstText(self, text=None, recursive=True): + return self.find(text=text, recursive=recursive) + + #Utility methods + + def append(self, tag): + """Appends the given tag to the contents of this tag.""" + self.contents.append(tag) + + #Private methods + + def _getAttrMap(self): + """Initializes a map representation of this tag's attributes, + if not already initialized.""" + if not getattr(self, 'attrMap'): + self.attrMap = {} + for (key, value) in self.attrs: + self.attrMap[key] = value + return self.attrMap + + #Generator methods + def childGenerator(self): + for i in range(0, len(self.contents)): + yield self.contents[i] + raise StopIteration + + def recursiveChildGenerator(self): + stack = [(self, 0)] + while stack: + tag, start = stack.pop() + if isinstance(tag, Tag): + for i in range(start, len(tag.contents)): + a = tag.contents[i] + yield a + if isinstance(a, Tag) and tag.contents: + if i < len(tag.contents) - 1: + stack.append((tag, i+1)) + stack.append((a, 0)) + break + raise StopIteration + +# Next, a couple classes to represent queries and their results. +class SoupStrainer: + """Encapsulates a number of ways of matching a markup element (tag or + text).""" + + def __init__(self, name=None, attrs={}, text=None, **kwargs): + self.name = name + if isString(attrs): + kwargs['class'] = attrs + attrs = None + if kwargs: + if attrs: + attrs = attrs.copy() + attrs.update(kwargs) + else: + attrs = kwargs + self.attrs = attrs + self.text = text + + def __str__(self): + if self.text: + return self.text + else: + return "%s|%s" % (self.name, self.attrs) + + def searchTag(self, markupName=None, markupAttrs={}): + found = None + markup = None + if isinstance(markupName, Tag): + markup = markupName + markupAttrs = markup + callFunctionWithTagData = callable(self.name) \ + and not isinstance(markupName, Tag) + + if (not self.name) \ + or callFunctionWithTagData \ + or (markup and self._matches(markup, self.name)) \ + or (not markup and self._matches(markupName, self.name)): + if callFunctionWithTagData: + match = self.name(markupName, markupAttrs) + else: + match = True + markupAttrMap = None + for attr, matchAgainst in self.attrs.items(): + if not markupAttrMap: + if hasattr(markupAttrs, 'get'): + markupAttrMap = markupAttrs + else: + markupAttrMap = {} + for k,v in markupAttrs: + markupAttrMap[k] = v + attrValue = markupAttrMap.get(attr) + if not self._matches(attrValue, matchAgainst): + match = False + break + if match: + if markup: + found = markup + else: + found = markupName + return found + + def search(self, markup): + #print 'looking for %s in %s' % (self, markup) + found = None + # If given a list of items, scan it for a text element that + # matches. + if isList(markup) and not isinstance(markup, Tag): + for element in markup: + if isinstance(element, NavigableString) \ + and self.search(element): + found = element + break + # If it's a Tag, make sure its name or attributes match. + # Don't bother with Tags if we're searching for text. + elif isinstance(markup, Tag): + if not self.text: + found = self.searchTag(markup) + # If it's text, make sure the text matches. + elif isinstance(markup, NavigableString) or \ + isString(markup): + if self._matches(markup, self.text): + found = markup + else: + raise Exception, "I don't know how to match against a %s" \ + % markup.__class__ + return found + + def _matches(self, markup, matchAgainst): + #print "Matching %s against %s" % (markup, matchAgainst) + result = False + if matchAgainst == True and type(matchAgainst) == types.BooleanType: + result = markup != None + elif callable(matchAgainst): + result = matchAgainst(markup) + else: + #Custom match methods take the tag as an argument, but all + #other ways of matching match the tag name as a string. + if isinstance(markup, Tag): + markup = markup.name + if markup and not isString(markup): + markup = unicode(markup) + #Now we know that chunk is either a string, or None. + if hasattr(matchAgainst, 'match'): + # It's a regexp object. + result = markup and matchAgainst.search(markup) + elif isList(matchAgainst): + result = markup in matchAgainst + elif hasattr(matchAgainst, 'items'): + result = markup.has_key(matchAgainst) + elif matchAgainst and isString(markup): + if isinstance(markup, unicode): + matchAgainst = unicode(matchAgainst) + else: + matchAgainst = str(matchAgainst) + + if not result: + result = matchAgainst == markup + return result + +class ResultSet(list): + """A ResultSet is just a list that keeps track of the SoupStrainer + that created it.""" + def __init__(self, source): + list.__init__([]) + self.source = source + +# Now, some helper functions. + +def isList(l): + """Convenience method that works with all 2.x versions of Python + to determine whether or not something is listlike.""" + return hasattr(l, '__iter__') \ + or (type(l) in (types.ListType, types.TupleType)) + +def isString(s): + """Convenience method that works with all 2.x versions of Python + to determine whether or not something is stringlike.""" + try: + return isinstance(s, unicode) or isintance(s, basestring) + except NameError: + return isinstance(s, str) + +def buildTagMap(default, *args): + """Turns a list of maps, lists, or scalars into a single map. + Used to build the SELF_CLOSING_TAGS, NESTABLE_TAGS, and + NESTING_RESET_TAGS maps out of lists and partial maps.""" + built = {} + for portion in args: + if hasattr(portion, 'items'): + #It's a map. Merge it. + for k,v in portion.items(): + built[k] = v + elif isList(portion): + #It's a list. Map each item to the default. + for k in portion: + built[k] = default + else: + #It's a scalar. Map it to the default. + built[portion] = default + return built + +# Now, the parser classes. + +class BeautifulStoneSoup(Tag, SGMLParser): + + """This class contains the basic parser and search code. It defines + a parser that knows nothing about tag behavior except for the + following: + + You can't close a tag without closing all the tags it encloses. + That is, "" actually means + "". + + [Another possible explanation is "", but since + this class defines no SELF_CLOSING_TAGS, it will never use that + explanation.] + + This class is useful for parsing XML or made-up markup languages, + or when BeautifulSoup makes an assumption counter to what you were + expecting.""" + + XML_ENTITY_LIST = {} + for i in Tag.XML_SPECIAL_CHARS_TO_ENTITIES.values(): + XML_ENTITY_LIST[i] = True + + SELF_CLOSING_TAGS = {} + NESTABLE_TAGS = {} + RESET_NESTING_TAGS = {} + QUOTE_TAGS = {} + + MARKUP_MASSAGE = [(re.compile('(<[^<>]*)/>'), + lambda x: x.group(1) + ' />'), + (re.compile(']*)>'), + lambda x: '') + ] + + ROOT_TAG_NAME = u'[document]' + + HTML_ENTITIES = "html" + XML_ENTITIES = "xml" + + def __init__(self, markup="", parseOnlyThese=None, fromEncoding=None, + markupMassage=True, smartQuotesTo=XML_ENTITIES, + convertEntities=None, selfClosingTags=None): + """The Soup object is initialized as the 'root tag', and the + provided markup (which can be a string or a file-like object) + is fed into the underlying parser. + + sgmllib will process most bad HTML, and the BeautifulSoup + class has some tricks for dealing with some HTML that kills + sgmllib, but Beautiful Soup can nonetheless choke or lose data + if your data uses self-closing tags or declarations + incorrectly. + + By default, Beautiful Soup uses regexes to sanitize input, + avoiding the vast majority of these problems. If the problems + don't apply to you, pass in False for markupMassage, and + you'll get better performance. + + The default parser massage techniques fix the two most common + instances of invalid HTML that choke sgmllib: + +
(No space between name of closing tag and tag close) + (Extraneous whitespace in declaration) + + You can pass in a custom list of (RE object, replace method) + tuples to get Beautiful Soup to scrub your input the way you + want.""" + + self.parseOnlyThese = parseOnlyThese + self.fromEncoding = fromEncoding + self.smartQuotesTo = smartQuotesTo + self.convertEntities = convertEntities + if self.convertEntities: + # It doesn't make sense to convert encoded characters to + # entities even while you're converting entities to Unicode. + # Just convert it all to Unicode. + self.smartQuotesTo = None + self.instanceSelfClosingTags = buildTagMap(None, selfClosingTags) + SGMLParser.__init__(self) + + if hasattr(markup, 'read'): # It's a file-type object. + markup = markup.read() + self.markup = markup + self.markupMassage = markupMassage + try: + self._feed() + except StopParsing: + pass + self.markup = None # The markup can now be GCed + + def _feed(self, inDocumentEncoding=None): + # Convert the document to Unicode. + markup = self.markup + if isinstance(markup, unicode): + if not hasattr(self, 'originalEncoding'): + self.originalEncoding = None + else: + dammit = UnicodeDammit\ + (markup, [self.fromEncoding, inDocumentEncoding], + smartQuotesTo=self.smartQuotesTo) + markup = dammit.unicode + self.originalEncoding = dammit.originalEncoding + if markup: + if self.markupMassage: + if not isList(self.markupMassage): + self.markupMassage = self.MARKUP_MASSAGE + for fix, m in self.markupMassage: + markup = fix.sub(m, markup) + self.reset() + + SGMLParser.feed(self, markup) + # Close out any unfinished strings and close all the open tags. + self.endData() + while self.currentTag.name != self.ROOT_TAG_NAME: + self.popTag() + + def __getattr__(self, methodName): + """This method routes method call requests to either the SGMLParser + superclass or the Tag superclass, depending on the method name.""" + #print "__getattr__ called on %s.%s" % (self.__class__, methodName) + + if methodName.find('start_') == 0 or methodName.find('end_') == 0 \ + or methodName.find('do_') == 0: + return SGMLParser.__getattr__(self, methodName) + elif methodName.find('__') != 0: + return Tag.__getattr__(self, methodName) + else: + raise AttributeError + + def isSelfClosingTag(self, name): + """Returns true iff the given string is the name of a + self-closing tag according to this parser.""" + return self.SELF_CLOSING_TAGS.has_key(name) \ + or self.instanceSelfClosingTags.has_key(name) + + def reset(self): + Tag.__init__(self, self, self.ROOT_TAG_NAME) + self.hidden = 1 + SGMLParser.reset(self) + self.currentData = [] + self.currentTag = None + self.tagStack = [] + self.quoteStack = [] + self.pushTag(self) + + def popTag(self): + tag = self.tagStack.pop() + # Tags with just one string-owning child get the child as a + # 'string' property, so that soup.tag.string is shorthand for + # soup.tag.contents[0] + if len(self.currentTag.contents) == 1 and \ + isinstance(self.currentTag.contents[0], NavigableString): + self.currentTag.string = self.currentTag.contents[0] + + #print "Pop", tag.name + if self.tagStack: + self.currentTag = self.tagStack[-1] + return self.currentTag + + def pushTag(self, tag): + #print "Push", tag.name + if self.currentTag: + self.currentTag.append(tag) + self.tagStack.append(tag) + self.currentTag = self.tagStack[-1] + + def endData(self, containerClass=NavigableString): + if self.currentData: + currentData = ''.join(self.currentData) + if not currentData.strip(): + if '\n' in currentData: + currentData = '\n' + else: + currentData = ' ' + self.currentData = [] + if self.parseOnlyThese and len(self.tagStack) <= 1 and \ + (not self.parseOnlyThese.text or \ + not self.parseOnlyThese.search(currentData)): + return + o = containerClass(currentData) + o.setup(self.currentTag, self.previous) + if self.previous: + self.previous.next = o + self.previous = o + self.currentTag.contents.append(o) + + + def _popToTag(self, name, inclusivePop=True): + """Pops the tag stack up to and including the most recent + instance of the given tag. If inclusivePop is false, pops the tag + stack up to but *not* including the most recent instqance of + the given tag.""" + #print "Popping to %s" % name + if name == self.ROOT_TAG_NAME: + return + + numPops = 0 + mostRecentTag = None + for i in range(len(self.tagStack)-1, 0, -1): + if name == self.tagStack[i].name: + numPops = len(self.tagStack)-i + break + if not inclusivePop: + numPops = numPops - 1 + + for i in range(0, numPops): + mostRecentTag = self.popTag() + return mostRecentTag + + def _smartPop(self, name): + + """We need to pop up to the previous tag of this type, unless + one of this tag's nesting reset triggers comes between this + tag and the previous tag of this type, OR unless this tag is a + generic nesting trigger and another generic nesting trigger + comes between this tag and the previous tag of this type. + + Examples: +

FooBar

should pop to 'p', not 'b'. +

FooBar

should pop to 'table', not 'p'. +

Foo

Bar

should pop to 'tr', not 'p'. +

FooBar

should pop to 'p', not 'b'. + +

    • *
    • * should pop to 'ul', not the first 'li'. +
  • ** should pop to 'table', not the first 'tr' + tag should + implicitly close the previous tag within the same
    ** should pop to 'tr', not the first 'td' + """ + + nestingResetTriggers = self.NESTABLE_TAGS.get(name) + isNestable = nestingResetTriggers != None + isResetNesting = self.RESET_NESTING_TAGS.has_key(name) + popTo = None + inclusive = True + for i in range(len(self.tagStack)-1, 0, -1): + p = self.tagStack[i] + if (not p or p.name == name) and not isNestable: + #Non-nestable tags get popped to the top or to their + #last occurance. + popTo = name + break + if (nestingResetTriggers != None + and p.name in nestingResetTriggers) \ + or (nestingResetTriggers == None and isResetNesting + and self.RESET_NESTING_TAGS.has_key(p.name)): + + #If we encounter one of the nesting reset triggers + #peculiar to this tag, or we encounter another tag + #that causes nesting to reset, pop up to but not + #including that tag. + popTo = p.name + inclusive = False + break + p = p.parent + if popTo: + self._popToTag(popTo, inclusive) + + def unknown_starttag(self, name, attrs, selfClosing=0): + #print "Start tag %s: %s" % (name, attrs) + if self.quoteStack: + #This is not a real tag. + #print "<%s> is not real!" % name + attrs = ''.join(map(lambda(x, y): ' %s="%s"' % (x, y), attrs)) + self.handle_data('<%s%s>' % (name, attrs)) + return + self.endData() + + if not self.isSelfClosingTag(name) and not selfClosing: + self._smartPop(name) + + if self.parseOnlyThese and len(self.tagStack) <= 1 \ + and (self.parseOnlyThese.text or not self.parseOnlyThese.searchTag(name, attrs)): + return + + tag = Tag(self, name, attrs, self.currentTag, self.previous) + if self.previous: + self.previous.next = tag + self.previous = tag + self.pushTag(tag) + if selfClosing or self.isSelfClosingTag(name): + self.popTag() + if name in self.QUOTE_TAGS: + #print "Beginning quote (%s)" % name + self.quoteStack.append(name) + self.literal = 1 + return tag + + def unknown_endtag(self, name): + #print "End tag %s" % name + if self.quoteStack and self.quoteStack[-1] != name: + #This is not a real end tag. + #print " is not real!" % name + self.handle_data('' % name) + return + self.endData() + self._popToTag(name) + if self.quoteStack and self.quoteStack[-1] == name: + self.quoteStack.pop() + self.literal = (len(self.quoteStack) > 0) + + def handle_data(self, data): + self.currentData.append(data) + + def _toStringSubclass(self, text, subclass): + """Adds a certain piece of text to the tree as a NavigableString + subclass.""" + self.endData() + self.handle_data(text) + self.endData(subclass) + + def handle_pi(self, text): + """Handle a processing instruction as a ProcessingInstruction + object, possibly one with a %SOUP-ENCODING% slot into which an + encoding will be plugged later.""" + if text[:3] == "xml": + text = "xml version='1.0' encoding='%SOUP-ENCODING%'" + self._toStringSubclass(text, ProcessingInstruction) + + def handle_comment(self, text): + "Handle comments as Comment objects." + self._toStringSubclass(text, Comment) + + def handle_charref(self, ref): + "Handle character references as data." + if self.convertEntities in [self.HTML_ENTITIES, + self.XML_ENTITIES]: + data = unichr(int(ref)) + else: + data = '&#%s;' % ref + self.handle_data(data) + + def handle_entityref(self, ref): + """Handle entity references as data, possibly converting known + HTML entity references to the corresponding Unicode + characters.""" + data = None + if self.convertEntities == self.HTML_ENTITIES or \ + (self.convertEntities == self.XML_ENTITIES and \ + self.XML_ENTITY_LIST.get(ref)): + try: + data = unichr(name2codepoint[ref]) + except KeyError: + pass + if not data: + data = '&%s;' % ref + self.handle_data(data) + + def handle_decl(self, data): + "Handle DOCTYPEs and the like as Declaration objects." + self._toStringSubclass(data, Declaration) + + def parse_declaration(self, i): + """Treat a bogus SGML declaration as raw data. Treat a CDATA + declaration as a CData object.""" + j = None + if self.rawdata[i:i+9] == '', i) + if k == -1: + k = len(self.rawdata) + data = self.rawdata[i+9:k] + j = k+3 + self._toStringSubclass(data, CData) + else: + try: + j = SGMLParser.parse_declaration(self, i) + except SGMLParseError: + toHandle = self.rawdata[i:] + self.handle_data(toHandle) + j = i + len(toHandle) + return j + +class BeautifulSoup(BeautifulStoneSoup): + + """This parser knows the following facts about HTML: + + * Some tags have no closing tag and should be interpreted as being + closed as soon as they are encountered. + + * The text inside some tags (ie. 'script') may contain tags which + are not really part of the document and which should be parsed + as text, not tags. If you want to parse the text as tags, you can + always fetch it and parse it explicitly. + + * Tag nesting rules: + + Most tags can't be nested at all. For instance, the occurance of + a

    tag should implicitly close the previous

    tag. + +

    Para1

    Para2 + should be transformed into: +

    Para1

    Para2 + + Some tags can be nested arbitrarily. For instance, the occurance + of a

    tag should _not_ implicitly close the previous +
    tag. + + Alice said:
    Bob said:
    Blah + should NOT be transformed into: + Alice said:
    Bob said:
    Blah + + Some tags can be nested, but the nesting is reset by the + interposition of other tags. For instance, a
    , + but not close a tag in another table. + +
    BlahBlah + should be transformed into: +
    BlahBlah + but, + Blah
    Blah + should NOT be transformed into + Blah
    Blah + + Differing assumptions about tag nesting rules are a major source + of problems with the BeautifulSoup class. If BeautifulSoup is not + treating as nestable a tag your page author treats as nestable, + try ICantBelieveItsBeautifulSoup, MinimalSoup, or + BeautifulStoneSoup before writing your own subclass.""" + + def __init__(self, *args, **kwargs): + if not kwargs.has_key('smartQuotesTo'): + kwargs['smartQuotesTo'] = self.HTML_ENTITIES + BeautifulStoneSoup.__init__(self, *args, **kwargs) + + SELF_CLOSING_TAGS = buildTagMap(None, + ['br' , 'hr', 'input', 'img', 'meta', + 'spacer', 'link', 'frame', 'base']) + + QUOTE_TAGS = {'script': None} + + #According to the HTML standard, each of these inline tags can + #contain another tag of the same type. Furthermore, it's common + #to actually use these tags this way. + NESTABLE_INLINE_TAGS = ['span', 'font', 'q', 'object', 'bdo', 'sub', 'sup', + 'center'] + + #According to the HTML standard, these block tags can contain + #another tag of the same type. Furthermore, it's common + #to actually use these tags this way. + NESTABLE_BLOCK_TAGS = ['blockquote', 'div', 'fieldset', 'ins', 'del'] + + #Lists can contain other lists, but there are restrictions. + NESTABLE_LIST_TAGS = { 'ol' : [], + 'ul' : [], + 'li' : ['ul', 'ol'], + 'dl' : [], + 'dd' : ['dl'], + 'dt' : ['dl'] } + + #Tables can contain other tables, but there are restrictions. + NESTABLE_TABLE_TAGS = {'table' : [], + 'tr' : ['table', 'tbody', 'tfoot', 'thead'], + 'td' : ['tr'], + 'th' : ['tr'], + 'thead' : ['table'], + 'tbody' : ['table'], + 'tfoot' : ['table'], + } + + NON_NESTABLE_BLOCK_TAGS = ['address', 'form', 'p', 'pre'] + + #If one of these tags is encountered, all tags up to the next tag of + #this type are popped. + RESET_NESTING_TAGS = buildTagMap(None, NESTABLE_BLOCK_TAGS, 'noscript', + NON_NESTABLE_BLOCK_TAGS, + NESTABLE_LIST_TAGS, + NESTABLE_TABLE_TAGS) + + NESTABLE_TAGS = buildTagMap([], NESTABLE_INLINE_TAGS, NESTABLE_BLOCK_TAGS, + NESTABLE_LIST_TAGS, NESTABLE_TABLE_TAGS) + + # Used to detect the charset in a META tag; see start_meta + CHARSET_RE = re.compile("((^|;)\s*charset=)([^;]*)") + + def start_meta(self, attrs): + """Beautiful Soup can detect a charset included in a META tag, + try to convert the document to that charset, and re-parse the + document from the beginning.""" + httpEquiv = None + contentType = None + contentTypeIndex = None + tagNeedsEncodingSubstitution = False + + for i in range(0, len(attrs)): + key, value = attrs[i] + key = key.lower() + if key == 'http-equiv': + httpEquiv = value + elif key == 'content': + contentType = value + contentTypeIndex = i + + if httpEquiv and contentType: # It's an interesting meta tag. + match = self.CHARSET_RE.search(contentType) + if match: + if getattr(self, 'declaredHTMLEncoding') or \ + (self.originalEncoding == self.fromEncoding): + # This is our second pass through the document, or + # else an encoding was specified explicitly and it + # worked. Rewrite the meta tag. + newAttr = self.CHARSET_RE.sub\ + (lambda(match):match.group(1) + + "%SOUP-ENCODING%", value) + attrs[contentTypeIndex] = (attrs[contentTypeIndex][0], + newAttr) + tagNeedsEncodingSubstitution = True + else: + # This is our first pass through the document. + # Go through it again with the new information. + newCharset = match.group(3) + if newCharset and newCharset != self.originalEncoding: + self.declaredHTMLEncoding = newCharset + self._feed(self.declaredHTMLEncoding) + raise StopParsing + tag = self.unknown_starttag("meta", attrs) + if tag and tagNeedsEncodingSubstitution: + tag.containsSubstitutions = True + +class StopParsing(Exception): + pass + +class ICantBelieveItsBeautifulSoup(BeautifulSoup): + + """The BeautifulSoup class is oriented towards skipping over + common HTML errors like unclosed tags. However, sometimes it makes + errors of its own. For instance, consider this fragment: + + FooBar + + This is perfectly valid (if bizarre) HTML. However, the + BeautifulSoup class will implicitly close the first b tag when it + encounters the second 'b'. It will think the author wrote + "FooBar", and didn't close the first 'b' tag, because + there's no real-world reason to bold something that's already + bold. When it encounters '' it will close two more 'b' + tags, for a grand total of three tags closed instead of two. This + can throw off the rest of your document structure. The same is + true of a number of other tags, listed below. + + It's much more common for someone to forget to close a 'b' tag + than to actually use nested 'b' tags, and the BeautifulSoup class + handles the common case. This class handles the not-co-common + case: where you can't believe someone wrote what they did, but + it's valid HTML and BeautifulSoup screwed up by assuming it + wouldn't be.""" + + I_CANT_BELIEVE_THEYRE_NESTABLE_INLINE_TAGS = \ + ['em', 'big', 'i', 'small', 'tt', 'abbr', 'acronym', 'strong', + 'cite', 'code', 'dfn', 'kbd', 'samp', 'strong', 'var', 'b', + 'big'] + + I_CANT_BELIEVE_THEYRE_NESTABLE_BLOCK_TAGS = ['noscript'] + + NESTABLE_TAGS = buildTagMap([], BeautifulSoup.NESTABLE_TAGS, + I_CANT_BELIEVE_THEYRE_NESTABLE_BLOCK_TAGS, + I_CANT_BELIEVE_THEYRE_NESTABLE_INLINE_TAGS) + +class MinimalSoup(BeautifulSoup): + """The MinimalSoup class is for parsing HTML that contains + pathologically bad markup. It makes no assumptions about tag + nesting, but it does know which tags are self-closing, that + + + + +
    + + Index: /sandbox/fvanderbiest/openlayers/tests/Ajax.html =================================================================== --- /sandbox/fvanderbiest/openlayers/tests/Ajax.html (revision 1941) +++ /sandbox/fvanderbiest/openlayers/tests/Ajax.html (revision 1941) @@ -0,0 +1,27 @@ + + + + + + + + Index: /sandbox/fvanderbiest/openlayers/tests/Request/XMLHttpRequest.html =================================================================== --- /sandbox/fvanderbiest/openlayers/tests/Request/XMLHttpRequest.html (revision 1941) +++ /sandbox/fvanderbiest/openlayers/tests/Request/XMLHttpRequest.html (revision 1941) @@ -0,0 +1,14 @@ + + + + + + + + Index: /sandbox/fvanderbiest/openlayers/tests/Filter.html =================================================================== --- /sandbox/fvanderbiest/openlayers/tests/Filter.html (revision 1941) +++ /sandbox/fvanderbiest/openlayers/tests/Filter.html (revision 1941) @@ -0,0 +1,21 @@ + + + + + + + + Index: /sandbox/fvanderbiest/openlayers/tests/Tile.html =================================================================== --- /sandbox/fvanderbiest/openlayers/tests/Tile.html (revision 1941) +++ /sandbox/fvanderbiest/openlayers/tests/Tile.html (revision 1941) @@ -0,0 +1,95 @@ + + + + + + + + + Index: /sandbox/fvanderbiest/openlayers/tests/StyleMap.html =================================================================== --- /sandbox/fvanderbiest/openlayers/tests/StyleMap.html (revision 1941) +++ /sandbox/fvanderbiest/openlayers/tests/StyleMap.html (revision 1941) @@ -0,0 +1,44 @@ + + + + + + +
    + + Index: /sandbox/fvanderbiest/openlayers/tests/Events.html =================================================================== --- /sandbox/fvanderbiest/openlayers/tests/Events.html (revision 1941) +++ /sandbox/fvanderbiest/openlayers/tests/Events.html (revision 1941) @@ -0,0 +1,457 @@ + + + + + + +
    +
    +
    + + Index: /sandbox/fvanderbiest/openlayers/tests/Extras.html =================================================================== --- /sandbox/fvanderbiest/openlayers/tests/Extras.html (revision 1941) +++ /sandbox/fvanderbiest/openlayers/tests/Extras.html (revision 1941) @@ -0,0 +1,21 @@ + + + + + + +
    + + Index: /sandbox/fvanderbiest/openlayers/tests/Rule.html =================================================================== --- /sandbox/fvanderbiest/openlayers/tests/Rule.html (revision 1941) +++ /sandbox/fvanderbiest/openlayers/tests/Rule.html (revision 1941) @@ -0,0 +1,99 @@ + + + + + + + + Index: /sandbox/fvanderbiest/openlayers/tests/Projection.html =================================================================== --- /sandbox/fvanderbiest/openlayers/tests/Projection.html (revision 1941) +++ /sandbox/fvanderbiest/openlayers/tests/Projection.html (revision 1941) @@ -0,0 +1,30 @@ + + + + + + + + Index: /sandbox/fvanderbiest/openlayers/tests/Marker/Box.html =================================================================== --- /sandbox/fvanderbiest/openlayers/tests/Marker/Box.html (revision 1941) +++ /sandbox/fvanderbiest/openlayers/tests/Marker/Box.html (revision 1941) @@ -0,0 +1,183 @@ + + + + + + +
    + + Index: /sandbox/fvanderbiest/openlayers/tests/geom_eq.js =================================================================== --- /sandbox/fvanderbiest/openlayers/tests/geom_eq.js (revision 1941) +++ /sandbox/fvanderbiest/openlayers/tests/geom_eq.js (revision 1941) @@ -0,0 +1,110 @@ +/** + * File: xml_eq.js + * Adds a xml_eq method to AnotherWay test objects. + * + */ + +(function() { + + /** + * Function assertEqual + * Test two objects for equivalence (based on ==). Throw an exception + * if not equivalent. + * + * Parameters: + * got - {Object} + * expected - {Object} + * msg - {String} The message to be thrown. This message will be appended + * with ": got {got} but expected {expected}" where got and expected are + * replaced with string representations of the above arguments. + */ + function assertEqual(got, expected, msg) { + if(got === undefined) { + got = "undefined"; + } else if (got === null) { + got = "null"; + } + if(expected === undefined) { + expected = "undefined"; + } else if (expected === null) { + expected = "null"; + } + if(got != expected) { + throw msg + ": got '" + got + "' but expected '" + expected + "'"; + } + } + + /** + * Function assertGeometryEqual + * Test two geometries for equivalence. Geometries are considered + * equivalent if they are of the same class, and given component + * geometries, if all components are equivalent. Throws a message as + * exception if not equivalent. + * + * Parameters: + * got - {OpenLayers.Geometry} + * expected - {OpenLayers.Geometry} + * options - {Object} Optional object for configuring test options. + */ + function assertGeometryEqual(got, expected, options) { + + var OpenLayers = Test.AnotherWay._g_test_iframe.OpenLayers; + + // compare types + assertEqual(typeof got, typeof expected, "Object types mismatch"); + + // compare classes + assertEqual(got.CLASS_NAME, expected.CLASS_NAME, "Object class mismatch"); + + if(got instanceof OpenLayers.Geometry.Point) { + // compare points + assertEqual(got.x, expected.x, "x mismatch"); + assertEqual(got.y, expected.y, "y mismatch"); + assertEqual(got.z, expected.z, "z mismatch"); + } else { + // compare components + assertEqual( + got.components.length, expected.components.length, + "Component length mismatch for " + got.CLASS_NAME + ); + for(var i=0; i + + + + + + + Index: /sandbox/fvanderbiest/openlayers/tests/Geometry/LineString.html =================================================================== --- /sandbox/fvanderbiest/openlayers/tests/Geometry/LineString.html (revision 1941) +++ /sandbox/fvanderbiest/openlayers/tests/Geometry/LineString.html (revision 1941) @@ -0,0 +1,383 @@ + + + + + + + + Index: /sandbox/fvanderbiest/openlayers/tests/Geometry/MultiPolygon.html =================================================================== --- /sandbox/fvanderbiest/openlayers/tests/Geometry/MultiPolygon.html (revision 1941) +++ /sandbox/fvanderbiest/openlayers/tests/Geometry/MultiPolygon.html (revision 1941) @@ -0,0 +1,34 @@ + + + + + + + + Index: /sandbox/fvanderbiest/openlayers/tests/Geometry/Curve.html =================================================================== --- /sandbox/fvanderbiest/openlayers/tests/Geometry/Curve.html (revision 1941) +++ /sandbox/fvanderbiest/openlayers/tests/Geometry/Curve.html (revision 1941) @@ -0,0 +1,157 @@ + + + + + + + + Index: /sandbox/fvanderbiest/openlayers/tests/Geometry/MultiPoint.html =================================================================== --- /sandbox/fvanderbiest/openlayers/tests/Geometry/MultiPoint.html (revision 1941) +++ /sandbox/fvanderbiest/openlayers/tests/Geometry/MultiPoint.html (revision 1941) @@ -0,0 +1,130 @@ + + + + + + + + Index: /sandbox/fvanderbiest/openlayers/tests/Geometry/Rectangle.html =================================================================== --- /sandbox/fvanderbiest/openlayers/tests/Geometry/Rectangle.html (revision 1941) +++ /sandbox/fvanderbiest/openlayers/tests/Geometry/Rectangle.html (revision 1941) @@ -0,0 +1,76 @@ + + + + + + + + Index: /sandbox/fvanderbiest/openlayers/tests/Geometry/Polygon.html =================================================================== --- /sandbox/fvanderbiest/openlayers/tests/Geometry/Polygon.html (revision 1941) +++ /sandbox/fvanderbiest/openlayers/tests/Geometry/Polygon.html (revision 1941) @@ -0,0 +1,381 @@ + + + + + + + + Index: /sandbox/fvanderbiest/openlayers/tests/Geometry/Surface.html =================================================================== --- /sandbox/fvanderbiest/openlayers/tests/Geometry/Surface.html (revision 1941) +++ /sandbox/fvanderbiest/openlayers/tests/Geometry/Surface.html (revision 1941) @@ -0,0 +1,22 @@ + + + + + + + + Index: /sandbox/fvanderbiest/openlayers/tests/Geometry/MultiLineString.html =================================================================== --- /sandbox/fvanderbiest/openlayers/tests/Geometry/MultiLineString.html (revision 1941) +++ /sandbox/fvanderbiest/openlayers/tests/Geometry/MultiLineString.html (revision 1941) @@ -0,0 +1,267 @@ + + + + + + + + Index: /sandbox/fvanderbiest/openlayers/tests/Geometry/Point.html =================================================================== --- /sandbox/fvanderbiest/openlayers/tests/Geometry/Point.html (revision 1941) +++ /sandbox/fvanderbiest/openlayers/tests/Geometry/Point.html (revision 1941) @@ -0,0 +1,214 @@ + + + + + + + + Index: /sandbox/fvanderbiest/openlayers/tests/Geometry/LinearRing.html =================================================================== --- /sandbox/fvanderbiest/openlayers/tests/Geometry/LinearRing.html (revision 1941) +++ /sandbox/fvanderbiest/openlayers/tests/Geometry/LinearRing.html (revision 1941) @@ -0,0 +1,241 @@ + + + + + + + + Index: /sandbox/fvanderbiest/openlayers/tests/Geometry/Collection.html =================================================================== --- /sandbox/fvanderbiest/openlayers/tests/Geometry/Collection.html (revision 1941) +++ /sandbox/fvanderbiest/openlayers/tests/Geometry/Collection.html (revision 1941) @@ -0,0 +1,270 @@ + + + + + + + + Index: /sandbox/fvanderbiest/openlayers/tests/Icon.html =================================================================== --- /sandbox/fvanderbiest/openlayers/tests/Icon.html (revision 1941) +++ /sandbox/fvanderbiest/openlayers/tests/Icon.html (revision 1941) @@ -0,0 +1,68 @@ + + + + + + + + Index: /sandbox/fvanderbiest/openlayers/tests/Geometry.html =================================================================== --- /sandbox/fvanderbiest/openlayers/tests/Geometry.html (revision 1941) +++ /sandbox/fvanderbiest/openlayers/tests/Geometry.html (revision 1941) @@ -0,0 +1,344 @@ + + + + + + + +
    + + Index: /sandbox/fvanderbiest/openlayers/tests/Protocol.html =================================================================== --- /sandbox/fvanderbiest/openlayers/tests/Protocol.html (revision 1941) +++ /sandbox/fvanderbiest/openlayers/tests/Protocol.html (revision 1941) @@ -0,0 +1,53 @@ + + + + + + + + Index: /sandbox/fvanderbiest/openlayers/tests/Strategy.html =================================================================== --- /sandbox/fvanderbiest/openlayers/tests/Strategy.html (revision 1941) +++ /sandbox/fvanderbiest/openlayers/tests/Strategy.html (revision 1941) @@ -0,0 +1,94 @@ + + + +