├── .gitignore ├── .travis.yml ├── LICENSE.md ├── README.md ├── _posts └── docs │ └── reference │ ├── 0204-01-01-introduction.md │ ├── 0204-02-01-usage.md │ ├── 0204-02-02-basics.md │ ├── 0204-02-04-interface-tour.md │ ├── 0204-02-05-files-and-directories.md │ ├── 0204-03-01-adding-layers.md │ ├── 0204-03-01-project-settings.md │ ├── 0204-04-01-carto.md │ ├── 0204-05-01-exporting.md │ ├── 0204-06-01-mapbox-geodata.md │ └── 0204-07-01-tilemill-settings.md ├── appveyor.yml ├── assets ├── css │ ├── code.css │ ├── codemirror.css │ ├── controls.css │ ├── reset.css │ └── style.css ├── fonts │ ├── DroidSans.ttf │ ├── DroidSans.woff │ ├── DroidSansBold.ttf │ ├── DroidSansBold.woff │ └── DroidSansMono.ttf ├── images │ ├── bg.png │ ├── bg.svg │ ├── controls.png │ ├── controls.svg │ ├── controls_2x.png │ ├── favicon.ico │ ├── favicon.svg │ ├── mask-0-25.png │ ├── mask-0-50.png │ ├── mask-255-90.png │ ├── mask-48-90.png │ ├── mask.png │ ├── mask.svg │ ├── spinner-reverse.gif │ ├── spinner.gif │ ├── sprite.png │ ├── sprite.svg │ ├── sprite_2x.png │ ├── tilemill.png │ ├── tilemill.svg │ ├── tilemill_2x.png │ └── top.png ├── js │ ├── codemirror.carto.complete.js │ ├── codemirror.carto.js │ ├── codemirror.js │ ├── codemirror.mustache.js │ ├── codemirror.overlay.js │ ├── codemirror.xml.js │ ├── colorpicker.classic.js │ ├── jquery.ui.js │ ├── mustache.js │ └── showdown.js └── manual │ ├── editor.png │ ├── editor.svg │ ├── export.png │ ├── inspector-hover.png │ ├── inspector.png │ ├── inspector.svg │ ├── legend.png │ ├── map.png │ ├── map.svg │ ├── project.png │ ├── project.svg │ ├── symbolizer-1.png │ ├── symbolizer-2.png │ ├── tools.png │ └── tools.svg ├── commands ├── core.bones ├── export.bones ├── global.bones ├── start.bones ├── test.bones └── tile.bones ├── configure.js ├── controllers └── Router.bones ├── data └── 82945364-10m-admin-0-countries │ └── 82945364-10m-admin-0-countries.zip ├── examples ├── control-room │ ├── .thumb.png │ ├── labels.mss │ ├── project.mml │ └── style.mss ├── geography-class │ ├── .thumb.png │ ├── flags │ │ ├── ABW.svgz │ │ ├── AFG.svgz │ │ ├── AGO.svgz │ │ ├── AIA.svgz │ │ ├── ALB.svgz │ │ ├── ALD.svgz │ │ ├── AND.svgz │ │ ├── ARE.svgz │ │ ├── ARG.svgz │ │ ├── ARM.svgz │ │ ├── ASM.svgz │ │ ├── ATA.svgz │ │ ├── ATC.svgz │ │ ├── ATF.svgz │ │ ├── ATG.svgz │ │ ├── AUS.svgz │ │ ├── AUT.svgz │ │ ├── AZE.svgz │ │ ├── BDI.svgz │ │ ├── BEL.svgz │ │ ├── BEN.svgz │ │ ├── BFA.svgz │ │ ├── BGD.svgz │ │ ├── BGR.svgz │ │ ├── BHR.svgz │ │ ├── BHS.svgz │ │ ├── BIH.svgz │ │ ├── BLM.svgz │ │ ├── BLR.svgz │ │ ├── BLZ.svgz │ │ ├── BMU.svgz │ │ ├── BOL.svgz │ │ ├── BRA.svgz │ │ ├── BRB.svgz │ │ ├── BRN.svgz │ │ ├── BTN.svgz │ │ ├── BWA.svgz │ │ ├── CAF.svgz │ │ ├── CAN.svgz │ │ ├── CHE.svgz │ │ ├── CHL.svgz │ │ ├── CHN.svgz │ │ ├── CIV.svgz │ │ ├── CLP.svgz │ │ ├── CMR.svgz │ │ ├── CNM.svgz │ │ ├── COD.svgz │ │ ├── COG.svgz │ │ ├── COK.svgz │ │ ├── COL.svgz │ │ ├── COM.svgz │ │ ├── CPV.svgz │ │ ├── CRI.svgz │ │ ├── CSI.svgz │ │ ├── CUB.svgz │ │ ├── CUW.svgz │ │ ├── CYM.svgz │ │ ├── CYN.svgz │ │ ├── CYP.svgz │ │ ├── CZE.svgz │ │ ├── DEU.svgz │ │ ├── DJI.svgz │ │ ├── DMA.svgz │ │ ├── DNK.svgz │ │ ├── DOM.svgz │ │ ├── DZA.svgz │ │ ├── ECU.svgz │ │ ├── EGY.svgz │ │ ├── ERI.svgz │ │ ├── ESB.svgz │ │ ├── ESP.svgz │ │ ├── EST.svgz │ │ ├── ETH.svgz │ │ ├── FIN.svgz │ │ ├── FJI.svgz │ │ ├── FLK.svgz │ │ ├── FRA.svgz │ │ ├── FRO.svgz │ │ ├── FSM.svgz │ │ ├── GAB.svgz │ │ ├── GAZ.svgz │ │ ├── GBR.svgz │ │ ├── GEO.svgz │ │ ├── GGY.svgz │ │ ├── GHA.svgz │ │ ├── GIB.svgz │ │ ├── GIN.svgz │ │ ├── GMB.svgz │ │ ├── GNB.svgz │ │ ├── GNQ.svgz │ │ ├── GRC.svgz │ │ ├── GRD.svgz │ │ ├── GRL.svgz │ │ ├── GTM.svgz │ │ ├── GUM.svgz │ │ ├── GUY.svgz │ │ ├── HKG.svgz │ │ ├── HMD.svgz │ │ ├── HND.svgz │ │ ├── HRV.svgz │ │ ├── HTI.svgz │ │ ├── HUN.svgz │ │ ├── IDN.svgz │ │ ├── IMN.svgz │ │ ├── IND.svgz │ │ ├── IOA.svgz │ │ ├── IOT.svgz │ │ ├── IRL.svgz │ │ ├── IRN.svgz │ │ ├── IRQ.svgz │ │ ├── ISL.svgz │ │ ├── ISR.svgz │ │ ├── ITA.svgz │ │ ├── JAM.svgz │ │ ├── JEY.svgz │ │ ├── JOR.svgz │ │ ├── JPN.svgz │ │ ├── KAB.svgz │ │ ├── KAS.svgz │ │ ├── KAZ.svgz │ │ ├── KEN.svgz │ │ ├── KGZ.svgz │ │ ├── KHM.svgz │ │ ├── KIR.svgz │ │ ├── KNA.svgz │ │ ├── KNM.svgz │ │ ├── KOR.svgz │ │ ├── KOS.svgz │ │ ├── KWT.svgz │ │ ├── LAO.svgz │ │ ├── LBN.svgz │ │ ├── LBR.svgz │ │ ├── LBY.svgz │ │ ├── LCA.svgz │ │ ├── LIE.svgz │ │ ├── LKA.svgz │ │ ├── LSO.svgz │ │ ├── LTU.svgz │ │ ├── LUX.svgz │ │ ├── LVA.svgz │ │ ├── MAC.svgz │ │ ├── MAF.svgz │ │ ├── MAR.svgz │ │ ├── MCO.svgz │ │ ├── MDA.svgz │ │ ├── MDG.svgz │ │ ├── MDV.svgz │ │ ├── MEX.svgz │ │ ├── MHL.svgz │ │ ├── MKD.svgz │ │ ├── MLI.svgz │ │ ├── MLT.svgz │ │ ├── MMR.svgz │ │ ├── MNE.svgz │ │ ├── MNG.svgz │ │ ├── MNP.svgz │ │ ├── MOZ.svgz │ │ ├── MRT.svgz │ │ ├── MSR.svgz │ │ ├── MUS.svgz │ │ ├── MWI.svgz │ │ ├── MYS.svgz │ │ ├── NAM.svgz │ │ ├── NCL.svgz │ │ ├── NER.svgz │ │ ├── NFK.svgz │ │ ├── NGA.svgz │ │ ├── NIC.svgz │ │ ├── NIU.svgz │ │ ├── NLD.svgz │ │ ├── NOR.svgz │ │ ├── NPL.svgz │ │ ├── NRU.svgz │ │ ├── NZL.svgz │ │ ├── OMN.svgz │ │ ├── PAK.svgz │ │ ├── PAN.svgz │ │ ├── PCN.svgz │ │ ├── PER.svgz │ │ ├── PHL.svgz │ │ ├── PLW.svgz │ │ ├── PNG.svgz │ │ ├── POL.svgz │ │ ├── PRI.svgz │ │ ├── PRK.svgz │ │ ├── PRT.svgz │ │ ├── PRY.svgz │ │ ├── PYF.svgz │ │ ├── QAT.svgz │ │ ├── ROU.svgz │ │ ├── RUS.svgz │ │ ├── RWA.svgz │ │ ├── SAH.svgz │ │ ├── SAU.svgz │ │ ├── SDN.svgz │ │ ├── SDS.svgz │ │ ├── SEN.svgz │ │ ├── SGP.svgz │ │ ├── SGS.svgz │ │ ├── SHN.svgz │ │ ├── SLB.svgz │ │ ├── SLE.svgz │ │ ├── SLV.svgz │ │ ├── SMR.svgz │ │ ├── SOL.svgz │ │ ├── SOM.svgz │ │ ├── SPM.svgz │ │ ├── SRB.svgz │ │ ├── STP.svgz │ │ ├── SUR.svgz │ │ ├── SVK.svgz │ │ ├── SVN.svgz │ │ ├── SWE.svgz │ │ ├── SWZ.svgz │ │ ├── SXM.svgz │ │ ├── SYC.svgz │ │ ├── SYR.svgz │ │ ├── TCA.svgz │ │ ├── TCD.svgz │ │ ├── TGO.svgz │ │ ├── THA.svgz │ │ ├── TJK.svgz │ │ ├── TKM.svgz │ │ ├── TLS.svgz │ │ ├── TON.svgz │ │ ├── TTO.svgz │ │ ├── TUN.svgz │ │ ├── TUR.svgz │ │ ├── TUV.svgz │ │ ├── TWN.svgz │ │ ├── TZA.svgz │ │ ├── UGA.svgz │ │ ├── UKR.svgz │ │ ├── UMI.svgz │ │ ├── URY.svgz │ │ ├── USA.svgz │ │ ├── USG.svgz │ │ ├── UZB.svgz │ │ ├── VAT.svgz │ │ ├── VCT.svgz │ │ ├── VEN.svgz │ │ ├── VGB.svgz │ │ ├── VIR.svgz │ │ ├── VNM.svgz │ │ ├── VUT.svgz │ │ ├── WEB.svgz │ │ ├── WLF.svgz │ │ ├── WSB.svgz │ │ ├── WSM.svgz │ │ ├── YEM.svgz │ │ ├── ZAF.svgz │ │ ├── ZMB.svgz │ │ └── ZWE.svgz │ ├── icons │ │ ├── circle-7.png │ │ └── star-10.png │ ├── insert_flags.sh │ ├── labels.mss │ ├── layers │ │ ├── country-interaction.geojson │ │ └── world_extent_wgs84.geojson │ ├── project.mml │ ├── rainbow.mss │ ├── style.mss │ └── textures │ │ ├── paperfolds_256.png │ │ └── paperfolds_512.png ├── open-streets-dc │ ├── .thumb.png │ ├── highway.mss │ ├── images │ │ ├── water.png │ │ └── wood.png │ ├── labels.mss │ ├── layers │ │ ├── dc-coastline.dbf │ │ ├── dc-coastline.prj │ │ ├── dc-coastline.shp │ │ ├── dc-coastline.shx │ │ ├── dcgis_water │ │ │ ├── WaterPly_900913.dbf │ │ │ ├── WaterPly_900913.index │ │ │ ├── WaterPly_900913.prj │ │ │ ├── WaterPly_900913.shp │ │ │ └── WaterPly_900913.shx │ │ ├── osm-landusages.dbf │ │ ├── osm-landusages.prj │ │ ├── osm-landusages.shp │ │ ├── osm-landusages.shx │ │ ├── osm-mainroads.dbf │ │ ├── osm-mainroads.prj │ │ ├── osm-mainroads.shp │ │ ├── osm-mainroads.shx │ │ ├── osm-motorways.dbf │ │ ├── osm-motorways.prj │ │ ├── osm-motorways.shp │ │ ├── osm-motorways.shx │ │ ├── osm-places.dbf │ │ ├── osm-places.prj │ │ ├── osm-places.shp │ │ ├── osm-places.shx │ │ ├── osm-roads.dbf │ │ ├── osm-roads.prj │ │ ├── osm-roads.shp │ │ ├── osm-roads.shx │ │ ├── osm-waterareas.dbf │ │ ├── osm-waterareas.prj │ │ ├── osm-waterareas.shp │ │ └── osm-waterareas.shx │ ├── project.mml │ └── style.mss └── road-trip │ ├── .thumb.png │ ├── labels.mss │ ├── project.mml │ ├── roads.mss │ └── style.mss ├── fonts ├── DejaVuSans-Bold.ttf ├── DejaVuSans-BoldOblique.ttf ├── DejaVuSans-ExtraLight.ttf ├── DejaVuSans-Oblique.ttf ├── DejaVuSans.ttf ├── DejaVuSansCondensed-Bold.ttf ├── DejaVuSansCondensed-BoldOblique.ttf ├── DejaVuSansCondensed-Oblique.ttf ├── DejaVuSansCondensed.ttf ├── DejaVuSansMono-Bold.ttf ├── DejaVuSansMono-BoldOblique.ttf ├── DejaVuSansMono-Oblique.ttf ├── DejaVuSansMono.ttf ├── DejaVuSerif-Bold.ttf ├── DejaVuSerif-BoldItalic.ttf ├── DejaVuSerif-Italic.ttf ├── DejaVuSerif.ttf ├── DejaVuSerifCondensed-Bold.ttf ├── DejaVuSerifCondensed-BoldItalic.ttf ├── DejaVuSerifCondensed-Italic.ttf ├── DejaVuSerifCondensed.ttf ├── LICENSE ├── unifont-7.0.05.ttf └── unifont_license.txt ├── index.js ├── lib ├── config.defaults.json ├── crashutil.js ├── create_files.js ├── fsutil.js ├── gitutil.js ├── queue.js ├── redirect.js └── s3.js ├── models ├── Base.bones ├── Config.bones ├── Config.server.bones ├── Datasource.bones ├── Datasource.server.bones ├── Export.bones ├── Exports.bones ├── Exports.server.bones ├── Favorite.bones ├── Favorites.bones ├── Layer.bones ├── Layers.bones ├── Library.bones ├── Library.server.bones ├── Page.bones ├── Page.server.bones ├── Pages.bones ├── Pages.server.bones ├── Preview.bones ├── Preview.server.bones ├── Project.bones ├── Project.server.bones ├── Projects.bones ├── Projects.server.bones ├── Stylesheet.bones └── Stylesheets.bones ├── package.json ├── plugins ├── carto │ ├── package.json │ ├── templates │ │ └── Reference._ │ └── views │ │ └── Carto.bones ├── editor │ ├── package.json │ ├── templates │ │ ├── Colorpicker._ │ │ ├── Editor._ │ │ ├── ProjectStylesheet._ │ │ ├── ProjectSwatch._ │ │ └── Stylesheet._ │ └── views │ │ ├── Stylesheet.bones │ │ └── Stylesheets.bones ├── fonts │ ├── package.json │ ├── templates │ │ └── Fonts._ │ └── views │ │ └── Fonts.bones └── templates │ ├── package.json │ ├── templates │ └── Templates._ │ └── views │ └── Templates.bones ├── rebuild_cxx.sh ├── servers ├── App.bones ├── Core.bones ├── Route.bones └── Tile.bones ├── templates ├── App._ ├── Autostyle._ ├── Config._ ├── Datasource._ ├── DatasourceRows._ ├── Error._ ├── Exports._ ├── Layer._ ├── Layers._ ├── Library._ ├── Manual._ ├── Map._ ├── Metadata._ ├── Modal._ ├── Pane._ ├── Plugin._ ├── Plugins._ ├── Preview._ ├── Project._ ├── ProjectAdd._ ├── ProjectLayer._ └── Projects._ ├── test ├── abilities.test.js ├── check_shared_libs.py ├── config.test.js ├── datasource.test.js ├── duplicate_module.test.js ├── export.test.js ├── fixtures │ ├── anti-meridian-export-job.json │ ├── countries.sqlite │ ├── create-project.json │ ├── created-project.json │ ├── datasource-postgis-features.json │ ├── datasource-postgis.json │ ├── datasource-shp-features.json │ ├── datasource-shp.json │ ├── datasource-sqlite.json │ ├── existing-project.json │ ├── export-job.json │ ├── invalid-project.json │ ├── pristine │ │ └── project │ │ │ └── demo_01 │ │ │ ├── project.mml │ │ │ └── style.mss │ └── tilemill_test.sql ├── init.js ├── project.test.js ├── support │ └── start.js └── tile.test.js └── views ├── App.bones ├── Config.bones ├── Datasource.bones ├── Error.bones ├── Exports.bones ├── Layer.bones ├── Layers.bones ├── Library.bones ├── Manual.bones ├── Map.bones ├── Metadata.bones ├── Modal.bones ├── Plugins.bones ├── Preview.bones ├── Project.bones ├── ProjectAdd.bones └── Projects.bones /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | /_site 3 | /platforms/osx/build 4 | /node_modules 5 | /test/fixtures/files 6 | npm-debug.log 7 | VERSION 8 | platforms/osx/Externals/Sparkle/source 9 | examples/geography-class/layers 10 | examples/road-trip/layers 11 | examples/control-room/layers 12 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | 3 | sudo: false 4 | 5 | node_js: 6 | - "0.10" 7 | # tests failing for unknown reasons 8 | #- "4" 9 | 10 | addons: 11 | postgresql: "9.3" 12 | apt: 13 | sources: 14 | - ubuntu-toolchain-r-test 15 | packages: 16 | - libstdc++6 # upgrade libstdc++ on linux to support C++11 17 | - libwebkit-dev 18 | 19 | before_install: 20 | - createdb template_postgis 21 | - psql -c "CREATE EXTENSION postgis" template_postgis 22 | 23 | install: 24 | - npm install --fallback-to-build=false 25 | - python test/check_shared_libs.py node_modules/ 26 | 27 | before_script: 28 | - npm ls 29 | 30 | script: 31 | - npm test 32 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | Copyright (c), MapBox 2 | All rights reserved. 3 | 4 | Redistribution and use in source and binary forms, with or without modification, 5 | are permitted provided that the following conditions are met: 6 | 7 | - Redistributions of source code must retain the above copyright notice, this 8 | list of conditions and the following disclaimer. 9 | - Redistributions in binary form must reproduce the above copyright notice, this 10 | list of conditions and the following disclaimer in the documentation and/or 11 | other materials provided with the distribution. 12 | - Neither the name "MapBox" nor the names of its contributors may be used to 13 | endorse or promote products derived from this software without specific prior 14 | written permission. 15 | 16 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 17 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 18 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 19 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR 20 | ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 21 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 22 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 23 | ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 25 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 | -------------------------------------------------------------------------------- /_posts/docs/reference/0204-02-01-usage.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: docs 3 | section: help 4 | category: reference 5 | tag: Reference 6 | title: Usage 7 | permalink: /docs/manual/usage 8 | --- 9 | After TileMill is installed you will want to familiarize yourself with the basics of starting and stopping the app as well as configuring any relevant settings. 10 | 11 | ## Mac OS X 12 | 13 | TileMill for Mac OS X is meant to be run as a desktop-style application. 14 | 15 | - **Start** TileMill by double-clicking its icon in the `Applications` folder 16 | - **Stop** TileMill by quitting the application 17 | - **Files** used by TileMill are in your user account's `Documents/MapBox` folder 18 | - **Logs** are viewable by choosing `Console` from the app's `Window` menu 19 | - **Preferences** are available from the application's main screen 20 | - **Advanced preferences** can be changed by editing `~/.tilemill/config.json` 21 | 22 | ## Windows 23 | 24 | - **Start** TileMill using the Start menu item at Start > TileMIll > Start TileMill 25 | - **Stop** TileMill by quitting the application 26 | - **Files** used by TileMill are in your user account's `Documents/MapBox` folder 27 | - **Logs** are written to a file in your users account folder (%USERPROFILE%) named `tilemill.log` 28 | - **Preferences** are available from the application's main screen 29 | - **Advanced preferences** can be changed by editing `~/.tilemill/config.json` 30 | 31 | ## Ubuntu 32 | 33 | - **Start** TileMill using the menu item at Applications > Graphics > TileMill. 34 | - **Stop** TileMill by quitting the application 35 | - **Files** used by TileMill are in your user account's `Documents/MapBox` folder 36 | - **Logs** are written to `~/.tilemill.log` 37 | - **Preferences** are available from the application's main screen 38 | - **Advanced preferences** can be changed by editing `~/tilemill/config.json` 39 | 40 | Learn how to [configure TileMill to run as a remote service on Ubuntu](http://mapbox.com/tilemill/docs/tutorials/ubuntu-service). 41 | -------------------------------------------------------------------------------- /_posts/docs/reference/0204-03-01-project-settings.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: docs 3 | section: help 4 | category: reference 5 | tag: Reference 6 | title: Project settings 7 | permalink: /docs/manual/project-settings 8 | --- 9 | You can adjust a variety project settings using the **Settings** panel. The panel is divided into three sections. 10 | 11 | ## Project 12 | 13 | You can set the name, description, bounding box and other metadata for the project on the **Project** tab. 14 | 15 | ## Tooltips 16 | 17 | The **Tooltips** tab allows you to make your maps interactive with dynamic tooltips that appear when you hover or click on a feature (any point or polygon). The tooltips can contain HTML and are useful for revealing additional data or images about the data on the map. 18 | 19 | First, select the **Layer** that you would like to use for interaction data. TileMill only supports one interactive layer at a time. After selecting a layer, the available data fields for the layer will be listed in the form of [Mustache](http://mustache.github.com/) tags. 20 | 21 | These tags can be used in Location, Teaser, or Full fields and they will be replaced with the appropriate value when you interact with the map. 22 | 23 | By default, the **Teaser** content appears when you hover over a feature and the **Full** content appears when you click on the feature. 24 | 25 | You can use the **Location** field to define a URL to be loaded when a feature is clicked. 26 | 27 | ### Allowed HTML 28 | 29 | For security, unsafe HTML in tooltips is sanitized and JavaScript code is removed. If you want to build sophisticated map interaction with JavaScript on your own website, you can write custom code using the [Wax](http://mapbox.com/wax/) library. 30 | 31 | ## Legend 32 | 33 | The **Legend** tab allows to you to create a legend for your map. Use it to explain what the colors and symbols used in your map mean. By default, the legend is always visible. 34 | 35 | ![Example legend]({{site.baseurl}}/assets/manual/legend.png) 36 | 37 | Like tooltips, the HTML in legends is sanitized for security. 38 | 39 | -------------------------------------------------------------------------------- /_posts/docs/reference/0204-07-01-tilemill-settings.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: docs 3 | section: help 4 | category: reference 5 | tag: Reference 6 | title: TileMill settings 7 | permalink: /docs/manual/tilemill-settings 8 | --- 9 | 10 | ## Documents 11 | 12 | The directory where TileMill stores files for projects and exports. If you want to keep your current projects, move the directory before changing this setting. 13 | 14 | ## MapBox Account 15 | 16 | The [MapBox](http://mapbox.com) account TileMill is authorized to upload maps to. MapBox provides hosting for maps created in TileMill. [Register](http://mapbox.com/plans/) for a free MapBox account. 17 | 18 | ## HTTP Proxy 19 | 20 | If your computer uses a HTTP proxy, you will need to specify the details for TileMill to work correctly. The proxy details need to be entered in the form of `http://user:pass@hostname:port` where *user*, *pass*, *hostname* and *port* are replaced with the relevant proxy details. After entering and saving this setting, you will need to restart TileMill. You should then be able to make use of TileMill's features requiring network access. 21 | 22 | *Note: TileMill does not support proxies for authorization. To authorize, open `http://localhost:20009` in a browser after starting TileMill.* 23 | -------------------------------------------------------------------------------- /appveyor.yml: -------------------------------------------------------------------------------- 1 | environment: 2 | matrix: 3 | - NODE_VERSION: 0.10.33 4 | platform: x64 5 | - NODE_VERSION: 0.10.33 6 | platform: x86 7 | 8 | shallow_clone: true 9 | 10 | install: 11 | # find and remove default node.exe to avoid conflicts 12 | - node -e "console.log(process.execPath)" > node_path.txt 13 | - SET /p NODE_EXE_PATH= 2 | 3 | 4 | 18 | 20 | 33 | 40 | 41 | 43 | 44 | 46 | image/svg+xml 47 | 49 | 50 | 51 | 52 | 53 | 58 | 66 | 67 | 68 | -------------------------------------------------------------------------------- /assets/images/spinner-reverse.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/assets/images/spinner-reverse.gif -------------------------------------------------------------------------------- /assets/images/spinner.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/assets/images/spinner.gif -------------------------------------------------------------------------------- /assets/images/sprite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/assets/images/sprite.png -------------------------------------------------------------------------------- /assets/images/sprite_2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/assets/images/sprite_2x.png -------------------------------------------------------------------------------- /assets/images/tilemill.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/assets/images/tilemill.png -------------------------------------------------------------------------------- /assets/images/tilemill_2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/assets/images/tilemill_2x.png -------------------------------------------------------------------------------- /assets/images/top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/assets/images/top.png -------------------------------------------------------------------------------- /assets/js/codemirror.mustache.js: -------------------------------------------------------------------------------- 1 | CodeMirror.defineMode("mustache", function(config, parserConfig) { 2 | var mustacheOverlay = { 3 | token: function(stream, state) { 4 | if (stream.match("{{")) { 5 | while ((ch = stream.next()) != null) 6 | if (ch == "}" && stream.next() == "}") break; 7 | return "mustache"; 8 | } 9 | while (stream.next() != null && !stream.match("{{", false)) {} 10 | return null; 11 | } 12 | }; 13 | return CodeMirror.overlayParser(CodeMirror.getMode(config, parserConfig.backdrop || "text/html"), mustacheOverlay); 14 | }); -------------------------------------------------------------------------------- /assets/js/codemirror.overlay.js: -------------------------------------------------------------------------------- 1 | // Utility function that allows modes to be combined. The mode given 2 | // as the base argument takes care of most of the normal mode 3 | // functionality, but a second (typically simple) mode is used, which 4 | // can override the style of text. Both modes get to parse all of the 5 | // text, but when both assign a non-null style to a piece of code, the 6 | // overlay wins, unless the combine argument was true, in which case 7 | // the styles are combined. 8 | 9 | CodeMirror.overlayParser = function(base, overlay, combine) { 10 | return { 11 | startState: function() { 12 | return { 13 | base: CodeMirror.startState(base), 14 | overlay: CodeMirror.startState(overlay), 15 | basePos: 0, baseCur: null, 16 | overlayPos: 0, overlayCur: null 17 | }; 18 | }, 19 | copyState: function(state) { 20 | return { 21 | base: CodeMirror.copyState(base, state.base), 22 | overlay: CodeMirror.copyState(overlay, state.overlay), 23 | basePos: state.basePos, baseCur: null, 24 | overlayPos: state.overlayPos, overlayCur: null 25 | }; 26 | }, 27 | 28 | token: function(stream, state) { 29 | if (stream.start == state.basePos) { 30 | state.baseCur = base.token(stream, state.base); 31 | state.basePos = stream.pos; 32 | } 33 | if (stream.start == state.overlayPos) { 34 | stream.pos = stream.start; 35 | state.overlayCur = overlay.token(stream, state.overlay); 36 | state.overlayPos = stream.pos; 37 | } 38 | stream.pos = Math.min(state.basePos, state.overlayPos); 39 | if (stream.eol()) state.basePos = state.overlayPos = 0; 40 | 41 | if (state.overlayCur == null) return state.baseCur; 42 | if (state.baseCur != null && combine) return state.baseCur + " " + state.overlayCur; 43 | else return state.overlayCur; 44 | }, 45 | 46 | indent: function(state, textAfter) { 47 | return base.indent(state.base, textAfter); 48 | }, 49 | electricChars: base.electricChars 50 | }; 51 | }; -------------------------------------------------------------------------------- /assets/manual/editor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/assets/manual/editor.png -------------------------------------------------------------------------------- /assets/manual/export.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/assets/manual/export.png -------------------------------------------------------------------------------- /assets/manual/inspector-hover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/assets/manual/inspector-hover.png -------------------------------------------------------------------------------- /assets/manual/inspector.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/assets/manual/inspector.png -------------------------------------------------------------------------------- /assets/manual/legend.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/assets/manual/legend.png -------------------------------------------------------------------------------- /assets/manual/map.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/assets/manual/map.png -------------------------------------------------------------------------------- /assets/manual/project.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/assets/manual/project.png -------------------------------------------------------------------------------- /assets/manual/symbolizer-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/assets/manual/symbolizer-1.png -------------------------------------------------------------------------------- /assets/manual/symbolizer-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/assets/manual/symbolizer-2.png -------------------------------------------------------------------------------- /assets/manual/tools.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/assets/manual/tools.png -------------------------------------------------------------------------------- /commands/global.bones: -------------------------------------------------------------------------------- 1 | var fs = require('fs'); 2 | var path = require('path'); 3 | var defaults = models.Config.defaults; 4 | 5 | Bones.Command.options['files'] = { 6 | 'title': 'files=[path]', 7 | 'description': 'Path to files directory.', 8 | 'default': defaults.files.replace(/^~/, process.env.HOME) 9 | }; 10 | 11 | Bones.Command.options['verbose'] = { 12 | 'title': 'verbose=on|off', 13 | 'description': 'verbose logging', 14 | 'default': defaults.verbose 15 | }; 16 | 17 | // Host option is unused. 18 | delete Bones.Command.options.host; 19 | -------------------------------------------------------------------------------- /commands/test.bones: -------------------------------------------------------------------------------- 1 | command = commands['core'].extend(); 2 | 3 | command.description = 'test server process'; 4 | 5 | command.prototype.initialize = function(plugin, callback) { 6 | Bones.plugin.command = this; 7 | var remaining = 2; 8 | this.servers = {}; 9 | this.servers['Core'] = new plugin.servers['Core'](plugin); 10 | this.servers['Tile'] = new plugin.servers['Tile'](plugin); 11 | _(this.servers).each(function(server) { 12 | server.start(function() { 13 | remaining--; 14 | console.warn('Started %s.', Bones.utils.colorize(server, 'green')); 15 | server.emit('start'); 16 | if (!remaining) callback && callback(); 17 | }.bind(this)); 18 | }.bind(this)); 19 | }; 20 | -------------------------------------------------------------------------------- /commands/tile.bones: -------------------------------------------------------------------------------- 1 | var path = require('path'); 2 | var defaults = models.Config.defaults; 3 | 4 | command = Bones.Command.extend(); 5 | 6 | command.description = 'start tile server'; 7 | 8 | command.options['tilePort'] = { 9 | 'title': 'tilePort=[port]', 10 | 'description': 'Tile server port.', 11 | 'default': defaults.tilePort 12 | }; 13 | 14 | command.prototype.bootstrap = function(plugin, callback) { 15 | var settings = Bones.plugin.config; 16 | settings.files = path.resolve(settings.files.replace(/^~/, process.env.HOME)); 17 | process.title = 'tilemill-tile'; 18 | callback(); 19 | }; 20 | 21 | command.prototype.initialize = function(plugin, callback) { 22 | this.servers = {}; 23 | this.servers['Tile'] = new plugin.servers['Tile'](plugin); 24 | this.servers['Tile'].start(function() { 25 | console.warn('Started %s.', Bones.utils.colorize(this, 'green')); 26 | this.emit('start'); 27 | callback && callback(); 28 | }); 29 | }; 30 | -------------------------------------------------------------------------------- /configure.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | var cp = require('child_process'); 4 | 5 | var prefix = '[tilemill configure] '; 6 | 7 | function mapnik_config(callback) { 8 | cp.execFile('mapnik-config', ['--version'], function(err, stdout, stderr) { 9 | if (err || stderr) { 10 | return callback(err || new Error(stderr.trim())); 11 | } else { 12 | return callback(null,stdout.trim()); 13 | } 14 | }); 15 | } 16 | 17 | function protobuf_config(callback) { 18 | if (process.platform === 'win32') { 19 | return callback(null,'skipped protobuf check'); 20 | } else { 21 | cp.execFile('pkg-config', ['protobuf','--version'], function(err, stdout, stderr) { 22 | if (err || stderr) { 23 | return callback(err || new Error(stderr.trim())); 24 | } else { 25 | return callback(null,stdout.trim()); 26 | } 27 | }); 28 | } 29 | } 30 | 31 | mapnik_config(function(err,result) { 32 | console.log(prefix + 'Using node v'+ process.versions.node); 33 | if(err) { 34 | console.error(prefix + 'Could not configure TileMill because the "mapnik-config" program was not found (' + err.message + ')'); 35 | process.exit(1); 36 | } else { 37 | console.log(prefix + 'Successfully found mapnik version v'+result + ' (via mapnik-config)'); 38 | protobuf_config(function(err,result) { 39 | if (err) { 40 | console.error(prefix + 'Could not configure TileMill because "pkg-config protobuf --version" returned an error (' + err.message + ')'); 41 | } else { 42 | console.log(prefix + 'Found libprotobuf v'+result) 43 | process.exit(0); 44 | } 45 | }); 46 | } 47 | }); 48 | -------------------------------------------------------------------------------- /data/82945364-10m-admin-0-countries/82945364-10m-admin-0-countries.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/data/82945364-10m-admin-0-countries/82945364-10m-admin-0-countries.zip -------------------------------------------------------------------------------- /examples/control-room/.thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/control-room/.thumb.png -------------------------------------------------------------------------------- /examples/control-room/style.mss: -------------------------------------------------------------------------------- 1 | /********************************************************** 2 | * Control Room 3 | **********************************************************/ 4 | 5 | @base: #001420; 6 | 7 | Map { background-color:@base; } 8 | 9 | .water-poly { polygon-fill:@base; } 10 | 11 | #land::glow-inner[zoom>0] { 12 | line-color:#225160; 13 | line-width:1.2; 14 | line-join:round; 15 | line-opacity:0.4; 16 | } 17 | #land::glow-innermiddle[zoom>1] { 18 | line-color:#225160; 19 | line-width:2.5; 20 | line-join:round; 21 | line-opacity:0.2; 22 | } 23 | #land::glow-outermiddle[zoom>2] { 24 | line-color:#225160; 25 | line-width:5; 26 | line-join:round; 27 | line-opacity:0.1; 28 | } 29 | #land::glow-outer[zoom>3] { 30 | line-color:#225160; 31 | line-width:5; 32 | line-join:round; 33 | line-opacity:0.05; 34 | } 35 | 36 | #land[zoom>=0] { 37 | polygon-fill:#0A202A; 38 | polygon-gamma:0.7; 39 | } 40 | 41 | 42 | 43 | #international_boundaries[zoom>1] { 44 | line-color:#0AF; 45 | line-dasharray:1,1; 46 | line-width:0.5; 47 | [zoom=4] { line-width:0.6; } 48 | [zoom=5] { line-width:0.8; } 49 | [zoom=6] { line-width:1; } 50 | [zoom=7] { line-width:1.2; } 51 | [zoom=8] { line-width:1.4; } 52 | [zoom>8] { line-width:1.6; } 53 | } 54 | 55 | #subnational_boundaries[COUNTRYNAM='US'][zoom=4], 56 | #subnational_boundaries[COUNTRYNAM='Canada'][zoom=4], 57 | #subnational_boundaries[COUNTRYNAM='Australia'][zoom=4], 58 | #map-units[zoom>4], 59 | #subnational_boundaries[zoom>4] { 60 | line-color:#0AF; 61 | line-dasharray:4,2; 62 | line-opacity:0.2; 63 | line-width:0.4; 64 | [zoom=5] { line-width:0.5; } 65 | [zoom=6] { line-width:0.6; } 66 | [zoom=7] { line-width:0.8; } 67 | [zoom=8] { line-width:1.0; } 68 | [zoom>8] { line-width:1.2; } 69 | } 70 | 71 | #geo-lines[ScaleRank<10] { 72 | line-color:#B2A; 73 | line-dasharray:1,4; 74 | line-opacity:0.8; 75 | line-width:0.25; 76 | line-gamma:0.2; 77 | } 78 | 79 | #urban { 80 | polygon-fill:#9F6; 81 | polygon-opacity:0.66; 82 | line-color:#9F6; 83 | line-opacity:0.33; 84 | [zoom=3] { line-width:0.4; } 85 | [zoom=4] { line-width:0.6; } 86 | [zoom=5] { line-width:0.8; } 87 | [zoom=6] { line-width:1; } 88 | [zoom>6] { line-width:1.2; } 89 | } -------------------------------------------------------------------------------- /examples/geography-class/.thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/.thumb.png -------------------------------------------------------------------------------- /examples/geography-class/flags/ABW.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/ABW.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/AFG.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/AFG.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/AGO.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/AGO.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/AIA.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/AIA.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/ALB.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/ALB.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/ALD.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/ALD.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/AND.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/AND.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/ARE.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/ARE.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/ARG.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/ARG.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/ARM.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/ARM.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/ASM.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/ASM.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/ATA.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/ATA.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/ATC.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/ATC.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/ATF.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/ATF.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/ATG.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/ATG.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/AUS.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/AUS.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/AUT.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/AUT.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/AZE.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/AZE.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/BDI.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/BDI.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/BEL.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/BEL.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/BEN.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/BEN.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/BFA.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/BFA.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/BGD.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/BGD.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/BGR.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/BGR.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/BHR.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/BHR.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/BHS.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/BHS.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/BIH.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/BIH.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/BLM.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/BLM.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/BLR.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/BLR.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/BLZ.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/BLZ.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/BMU.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/BMU.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/BOL.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/BOL.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/BRA.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/BRA.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/BRB.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/BRB.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/BRN.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/BRN.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/BTN.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/BTN.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/BWA.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/BWA.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/CAF.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/CAF.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/CAN.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/CAN.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/CHE.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/CHE.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/CHL.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/CHL.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/CHN.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/CHN.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/CIV.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/CIV.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/CLP.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/CLP.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/CMR.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/CMR.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/CNM.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/CNM.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/COD.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/COD.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/COG.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/COG.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/COK.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/COK.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/COL.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/COL.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/COM.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/COM.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/CPV.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/CPV.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/CRI.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/CRI.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/CSI.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/CSI.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/CUB.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/CUB.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/CUW.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/CUW.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/CYM.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/CYM.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/CYN.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/CYN.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/CYP.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/CYP.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/CZE.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/CZE.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/DEU.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/DEU.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/DJI.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/DJI.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/DMA.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/DMA.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/DNK.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/DNK.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/DOM.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/DOM.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/DZA.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/DZA.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/ECU.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/ECU.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/EGY.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/EGY.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/ERI.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/ERI.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/ESB.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/ESB.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/ESP.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/ESP.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/EST.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/EST.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/ETH.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/ETH.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/FIN.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/FIN.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/FJI.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/FJI.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/FLK.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/FLK.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/FRA.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/FRA.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/FRO.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/FRO.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/FSM.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/FSM.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/GAB.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/GAB.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/GAZ.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/GAZ.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/GBR.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/GBR.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/GEO.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/GEO.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/GGY.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/GGY.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/GHA.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/GHA.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/GIB.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/GIB.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/GIN.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/GIN.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/GMB.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/GMB.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/GNB.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/GNB.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/GNQ.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/GNQ.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/GRC.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/GRC.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/GRD.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/GRD.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/GRL.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/GRL.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/GTM.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/GTM.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/GUM.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/GUM.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/GUY.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/GUY.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/HKG.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/HKG.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/HMD.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/HMD.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/HND.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/HND.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/HRV.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/HRV.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/HTI.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/HTI.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/HUN.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/HUN.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/IDN.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/IDN.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/IMN.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/IMN.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/IND.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/IND.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/IOA.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/IOA.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/IOT.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/IOT.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/IRL.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/IRL.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/IRN.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/IRN.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/IRQ.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/IRQ.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/ISL.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/ISL.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/ISR.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/ISR.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/ITA.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/ITA.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/JAM.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/JAM.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/JEY.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/JEY.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/JOR.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/JOR.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/JPN.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/JPN.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/KAB.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/KAB.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/KAS.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/KAS.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/KAZ.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/KAZ.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/KEN.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/KEN.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/KGZ.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/KGZ.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/KHM.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/KHM.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/KIR.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/KIR.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/KNA.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/KNA.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/KNM.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/KNM.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/KOR.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/KOR.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/KOS.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/KOS.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/KWT.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/KWT.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/LAO.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/LAO.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/LBN.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/LBN.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/LBR.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/LBR.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/LBY.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/LBY.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/LCA.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/LCA.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/LIE.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/LIE.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/LKA.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/LKA.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/LSO.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/LSO.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/LTU.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/LTU.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/LUX.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/LUX.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/LVA.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/LVA.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/MAC.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/MAC.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/MAF.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/MAF.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/MAR.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/MAR.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/MCO.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/MCO.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/MDA.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/MDA.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/MDG.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/MDG.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/MDV.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/MDV.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/MEX.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/MEX.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/MHL.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/MHL.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/MKD.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/MKD.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/MLI.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/MLI.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/MLT.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/MLT.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/MMR.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/MMR.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/MNE.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/MNE.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/MNG.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/MNG.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/MNP.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/MNP.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/MOZ.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/MOZ.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/MRT.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/MRT.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/MSR.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/MSR.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/MUS.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/MUS.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/MWI.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/MWI.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/MYS.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/MYS.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/NAM.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/NAM.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/NCL.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/NCL.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/NER.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/NER.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/NFK.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/NFK.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/NGA.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/NGA.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/NIC.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/NIC.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/NIU.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/NIU.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/NLD.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/NLD.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/NOR.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/NOR.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/NPL.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/NPL.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/NRU.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/NRU.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/NZL.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/NZL.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/OMN.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/OMN.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/PAK.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/PAK.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/PAN.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/PAN.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/PCN.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/PCN.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/PER.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/PER.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/PHL.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/PHL.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/PLW.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/PLW.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/PNG.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/PNG.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/POL.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/POL.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/PRI.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/PRI.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/PRK.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/PRK.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/PRT.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/PRT.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/PRY.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/PRY.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/PYF.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/PYF.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/QAT.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/QAT.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/ROU.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/ROU.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/RUS.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/RUS.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/RWA.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/RWA.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/SAH.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/SAH.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/SAU.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/SAU.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/SDN.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/SDN.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/SDS.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/SDS.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/SEN.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/SEN.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/SGP.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/SGP.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/SGS.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/SGS.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/SHN.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/SHN.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/SLB.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/SLB.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/SLE.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/SLE.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/SLV.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/SLV.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/SMR.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/SMR.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/SOL.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/SOL.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/SOM.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/SOM.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/SPM.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/SPM.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/SRB.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/SRB.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/STP.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/STP.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/SUR.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/SUR.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/SVK.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/SVK.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/SVN.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/SVN.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/SWE.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/SWE.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/SWZ.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/SWZ.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/SXM.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/SXM.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/SYC.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/SYC.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/SYR.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/SYR.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/TCA.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/TCA.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/TCD.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/TCD.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/TGO.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/TGO.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/THA.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/THA.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/TJK.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/TJK.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/TKM.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/TKM.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/TLS.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/TLS.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/TON.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/TON.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/TTO.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/TTO.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/TUN.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/TUN.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/TUR.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/TUR.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/TUV.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/TUV.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/TWN.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/TWN.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/TZA.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/TZA.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/UGA.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/UGA.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/UKR.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/UKR.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/UMI.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/UMI.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/URY.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/URY.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/USA.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/USA.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/USG.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/USG.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/UZB.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/UZB.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/VAT.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/VAT.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/VCT.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/VCT.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/VEN.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/VEN.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/VGB.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/VGB.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/VIR.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/VIR.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/VNM.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/VNM.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/VUT.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/VUT.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/WEB.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/WEB.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/WLF.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/WLF.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/WSB.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/WSB.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/WSM.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/WSM.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/YEM.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/YEM.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/ZAF.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/ZAF.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/ZMB.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/ZMB.svgz -------------------------------------------------------------------------------- /examples/geography-class/flags/ZWE.svgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/flags/ZWE.svgz -------------------------------------------------------------------------------- /examples/geography-class/icons/circle-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/icons/circle-7.png -------------------------------------------------------------------------------- /examples/geography-class/icons/star-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/icons/star-10.png -------------------------------------------------------------------------------- /examples/geography-class/insert_flags.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e -u 3 | 4 | # Requirements: 5 | # - MillPrep: https://github.com/mapbox/millprep 6 | # - ImageMagick 7 | # - OptiPNG 8 | # - base64 9 | 10 | # To create the countries-interaction layer: 11 | # Get a copy of the 1:50M scale Natural Earth admin 0 countries file and run 12 | # `millprep.py --sqlite ne_50m_admin_0_countries.shp` 13 | 14 | db="layers/ne_50m_admin_0_countries_millready.sqlite" 15 | table="ne_50m_admin_0_countries" 16 | 17 | echo "Converting SVGs to PNGs... " 18 | mogrify -resize 100x100 -colors 64 -format png flags/*.svg 19 | 20 | echo "Optimizing PNGs... " 21 | optipng -quiet flags/*.png 22 | 23 | echo "Updating SQLite table with base64-encoded flag data... " 24 | 25 | sqlite3 $db "PRAGMA table_info(ne_50m_admin_0_countries);" \ 26 | | grep -i 'flag_png|text' > /dev/null \ 27 | || sqlite3 $db "ALTER TABLE $table ADD COLUMN flag_png text;" 28 | 29 | for flagpng in flags/*.png; do 30 | adm0_a3="$(basename $flagpng .png)" 31 | flagdata="$(base64 -w0 $flagpng)" 32 | sqlite3 $db "UPDATE $table SET flag_png = '$flagdata' WHERE adm0_a3 = '$adm0_a3';" 33 | done 34 | 35 | echo "Done." 36 | -------------------------------------------------------------------------------- /examples/geography-class/layers/world_extent_wgs84.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "type": "FeatureCollection", 3 | "features": [ 4 | 5 | { "type": "Feature", 6 | "properties": { "FID": 0.000000 }, 7 | "geometry": 8 | { "type": "Polygon", 9 | "coordinates": [ [ 10 | [ -180.0, -85.051129 ], 11 | [ -180.0, 85.051129 ], 12 | [ 180.0, 85.051129 ], 13 | [ 180.0, -85.051129 ], 14 | [ -180.0, -85.051129 ] 15 | ] ] 16 | } 17 | } 18 | 19 | ] 20 | } 21 | -------------------------------------------------------------------------------- /examples/geography-class/textures/paperfolds_256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/textures/paperfolds_256.png -------------------------------------------------------------------------------- /examples/geography-class/textures/paperfolds_512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/geography-class/textures/paperfolds_512.png -------------------------------------------------------------------------------- /examples/open-streets-dc/.thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/open-streets-dc/.thumb.png -------------------------------------------------------------------------------- /examples/open-streets-dc/images/water.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/open-streets-dc/images/water.png -------------------------------------------------------------------------------- /examples/open-streets-dc/images/wood.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/open-streets-dc/images/wood.png -------------------------------------------------------------------------------- /examples/open-streets-dc/layers/dc-coastline.dbf: -------------------------------------------------------------------------------- 1 | _A WFIDN 9713 9790 -------------------------------------------------------------------------------- /examples/open-streets-dc/layers/dc-coastline.prj: -------------------------------------------------------------------------------- 1 | PROJCS["Popular_Visualisation_CRS_Mercator_deprecated",GEOGCS["GCS_Popular Visualisation CRS",DATUM["D_Popular_Visualisation_Datum",SPHEROID["Popular_Visualisation_Sphere",6378137,0]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Mercator"],PARAMETER["central_meridian",0],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["Meter",1],PARAMETER["standard_parallel_1",0.0]] -------------------------------------------------------------------------------- /examples/open-streets-dc/layers/dc-coastline.shp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/open-streets-dc/layers/dc-coastline.shp -------------------------------------------------------------------------------- /examples/open-streets-dc/layers/dc-coastline.shx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/open-streets-dc/layers/dc-coastline.shx -------------------------------------------------------------------------------- /examples/open-streets-dc/layers/dcgis_water/WaterPly_900913.dbf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/open-streets-dc/layers/dcgis_water/WaterPly_900913.dbf -------------------------------------------------------------------------------- /examples/open-streets-dc/layers/dcgis_water/WaterPly_900913.index: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/open-streets-dc/layers/dcgis_water/WaterPly_900913.index -------------------------------------------------------------------------------- /examples/open-streets-dc/layers/dcgis_water/WaterPly_900913.prj: -------------------------------------------------------------------------------- 1 | PROJCS["Google_Maps_Global_Mercator",GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Mercator_2SP"],PARAMETER["standard_parallel_1",0],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",0],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["Meter",1]] -------------------------------------------------------------------------------- /examples/open-streets-dc/layers/dcgis_water/WaterPly_900913.shp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/open-streets-dc/layers/dcgis_water/WaterPly_900913.shp -------------------------------------------------------------------------------- /examples/open-streets-dc/layers/dcgis_water/WaterPly_900913.shx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/open-streets-dc/layers/dcgis_water/WaterPly_900913.shx -------------------------------------------------------------------------------- /examples/open-streets-dc/layers/osm-landusages.dbf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/open-streets-dc/layers/osm-landusages.dbf -------------------------------------------------------------------------------- /examples/open-streets-dc/layers/osm-landusages.prj: -------------------------------------------------------------------------------- 1 | PROJCS["Popular_Visualisation_CRS_Mercator_deprecated",GEOGCS["GCS_Popular Visualisation CRS",DATUM["D_Popular_Visualisation_Datum",SPHEROID["Popular_Visualisation_Sphere",6378137,0]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Mercator"],PARAMETER["central_meridian",0],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["Meter",1],PARAMETER["standard_parallel_1",0.0]] -------------------------------------------------------------------------------- /examples/open-streets-dc/layers/osm-landusages.shp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/open-streets-dc/layers/osm-landusages.shp -------------------------------------------------------------------------------- /examples/open-streets-dc/layers/osm-landusages.shx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/open-streets-dc/layers/osm-landusages.shx -------------------------------------------------------------------------------- /examples/open-streets-dc/layers/osm-mainroads.dbf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/open-streets-dc/layers/osm-mainroads.dbf -------------------------------------------------------------------------------- /examples/open-streets-dc/layers/osm-mainroads.prj: -------------------------------------------------------------------------------- 1 | PROJCS["Popular_Visualisation_CRS_Mercator_deprecated",GEOGCS["GCS_Popular Visualisation CRS",DATUM["D_Popular_Visualisation_Datum",SPHEROID["Popular_Visualisation_Sphere",6378137,0]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Mercator"],PARAMETER["central_meridian",0],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["Meter",1],PARAMETER["standard_parallel_1",0.0]] -------------------------------------------------------------------------------- /examples/open-streets-dc/layers/osm-mainroads.shp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/open-streets-dc/layers/osm-mainroads.shp -------------------------------------------------------------------------------- /examples/open-streets-dc/layers/osm-mainroads.shx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/open-streets-dc/layers/osm-mainroads.shx -------------------------------------------------------------------------------- /examples/open-streets-dc/layers/osm-motorways.dbf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/open-streets-dc/layers/osm-motorways.dbf -------------------------------------------------------------------------------- /examples/open-streets-dc/layers/osm-motorways.prj: -------------------------------------------------------------------------------- 1 | PROJCS["Popular_Visualisation_CRS_Mercator_deprecated",GEOGCS["GCS_Popular Visualisation CRS",DATUM["D_Popular_Visualisation_Datum",SPHEROID["Popular_Visualisation_Sphere",6378137,0]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Mercator"],PARAMETER["central_meridian",0],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["Meter",1],PARAMETER["standard_parallel_1",0.0]] -------------------------------------------------------------------------------- /examples/open-streets-dc/layers/osm-motorways.shp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/open-streets-dc/layers/osm-motorways.shp -------------------------------------------------------------------------------- /examples/open-streets-dc/layers/osm-motorways.shx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/open-streets-dc/layers/osm-motorways.shx -------------------------------------------------------------------------------- /examples/open-streets-dc/layers/osm-places.dbf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/open-streets-dc/layers/osm-places.dbf -------------------------------------------------------------------------------- /examples/open-streets-dc/layers/osm-places.prj: -------------------------------------------------------------------------------- 1 | PROJCS["Popular_Visualisation_CRS_Mercator_deprecated",GEOGCS["GCS_Popular Visualisation CRS",DATUM["D_Popular_Visualisation_Datum",SPHEROID["Popular_Visualisation_Sphere",6378137,0]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Mercator"],PARAMETER["central_meridian",0],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["Meter",1],PARAMETER["standard_parallel_1",0.0]] -------------------------------------------------------------------------------- /examples/open-streets-dc/layers/osm-places.shp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/open-streets-dc/layers/osm-places.shp -------------------------------------------------------------------------------- /examples/open-streets-dc/layers/osm-places.shx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/open-streets-dc/layers/osm-places.shx -------------------------------------------------------------------------------- /examples/open-streets-dc/layers/osm-roads.dbf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/open-streets-dc/layers/osm-roads.dbf -------------------------------------------------------------------------------- /examples/open-streets-dc/layers/osm-roads.prj: -------------------------------------------------------------------------------- 1 | PROJCS["Popular_Visualisation_CRS_Mercator_deprecated",GEOGCS["GCS_Popular Visualisation CRS",DATUM["D_Popular_Visualisation_Datum",SPHEROID["Popular_Visualisation_Sphere",6378137,0]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Mercator"],PARAMETER["central_meridian",0],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["Meter",1],PARAMETER["standard_parallel_1",0.0]] -------------------------------------------------------------------------------- /examples/open-streets-dc/layers/osm-roads.shp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/open-streets-dc/layers/osm-roads.shp -------------------------------------------------------------------------------- /examples/open-streets-dc/layers/osm-roads.shx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/open-streets-dc/layers/osm-roads.shx -------------------------------------------------------------------------------- /examples/open-streets-dc/layers/osm-waterareas.dbf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/open-streets-dc/layers/osm-waterareas.dbf -------------------------------------------------------------------------------- /examples/open-streets-dc/layers/osm-waterareas.prj: -------------------------------------------------------------------------------- 1 | PROJCS["Popular_Visualisation_CRS_Mercator_deprecated",GEOGCS["GCS_Popular Visualisation CRS",DATUM["D_Popular_Visualisation_Datum",SPHEROID["Popular_Visualisation_Sphere",6378137,0]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Mercator"],PARAMETER["central_meridian",0],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["Meter",1],PARAMETER["standard_parallel_1",0.0]] -------------------------------------------------------------------------------- /examples/open-streets-dc/layers/osm-waterareas.shp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/open-streets-dc/layers/osm-waterareas.shp -------------------------------------------------------------------------------- /examples/open-streets-dc/layers/osm-waterareas.shx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/open-streets-dc/layers/osm-waterareas.shx -------------------------------------------------------------------------------- /examples/open-streets-dc/style.mss: -------------------------------------------------------------------------------- 1 | /********************************************************** 2 | 3 | Open Streets, DC 4 | ================ 5 | 6 | *An example of street-level map design.* 7 | 8 | Data used by this map is © OpenStreetMap contributors and 9 | distributed under the terms of the Open Database License. 10 | See for details. 11 | 12 | Pattern images derived from designs by Subtle Patterns and 13 | licensed CC-BY-SA. See for details. 14 | 15 | The shapefiles used in this project are based on those 16 | provided by Mike Migurski at . 17 | You can swap out the DC data for any other city there by 18 | downloading the Imposm shapefile package. 19 | 20 | ***********************************************************/ 21 | 22 | /* ---- PALETTE ---- */ 23 | 24 | @water:#c0d8ff; 25 | @park:#cea; 26 | @land:#f5fdf0; 27 | @school:#f8e8c8; 28 | 29 | Map { 30 | background-color:@land; 31 | } 32 | 33 | #water, 34 | #ocean { 35 | polygon-fill:@water; 36 | polygon-gamma:0.5; // reduces gaps between shapes 37 | polygon-pattern-file:url(images/water.png); 38 | polygon-pattern-comp-op:color-burn; 39 | polygon-pattern-alignment:global; // keeps it seamless 40 | } 41 | 42 | #landusages[zoom>6] { 43 | [type='forest'], 44 | [type='wood'] { 45 | polygon-fill:@park; 46 | polygon-pattern-file:url(images/wood.png); 47 | polygon-pattern-comp-op:multiply; 48 | } 49 | [type='cemetery'], 50 | [type='common'], 51 | [type='golf_course'], 52 | [type='park'], 53 | [type='pitch'], 54 | [type='recreation_ground'], 55 | [type='village_green'] { 56 | polygon-fill:@park; 57 | } 58 | } 59 | 60 | #landusages[zoom>=12] { 61 | [type='school'], 62 | [type='college'], 63 | [type='university'] { 64 | polygon-fill: @school; 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /examples/road-trip/.thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/examples/road-trip/.thumb.png -------------------------------------------------------------------------------- /examples/road-trip/labels.mss: -------------------------------------------------------------------------------- 1 | @serif:"Times New Roman Regular","FreeSerif Medium","DejaVu Serif Book"; 2 | @serif_italic:"Times New Roman Italic","FreeSerif Italic","DejaVu Serif Italic"; 3 | @sans:"Arial Regular","Liberation Sans Regular","DejaVu Sans Book"; 4 | @sans-bold:"Arial Bold","Liberation Sans Bold","DejaVu Sans Bold"; 5 | 6 | #country_label[zoom>2][zoom<6][ADM0_A3='CAN'], 7 | #country_label[zoom>2][zoom<6][ADM0_A3='USA'], 8 | #country_label[zoom>2][zoom<6][ADM0_A3='MEX'] { 9 | text-name:"[NAME]"; 10 | text-face-name:@serif; 11 | text-transform:uppercase; 12 | text-character-spacing:1; 13 | text-line-spacing:4; 14 | text-size:14; 15 | text-wrap-width:120; 16 | text-allow-overlap:true; 17 | text-halo-radius:2; 18 | text-halo-fill:rgba(255,255,255,0.75); 19 | } 20 | 21 | #city[SOV_A3='USA'][SCALERANK<4][zoom>2], 22 | #city[SOV_A3='USA'][SCALERANK=4][zoom>3], 23 | #city[SOV_A3='USA'][SCALERANK=5][zoom>4], 24 | #city[SOV_A3='USA'][SCALERANK>=6][zoom>5] { 25 | text-name:"[NAME]"; 26 | text-face-name:@sans-bold; 27 | text-size:9; 28 | text-halo-radius:1; 29 | text-halo-fill:rgba(255,255,255,0.75); 30 | } 31 | 32 | #park_label[zoom>5] { 33 | text-name:"[Unit_Name]"; 34 | text-face-name:@serif_italic; 35 | text-fill:#063; 36 | text-size:11; 37 | text-halo-radius:1; 38 | text-halo-fill:rgba(255,255,255,0.75); 39 | text-wrap-width:30; 40 | text-line-spacing:2; 41 | } 42 | 43 | #geo-region { 44 | text-name:"[Name]"; 45 | text-face-name:@serif_italic; 46 | text-fill:#036; 47 | text-size:11; 48 | text-halo-radius:1; 49 | text-halo-fill:rgba(255,255,255,0.75); 50 | text-wrap-width:30; 51 | text-line-spacing:2; 52 | } 53 | -------------------------------------------------------------------------------- /examples/road-trip/roads.mss: -------------------------------------------------------------------------------- 1 | #road::l[Type='Major Highway'][zoom>2], 2 | #road::l[Type='Secondary Highway'][zoom>2] { 3 | line-color:#C33; 4 | } 5 | /*#road[SOV_A3='USA'][Type='Major Highway'][zoom>1], 6 | #road[SOV_A3='USA'][Type='Secondary Highway'][zoom>1] { 7 | line-color:#F00; 8 | }*/ 9 | 10 | /* Roads - Z3 */ 11 | #road::l[Type='Major Highway'][zoom=3] { line-width:0.5; } 12 | #road::l[Type='Secondary Highway'][zoom=3] { line-width:0.2; } 13 | /* Roads - Z4 */ 14 | #road::l[Type='Major Highway'][zoom=4] { line-width:0.6; } 15 | #road::l[Type='Secondary Highway'][zoom=4] { line-width:0.3; } 16 | /* Roads - Z5 */ 17 | #road::l[Type='Major Highway'][zoom=5] { line-width:1.2; } 18 | #road::l[Type='Secondary Highway'][zoom=5] { line-width:0.6; } 19 | /* Roads - Z6 */ 20 | #road::l[Type='Major Highway'][zoom=6] { line-width:2; } 21 | #road::l[Type='Secondary Highway'][zoom=6] { line-width:0.8; } 22 | /* Roads - Z7 */ 23 | #road::l[Type='Major Highway'][zoom=7] { line-width:2.6; } 24 | #road::l[Type='Secondary Highway'][zoom=7] { line-width:1.3; } 25 | 26 | #road_na[zoom>5][TYPE='Primary'] { 27 | line-color:#E63; 28 | line-width:0.8; 29 | } 30 | 31 | /* Railroads */ 32 | #rail[zoom>4] { 33 | line-color:#999; 34 | line-width:0.6; 35 | } -------------------------------------------------------------------------------- /examples/road-trip/style.mss: -------------------------------------------------------------------------------- 1 | /*********************************************************************** 2 | 3 | 'Road Trip' 4 | =========== 5 | 6 | A map of the United States inspired by the impossible-to-fold maps in 7 | your glovebox. 8 | 9 | ***********************************************************************/ 10 | 11 | @land: #fff1cf; 12 | @water: #C0E0F8; 13 | @waterline: #8CE; 14 | 15 | Map { 16 | background-color:@water; 17 | } 18 | 19 | #countries::outline { 20 | line-color:@waterline; 21 | line-width:1.6; 22 | } 23 | #countries::fill { 24 | polygon-fill:@land; 25 | polygon-gamma:0.75; 26 | [ADM0_A3='USA'] { polygon-fill:lighten(@land, 7); } 27 | } 28 | 29 | #lake[zoom>=0][ScaleRank<=2], 30 | #lake[zoom>=1][ScaleRank=3], 31 | #lake[zoom>=2][ScaleRank=4], 32 | #lake[zoom>=3][ScaleRank=5], 33 | #lake[zoom>=4][ScaleRank=6], 34 | #lake[zoom>=5][ScaleRank=7], 35 | #lake[zoom>=6][ScaleRank=8], 36 | #lake[zoom>=7][ScaleRank=9] { 37 | ::outline { line-color:@waterline; } 38 | ::fill { polygon-fill:@water; } 39 | } 40 | 41 | .park { line-color:#AD9; } 42 | .park.area { polygon-fill:#DEB; } 43 | 44 | #country_border::glow[zoom>2] { 45 | line-color:#F60; 46 | line-opacity:0.33; 47 | line-width:4; 48 | } 49 | 50 | #country_border { line-color:#408; } 51 | #country_border[zoom<3] { line-width:0.4; } 52 | #country_border[zoom=3] { line-width:0.6; } 53 | #country_border[zoom=4] { line-width:0.8; } 54 | #country_border[zoom=5] { line-width:1.0; } 55 | 56 | #country_border_marine { 57 | line-color:#A06; 58 | line-dasharray:8,2; 59 | line-opacity:0.3; 60 | line-width:0.8; 61 | } 62 | 63 | #state_line::glow[ADM0_A3='USA'], 64 | #state_line::glow[ADM0_A3='CAN'] { 65 | [zoom>2] { 66 | line-color:#FD0; 67 | line-opacity:0.2; 68 | line-width:3; 69 | } 70 | } 71 | #state_line[ADM0_A3='USA'], 72 | #state_line[ADM0_A3='CAN'] { 73 | [zoom>2] { 74 | line-dasharray:2,2,10,2; 75 | line-width:0.6; 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /fonts/DejaVuSans-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/fonts/DejaVuSans-Bold.ttf -------------------------------------------------------------------------------- /fonts/DejaVuSans-BoldOblique.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/fonts/DejaVuSans-BoldOblique.ttf -------------------------------------------------------------------------------- /fonts/DejaVuSans-ExtraLight.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/fonts/DejaVuSans-ExtraLight.ttf -------------------------------------------------------------------------------- /fonts/DejaVuSans-Oblique.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/fonts/DejaVuSans-Oblique.ttf -------------------------------------------------------------------------------- /fonts/DejaVuSans.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/fonts/DejaVuSans.ttf -------------------------------------------------------------------------------- /fonts/DejaVuSansCondensed-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/fonts/DejaVuSansCondensed-Bold.ttf -------------------------------------------------------------------------------- /fonts/DejaVuSansCondensed-BoldOblique.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/fonts/DejaVuSansCondensed-BoldOblique.ttf -------------------------------------------------------------------------------- /fonts/DejaVuSansCondensed-Oblique.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/fonts/DejaVuSansCondensed-Oblique.ttf -------------------------------------------------------------------------------- /fonts/DejaVuSansCondensed.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/fonts/DejaVuSansCondensed.ttf -------------------------------------------------------------------------------- /fonts/DejaVuSansMono-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/fonts/DejaVuSansMono-Bold.ttf -------------------------------------------------------------------------------- /fonts/DejaVuSansMono-BoldOblique.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/fonts/DejaVuSansMono-BoldOblique.ttf -------------------------------------------------------------------------------- /fonts/DejaVuSansMono-Oblique.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/fonts/DejaVuSansMono-Oblique.ttf -------------------------------------------------------------------------------- /fonts/DejaVuSansMono.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/fonts/DejaVuSansMono.ttf -------------------------------------------------------------------------------- /fonts/DejaVuSerif-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/fonts/DejaVuSerif-Bold.ttf -------------------------------------------------------------------------------- /fonts/DejaVuSerif-BoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/fonts/DejaVuSerif-BoldItalic.ttf -------------------------------------------------------------------------------- /fonts/DejaVuSerif-Italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/fonts/DejaVuSerif-Italic.ttf -------------------------------------------------------------------------------- /fonts/DejaVuSerif.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/fonts/DejaVuSerif.ttf -------------------------------------------------------------------------------- /fonts/DejaVuSerifCondensed-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/fonts/DejaVuSerifCondensed-Bold.ttf -------------------------------------------------------------------------------- /fonts/DejaVuSerifCondensed-BoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/fonts/DejaVuSerifCondensed-BoldItalic.ttf -------------------------------------------------------------------------------- /fonts/DejaVuSerifCondensed-Italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/fonts/DejaVuSerifCondensed-Italic.ttf -------------------------------------------------------------------------------- /fonts/DejaVuSerifCondensed.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/fonts/DejaVuSerifCondensed.ttf -------------------------------------------------------------------------------- /fonts/unifont-7.0.05.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/fonts/unifont-7.0.05.ttf -------------------------------------------------------------------------------- /fonts/unifont_license.txt: -------------------------------------------------------------------------------- 1 | Unifoundry.com exists to help get Unicode fonts and utilities into the hands of those who need them. 2 | 3 | My first endeavor was to create several utilities for the free GNU Unifont bitmap font of Roman Czyborra. As of 20 June 2008 (by coincidence the Summer Solstice), the GNU Unifont has a glyph for every printable code point in the Unicode Basic Multilingual Plane (BMP). The BMP is the first Unicode "plane" of 65,536 code points, and includes character encoding for most of the world's modern scripts. Roman Czyborra began this effort 10 years ago. 4 | 5 | The "unifont" font has undergone further refinement and correction since then. Please replace all previous versions with the 2008-08-20 release. 6 | 7 | Two utilities convert any 256-code point block of Unifont glyphs to and from Windows Bitmap and Wireless Bitmap files, with code points displayed in a labeled 16 by 16 grid. These blocks aren't restricted to the BMP, though the GNU Unifont only supports the BMP. The software was developed using the cygwin package in a Microsoft Windows XP environment, but should compile on just about any platform that has a C compiler, especially on Unix/Linux systems. 8 | 9 | By converting GNU Unifont's .hex encoding into bitmaps, these utilities allow glyphs to be viewed and edited in their correct aspect ratio with a graphics editor. Hopefully this will make adding new glyphs to the GNU Unifont easier. 10 | 11 | My software and is released under the terms of the GNU General Public License (GNU GPL) version 2.0, or (at your option) a later version. The precompiled fonts are released under the terms of the GNU GPL version 2, with the exception that embedding the font in a document does not in itself bind that document to the terms of the GPL. 12 | 13 | If you have any questions, please email unifoundry at this domain name (not spelled out because of spammers). 14 | 15 | — Paul Hardy, GPG Key ID E6E6E390 -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | // increase the libuv threadpool size to 1.5x the number of logical CPUs. 4 | process.env.UV_THREADPOOL_SIZE = Math.ceil(Math.max(4, require('os').cpus().length * 1.5)); 5 | process.env.OPENFILEGDB_IN_MEMORY_SPI = "OFF"; 6 | var path = require('path'); 7 | process.env.MAPNIK_FONT_PATH = path.join(__dirname,'fonts'); 8 | 9 | var fs = require('fs'); 10 | // node v6 -> v8 compatibility 11 | var existsSync = require('fs').existsSync || require('path').existsSync; 12 | 13 | process.title = 'tilemill'; 14 | 15 | // This is necessary to make optimist not special-case into coffeescript as 16 | // certain node installs (e.g. ubuntu node ppa) do not use `node` as the binary 17 | // name. 18 | process.argv[0] = 'node'; 19 | 20 | if (process.platform === 'win32') { 21 | // HOME is undefined on windows 22 | process.env.HOME = process.env.USERPROFILE; 23 | // Add custom library paths to the PATH 24 | process.env.PATH = path.join(__dirname,"node_modules/mapnik/lib/binding/"); 25 | } 26 | 27 | // Default --config flag to user's home .tilemill.json config file. 28 | // @TODO find a more elegant way to set a default for this value 29 | // upstream in bones. 30 | var config = path.join(process.env.HOME, '.tilemill/config.json'); 31 | if (existsSync(config)) { 32 | var argv = require('optimist').argv; 33 | argv.config = argv.config || config; 34 | } 35 | 36 | require('tilelive-mapnik').registerProtocols(require('tilelive')); 37 | require('mbtiles').registerProtocols(require('tilelive')); 38 | 39 | require('bones').load(__dirname); 40 | !module.parent && require('bones').start(); 41 | -------------------------------------------------------------------------------- /lib/config.defaults.json: -------------------------------------------------------------------------------- 1 | { 2 | "port": 20009, 3 | "tilePort": 20008, 4 | "files": "~/Documents/MapBox", 5 | "examples": true, 6 | "sampledata": true, 7 | "host": false, 8 | "listenHost": "127.0.0.1", 9 | "server": true, 10 | "verbose": "on" 11 | } 12 | -------------------------------------------------------------------------------- /lib/crashutil.js: -------------------------------------------------------------------------------- 1 | var path = require('path'); 2 | var child = require('child_process'); 3 | var glob = require('glob'); 4 | var chrono = require('chrono'); 5 | 6 | var path_sep = process.platform === 'win32' ? '\\' : '/'; 7 | 8 | function display_crash_log(callback) { 9 | try { 10 | if (process.platform == 'darwin') { 11 | var now = new Date(); 12 | var crash_path = path.join(process.env.HOME, 'Library/Logs/DiagnosticReports'); 13 | var search = crash_path + '/node_' + now.format('Y-m-d') + '-*.crash'; 14 | var files = glob.sync(search); 15 | if (files.length > 0) { 16 | console.warn('[tilemill] found ' + files.length + ' crash logs for node'); 17 | // grab the latest 18 | var latest = files[files.length - 1]; 19 | return callback(null, latest); 20 | } else { 21 | console.log('[tilemill] no crash logs found'); 22 | return callback(null, null); 23 | } 24 | } else if (process.platform === 'win32') { 25 | var crash_path = path.join(process.env.HOMEPATH, 'AppData/Local/Microsoft/Windows/WER/ReportArchive/'); 26 | // normalize to unix paths to that glob works 27 | //crash_path = crash_path.replace(/\\/g, '/'); 28 | // use cwd to workaround abs path bug: https://github.com/isaacs/node-glob/issues/40 29 | var options = {cwd: crash_path}; 30 | var search = 'AppCrash_node.exe_*'; 31 | var files = glob.sync(search,options); 32 | if (files.length > 0) { 33 | console.warn('[tilemill] found ' + files.length + ' crash logs for node'); 34 | // grab the latest 35 | var latest = path.join(crash_path, files[files.length - 1]); 36 | return callback(null, latest); 37 | } else { 38 | console.log('[tilemill] no crash logs found'); 39 | return callback(null, null); 40 | } 41 | } else { 42 | return callback(null, null); 43 | } 44 | } catch (err) { 45 | return callback(err); 46 | } 47 | } 48 | 49 | module.exports = { 50 | display_crash_log: display_crash_log 51 | }; 52 | -------------------------------------------------------------------------------- /lib/create_files.js: -------------------------------------------------------------------------------- 1 | var existsSync = require('fs').existsSync || require('path').existsSync; 2 | var fsutil = require('./fsutil'); 3 | var path = require('path'); 4 | 5 | function init_dirs(dirs, settings) { 6 | if (!existsSync(settings.files)) { 7 | console.warn('Creating files dir %s', settings.files); 8 | if (process.platform === 'win32') { 9 | var match = settings.files.match(/^[a-zA-Z]:/); 10 | if (match) { 11 | throw new Error("Drive does not exist: " + match[0]); 12 | } 13 | } 14 | fsutil.mkdirpSync(settings.files, 0755); 15 | } 16 | dirs.forEach(function(key) { 17 | var dir = path.join(settings.files, key); 18 | if (!existsSync(dir)) { 19 | fsutil.mkdirpSync(dir, 0755); 20 | console.warn('Creating %s dir %s', key, dir); 21 | if (key === 'project' && settings.examples) { 22 | var examples = path.resolve(path.join(__dirname, '..', 'examples')); 23 | fsutil.cprSync(examples, dir); 24 | } else if (key === 'cache' && settings.sampledata) { 25 | var shapefile = '82945364-10m-admin-0-countries'; 26 | var data = path.resolve(path.join(__dirname, '..', 'data', shapefile)); 27 | fsutil.cprSync(data, path.resolve(path.join(dir, shapefile))); 28 | } 29 | } 30 | }); 31 | } 32 | 33 | module.exports = { 34 | init_dirs: init_dirs 35 | }; 36 | -------------------------------------------------------------------------------- /lib/gitutil.js: -------------------------------------------------------------------------------- 1 | var exec = require('child_process').exec; 2 | var fs = require('fs'); 3 | var package_json = require('../package.json'); 4 | 5 | var child = exec('git describe --tags --always', 6 | function(error, stdout, stderr) { 7 | if (error !== null) { 8 | console.log('exec error: ' + error); 9 | } else { 10 | var hash = stdout; 11 | if (hash[0] == 'v') { 12 | // git describe actually found a tag 13 | var version_file = hash + hash.slice(1, -10).replace('-', '.') + '\n'; 14 | fs.writeFileSync('VERSION', version_file); 15 | } else { 16 | // no tag found likely due to shallow clone (--depth=N) 17 | var version_file = 'v' + package_json.version + '-' + hash; 18 | fs.writeFileSync('VERSION', version_file); 19 | } 20 | } 21 | }); 22 | -------------------------------------------------------------------------------- /lib/queue.js: -------------------------------------------------------------------------------- 1 | var util = require('util'); 2 | var EventEmitter = require('events').EventEmitter; 3 | 4 | module.exports = Queue; 5 | function Queue(callback, concurrency, timeout) { 6 | this.callback = callback; 7 | this.concurrency = concurrency || 10; 8 | this.timeout = timeout || 0; 9 | this.add = this.add.bind(this); 10 | this.next = this.next.bind(this); 11 | this.invoke = this.invoke.bind(this); 12 | this.queue = []; 13 | this.running = 0; 14 | } 15 | util.inherits(Queue, EventEmitter); 16 | 17 | Queue.prototype.add = function(item) { 18 | this.queue.push(item); 19 | if (this.running < this.concurrency) { 20 | this.running++; 21 | this.next(); 22 | } 23 | }; 24 | 25 | Queue.prototype.invoke = function() { 26 | if (this.queue.length) { 27 | this.callback(this.queue.shift(), this.next); 28 | } else { 29 | this.next(); 30 | } 31 | }; 32 | 33 | Queue.prototype.next = function(err) { 34 | if (this.queue.length) { 35 | if (this.timeout) { 36 | setTimeout(this.invoke, this.timeout); 37 | } else { 38 | process.nextTick(this.invoke); 39 | } 40 | } else { 41 | this.running--; 42 | if (!this.running) { 43 | this.emit('empty'); 44 | } 45 | } 46 | }; 47 | -------------------------------------------------------------------------------- /lib/redirect.js: -------------------------------------------------------------------------------- 1 | function format(output) { 2 | var prefix = '[' + process.title + '] '; 3 | if (output[output.length - 1] === '\n') { 4 | output = output.substring(0, output.length - 1); 5 | } 6 | console.warn(prefix + output.split('\n').join('\n' + prefix)); 7 | } 8 | 9 | function onData(proc) { 10 | proc.stdout.setEncoding('utf8'); 11 | proc.stdout.on('data', format.bind(global)); 12 | proc.stderr.setEncoding('utf8'); 13 | proc.stderr.on('data', format.bind(global)); 14 | } 15 | 16 | module.exports = { 17 | onData: onData 18 | }; 19 | -------------------------------------------------------------------------------- /models/Config.bones: -------------------------------------------------------------------------------- 1 | // Config 2 | // ------ 3 | model = Backbone.Model.extend({}); 4 | 5 | model.prototype.schema = { 6 | 'id': 'Config', 7 | 'type': 'object', 8 | 'properties': { 9 | 'port': { 10 | 'type': 'integer' 11 | }, 12 | 'files': { 13 | 'type': 'string' 14 | }, 15 | 'httpProxy': { 16 | 'type': 'string' 17 | }, 18 | 'verbose': { 19 | 'type': 'string', 20 | 'enum': ['on', 'off'], 21 | } 22 | } 23 | }; 24 | 25 | model.prototype.initialize = function() { 26 | this.id = 'config'; 27 | }; 28 | 29 | model.prototype.url = function() { 30 | return '/api/Config/config'; 31 | }; 32 | -------------------------------------------------------------------------------- /models/Datasource.bones: -------------------------------------------------------------------------------- 1 | // Datasource (read-only) 2 | // ---------------------- 3 | // Model. Inspection metadata about a map layer. Use `fetchFeatures()` to do 4 | // a datasource fetch that includes layer feature objects. 5 | model = Backbone.Model.extend({}); 6 | 7 | // @TODO either as a feature or a bug, object attributes are not set 8 | // automatically when passed to the constructor. We set it manually here. 9 | model.prototype.initialize = function(attributes, options) { 10 | this.set({'fields': attributes.fields}); 11 | this.options = options; 12 | }; 13 | 14 | model.prototype.url = function() { 15 | if (Bones.server) return; 16 | 17 | var attr = this.attributes; 18 | if (this.getFeatures) attr.features = true; 19 | if (this.getInfo) attr.info = true; 20 | return 'http://' 21 | + window.abilities.tileUrl 22 | + '/datasource/' 23 | + this.get('id') 24 | + '?' + $.param(attr); 25 | }; 26 | 27 | model.prototype.fetchFeatures = function(options) { 28 | this.getFeatures = true; 29 | this.fetch(options); 30 | }; 31 | 32 | model.prototype.fetchInfo = function(options) { 33 | this.getInfo = true; 34 | this.fetch(options); 35 | }; 36 | -------------------------------------------------------------------------------- /models/Exports.bones: -------------------------------------------------------------------------------- 1 | // Exports 2 | // ------- 3 | // Collection. List of all Exports. 4 | model = Backbone.Collection.extend({}); 5 | 6 | model.prototype.model = models.Export; 7 | model.prototype.url = '/api/Export'; 8 | model.prototype.comparator = function(m) { return m.get('created') * -1; } 9 | -------------------------------------------------------------------------------- /models/Favorite.bones: -------------------------------------------------------------------------------- 1 | // Favorite 2 | // -------- 3 | // Model. A URI favorite. 4 | model = Backbone.Model.extend(); 5 | 6 | model.prototype.schema = { 7 | 'id': 'Favorite', 8 | 'type': 'object', 9 | 'properties': { 10 | 'id': { 11 | 'type': 'string', 12 | 'required': true 13 | }, 14 | 'created': { 15 | 'type': 'integer' 16 | } 17 | } 18 | }; 19 | 20 | model.prototype.url = function() { 21 | return '/api/Favorite/' + encodeURIComponent(this.id); 22 | }; 23 | -------------------------------------------------------------------------------- /models/Favorites.bones: -------------------------------------------------------------------------------- 1 | // Favorites 2 | // --------- 3 | // Collection of Favorite models. 4 | model = Backbone.Collection.extend(); 5 | model.prototype.model = models.Favorite; 6 | model.prototype.url = '/api/Favorite'; 7 | model.prototype.toLibrary = function(id) { 8 | var type; 9 | var filter; 10 | switch (id) { 11 | case 'favoritesPostGIS': 12 | type = 'postgis'; 13 | filter = function(id) { 14 | return id.indexOf('dbname=') !== -1 15 | }; 16 | break; 17 | case 'favoritesFile': 18 | type = 'file'; 19 | filter = function(id) { 20 | return id.indexOf('dbname=') === -1 21 | && id.indexOf('.sqlite') === -1; 22 | }; 23 | break; 24 | case 'favoritesSqlite': 25 | type = 'sqlite'; 26 | filter = function(id) { 27 | return id.indexOf('dbname=') === -1 28 | && id.indexOf('.sqlite') !== -1; 29 | }; 30 | break; 31 | } 32 | return { 33 | id: id, 34 | location: '', 35 | assets: this.chain() 36 | .pluck('id') 37 | .filter(filter) 38 | .map(function(id) { return { name:id, uri:id }}) 39 | .value() 40 | }; 41 | }; 42 | 43 | model.prototype.comparator = function(m) { 44 | return -1 * (m.get('created')||0); 45 | }; 46 | 47 | // Checks if a given id is a favorite. Adds normalization so PostGIS favorites 48 | // match regardless of the order of the arguments. 49 | model.prototype.isFavorite = function(id) { 50 | if (id.indexOf('dbname=') !== -1) { 51 | if (id == null) return null; 52 | var args = _(id.split(' ')).sortBy(function(arg) { return arg }); 53 | return this.chain() 54 | .pluck('id') 55 | .filter(function(id) { return id.indexOf('dbname=') !== -1 }) 56 | .map(function(id) { return _(id.split(' ')).sortBy(function(arg) { return arg }) }) 57 | .filter(function(id) { return _(id).isEqual(args) }) 58 | .first() 59 | .value(); 60 | } else if (this.get(id)) { 61 | return true; 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /models/Layers.bones: -------------------------------------------------------------------------------- 1 | // Layers 2 | // ------ 3 | // Collection. List of Layer models. This collection is a child of the 4 | // Project model and updates its parent on update events. 5 | // **This collection is not backed directly by the server.** 6 | model = Backbone.Collection.extend({}); 7 | 8 | model.prototype.model = models.Layer; 9 | 10 | model.prototype.initialize = function(models, options) { 11 | var that = this; 12 | var change = function() { 13 | this.parent.set({ 'Layer': that }); 14 | this.parent.change(); 15 | }; 16 | this.parent = options.parent; 17 | this.bind('refresh', change); 18 | this.bind('change', change); 19 | this.bind('add', change); 20 | this.bind('remove', change); 21 | }; 22 | -------------------------------------------------------------------------------- /models/Library.bones: -------------------------------------------------------------------------------- 1 | // Library 2 | // -------- 3 | // Model. Stores settings for a given asset library type, e.g. a local file 4 | // directory or an Amazon S3 bucket. 5 | model = Backbone.Model.extend(); 6 | 7 | model.prototype.schema = { 8 | 'type': 'object', 9 | 'properties': { 10 | 'id': { 11 | 'type': 'string', 12 | 'required': true 13 | }, 14 | 'location': { 15 | 'type': 'string', 16 | 'description': 'Current working dir or URL location.' 17 | }, 18 | 'assets': { 19 | 'type': 'array', 20 | 'description': 'Objects in this library.', 21 | 'items': { 22 | 'type': 'object', 23 | 'properties': { 24 | 'name': { 25 | 'type': 'string', 26 | 'description': 'Human readable name of this asset.' 27 | }, 28 | 'location': { 29 | 'type': 'string', 30 | 'description': 'Asset changes the Library\'s location.' 31 | }, 32 | 'uri': { 33 | 'type': 'string', 34 | 'description': 'URI of this asset.' 35 | } 36 | } 37 | } 38 | } 39 | } 40 | }; 41 | 42 | model.prototype.url = function() { 43 | var url = '/api/Library/' + this.id; 44 | if (!Bones.server && this.get('location') && this.get('project')) { 45 | url += '?' + $.param({location:this.get('location'), project:this.get('project')}); 46 | } 47 | return url; 48 | }; 49 | 50 | model.prototype.initialize = function(attributes, options) { 51 | options = options || {}; 52 | if (options.location) this.set({'location': options.location, project:options.project}); 53 | }; 54 | 55 | -------------------------------------------------------------------------------- /models/Page.bones: -------------------------------------------------------------------------------- 1 | // Doc 2 | // --- 3 | // Model. Retrieve a text doc page from the server. 4 | model = Backbone.Model.extend({}); 5 | model.prototype.url = function() { return '/api/Page/' + this.get('id'); }; 6 | model.prototype.defaults = {id: '0204-01-01-introduction.md'}; 7 | -------------------------------------------------------------------------------- /models/Page.server.bones: -------------------------------------------------------------------------------- 1 | var path = require('path'); 2 | var fs = require('fs'); 3 | 4 | models.Page.prototype.sync = function(method, model, success, error) { 5 | if (method !== 'read') return error('Method not supported.'); 6 | var filepath = path.resolve(path.join(__dirname, '..', '_posts', 'docs', 'reference', model.id)); 7 | fs.readFile(filepath, 'utf8', function(err, data) { 8 | if (err) return error(err); 9 | data = data.substring(data.indexOf('---', 3) + 3); 10 | data = data.replace(/{{site.baseurl}}\/assets/g, '/assets/tilemill'); 11 | return success({id: model.id, data: data}); 12 | }); 13 | }; 14 | -------------------------------------------------------------------------------- /models/Pages.bones: -------------------------------------------------------------------------------- 1 | model = Backbone.Collection.extend({ 2 | model: models.Page, 3 | url: '/api/Page', 4 | comparator: function(m) { return m.id } 5 | }); 6 | -------------------------------------------------------------------------------- /models/Pages.server.bones: -------------------------------------------------------------------------------- 1 | var path = require('path'); 2 | var fs = require('fs'); 3 | 4 | models.Pages.prototype.sync = function(method, model, success, error) { 5 | if (method !== 'read') return error('Method not supported.'); 6 | var filepath = path.resolve(path.join(__dirname, '..', '_posts', 'docs', 'reference')); 7 | fs.readdir(filepath, function(err, data) { 8 | if (err) return error(err); 9 | var models = _(data).map(function(id) { 10 | var title = id.match(/[\d]{4}-[\d]{2}-[\d]{2}-([\w-]+)/)[1]. 11 | replace(/-/g, ' '). 12 | replace(/mapbox/, 'MapBox'); 13 | return { 14 | id: id, 15 | title: title.charAt(0).toUpperCase() + title.slice(1) 16 | }; 17 | }); 18 | return success(models); 19 | }); 20 | }; 21 | -------------------------------------------------------------------------------- /models/Preview.bones: -------------------------------------------------------------------------------- 1 | // Preview of an mbtiles export. 2 | model = Backbone.Model.extend({}); 3 | model.prototype.url = function() { return '/api/Preview/' + this.id; }; 4 | -------------------------------------------------------------------------------- /models/Preview.server.bones: -------------------------------------------------------------------------------- 1 | var path = require('path'); 2 | var tilelive = require('tilelive'); 3 | var settings = Bones.plugin.config; 4 | 5 | models.Preview.prototype.sync = function(method, model, success, error) { 6 | if (method !== 'read') return error(new Error('Method not supported.')); 7 | var filepath = path.join(settings.files, 'export', model.id); 8 | var uri = {protocol:'mbtiles:',pathname:filepath}; 9 | tilelive.load(uri, function(err, source) { 10 | if (err) return error(err); 11 | source.getInfo(function(err, info) { 12 | if (err) return error(err); 13 | info.tiles = ['http://' + settings.tileUrl + '/tile/' + model.id + '/{z}/{x}/{y}.png?' + (+new Date)]; 14 | info.grids = ['http://' + settings.tileUrl + '/tile/' + model.id + '/{z}/{x}/{y}.grid.json?' + (+new Date)]; 15 | success(_(info).extend({id: model.id })); 16 | }); 17 | }); 18 | }; 19 | 20 | -------------------------------------------------------------------------------- /models/Projects.bones: -------------------------------------------------------------------------------- 1 | // ProjectList 2 | // ----------- 3 | // Collection. All project models. 4 | model = Backbone.Collection.extend({ 5 | model: models.Project, 6 | url: '/api/Project', 7 | comparator: function(project) { 8 | return (project.get('name') || project.get('id')).toLowerCase(); 9 | } 10 | }); 11 | 12 | -------------------------------------------------------------------------------- /models/Projects.server.bones: -------------------------------------------------------------------------------- 1 | models.Projects.prototype.sync = models.Project.prototype.sync; 2 | -------------------------------------------------------------------------------- /models/Stylesheet.bones: -------------------------------------------------------------------------------- 1 | // Stylesheet 2 | // ---------- 3 | // Model. Represents a single map MSS stylesheet. This model is a child of 4 | // the Project model and is saved serialized as part of the parent. 5 | // **This model is not backed directly by the server.** 6 | model = Backbone.Model.extend({}); 7 | 8 | model.prototype.schema = { 9 | 'id': 'Stylesheet', 10 | 'type': 'object', 11 | 'properties': { 12 | 'id': { 13 | 'type': 'string', 14 | 'required': true, 15 | 'pattern': '^[A-Za-z0-9\-_.]+$', 16 | 'title': 'Name', 17 | 'description': 'Name may only include alphanumeric characters, dots, dashes and underscores.' 18 | }, 19 | 'data': { 20 | 'type': 'string', 21 | 'required': true 22 | } 23 | } 24 | }; 25 | 26 | model.prototype.defaults = { 'data': '' }; 27 | 28 | model.prototype.validate = function(attr) { 29 | if (attr.id && 30 | this.collection && 31 | this.collection.get(attr.id) && 32 | this.collection.get(attr.id) !== this) 33 | return new Error(_('Stylesheet "<%=id%>" already exists.').template(attr)); 34 | }; 35 | -------------------------------------------------------------------------------- /models/Stylesheets.bones: -------------------------------------------------------------------------------- 1 | // Stylesheets 2 | // ----------- 3 | // Collection. List of Stylesheet models. This collection is a child of the 4 | // Project model and updates its parent on update events. 5 | // **This collection is not backed directly by the server.** 6 | model = Backbone.Collection.extend({}); 7 | 8 | model.prototype.model = models.Stylesheet; 9 | 10 | model.prototype.initialize = function(models, options) { 11 | var that = this; 12 | var change = function() { 13 | this.parent.set({ 'Stylesheet': that }); 14 | this.parent.change(); 15 | }; 16 | this.parent = options.parent; 17 | this.bind('refresh', change); 18 | this.bind('change', change); 19 | this.bind('add', change); 20 | this.bind('remove', change); 21 | }; 22 | -------------------------------------------------------------------------------- /plugins/carto/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "carto", 3 | "description": "Carto syntax reference for editing.", 4 | "engines": {"tilemill":"*"}, 5 | "private": true 6 | } 7 | -------------------------------------------------------------------------------- /plugins/carto/views/Carto.bones: -------------------------------------------------------------------------------- 1 | view = Backbone.View.extend(); 2 | 3 | view.prototype.events = { 4 | 'click .toggler a': 'toggler' 5 | } 6 | 7 | view.prototype.initialize = function(options) { 8 | this.render(); 9 | this._carto_state = options._carto_state; 10 | if (this._carto_state.section) { 11 | $('a[href=' + this._carto_state.section + ']').click(); 12 | } 13 | }; 14 | 15 | view.prototype.toggler = function(ev) { 16 | this._carto_state.section = $(ev.currentTarget).attr('href'); 17 | }; 18 | 19 | view.prototype.render = function() { 20 | if (this.$('.manual').size()) return this; 21 | 22 | this.$('.content').html(templates.Reference(abilities.carto)); 23 | /*this.$('pre.carto-snippet').each(function(i, elem) { 24 | CodeMirror(function(el) { 25 | $(elem).replaceWith(el); 26 | }, { 27 | readOnly: 'nocursor', 28 | mode: { 29 | name: 'carto', 30 | reference: abilities.carto 31 | }, 32 | value: $(elem).text() 33 | } 34 | ); 35 | });*/ 36 | return this; 37 | }; 38 | 39 | // Hook in to project view with an augment. 40 | views.Project.augment({ 41 | events: { 'click a[href=#carto]': 'carto' }, 42 | carto: function() { 43 | new view({ 44 | el:$('#drawer'), 45 | _carto_state: this._carto_state 46 | }) 47 | }, 48 | initialize: function(p, o) { 49 | _(this).bindAll('carto'); 50 | // Minor state saving for the carto window 51 | this._carto_state = {}; 52 | return p.call(this, o); 53 | }, 54 | render: function(p) { 55 | p.call(this); 56 | this.$('.palette').prepend("Carto"); 57 | return this; 58 | } 59 | }); 60 | 61 | -------------------------------------------------------------------------------- /plugins/editor/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "editor", 3 | "description": "Stylesheet code editor.", 4 | "engines": {"tilemill":"*"}, 5 | "private": true 6 | } 7 | -------------------------------------------------------------------------------- /plugins/editor/templates/Colorpicker._: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 | Save 5 | Cancel 6 |
7 | 8 |
9 | -------------------------------------------------------------------------------- /plugins/editor/templates/Editor._: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 |
5 |
    6 |
    7 | Add stylesheet 8 |
    9 |
    10 |
    11 |
    12 | Close 13 |
    14 |
    15 |
    16 | 17 | -------------------------------------------------------------------------------- /plugins/editor/templates/ProjectStylesheet._: -------------------------------------------------------------------------------- 1 |
  • 2 | ' href='#stylesheet-<%= id.replace(/[\.]/g, '-') %>'> 3 | <%= id %> 4 | 5 | 6 |
  • 7 | -------------------------------------------------------------------------------- /plugins/editor/templates/ProjectSwatch._: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /plugins/editor/templates/Stylesheet._: -------------------------------------------------------------------------------- 1 |
    2 |
      3 |
    • 4 |
      Add a new Carto stylesheet. Stylesheets are applied to the project in the order they appear.
      5 |
    • 6 |
    • 7 | 8 | 9 |
    • 10 |
    • 11 | 12 | 13 |
    • 14 |
    15 |
    16 | -------------------------------------------------------------------------------- /plugins/editor/views/Stylesheet.bones: -------------------------------------------------------------------------------- 1 | view = Backbone.View.extend(); 2 | 3 | view.prototype.events = { 4 | 'click input[type=submit]': 'save' 5 | }; 6 | 7 | view.prototype.initialize = function(options) { 8 | _(this).bindAll('render', 'save'); 9 | this.render(); 10 | }; 11 | 12 | view.prototype.render = function() { 13 | this.$('.content').html(templates.Stylesheet({})); 14 | 15 | // Autofocus first field. 16 | this.$('input[type=text]:first').focus(); 17 | return this; 18 | }; 19 | 20 | view.prototype.save = function() { 21 | var attr = Bones.utils.form(this.$('.form'), this.model); 22 | var options = { error: function(m, resp) { 23 | console.log('error saving project: ' + m.id); 24 | new views.Modal(resp); 25 | } 26 | }; 27 | if (this.model.set(attr, options)) { 28 | this.model.collection.add(this.model); 29 | this.$('a[href="#close"]').click(); 30 | } 31 | return false; 32 | }; 33 | -------------------------------------------------------------------------------- /plugins/fonts/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "fonts", 3 | "description": "List of available fonts.", 4 | "engines": {"tilemill":"*"}, 5 | "private": true 6 | } 7 | -------------------------------------------------------------------------------- /plugins/fonts/templates/Fonts._: -------------------------------------------------------------------------------- 1 |
    2 | 3 | 24 | 25 |
    26 | <% _(fonts).each(function(f) { %> 27 | 28 | 29 | Copy + paste into editor 30 | 31 | <% }); %> 32 |
    33 | 34 |
    35 | -------------------------------------------------------------------------------- /plugins/fonts/views/Fonts.bones: -------------------------------------------------------------------------------- 1 | view = Backbone.View.extend(); 2 | 3 | view.prototype.events = { 4 | 'click a.font': 'insert', 5 | 'keydown a.font input': 'keydown' 6 | }; 7 | 8 | view.prototype.initialize = function(options) { 9 | _(this).bindAll('insert', 'keydown'); 10 | this.render(); 11 | }; 12 | 13 | view.prototype.render = function() { 14 | if (this.$('.fonts').size()) return this; 15 | var groups = {}; 16 | var fonts = _(abilities.fonts).map(function(font) { 17 | var group = font.toUpperCase().charCodeAt(0); 18 | groups[group] = groups[group] || 0; 19 | groups[group]++ 20 | return { name:font, group:group }; 21 | }); 22 | this.$('.content').html(templates.Fonts({ 23 | fonts: fonts, 24 | groups: groups 25 | })); 26 | return this; 27 | }; 28 | 29 | // Select font text. 30 | view.prototype.insert = function(ev) { 31 | var target = $(ev.currentTarget); 32 | target.addClass('insert').siblings().removeClass('insert'); 33 | $('input', target).select(); 34 | return false; 35 | }; 36 | 37 | // Catch non-action keypress (e.g. Ctrl-C) events when a font input field 38 | // is selected to prevent users from tampering with a font name. 39 | view.prototype.keydown = function(ev) { 40 | if (ev.ctrlKey || ev.metaKey || ev.altKey) return; 41 | return false; 42 | } 43 | 44 | // Hook in to projet view with an augment. 45 | views.Project.augment({ 46 | events: { 'click a[href=#fonts]': 'fonts' }, 47 | fonts: function() { 48 | new view({ el:$('#drawer') }) 49 | }, 50 | render: function(p) { 51 | p.call(this); 52 | this.$('.palette').prepend("Fonts"); 53 | return this; 54 | } 55 | }); 56 | 57 | -------------------------------------------------------------------------------- /plugins/templates/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "templates", 3 | "description": "Legend and tooltip template editor.", 4 | "engines": {"tilemill":"*"}, 5 | "private": true 6 | } 7 | -------------------------------------------------------------------------------- /rebuild_cxx.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | echo 'rebuilding node cxx modules' 3 | CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" 4 | cd ${CURRENT_DIR} 5 | echo "starting work in ${CURRENT_DIR}" 6 | TILEMILL_ROOT=`pwd` 7 | PATH=${TILEMILL_ROOT}/node_modules/.bin:${PATH} 8 | PATH="`npm explore npm -g -- pwd`/bin/node-gyp-bin":${PATH} 9 | 10 | RUN_SETUP=false 11 | while getopts "s" OPT; do 12 | case $OPT in 13 | s) 14 | RUN_SETUP=true 15 | ;; 16 | esac 17 | done 18 | 19 | BUILD_ROOT=${TILEMILL_ROOT}/node_root_dir 20 | 21 | if [ "${RUN_SETUP}" = true ]; then 22 | NVER=`node -e "console.log(process.versions.node)"` 23 | echo "Running node-gyp setup for ${NVER}" 24 | node-gyp install ${NVER} 25 | BUILD_ROOT=${TILEMILL_ROOT}/node_root_dir 26 | cp -r ~/.node-gyp/${NVER}/ ${BUILD_ROOT} 27 | rm -rf ~/.node-gyp/ 28 | fi 29 | npm rebuild --nodedir=${BUILD_ROOT} --build-from-source 30 | 31 | -------------------------------------------------------------------------------- /servers/Core.bones: -------------------------------------------------------------------------------- 1 | var env = process.env.NODE_ENV || 'development'; 2 | 3 | servers['Core'].prototype.port = 20009; 4 | servers['Core'].prototype.start = function(callback) { 5 | if (this.plugin.config.coreSocket) { 6 | this.port = null; 7 | this.listen(this.plugin.config.coreSocket, callback); 8 | } else if (this.port) { 9 | this.listen(this.port, this.plugin.config.listenHost, callback); 10 | } 11 | return this; 12 | }; 13 | servers['Core'].prototype.initialize = function(app) { 14 | this.port = app.config.port || this.port; 15 | this.use(new servers['Middleware'](app)); 16 | this.use(new servers['App'](app)); 17 | if (env === 'development') this.use(new servers['Debug'](app)); 18 | this.use(new servers['Route'](app)); 19 | this.use(new servers['Asset'](app)); 20 | this.enable('jsonp callback'); 21 | }; 22 | -------------------------------------------------------------------------------- /servers/Route.bones: -------------------------------------------------------------------------------- 1 | servers['Route'].augment({ 2 | assets: { 3 | styles: [ 4 | require.resolve('../assets/css/reset.css'), 5 | require.resolve('../assets/css/style.css'), 6 | require.resolve('../assets/css/controls.css'), 7 | require.resolve('../assets/css/codemirror.css'), 8 | require.resolve('../assets/css/code.css') 9 | ], 10 | scripts: [ 11 | require.resolve('../assets/js/colorpicker.classic.js'), 12 | require.resolve('../assets/js/mustache.js'), 13 | require.resolve('../assets/js/jquery.ui.js'), 14 | require.resolve('semver/semver.browser.js'), 15 | require.resolve('chrono/lib/chrono.js'), 16 | require.resolve('modestmaps/modestmaps.js'), 17 | require.resolve('wax/dist/wax.mm.min.js'), 18 | require.resolve('JSV/lib/uri/uri.js'), 19 | require.resolve('JSV/lib/jsv.js'), 20 | require.resolve('JSV/lib/json-schema-draft-03.js'), 21 | require.resolve('../assets/js/codemirror.js'), 22 | require.resolve('../assets/js/codemirror.overlay.js'), 23 | require.resolve('../assets/js/codemirror.carto.js'), 24 | require.resolve('../assets/js/codemirror.carto.complete.js'), 25 | require.resolve('../assets/js/codemirror.xml.js'), 26 | require.resolve('../assets/js/codemirror.mustache.js'), 27 | require.resolve('../assets/js/showdown.js'), 28 | require.resolve('sphericalmercator') 29 | ] 30 | }, 31 | initializeAssets: function(parent, app) { 32 | parent.call(this, app); 33 | this.get('/assets/tilemill/css/vendor.css', 34 | mirror.assets(this.assets.styles, { type: '.css' }).handler); 35 | this.get('/assets/tilemill/js/vendor.js', 36 | mirror.assets(this.assets.scripts, { type: '.js' }).handler); 37 | } 38 | }); 39 | 40 | -------------------------------------------------------------------------------- /templates/Autostyle._: -------------------------------------------------------------------------------- 1 | <% if (get('geometry') == 'polygon' || get('geometry') == 'multipolygon') { %> 2 | 3 | #<%= get('id') %> { 4 | line-color:#594; 5 | line-width:0.5; 6 | polygon-opacity:1; 7 | polygon-fill:#ae8; 8 | }<% } %><% if (get('geometry') == 'point' || get('geometry') == 'multipoint') { %> 9 | 10 | #<%= get('id') %> { 11 | marker-width:6; 12 | marker-fill:#f45; 13 | marker-line-color:#813; 14 | marker-allow-overlap:true; 15 | marker-ignore-placement:true; 16 | }<% } %><% if (get('geometry') == 'linestring' || get('geometry') == 'multilinestring') { %> 17 | 18 | #<%= get('id') %> { 19 | line-width:1; 20 | line-color:#168; 21 | }<% } %><% if (get('geometry') == 'raster') { %> 22 | 23 | #<%= get('id') %> { 24 | raster-opacity:1; 25 | }<% } %> 26 | -------------------------------------------------------------------------------- /templates/Datasource._: -------------------------------------------------------------------------------- 1 | <% 2 | /* @TODO not using underscore 1.2's escape method as it is 3 | still stabilizing. Consider switching once 1.2 stable. */ 4 | obj.escape = function(string) { 5 | return (''+string) 6 | .replace(/&/g, '&') 7 | .replace(//g, '>'); 9 | }; %> 10 | 16 |
    17 | 18 | 19 | 20 | <% _(fields).each(function (field, name) { %> 21 | 22 | <% }); %> 23 | 24 | 25 | 26 | 27 | <% _(fields).each(function (field) { %> 28 | <% if (field.type === 'Number') { %> 29 | 30 | <% } else { %> 31 | 32 | <% } %> 33 | <% }); %> 34 | 35 | 36 | <% _(fields).each(function (field) { %> 37 | <% if (field.type === 'Number') { %> 38 | 39 | <% } else { %> 40 | 41 | <% } %> 42 | <% }); %> 43 | 44 | <%= this['DatasourceRows'](obj) %> 45 | 46 |
    <%= name %>
    min <%= obj.escape(field.min) %><%= obj.escape(field.min) %> min
    max <%= obj.escape(field.max) %><%= obj.escape(field.max) %> max
    47 | <% if (moreFields.length) { %> 48 |
    49 | <%= moreFields.join(', ') %> fields omitted.
    Use fewer fields for better performance. 50 |
    51 | <% } %> 52 | <% if (more) { %> 53 | 54 | <% } %> 55 |
    56 | -------------------------------------------------------------------------------- /templates/DatasourceRows._: -------------------------------------------------------------------------------- 1 | <% 2 | /* @TODO not using underscore 1.2's escape method as it is 3 | still stabilizing. Consider switching once 1.2 stable. */ 4 | obj.escape = function(string) { 5 | return (''+string) 6 | .replace(/&/g, '&') 7 | .replace(//g, '>'); 9 | }; %> 10 | <% _(features).each(function (feature) { %> 11 | 12 | <% _(fields).each(function (value, key) { if (key !== '__id__') { %> 13 | <%= obj.escape(feature[key]) %> 14 | <% }}); %> 15 | 16 | <% }); %> 17 | -------------------------------------------------------------------------------- /templates/Error._: -------------------------------------------------------------------------------- 1 |
    2 |
    <%= content.toString() %>
    3 |
    4 | 5 | -------------------------------------------------------------------------------- /templates/Exports._: -------------------------------------------------------------------------------- 1 |
      2 | 3 | <% if (!collection.length) { %> 4 |
    • No exports found.
    • 5 | <% } %> 6 | 7 | <% collection.each(function(m) { %> 8 |
    • '> 9 | '> 10 | '><%=m.get('status')%> 11 | 12 |

      <%= m.get('name') || m.get('filename') %>

      13 |
      14 | <% if (m.get('created')) { %> 15 | Started <%= (new Date(m.get('created'))).format('M j h:ia') %> 16 | <% } else if (m.get('status') === 'waiting') { %> 17 | Waiting to be processed 18 | <% } %> 19 | <% if (m.get('updated')) { %> 20 | — <%= obj.time(m.get('updated') - m.get('created')) %> 21 | <% } %> 22 |
      23 |
      24 | <% if (m.get('status') === 'processing' || m.get('status') === 'waiting') { %> 25 |
      %'class='bar'>
      26 | <%= obj.time(m.get('remaining')) %> remaining 27 | <% } %> 28 | <% if (m.get('status') === 'complete') { %> 29 |
      30 | <% if (m.get('format') === 'mbtiles') { %> 31 | Save 32 | <% } else { %> 33 | '> Save 34 | <% } %> 35 |
      36 | <% } %> 37 | <% if (m.get('status') === 'error') { %> 38 |
      39 |
      <%=m.get('error')%>
      40 |
      41 | <% } %> 42 |
      43 | Delete 44 |
    • 45 | <% }); %> 46 |
    47 | -------------------------------------------------------------------------------- /templates/Layers._: -------------------------------------------------------------------------------- 1 | 8 |
      9 | -------------------------------------------------------------------------------- /templates/Library._: -------------------------------------------------------------------------------- 1 |
      2 |
      3 | <% if (model.id === 'favoritesPostGIS') { %> 4 | Favorites 5 | <% } else if (model.id === 'sqlite') { %> 6 | FileFavorites 8 | <% } else { %> 9 | FileMapBoxFavorites 12 | <% } %> 13 |
      14 | 15 | 26 | 27 |
      28 | <% if (model.get('assets').length === 0) { %> 29 |
      No items found.
      30 | <% } %> 31 | 32 | <% _(model.get('assets')).each(function(asset) { %> 33 | '> 34 | <% if (asset.location) { %><% } %> 35 | <% if (asset.uri) { %><% } %> 36 | <%= asset.name %> 37 | <% if (asset.size) { %><%= asset.size %><% } %> 38 | 39 | <% }); %> 40 |
      41 |
      42 | -------------------------------------------------------------------------------- /templates/Manual._: -------------------------------------------------------------------------------- 1 |
      2 | 10 |
      <%= obj.model.get('data') %>
      11 |
      12 | -------------------------------------------------------------------------------- /templates/Map._: -------------------------------------------------------------------------------- 1 | 12 |
      13 |
      Zoom
      14 |
      15 | -------------------------------------------------------------------------------- /templates/Modal._: -------------------------------------------------------------------------------- 1 | <% if (type === 'confirm') { %> 2 |
      <%= content.toString() %>
      3 |
      4 | <% if (affirmative) %><% ; %> 5 | <% if (negative) %><% ; %> 6 |
      7 | <% } else { %> 8 | Close 9 |
      <%= content.toString().replace(//g, '>') %>
      10 |
      Is this a bug? Report it on github.
      11 | <% } %> 12 | -------------------------------------------------------------------------------- /templates/Pane._: -------------------------------------------------------------------------------- 1 |

      2 | Close 3 |
      4 |
      5 | Cancel 6 | -------------------------------------------------------------------------------- /templates/Plugin._: -------------------------------------------------------------------------------- 1 | <% 2 | var installed = !!window.abilities.plugins[id]; 3 | var compatible = semver.satisfies(window.abilities.tilemill.version, get('engines').tilemill); 4 | var upgradable = installed && get('latest') && semver.gt(get('latest'), get('version')); 5 | %> 6 |
    • '> 7 | <%= escape('name') %> 8 | 9 | <%= escape('description') || 'No description.' %>
      10 | <% if (get('core')) %>TileMill <%=window.abilities.tilemill.version%><%;%> 11 | <% if (!get('core')) %>Version <%= escape('version') || 'unknown' %><%;%> 12 | <% if (!compatible) %> 13 | Incompatible with TileMill <%=window.abilities.tilemill.version%> 14 | <%;%> 15 | <% if (get('broken')) %> 16 | Broken, uninstalling is highly recommended 17 | <%;%> 18 | 19 |
      20 |
      21 | <% if (get('core')) { %> 22 | Core 23 | <% } else { %> 24 | <% if (upgradable) %>Upgrade<% ; %> 25 | <% if (installed) %>Uninstall<% ; %> 26 | <% if (!installed && compatible) %>Install<% ; %> 27 | <% } %> 28 |
      29 |
    • 30 | 31 | -------------------------------------------------------------------------------- /templates/Plugins._: -------------------------------------------------------------------------------- 1 |
        2 |
      • 3 |

        Installed plugins

        4 |
      • 5 |
        • 6 | 10 | <%= collection.map(templates.Plugin).join('') %> 11 |
      • 12 |
        13 |
      14 |
        15 |
      • 16 |

        Available plugins

        17 |
      • 18 |
        • 19 | <% var show = available.chain() 20 | .filter(function(m) { return !window.abilities.plugins[m.id] }) 21 | .map(templates.Plugin) 22 | .value(); 23 | show = show.length ? show.join('') : available.length ? '
          No plugins found.
          ' : ''; 24 | %> 25 | <%= show %> 26 |
      • 27 |
        28 |
      29 | -------------------------------------------------------------------------------- /templates/Preview._: -------------------------------------------------------------------------------- 1 |
      2 | 11 |
      12 |
      13 | -------------------------------------------------------------------------------- /templates/ProjectAdd._: -------------------------------------------------------------------------------- 1 |
        2 |
      • 3 |

        Project information

        4 |
        Provide information about your project. You can edit these fields later.
        5 |
      • 6 |
      • 7 | 8 | ' /> 9 |
      • 10 |
      • 11 | 12 | ' /> 13 |
      • 14 |
      • 15 | 16 | ' /> 17 |
      • 18 |
      • 19 | 20 | 28 |
      • 29 |
      • 30 | 31 | 32 | Include world layer and styles. 33 |
      • 34 |
      • 35 | 36 | 37 |
      • 38 |
      39 | -------------------------------------------------------------------------------- /templates/ProjectLayer._: -------------------------------------------------------------------------------- 1 | class='status-off'<% } %>> 2 | 3 | ' class='icon geometry geometry-<%= get('geometry') %>'> 4 | 5 | 6 | 7 | <% if (get('geometry') !== 'raster') { %> 8 | Features (<%= id %>) 9 | <% } %> 10 | Zoom to <%= id %> 11 | Hide <%= id %> 12 | Edit <%= id %> 13 | Clone <%= id %> 14 | Delete <%= id %> 15 | 16 | 17 | -------------------------------------------------------------------------------- /templates/Projects._: -------------------------------------------------------------------------------- 1 | 22 | -------------------------------------------------------------------------------- /test/abilities.test.js: -------------------------------------------------------------------------------- 1 | var assert = require('assert'); 2 | var core; 3 | var tile; 4 | 5 | describe('abilities', function() { 6 | 7 | before(function(done) { 8 | require('./support/start').start(function(command) { 9 | core = command.servers['Core']; 10 | tile = command.servers['Tile']; 11 | done(); 12 | }); 13 | }); 14 | 15 | after(function(done) { 16 | core.close(); 17 | tile.close(); 18 | done(); 19 | }); 20 | 21 | it('GET should return JSON', function(done) { 22 | assert.response(core, 23 | { url: '/assets/tilemill/js/abilities.js' }, 24 | { status: 200 }, 25 | function(res) { 26 | var body = res.body.replace(/^\s*var\s+abilities\s*=\s*(.+?);?$/, '$1'); 27 | var abilities = JSON.parse(body); 28 | // travis does a shallow clone so the git version and hash will 29 | // not be known, which is harmless 30 | if (!process.env.TRAVIS) { 31 | assert.ok(/v\d+.\d+.\d+-\d+-[a-z0-9]+/.test(abilities.version[0]),abilities.version[0]); 32 | assert.ok(/\d+.\d+.\d+.\d+/.test(abilities.version[1]),abilities.version[1]); 33 | } 34 | assert.ok(abilities.fonts.indexOf('Arial Regular') >= 0 || 35 | abilities.fonts.indexOf('DejaVu Sans Book') >= 0); 36 | assert.deepEqual([0,206,209], abilities.carto.colors.darkturquoise); 37 | assert.deepEqual([ 38 | "background-color", 39 | "background-image", 40 | "background-image-comp-op", 41 | "background-image-opacity", 42 | "srs", 43 | "buffer-size", 44 | "maximum-extent", 45 | "base", 46 | "paths-from-xml", 47 | "minimum-version", 48 | "font-directory" 49 | ], Object.keys(abilities.carto.symbolizers.map)); 50 | assert.equal(true,abilities.exports.mbtiles); 51 | done(); 52 | } 53 | ); 54 | }); 55 | 56 | }); 57 | 58 | -------------------------------------------------------------------------------- /test/duplicate_module.test.js: -------------------------------------------------------------------------------- 1 | var assert = require('assert'); 2 | var exec = require('child_process').exec; 3 | 4 | var count_module = function(name,callback) { 5 | var cmd = 'npm ls ' + name; 6 | exec(cmd, 7 | function (error, stdout, stderr) { 8 | var pattern = new RegExp(name+'@','g'); 9 | var match = stdout.match(pattern); 10 | if (!match) { 11 | return callback(null,0); 12 | } 13 | return callback(null,match.length); 14 | }); 15 | }; 16 | 17 | describe('config loading pwnage', function() { 18 | 19 | ['optimist','sqlite3','mapnik'].forEach(function(mod) { 20 | it('there should only be one ' + mod + ' module otherwise you are hosed', function(done) { 21 | count_module(mod, function(err,count) { 22 | if (err) throw err; 23 | assert.notEqual(count,0,'you are missing the ' + mod + ' module (`npm ls ' + mod + '`)'); 24 | assert.equal(count,1,'you have more than one copy of ' + mod + ' (`npm ls ' + mod + '`)'); 25 | done(); 26 | }); 27 | }); 28 | }); 29 | 30 | }); -------------------------------------------------------------------------------- /test/fixtures/anti-meridian-export-job.json: -------------------------------------------------------------------------------- 1 | { 2 | "progress": 0, 3 | "status": "waiting", 4 | "format": "mbtiles", 5 | "project": "demo_01", 6 | "tile_format": "png", 7 | "id": "", 8 | "filename": "demo_anti-meridian.mbtiles", 9 | "bbox": [ 175, 31.8402, -175, 71.9245 ], 10 | "minzoom": 0, 11 | "maxzoom": 2, 12 | "bones.token": "zbx6dr0ghgvRNZOuu8PXtt2VCAIKO2qK" 13 | } -------------------------------------------------------------------------------- /test/fixtures/countries.sqlite: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/florianf/tileoven/2e14a75b066cb022e4796f26bd050e3f437dcb10/test/fixtures/countries.sqlite -------------------------------------------------------------------------------- /test/fixtures/create-project.json: -------------------------------------------------------------------------------- 1 | { 2 | "bounds": [ -180, -85.05112877980659, 180, 85.05112877980659], 3 | "center": [0, 0, 2], 4 | "format": "png", 5 | "interactivity": false, 6 | "minzoom": 0, 7 | "maxzoom": 22, 8 | "srs": "+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over", 9 | "Stylesheet": [{ 10 | "data": "Map {\n background-color: #fff;\n}\n\n#world {\n polygon-fill: #eee;\n line-color: #ccc;\n line-width: 0.5;\n}", 11 | "id": "style.mss" 12 | }], 13 | "Layer": [{ 14 | "id": "world", 15 | "name": "world", 16 | "srs": "+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over", 17 | "geometry": "polygon", 18 | "Datasource": { 19 | "file": "http://tilemill-data.s3.amazonaws.com/world_borders_merc.zip", 20 | "type": "shape" 21 | } 22 | }], 23 | "id": "demo_02", 24 | "bones.token": "NTdptwhjvjRcJy89kqsV9Hgk0AkG3Y5O" 25 | } 26 | -------------------------------------------------------------------------------- /test/fixtures/created-project.json: -------------------------------------------------------------------------------- 1 | { 2 | "Layer": [ 3 | { 4 | "Datasource": { 5 | "file": "http://tilemill-data.s3.amazonaws.com/world_borders_merc.zip", 6 | "type": "shape" 7 | }, 8 | "geometry": "polygon", 9 | "id": "world", 10 | "name": "world", 11 | "srs": "+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over" 12 | } 13 | ], 14 | "Stylesheet": [ 15 | { 16 | "data": "Map {\n background-color: #fff;\n}\n\n#world {\n polygon-fill: #eee;\n line-color: #ccc;\n line-width: 0.5;\n}", 17 | "id": "style.mss" 18 | } 19 | ], 20 | "bounds": [ -180, -85.05112877980659, 180, 85.05112877980659 ], 21 | "center": [ 0, 0, 2 ], 22 | "format": "png", 23 | "grids": [ "http://127.0.0.1:20008/tile/demo_02/{z}/{x}/{y}.grid.json" ], 24 | "tiles": [ "http://127.0.0.1:20008/tile/demo_02/{z}/{x}/{y}.png" ], 25 | "scale": 1, 26 | "metatile": 2, 27 | "id": "demo_02", 28 | "interactivity": false, 29 | "maxzoom": 22, 30 | "minzoom": 0, 31 | "scheme": "xyz", 32 | "srs": "+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over", 33 | "tilejson": "2.0.0" 34 | } 35 | -------------------------------------------------------------------------------- /test/fixtures/datasource-postgis.json: -------------------------------------------------------------------------------- 1 | { 2 | "features": [], 3 | "fields": { 4 | "featurecla": { "type": "String" }, 5 | "gid": { "type": "Number" }, 6 | "scalerank": { "type": "Number" } 7 | }, 8 | "geometry_type": "linestring", 9 | "id": "postgis", 10 | "project": "demo_01", 11 | "type": "vector", 12 | "unproj_extent" : [ 13 | -137.55088970390102, 14 | -52.986907341349465, 15 | 140.97763013616188, 16 | 70.07531103545583 17 | ], 18 | "extent" : "-15312095,-6980576.5,15693558,11093272", 19 | "sticky_options":{} 20 | } -------------------------------------------------------------------------------- /test/fixtures/datasource-shp.json: -------------------------------------------------------------------------------- 1 | { 2 | "fields": { 3 | "AREA": { "type": "Number" }, 4 | "FIPS": { "type": "String" }, 5 | "ISO2": { "type": "String" }, 6 | "ISO3": {"type": "String" }, 7 | "LAT": { "type": "Number" }, 8 | "LON": { "type": "Number" }, 9 | "NAME": { "type": "String" }, 10 | "POP2005": { "type": "Number" }, 11 | "REGION": { "type": "Number" }, 12 | "SUBREGION": { "type": "Number" }, 13 | "UN": { "type": "Number" } 14 | }, 15 | "geometry_type": "polygon", 16 | "id": "world", 17 | "project": "demo_01", 18 | "type": "vector", 19 | "url": "http://tilemill-data.s3.amazonaws.com/world_borders_merc.zip", 20 | "features": [] 21 | } 22 | -------------------------------------------------------------------------------- /test/fixtures/datasource-sqlite.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "world", 3 | "project": "demo_01", 4 | "fields": { 5 | "OGC_FID": { "type": "Number" }, 6 | "scalerank": { "type": "Number" }, 7 | "labelrank": { "type": "Number" }, 8 | "featurecla": { "type": "String" }, 9 | "sovereignt": { "type": "String" }, 10 | "sov_a3": { "type": "String" }, 11 | "adm0_dif": { "type": "Number" }, 12 | "level": { "type": "Number" }, 13 | "type": { "type": "String" }, 14 | "admin": { "type": "String" }, 15 | "adm0_a3": { "type": "String" }, 16 | "geou_dif": { "type": "Number" }, 17 | "name": { "type": "String" }, 18 | "abbrev": { "type": "String" }, 19 | "postal": { "type": "String" }, 20 | "name_forma": { "type": "String" }, 21 | "terr_": { "type": "String" }, 22 | "name_sort": { "type": "String" }, 23 | "map_color": { "type": "Number" }, 24 | "pop_est": { "type": "Number" }, 25 | "gdp_md_est": { "type": "Number" }, 26 | "fips_10_": { "type": "Number" }, 27 | "iso_a2": { "type": "String" }, 28 | "iso_a3": { "type": "String" }, 29 | "iso_n3": { "type": "Number" } 30 | }, 31 | "features": [], 32 | "type": "vector", 33 | "geometry_type": "polygon", 34 | "unproj_extent" : [ 35 | -70.06163470944716, 36 | 12.41753750275562, 37 | 74.89230718349421, 38 | 38.47367493851016 39 | ], 40 | "extent" : "-7799225.5,1393264.125,8336973.5,4646558", 41 | "sticky_options":{} 42 | } 43 | -------------------------------------------------------------------------------- /test/fixtures/existing-project.json: -------------------------------------------------------------------------------- 1 | { 2 | "bounds": [-180, -85.05112877980659, 180, 85.05112877980659], 3 | "center": [0, 0, 2], 4 | "format": "png8:m=h", 5 | "interactivity": { 6 | "layer": "world", 7 | "template_teaser": "{{NAME}}", 8 | "template_full": "", 9 | "template_location": "", 10 | "fields": ["NAME"] 11 | }, 12 | "template": "{{#__location__}}{{/__location__}}{{#__teaser__}}{{NAME}}{{/__teaser__}}{{#__full__}}{{/__full__}}", 13 | "minzoom": 0, 14 | "maxzoom": 22, 15 | "srs": "+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over", 16 | "Stylesheet": [{ 17 | "id": "style.mss", 18 | "data": "Map {\n background-color: #fff;\n}\n\n#world {\n polygon-fill: #eee;\n line-color: #ccc;\n line-width: 0.5;\n}" 19 | }], 20 | "Layer": [{ 21 | "id": "world", 22 | "name": "world", 23 | "srs": "+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over", 24 | "geometry": "polygon", 25 | "Datasource": { 26 | "file": "http://tilemill-data.s3.amazonaws.com/world_borders_merc.zip", 27 | "type": "shape" 28 | } 29 | }], 30 | "id": "demo_01", 31 | "tilejson": "2.0.0", 32 | "scheme": "xyz", 33 | "tiles": ["http://127.0.0.1:20008/tile/demo_01/{z}/{x}/{y}.png"], 34 | "grids": ["http://127.0.0.1:20008/tile/demo_01/{z}/{x}/{y}.grid.json"] 35 | } 36 | -------------------------------------------------------------------------------- /test/fixtures/export-job.json: -------------------------------------------------------------------------------- 1 | { 2 | "progress": 0, 3 | "status": "waiting", 4 | "format": "mbtiles", 5 | "project": "demo_01", 6 | "tile_format": "png", 7 | "id": "", 8 | "filename": "demo_01.mbtiles", 9 | "bbox": [ -29.5642, 31.8402, 42.1545, 71.9245 ], 10 | "minzoom": 0, 11 | "maxzoom": 2, 12 | "bones.token": "zbx6dr0ghgvRNZOuu8PXtt2VCAIKO2qK" 13 | } -------------------------------------------------------------------------------- /test/fixtures/invalid-project.json: -------------------------------------------------------------------------------- 1 | { 2 | "bounds": [-180, -85.05112877980659, 180, 85.05112877980659], 3 | "center": [0, 0, 2], 4 | "format": "png", 5 | "interactivity": false, 6 | "minzoom": 0, 7 | "maxzoom": 22, 8 | "srs": "+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over", 9 | "Stylesheet": [{ 10 | "id": "style.mss", 11 | "data": "Map {\n background-color: blurb;\n}\n\n#world {\n polygon-fill: #eee;\n line-color: #ccc;\n line-width: 0.5;\n}" 12 | }], 13 | "Layer": [{ 14 | "id": "world", 15 | "name": "world", 16 | "srs": "+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over", 17 | "geometry": "polygon", 18 | "Datasource": { 19 | "file": "http://tilemill-data.s3.amazonaws.com/world_borders_merc.zip", 20 | "type": "shape" 21 | } 22 | }], 23 | "id": "demo_01", 24 | "tilejson": "2.0.0", 25 | "scheme": "xyz", 26 | "tiles": ["http://127.0.0.1:20008/tile/demo_01/{z}/{x}/{y}.png"], 27 | "grids": ["http://127.0.0.1:20008/tile/demo_01/{z}/{x}/{y}.grid.json"], 28 | "bones.token": "qUPgDcUqcee7RkBieVn7bfhZxAZALOyx" 29 | } 30 | -------------------------------------------------------------------------------- /test/fixtures/pristine/project/demo_01/project.mml: -------------------------------------------------------------------------------- 1 | { 2 | "bounds": [ 3 | -180, 4 | -85.05112877980659, 5 | 180, 6 | 85.05112877980659 7 | ], 8 | "center": [ 9 | 0, 10 | 0, 11 | 2 12 | ], 13 | "format": "png8:m=h", 14 | "interactivity": { 15 | "layer": "world", 16 | "template_teaser": "{{NAME}}", 17 | "template_full": "", 18 | "template_location": "" 19 | }, 20 | "minzoom": 0, 21 | "maxzoom": 22, 22 | "srs": "+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over", 23 | "Stylesheet": [ 24 | "style.mss" 25 | ], 26 | "Layer": [ 27 | { 28 | "id": "world", 29 | "name": "world", 30 | "srs": "+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over", 31 | "geometry": "polygon", 32 | "Datasource": { 33 | "file": "http://tilemill-data.s3.amazonaws.com/world_borders_merc.zip", 34 | "type": "shape" 35 | } 36 | } 37 | ] 38 | } 39 | -------------------------------------------------------------------------------- /test/fixtures/pristine/project/demo_01/style.mss: -------------------------------------------------------------------------------- 1 | Map { 2 | background-color: #fff; 3 | } 4 | 5 | #world { 6 | polygon-fill: #eee; 7 | line-color: #ccc; 8 | line-width: 0.5; 9 | } -------------------------------------------------------------------------------- /test/init.js: -------------------------------------------------------------------------------- 1 | 2 | // global init - run once 3 | before(function(done) { 4 | require('./support/start').reset(function() { 5 | done(); 6 | }); 7 | }); 8 | 9 | -------------------------------------------------------------------------------- /test/tile.test.js: -------------------------------------------------------------------------------- 1 | var assert = require('assert'); 2 | var core; 3 | var tile; 4 | 5 | describe('tile endpoint', function() { 6 | 7 | before(function(done) { 8 | require('./support/start').start(function(command) { 9 | core = command.servers['Core']; 10 | tile = command.servers['Tile']; 11 | done(); 12 | }); 13 | }); 14 | 15 | after(function(done) { 16 | core.close(); 17 | tile.close(); 18 | done(); 19 | }); 20 | 21 | it('should 404 for missing project', function(done) { 22 | assert.response(tile, 23 | { url: '/tile/does_not_exist/0/0/0.png', encoding: 'binary' }, 24 | { body: /Project does not exist/, status: 404 }, 25 | function() { done(); } 26 | ); 27 | }); 28 | it ('should 200 (tile) for existing project', function(done) { 29 | assert.response(tile, 30 | { url: '/tile/demo_01/2/2/1.png', encoding: 'binary' }, 31 | { status: 200 }, 32 | function(res) { 33 | assert.equal(res.body.length, 7983); 34 | done(); 35 | } 36 | ); 37 | }); 38 | it ('should 200 (grid) for existing project', function(done) { 39 | assert.response(tile, 40 | { url: '/tile/demo_01/2/2/1.grid.json' }, 41 | { status: 200 }, 42 | function(res) { 43 | function grid(data) { return data; }; 44 | var data = eval(res.body); 45 | assert.equal(data.grid.length, 64); 46 | assert.equal(data.keys.length, 90); 47 | assert.equal(Object.keys(data.data).length, 89); 48 | assert.equal(data.keys[1], '154'); 49 | assert.equal(data.data['154'].NAME, 'Norway'); 50 | done(); 51 | } 52 | ); 53 | }); 54 | 55 | }); 56 | -------------------------------------------------------------------------------- /views/Datasource.bones: -------------------------------------------------------------------------------- 1 | view = Backbone.View.extend(); 2 | 3 | view.prototype.events = { 4 | 'click a[href=#back]': 'back', 5 | 'click a.showall': 'showAll' 6 | }; 7 | 8 | view.prototype.featureLimit = 100; 9 | 10 | view.prototype.initialize = function(options) { 11 | this.render(); 12 | }; 13 | 14 | view.prototype.back = function() { 15 | $('.palette a[href=#layers]').click(); 16 | return false; 17 | }; 18 | 19 | view.prototype.render = function() { 20 | var features = this.model.get('features'); 21 | var fields = _(this.model.get('fields')).reduce(function(memo, v, k) { 22 | if (_(memo).keys().length < 50) memo[k] = v; 23 | return memo; 24 | }, {}); 25 | this.$('.content').html(templates.Datasource({ 26 | fields: fields, 27 | features: _(features).first(this.featureLimit), 28 | more: _(features).size() > this.featureLimit, 29 | moreFields: _(_(this.model.get('fields')).keys()).difference(_(fields).keys()) 30 | })); 31 | return this; 32 | }; 33 | 34 | view.prototype.showAll = function() { 35 | this.$('a.showall').hide(); 36 | this.$('.content table tbody').append(templates.DatasourceRows({ 37 | fields: this.model.get('fields'), 38 | features: _(this.model.get('features')).rest(this.featureLimit) 39 | })); 40 | return false; 41 | } 42 | 43 | -------------------------------------------------------------------------------- /views/Error.bones: -------------------------------------------------------------------------------- 1 | view = Backbone.View.extend(); 2 | 3 | // Override _ensureElement. 4 | view.prototype._ensureElement = function() { 5 | this.el = this.el || $('#page'); 6 | }; 7 | 8 | view.prototype.initialize = function(options) { 9 | _(this).bindAll('render'); 10 | 11 | // Attempt to handle jqXHR objects. 12 | if (options.responseText) { 13 | try { 14 | options = { content: JSON.parse(options.responseText).message }; 15 | } catch(e) { 16 | options = { content: options.responseText }; 17 | } 18 | } else if (options.status === 0) { 19 | options = { content: 'No response from server.' }; 20 | } else if (typeof options === 'string') { 21 | options = { content: options }; 22 | } else if (options instanceof Error) { 23 | options = { content: options.toString() }; 24 | } 25 | 26 | options = options || {}; 27 | options.content = options.content || {}; 28 | this.options = options; 29 | this.render(); 30 | }; 31 | 32 | view.prototype.render = function() { 33 | $(this.el).html(templates.Error(this.options)); 34 | return this; 35 | }; 36 | 37 | -------------------------------------------------------------------------------- /views/Manual.bones: -------------------------------------------------------------------------------- 1 | view = Backbone.View.extend(); 2 | 3 | view.prototype.initialize = function(options) { 4 | _(this).bindAll('render'); 5 | this.render(); 6 | }; 7 | 8 | view.prototype.render = function() { 9 | $('.bleed .active').removeClass('active'); 10 | $('.bleed .manual').addClass('active'); 11 | 12 | $(this.el).html(templates.Manual({model: this.model, collection: this.collection})); 13 | this.$('.md').each(function() { 14 | var html = $('
      ') 15 | .html((new Showdown.converter()).makeHtml($(this).html())) 16 | .attr('class', $(this).attr('class')) 17 | .attr('id', $(this).attr('id')); 18 | $(this).hide().after(html); 19 | $('h2, h3, h4, h5, h6', html).each(function() { 20 | var heading = this; 21 | var cleaned = $(heading).text().replace(/[\s\W]+/g, '-').toLowerCase(); 22 | $(this).attr('id', 'manual-' + cleaned); 23 | this.className = this.nodeName; 24 | }); 25 | $('a', html).each(function() { $(this).get(0).target = '_blank'; }); 26 | }); 27 | }; 28 | 29 | -------------------------------------------------------------------------------- /views/Preview.bones: -------------------------------------------------------------------------------- 1 | view = Backbone.View.extend(); 2 | 3 | view.prototype.events = { 4 | 'click a.upload': 'upload' 5 | }; 6 | 7 | view.prototype.initialize = function(options) { 8 | _(this).bindAll('render'); 9 | 10 | Bones.utils.fetch({ 11 | preview: new models.Preview({id:this.model.get('filename')}), 12 | config: new models.Config() 13 | }, _(function(err, models) { 14 | if (err) return new views.Modal(err); 15 | this.preview = models.preview; 16 | this.config = models.config; 17 | this.render(); 18 | }).bind(this)); 19 | }; 20 | 21 | view.prototype.render = function() { 22 | this.$('.content').html(templates.Preview({ 23 | model: this.model, 24 | config: this.config 25 | })); 26 | 27 | if (!MM) throw new Error('ModestMaps not found.'); 28 | this.map = new MM.Map('preview', 29 | new wax.mm.connector(this.preview.attributes)); 30 | wax.mm.interaction() 31 | .map(this.map) 32 | .tilejson(this.preview.attributes) 33 | .on(wax.tooltip().parent(this.map.parent).events()); 34 | wax.mm.legend(this.map, this.preview.attributes).appendTo(this.map.parent); 35 | wax.mm.zoombox(this.map); 36 | wax.mm.zoomer(this.map).appendTo(this.map.parent); 37 | 38 | var center = this.preview.get('center'); 39 | this.map.setCenterZoom(new MM.Location( 40 | center[1], 41 | center[0]), 42 | center[2]); 43 | 44 | this.map.setZoomRange( 45 | this.model.get('minzoom'), 46 | this.model.get('maxzoom')); 47 | 48 | return this; 49 | }; 50 | 51 | view.prototype.upload = function(ev) { 52 | (new models.Export({ 53 | filename: this.model.get('filename'), 54 | project: this.model.get('project'), 55 | format: 'upload' 56 | }).save({}, { 57 | success: _(function(model) { 58 | this.collection.add(model); 59 | $('a.close', this.el).click(); 60 | }).bind(this) 61 | })); 62 | return false; 63 | }; 64 | -------------------------------------------------------------------------------- /views/ProjectAdd.bones: -------------------------------------------------------------------------------- 1 | view = Backbone.View.extend(); 2 | 3 | view.prototype.events = { 4 | 'click input[type=submit]': 'save' 5 | }; 6 | 7 | view.prototype.initialize = function(options) { 8 | _(this).bindAll('render', 'save'); 9 | this.render(); 10 | }; 11 | 12 | view.prototype.render = function() { 13 | this.$('.content').html(templates.ProjectAdd(this.model)); 14 | this.$('input[type=text]:first').focus(); 15 | return this; 16 | }; 17 | 18 | view.prototype.save = function() { 19 | var attr = Bones.utils.form(this.$('form'), this.model); 20 | var error = function(m, e) { new views.Modal(e); }; 21 | if (!this.model.set(attr, {error:error})) return false; 22 | 23 | $(this.el).addClass('loading'); 24 | this.model.setDefaults(this.$('input[name=use-default]')[0].checked); 25 | this.model.save({}, { 26 | success: _(function(model) { 27 | Bones.utils.until(model.thumb(), _(function() { 28 | this.model.collection.add(this.model); 29 | $(this.el).removeClass('loading'); 30 | window.location.hash = '#/project/' + this.model.get('id'); 31 | this.$('a[href="#close"]').click(); 32 | }).bind(this)); 33 | }).bind(this), 34 | error:error 35 | }); 36 | return false; 37 | }; 38 | 39 | -------------------------------------------------------------------------------- /views/Projects.bones: -------------------------------------------------------------------------------- 1 | view = Backbone.View.extend({ 2 | events: { 3 | 'click a[href=#add]': 'add', 4 | 'click .delete': 'del' 5 | }, 6 | initialize: function() { 7 | _(this).bindAll('render', 'add', 'del'); 8 | this.collection.bind('add', this.render); 9 | this.collection.bind('remove', this.render); 10 | this.render(); 11 | }, 12 | render: function() { 13 | $('.bleed .active').removeClass('active'); 14 | $('.bleed .projects').addClass('active'); 15 | 16 | $(this.el).html(templates.Projects(this.collection)); 17 | return this; 18 | }, 19 | add: function() { 20 | var model = new models.Project({}, {collection:this.collection}); 21 | new views.ProjectAdd({ el: $('#popup'), model: model }); 22 | }, 23 | del: function(ev) { 24 | var id = $(ev.currentTarget).attr('id'); 25 | var model = this.collection.get(id); 26 | new views.Modal({ 27 | content: _('Are you sure you want to delete "<%=get("name")||id%>?"').template(model), 28 | callback: _(function() { 29 | model.destroy({ 30 | success: _(function() { 31 | this.collection.remove(model); 32 | // Reset the project nav item to be disabled if 33 | // set to the project that is being deleted. 34 | if ($('.bleed .editor').attr('href') === '#/project/' + model.id) 35 | $('.bleed .editor') 36 | .removeAttr('href') 37 | .addClass('disabled'); 38 | }).bind(this), 39 | error: _(function(model, err) { 40 | new views.Modal(err); 41 | }).bind(this) 42 | }); 43 | }).bind(this), 44 | affirmative: 'Delete' 45 | }); 46 | return false; 47 | } 48 | }); 49 | --------------------------------------------------------------------------------