diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..46bc351 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,17 @@ + +Opening a pull request on MapComplete +===================================== + +Hey! Thanks for opening a pull request on Mapcomplete! This probably means you want to add a new theme - if so, please follow the checklist below. +If this pull request is for some other issue, please ignore the template. + +Adding your new theme +--------------------- + +Thanks for taking the time to create your theme and to add it to the main repository! + +To making merging smooth, please make sure that each of the following conditions is met: + +- [ ] The codebase is GPL-licensed. By opening a pull request, the new theme will be GPL too +- [ ] All images are included in the pull request and no images are loaded from an external service (e.g. Wikipedia) +- [ ] The [guidelines on how to make your own theme](https://github.com/pietervdvn/MapComplete/blob/master/Docs/Making_Your_Own_Theme.md) are read and followed \ No newline at end of file diff --git a/.github/workflows/pull_request_check.yml b/.github/workflows/pull_request_check.yml new file mode 100644 index 0000000..efc2907 --- /dev/null +++ b/.github/workflows/pull_request_check.yml @@ -0,0 +1,65 @@ +name: Pull request check +on: + pull_request_target: + types: [opened, edited, synchronize, ready_for_review, review_requested] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - uses: actions/checkout@v2 + - name: Set up Node.js + uses: actions/setup-node@v1.2.0 + env: + ACTIONS_ALLOW_UNSECURE_COMMANDS: 'true' + + - name: install deps + run: npm install + + - name: create generated dir + run: mkdir ./assets/generated + + - name: create stub themes + run: "echo '{\"layers\": [], \"themes\": []}' > ./assets/generated/known_layers_and_themes.json" + + - name: Compile license info + run: npm run generate:licenses + + - name: Compile and validate themes and layers + run: npm run validate:layeroverview + + - name: Validate license info + run: npm run validate:licenses + + - name: Set failure key + run: | + ls + if [[ -f "layer_report.txt" || -f "missing_licenses.txt" ]]; then + echo "Found a report..." + echo "VALIDATION_FAILED=true" >> $GITHUB_ENV + else + echo "VALIDATION_FAILED=false" >> $GITHUB_ENV + fi + + - name: Test variable + run: echo "${{ env.VALIDATION_FAILED }}" + + - name: Archive reports + uses: actions/upload-artifact@v2 + if: >- + env.VALIDATION_FAILED == 'true' + with: + name: reports + path: | + layer_report.txt + missing_licenses.txt + + - name: Comment PR + uses: allthatjazzleo/actions-pull-request-add-comment@master + if: >- + env.VALIDATION_FAILED == 'true' + with: + message: "cat layer_report.txt missing_licenses.txt" + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/.github/workflows/theme_validation.yml b/.github/workflows/theme_validation.yml new file mode 100644 index 0000000..4af37cf --- /dev/null +++ b/.github/workflows/theme_validation.yml @@ -0,0 +1,32 @@ +name: Theme Validation +on: + push: + branches: + - develop + - master + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up Node.js + uses: actions/setup-node@v1.2.0 + env: + ACTIONS_ALLOW_UNSECURE_COMMANDS: 'true' + + - name: install deps + run: npm install + + - name: create generated dir + run: mkdir ./assets/generated + + - name: create stub themes + run: "echo '{\"layers\": [], \"themes\": []}' > ./assets/generated/known_layers_and_themes.json" + + + - name: Compile license info + run: npm run validate:licenses + + - name: Compile themes and layers + run: npm run validate:layeroverview diff --git a/AllTranslationAssets.ts b/AllTranslationAssets.ts index 6552d52..259d261 100644 --- a/AllTranslationAssets.ts +++ b/AllTranslationAssets.ts @@ -67,7 +67,10 @@ export default class AllTranslationAssets { }, openStreetMapIntro: new Translation( {"en":"

An Open Map

Wouldn't it be cool if there was a single map, which everyone could freely use and edit? A single place to store all geo-information? Then, all those websites with different, small and incompatible maps (which are always outdated) wouldn't be needed anymore.

OpenStreetMap is this map. The map data can be used for free (with attribution and publication of changes to that data). On top of that, everyone can freely add new data and fix errors. This website uses OpenStreetMap as well. All the data is from there, and your answers and corrections are added there as well.

A ton of people and application already use OpenStreetMap: Maps.me, OsmAnd, but also the maps at Facebook, Instagram, Apple-maps and Bing-maps are (partly) powered by OpenStreetMap.If you change something here, it'll be reflected in those applications too - after their next update!

","es":"

Un mapa abierto

¿No sería genial si hubiera un solo mapa, que todos pudieran usar y editar libremente?¿Un solo lugar para almacenar toda la información geográfica? Entonces, todos esos sitios web con mapas diferentes, pequeños e incompatibles (que siempre están desactualizados) ya no serían necesarios.

OpenStreetMap es ese mapa. Los datos del mapa se pueden utilizar de forma gratuita (con atribución y publicación de cambios en esos datos).Además de eso, todos pueden agregar libremente nuevos datos y corregir errores. Este sitio web también usa OpenStreetMap. Todos los datos provienen de allí, y tus respuestas y correcciones también se añadirán allí.

Muchas personas y aplicaciones ya usan OpenStreetMap: Maps.me, OsmAnd, pero también los mapas de Facebook, Instagram, Apple y Bing son (en parte) impulsados ​​por OpenStreetMap .Si cambias algo aquí, también se reflejará en esas aplicaciones, en su próxima actualización

","ca":"

Un mapa obert

No seria genial si hagués un únic mapa, que tothom pogués utilitzar i editar lliurement?Un sol lloc on emmagatzemar tota la informació geogràfica? Llavors tots aquests llocs web amb mapes diferents petits i incompatibles (que sempre estaran desactulitzats) ja no serien necessaris.

OpenStreetMap és aquest mapa. Les dades del mapa es poden utilitzar de franc (amb atribució i publicació de canvis en aquestes dades).A més a més, tothom pot agregar lliurement noves dades i corregir errors. De fet, aquest lloc web també fa servir OpenStreetMap. Totes les dades provenen d'allà i les teves respostes i correccions també s'afegiran allà.

Moltes persones i aplicacions ja utilitzen OpenStreetMap: Maps.me, OsmAnd, però també els mapes de Facebook, Instagram, Apple i Bing són (en part) impulsats ​​per OpenStreetMap.Si canvies alguna cosa aquí també es reflectirà en aquestes aplicacions en la seva propera actualització.

","nl":"

Een open kaart

Zou het niet fantastisch zijn als er een open kaart zou zijn die door iedereen aangepast én gebruikt kan worden? Een kaart waar iedereen zijn interesses aan zou kunnen toevoegen? Dan zouden er geen duizend-en-één verschillende kleine kaartjes, websites, ... meer nodig zijn

OpenStreetMap is deze open kaart. Je mag de kaartdata gratis gebruiken (mits bronvermelding en herpublicatie van aanpassingen). Daarenboven mag je de kaart ook gratis aanpassen als je een account maakt. Ook deze website is gebaseerd op OpenStreetMap. Als je hier een vraag beantwoord, gaat het antwoord daar ook naartoe

Tenslotte zijn er reeds vele gebruikers van OpenStreetMap. Denk maar Maps.me, OsmAnd, verschillende gespecialiseerde routeplanners, de achtergrondkaarten op Facebook, Instagram,...
Zelfs Apple Maps en Bing-Maps gebruiken OpenStreetMap in hun kaarten!

Kortom, als je hier een punt toevoegd of een vraag beantwoord, zal dat na een tijdje ook in al dié applicaties te zien zijn.

","fr":"

Une carte ouverte

Ne serait-il pas génial d'avoir sur une carte que tout le monde pourrait éditer ouvertement? Une seule et unique plateforme regroupant toutes les informations geographiques? Ainsi nous n'aurons plus besoin de toutes ces cartes petites et incompatibles cartes (souvent non mises à jour).

OpenStreetMap est la carte qu'il vous faut!. Toutes les données de cette carte peuvent être utilisé gratuitement (avec d'attribution et de publication des changements de données). De plus tout le monde est libre d'ajouter de nouvelles données et de corriger les erreurs. Ce site internet utilise également OpenStreetMap. Toutes les données en proviennent et tous les ajouts et modifications y seront également ajoutés.

De nombreux individus et d'applications utilisent déjà OpenStreetMap: Maps.me, OsmAnd, mais aussi les cartes de Facebook, Instagram, Apple-maps et Bing-maps sont (en partie) supporté par OpenStreetMap. Si vous modifié quelque chose ici, ces changements seront incorporer dans ces applications dès leurs mises à jour!

","gl":"

Un mapa aberto

Non sería xenial se houbera un só mapa, que todos puideran empregar e editar de xeito libre?Un só lugar para almacenar toda a información xeográfica? Entón, todos eses sitios web con mapas diferentes, pequenos e incompatíbeis (que sempre están desactualizados) xa non serían necesarios.

OpenStreetMap é ese mapa. Os datos do mapa pódense empregar de balde (con atribución e publicación de modificacións neses datos).Ademais diso, todos poden engadir de xeito ceibe novos datos e corrixir erros. Este sitio web tamén emprega o OpenStreetMap. Todos os datos proveñen de alí, e as túas respostas e correccións tamén serán engadidas alí.

Moitas persoas e aplicacións xa empregan o OpenStreetMap: Maps.me, OsmAnd, pero tamén os mapas do Facebook, Instagram, Apple e Bing son (en parte) impulsados ​​polo OpenStreetMap.Se mudas algo aquí, tamén será reflexado nesas aplicacións, na súa seguinte actualización!

","de":"

Eine offene Karte

Wäre es nicht toll, wenn es eine offene Karte gäbe, die von jedem angepasst und benutzt werden könnte? Eine Karte, zu der jeder seine Interessen hinzufügen kann? Dann bräuchte man all diese Websites mit unterschiedlichen, kleinen und inkompatiblen Karten (die immer veraltet sind) nicht mehr.

OpenStreetMap ist diese offene Karte. Die Kartendaten können kostenlos verwendet werden (mit Attribution und Veröffentlichung von Änderungen an diesen Daten). Darüber hinaus können Sie die Karte kostenlos ändern und Fehler beheben, wenn Sie ein Konto erstellen. Diese Website basiert ebenfalls auf OpenStreetMap. Wenn Sie eine Frage hier beantworten, geht die Antwort auch dorthin.

Viele Menschen und Anwendungen nutzen OpenStreetMap bereits: Maps.me, OsmAnd, verschiedene spezialisierte Routenplaner, die Hintergrundkarten auf Facebook, Instagram,...
Sogar Apple Maps und Bing Maps verwenden OpenStreetMap in ihren Karten!

Wenn Sie hier einen Punkt hinzufügen oder eine Frage beantworten, wird er nach einer Weile in all diesen Anwendungen sichtbar sein.

"} ), attribution: { attributionTitle: new Translation( {"en":"Attribution notice","nl":"Met dank aan"} ), - attributionContent: new Translation( {"en":"

All data is provided by OpenStreetMap, freely reusable under the Open DataBase License.

Some images are provided by Wikimedia

"} ), + attributionContent: new Translation( {"en":"

All data is provided by OpenStreetMap, freely reusable under the Open DataBase License.

"} ), + themeBy: new Translation( {"en":"Theme maintained by {author}"} ), + iconAttribution: { title: new Translation( {"en":"Used icons"} ), +}, }, sharescreen: { intro: new Translation( {"en":"

Share this map

Share this map by copying the link below and sending it to friends and family:","ca":"

Comparteix aquest mapa

Comparteix aquest mapa copiant l'enllaç de sota i enviant-lo a amics i família:","es":"

Comparte este mapa

Comparte este mapa copiando el enlace de debajo y enviándolo a amigos y familia:","fr":"

Partager cette carte

Partagez cette carte en copiant le lien suivant et envoyez-le à vos amis:","nl":"

Deel deze kaart

Kopieer onderstaande link om deze kaart naar vrienden en familie door te sturen:","gl":"

Comparte este mapa

Comparte este mapa copiando a ligazón de embaixo e enviándoa ás amizades e familia:","de":"

Diese Karte teilen

Sie können diese Karte teilen, indem Sie den untenstehenden Link kopieren und an Freunde und Familie schick"} ), addToHomeScreen: new Translation( {"en":"

Add to your home screen

You can easily add this website to your smartphone home screen for a native feel. Click the 'add to home screen button' in the URL bar to do this.","ca":"

Afegir-lo a la pantalla d'inici

Pots afegir aquesta web a la pantalla d'inici del teu smartphone per a que es vegi més nadiu. Apreta al botó 'afegir a l'inici' a la barra d'adreces URL per fer-ho.","es":"

Añadir a la pantalla de inicio

Puedes añadir esta web en la pantalla de inicio de tu smartphone para que se vea más nativo. Aprieta el botón 'añadir a inicio' en la barra de direcciones URL para hacerlo.","fr":"

Ajouter à votre page d'accueil

Vous pouvez facilement ajouter la carte à votre écran d'accueil de téléphone. Cliquer sur le boutton 'ajouter à l'ecran d'accueil' dans la barre d'adresse pour éffectuer cette tâche.","gl":"

Engadir á pantalla de inicio

Podes engadir esta web na pantalla de inicio do teu smartphone para que se vexa máis nativo. Preme o botón 'engadir ó inicio' na barra de enderezos URL para facelo.","nl":"

Voeg toe aan je thuis-scherm

Je kan deze website aan je thuisscherm van je smartphone toevoegen voor een native feel","de":"

Zum Startbildschirm hinzufügen

Sie können diese Website einfach zum Startbildschirm Ihres Smartphones hinzufügen, um ein natives Gefühl zu erhalten. Klicken Sie dazu in der URL-Leiste auf die Schaltfläche 'Zum Startbildschirm hinzufügen'."} ), @@ -99,7 +102,7 @@ export default class AllTranslationAssets { getStartedNewAccount: new Translation( {"en":" or create a new account","nl":" of maak een nieuwe account aan ","fr":" ou enregistrez-vous","es":" o crea una nueva cuenta","ca":" o crea un nou compte","gl":" ou crea unha nova conta","de":" oder ein neues Konto anlegen"} ), noTagsSelected: new Translation( {"en":"No tags selected","es":"No se han seleccionado etiquetas","ca":"No s'han seleccionat etiquetes","gl":"Non se seleccionaron etiquetas","nl":"Geen tags geselecteerd","fr":"Aucune balise sélectionnée","de":"Keine Tags ausgewählt"} ), customThemeIntro: new Translation( {"en":"

Custom themes

These are previously visited user-generated themes.","nl":"

Onofficiële thema's

De onderstaande thema's heb je eerder bezocht en zijn gemaakt door andere OpenStreetMappers.","fr":"

Thèmes personnalisés

Vous avez déjà visité ces thèmes personnalisés.","gl":"

Temas personalizados

Estes son temas xerados por usuarios previamente visitados.","de":"

Kundenspezifische Themen

Dies sind zuvor besuchte benutzergenerierte Themen"} ), - aboutMapcomplete: new Translation( {"en":"

About MapComplete

MapComplete is an OpenStreetMap editor that is meant to help everyone to easily add information on a single theme.

Only features relevant to a single theme are shown with a few predefined questions, in order to keep things simple and extremly user-friendly.The theme maintainer can also choose a language for the interface, choose to disable elements or even to embed it into a different website without any UI-element at all.

However, another important part of MapComplete is to always offer the next step to learn more about OpenStreetMap:

Do you notice an issue with MapComplete? Do you have a feature request? Do you want to help translating? Head over to the source code or issue tracker. Follow the edit count on OsmCha

","nl":"

Over MapComplete

MapComplete is een OpenStreetMap-editor om eenvoudig informatie toe te voegen over één enkel onderwerp.

Om de editor zo simpel en gebruiksvriendelijk mogelijk te houden, worden enkel objecten relevant voor het thema getoond.Voor deze objecten kunnen dan vragen beantwoord worden, of men kan een nieuw punt van dit thema toevoegen.De maker van het thema kan er ook voor opteren om een aantal elementen van de gebruikersinterface uit te schakelen of de taal ervan in te stellen.

Een ander belangrijk aspect is om bezoekers stap voor stap meer te leren over OpenStreetMap:

Merk je een bug of wil je een extra feature? Wil je helpen vertalen? Bezoek dan de broncode en issue tracker. Volg de edits op OsmCha

","de":"

Über MapComplete

MapComplete ist ein OpenStreetMap-Editor, der jedem helfen soll, auf einfache Weise Informationen zu einem Einzelthema hinzuzufügen.

Nur Merkmale, die für ein einzelnes Thema relevant sind, werden mit einigen vordefinierten Fragen gezeigt, um die Dinge einfach und extrem benutzerfreundlich zu halten.Der Themen-Betreuer kann auch eine Sprache für die Schnittstelle wählen, Elemente deaktivieren oder sogar in eine andere Website ohne jegliches UI-Element einbetten.

Ein weiterer wichtiger Teil von MapComplete ist jedoch, immer den nächsten Schritt anzubietenum mehr über OpenStreetMap zu erfahren:

Fällt Ihnen ein Problem mit MapComplete auf? Haben Sie einen Feature-Wunsch? Wollen Sie beim Übersetzen helfen? Gehen Sie zum Quellcode oder zur Problemverfolgung.

"} ), + aboutMapcomplete: new Translation( {"en":"

About MapComplete

With MapComplete you can enrich OpenStreetMap with information on a single theme.

MapComplete asks a few questions about features relevant to the theme. Answer the questions, and in a few minutes your information will be available around the globe!

The theme maintainer defines the displayed elements, questions and languages for the theme.

Find out more

MapComplete always offers the next step to learn more about OpenStreetMap:

Did you notice an issue with MapComplete? Do you have a feature request? Do you want to help translate? Head over to the source code or issue tracker. Follow the edit count on OsmCha

","nl":"

Over MapComplete

MapComplete is een OpenStreetMap-editor om eenvoudig informatie toe te voegen over één enkel onderwerp.

Om de editor zo simpel en gebruiksvriendelijk mogelijk te houden, worden enkel objecten relevant voor het thema getoond.Voor deze objecten kunnen dan vragen beantwoord worden, of men kan een nieuw punt van dit thema toevoegen.De maker van het thema kan er ook voor opteren om een aantal elementen van de gebruikersinterface uit te schakelen of de taal ervan in te stellen.

Een ander belangrijk aspect is om bezoekers stap voor stap meer te leren over OpenStreetMap:

Merk je een bug of wil je een extra feature? Wil je helpen vertalen? Bezoek dan de broncode en issue tracker. Volg de edits op OsmCha

","de":"

Über MapComplete

MapComplete ist ein OpenStreetMap-Editor, der jedem helfen soll, auf einfache Weise Informationen zu einem Einzelthema hinzuzufügen.

Nur Merkmale, die für ein einzelnes Thema relevant sind, werden mit einigen vordefinierten Fragen gezeigt, um die Dinge einfach und extrem benutzerfreundlich zu halten.Der Themen-Betreuer kann auch eine Sprache für die Schnittstelle wählen, Elemente deaktivieren oder sogar in eine andere Website ohne jegliches UI-Element einbetten.

Ein weiterer wichtiger Teil von MapComplete ist jedoch, immer den nächsten Schritt anzubietenum mehr über OpenStreetMap zu erfahren:

Fällt Ihnen ein Problem mit MapComplete auf? Haben Sie einen Feature-Wunsch? Wollen Sie beim Übersetzen helfen? Gehen Sie zum Quellcode oder zur Problemverfolgung.

"} ), backgroundMap: new Translation( {"en":"Background map","ca":"Mapa de fons","es":"Mapa de fondo","nl":"Achtergrondkaart","fr":"Carte de fonds","de":"Hintergrundkarte"} ), layerSelection: { zoomInToSeeThisLayer: new Translation( {"en":"Zoom in to see this layer","ca":"Amplia per veure aquesta capa","es":"Amplía para ver esta capa","nl":"Vergroot de kaart om deze laag te zien","fr":"Aggrandissez la carte pour voir cette couche","de":"Vergrößern, um diese Ebene zu sehen"} ), title: new Translation( {"en":"Select layers","nl":"Selecteer lagen"} ), diff --git a/Customizations/AllKnownLayers.ts b/Customizations/AllKnownLayers.ts index ba5795d..ae059e5 100644 --- a/Customizations/AllKnownLayers.ts +++ b/Customizations/AllKnownLayers.ts @@ -1,90 +1,35 @@ -import * as drinkingWater from "../assets/layers/drinking_water/drinking_water.json"; -import * as ghostbikes from "../assets/layers/ghost_bike/ghost_bike.json" -import * as viewpoint from "../assets/layers/viewpoint/viewpoint.json" -import * as bike_parking from "../assets/layers/bike_parking/bike_parking.json" -import * as bike_repair_station from "../assets/layers/bike_repair_station/bike_repair_station.json" -import * as birdhides from "../assets/layers/bird_hide/birdhides.json" -import * as nature_reserve from "../assets/layers/nature_reserve/nature_reserve.json" -import * as bike_cafes from "../assets/layers/bike_cafe/bike_cafes.json" -import * as bike_monitoring_station from "../assets/layers/bike_monitoring_station/bike_monitoring_station.json" -import * as cycling_themed_objects from "../assets/layers/cycling_themed_object/cycling_themed_objects.json" -import * as bike_shops from "../assets/layers/bike_shop/bike_shop.json" -import * as bike_cleaning from "../assets/layers/bike_cleaning/bike_cleaning.json" -import * as bicycle_library from "../assets/layers/bicycle_library/bicycle_library.json" -import * as bicycle_tube_vending_machine from "../assets/layers/bicycle_tube_vending_machine/bicycle_tube_vending_machine.json" -import * as maps from "../assets/layers/maps/maps.json" -import * as information_boards from "../assets/layers/information_board/information_board.json" -import * as direction from "../assets/layers/direction/direction.json" -import * as surveillance_camera from "../assets/layers/surveillance_cameras/surveillance_cameras.json" -import * as toilets from "../assets/layers/toilets/toilets.json" -import * as bookcases from "../assets/layers/public_bookcases/public_bookcases.json" -import * as tree_nodes from "../assets/layers/trees/tree_nodes.json" -import * as benches from "../assets/layers/benches/benches.json" -import * as benches_at_pt from "../assets/layers/benches/benches_at_pt.json" -import * as picnic_tables from "../assets/layers/benches/picnic_tables.json" -import * as play_forest from "../assets/layers/play_forest/play_forest.json" -import * as playground from "../assets/layers/playground/playground.json" -import * as sport_pitch from "../assets/layers/sport_pitch/sport_pitch.json" -import * as slow_roads from "../assets/layers/slow_roads/slow_roads.json" import LayerConfig from "./JSON/LayerConfig"; import {LayerConfigJson} from "./JSON/LayerConfigJson"; -import * as grass_in_parks from "../assets/layers/village_green/grass_in_parks.json" -import * as village_green from "../assets/layers/village_green/village_green.json" +import * as known_layers from "../assets/generated/known_layers_and_themes.json" +import {Utils} from "../Utils"; export default class AllKnownLayers { - private static sharedLayersListRaw : LayerConfigJson[] = [ - drinkingWater, - ghostbikes, - viewpoint, - bike_parking, - bike_repair_station, - bike_monitoring_station, - birdhides, - nature_reserve, - bike_cafes, - bicycle_library, - cycling_themed_objects, - bike_shops, - bike_cleaning, - bicycle_tube_vending_machine, - maps, - direction, - information_boards, - toilets, - bookcases, - surveillance_camera, - tree_nodes, - benches, - benches_at_pt, - picnic_tables, - play_forest, - playground, - sport_pitch, - slow_roads, - grass_in_parks, - village_green - ]; - // Must be below the list... public static sharedLayers: Map = AllKnownLayers.getSharedLayers(); public static sharedLayersJson: Map = AllKnownLayers.getSharedLayersJson(); - + private static sharedLayersListRaw: LayerConfigJson[] = known_layers.layers; private static getSharedLayers(): Map { const sharedLayers = new Map(); - for (const layer of AllKnownLayers.sharedLayersListRaw) { - const parsed = new LayerConfig(layer, "shared_layers") - sharedLayers.set(layer.id, parsed); - sharedLayers[layer.id] = parsed; + for (const layer of known_layers.layers) { + try { + const parsed = new LayerConfig(layer, "shared_layers") + sharedLayers.set(layer.id, parsed); + sharedLayers[layer.id] = parsed; + } catch (e) { + if (!Utils.runningFromConsole) { + console.error("CRITICAL: Could not parse a layer configuration!", layer.id, " due to", e) + } + } } return sharedLayers; } private static getSharedLayersJson(): Map { const sharedLayers = new Map(); - for (const layer of AllKnownLayers.sharedLayersListRaw) { + for (const layer of known_layers.layers) { sharedLayers.set(layer.id, layer); sharedLayers[layer.id] = layer; } diff --git a/Customizations/AllKnownLayouts.ts b/Customizations/AllKnownLayouts.ts index 488c21c..87d42f1 100644 --- a/Customizations/AllKnownLayouts.ts +++ b/Customizations/AllKnownLayouts.ts @@ -1,74 +1,29 @@ -import * as bookcases from "../assets/themes/bookcases/Bookcases.json"; -import * as aed from "../assets/themes/aed/aed.json"; -import * as toilets from "../assets/themes/toilets/toilets.json"; -import * as artworks from "../assets/themes/artwork/artwork.json"; -import * as cyclestreets from "../assets/themes/cyclestreets/cyclestreets.json"; -import * as ghostbikes from "../assets/themes/ghostbikes/ghostbikes.json" -import * as cyclofix from "../assets/themes/cyclofix/cyclofix.json" -import * as buurtnatuur from "../assets/themes/buurtnatuur/buurtnatuur.json" -import * as nature from "../assets/themes/nature/nature.json" -import * as maps from "../assets/themes/maps/maps.json" -import * as shops from "../assets/themes/shops/shops.json" -import * as bike_monitoring_stations from "../assets/themes/bike_monitoring_station/bike_monitoring_stations.json" -import * as fritures from "../assets/themes/fritures/fritures.json" -import * as benches from "../assets/themes/benches/benches.json"; -import * as charging_stations from "../assets/themes/charging_stations/charging_stations.json" -import * as widths from "../assets/themes/widths/width.json" -import * as drinking_water from "../assets/themes/drinking_water/drinking_water.json" -import * as climbing from "../assets/themes/climbing/climbing.json" -import * as surveillance_cameras from "../assets/themes/surveillance_cameras/surveillance_cameras.json" -import * as trees from "../assets/themes/trees/trees.json" -import * as personal from "../assets/themes/personalLayout/personalLayout.json" -import * as playgrounds from "../assets/themes/playgrounds/playgrounds.json" -import * as bicycle_lib from "../assets/themes/bicycle_library/bicycle_library.json" -import * as campersites from "../assets/themes/campersites/campersites.json" -import * as play_forests from "../assets/themes/play_forests/play_forests.json" -import * as speelplekken from "../assets/themes/speelplekken/speelplekken.json" -import * as sport_pitches from "../assets/themes/sport_pitches/sport_pitches.json" -import * as grb from "../assets/themes/grb.json" -import * as facadegardens from "../assets/themes/facadegardens/facadegardens.json" -import LayerConfig from "./JSON/LayerConfig"; import LayoutConfig from "./JSON/LayoutConfig"; import AllKnownLayers from "./AllKnownLayers"; - +import * as known_themes from "../assets/generated/known_layers_and_themes.json" +import {LayoutConfigJson} from "./JSON/LayoutConfigJson"; +import * as all_layouts from "../assets/generated/known_layers_and_themes.json" export class AllKnownLayouts { - public static allLayers: Map = undefined; - public static layoutsList: LayoutConfig[] = [ - new LayoutConfig(personal), - AllKnownLayouts.GenerateCycloFix(), - new LayoutConfig(aed), - new LayoutConfig(bookcases), - new LayoutConfig(toilets), - new LayoutConfig(artworks), - new LayoutConfig(ghostbikes), - new LayoutConfig(shops), - new LayoutConfig(drinking_water), - new LayoutConfig(nature), - new LayoutConfig(cyclestreets), - new LayoutConfig(bicycle_lib), - new LayoutConfig(maps), - new LayoutConfig(fritures), - new LayoutConfig(benches), - new LayoutConfig(charging_stations), - new LayoutConfig(widths), - new LayoutConfig(buurtnatuur), - new LayoutConfig(bike_monitoring_stations), - new LayoutConfig(surveillance_cameras), - new LayoutConfig(climbing), - new LayoutConfig(playgrounds), - new LayoutConfig(trees), - new LayoutConfig(campersites), - new LayoutConfig(play_forests), - new LayoutConfig(speelplekken), - new LayoutConfig(sport_pitches), - new LayoutConfig(grb), - new LayoutConfig(facadegardens) - ]; - public static allSets: Map = AllKnownLayouts.AllLayouts(); - private static GenerateCycloFix(): LayoutConfig { - const layout = new LayoutConfig(cyclofix) + public static allKnownLayouts: Map = AllKnownLayouts.AllLayouts(); + public static layoutsList: LayoutConfig[] = AllKnownLayouts.GenerateOrderedList(AllKnownLayouts.allKnownLayouts); + + private static GenerateOrderedList(allKnownLayouts: Map): LayoutConfig[] { + const keys = ["personal", "cyclofix", "bookcases", "toilets", "aed"] + const list = [] + for (const key of keys) { + list.push(allKnownLayouts.get(key)) + } + allKnownLayouts.forEach((layout, key) => { + if (keys.indexOf(key) < 0) { + list.push(layout) + } + }) + return list; + } + + private static AddGhostBikes(layout: LayoutConfig): LayoutConfig { const now = new Date(); const m = now.getMonth() + 1; const day = new Date().getDate() + 1; @@ -86,8 +41,15 @@ export class AllKnownLayouts { } private static AllLayouts(): Map { - this.allLayers = new Map(); - for (const layout of this.layoutsList) { + const dict: Map = new Map(); + for (const layoutConfigJson of known_themes.themes) { + const layout = new LayoutConfig(layoutConfigJson, true) + + if (layout.id === "cyclofix") { + AllKnownLayouts.AddGhostBikes(layout) + } + dict.set(layout.id, layout) + for (let i = 0; i < layout.layers.length; i++) { let layer = layout.layers[i]; if (typeof (layer) === "string") { @@ -98,20 +60,9 @@ export class AllKnownLayouts { } } - if (this.allLayers[layer.id] !== undefined) { - continue; - } - this.allLayers[layer.id] = layer; - this.allLayers[layer.id.toLowerCase()] = layer; } } - - const allSets: Map = new Map(); - for (const layout of this.layoutsList) { - allSets[layout.id] = layout; - allSets[layout.id.toLowerCase()] = layout; - } - return allSets; + return dict; } } diff --git a/Customizations/JSON/LayerConfig.ts b/Customizations/JSON/LayerConfig.ts index 7d85a61..45aae95 100644 --- a/Customizations/JSON/LayerConfig.ts +++ b/Customizations/JSON/LayerConfig.ts @@ -7,6 +7,7 @@ import {TagRenderingConfigJson} from "./TagRenderingConfigJson"; import {Translation} from "../../UI/i18n/Translation"; import Img from "../../UI/Base/Img"; import Svg from "../../Svg"; + import {Utils} from "../../Utils"; import Combine from "../../UI/Base/Combine"; import {VariableUiElement} from "../../UI/Base/VariableUIElement"; @@ -17,6 +18,7 @@ import {SubstitutedTranslation} from "../../UI/SubstitutedTranslation"; import SourceConfig from "./SourceConfig"; import {TagsFilter} from "../../Logic/Tags/TagsFilter"; import {Tag} from "../../Logic/Tags/Tag"; +import SubstitutingTag from "../../Logic/Tags/SubstitutingTag"; export default class LayerConfig { @@ -40,6 +42,7 @@ export default class LayerConfig { icon: TagRenderingConfig; iconOverlays: { if: TagsFilter, then: TagRenderingConfig, badge: boolean }[] iconSize: TagRenderingConfig; + label: TagRenderingConfig; rotation: TagRenderingConfig; color: TagRenderingConfig; width: TagRenderingConfig; @@ -212,14 +215,15 @@ export default class LayerConfig { } this.isShown = tr("isShown", "yes"); this.iconSize = tr("iconSize", "40,40,center"); + this.label = tr("label", "") this.color = tr("color", "#0000ff"); this.width = tr("width", "7"); this.rotation = tr("rotation", "0"); this.dashArray = tr("dashArray", ""); - if(json["showIf"] !== undefined){ - throw "Invalid key on layerconfig "+this.id+": showIf. Did you mean 'isShown' instead?"; + if (json["showIf"] !== undefined) { + throw "Invalid key on layerconfig " + this.id + ": showIf. Did you mean 'isShown' instead?"; } } @@ -307,7 +311,7 @@ export default class LayerConfig { function render(tr: TagRenderingConfig, deflt?: string) { const str = (tr?.GetRenderValue(tags.data)?.txt ?? deflt); - return SubstitutedTranslation.SubstituteKeys(str, tags.data); + return SubstitutedTranslation.SubstituteKeys(str, tags.data).replace(/{.*}/g, ""); } const iconSize = render(this.iconSize, "40,40,center").split(","); @@ -321,7 +325,7 @@ export default class LayerConfig { const weight = rendernum(this.width, 5); const iconW = num(iconSize[0]); - const iconH = num(iconSize[1]); + let iconH = num(iconSize[1]); const mode = iconSize[2] ?? "center" let anchorW = iconW / 2; @@ -343,15 +347,15 @@ export default class LayerConfig { const iconUrlStatic = render(this.icon); const self = this; const mappedHtml = tags.map(tgs => { - // What do you mean, 'tgs' is never read? - // It is read implicitly in the 'render' method - const iconUrl = render(self.icon); - const rotation = render(self.rotation, "0deg"); - - let htmlParts: UIElement[] = []; - let sourceParts = iconUrl.split(";"); - function genHtmlFromString(sourcePart: string): UIElement { + if (sourcePart.indexOf("html:") == 0) { + // We use § as a replacement for ; + const html = sourcePart.substring("html:".length) + const inner = new FixedUiElement(SubstitutingTag.substituteString(html, tgs)).SetClass("block w-min text-center") + const outer = new Combine([inner]).SetClass("flex flex-col items-center") + return outer; + } + const style = `width:100%;height:100%;transform: rotate( ${rotation} );display:block;position: absolute; top: 0; left: 0`; let html: UIElement = new FixedUiElement(``); const match = sourcePart.match(/([a-zA-Z0-9_]*):([^;]*)/) @@ -365,11 +369,17 @@ export default class LayerConfig { } + // What do you mean, 'tgs' is never read? + // It is read implicitly in the 'render' method + const iconUrl = render(self.icon); + const rotation = render(self.rotation, "0deg"); + + let htmlParts: UIElement[] = []; + let sourceParts = Utils.NoNull(iconUrl.split(";").filter(prt => prt != "")); for (const sourcePart of sourceParts) { htmlParts.push(genHtmlFromString(sourcePart)) } - let badges = []; for (const iconOverlay of self.iconOverlays) { if (!iconOverlay.if.matchesProperties(tgs)) { @@ -377,7 +387,7 @@ export default class LayerConfig { } if (iconOverlay.badge) { const badgeParts: UIElement[] = []; - const partDefs = iconOverlay.then.GetRenderValue(tgs).txt.split(";"); + const partDefs = iconOverlay.then.GetRenderValue(tgs).txt.split(";").filter(prt => prt != ""); for (const badgePartStr of partDefs) { badgeParts.push(genHtmlFromString(badgePartStr)) @@ -399,6 +409,16 @@ export default class LayerConfig { .SetStyle("display:flex;height:50%;width:100%;position:absolute;top:50%;left:50%;"); htmlParts.push(badgesComponent) } + + if(sourceParts.length ==0){iconH = 0} + + const label = self.label.GetRenderValue(tgs)?.Subs(tgs) + .SetClass("block w-min text-center") + .SetStyle("margin-top: "+(iconH + 2) +"px") + console.log("Generating label gave ", label, " source: ", self.label, "tags: ", tgs) + if (label !== undefined) { + htmlParts.push(new Combine([label]).SetClass("flex flex-col items-center")) + } return new Combine(htmlParts).Render(); }) @@ -419,5 +439,23 @@ export default class LayerConfig { }; } + public ExtractImages(): Set { + const parts: Set[] = [] + parts.push(...this.tagRenderings?.map(tr => tr.ExtractImages(false))) + parts.push(...this.titleIcons?.map(tr => tr.ExtractImages(true))) + parts.push(this.icon?.ExtractImages(true)) + parts.push(...this.iconOverlays?.map(overlay => overlay.then.ExtractImages(true))) + for (const preset of this.presets) { + parts.push(new Set(preset.description?.ExtractImages(false))) + } + + const allIcons = new Set(); + for (const part of parts) { + part?.forEach(allIcons.add, allIcons) + } + + return allIcons; + } + } \ No newline at end of file diff --git a/Customizations/JSON/LayerConfigJson.ts b/Customizations/JSON/LayerConfigJson.ts index b21bb3f..34d0a8c 100644 --- a/Customizations/JSON/LayerConfigJson.ts +++ b/Customizations/JSON/LayerConfigJson.ts @@ -105,6 +105,7 @@ export interface LayerConfigJson { * As a result, on could use a generic pin, then overlay it with a specific icon. * To make things even more practical, one can use all svgs from the folder "assets/svg" and _substitute the color_ in it. * E.g. to draw a red pin, use "pin:#f00", to have a green circle with your icon on top, use `circle:#0f0;` + * */ icon?: string | TagRenderingConfigJson; @@ -128,7 +129,12 @@ export interface LayerConfigJson { * Usage: as if it were a css property for 'rotate', thus has to end with 'deg', e.g. `90deg`, `{direction}deg`, `calc(90deg - {camera:direction}deg)`` */ rotation?: string | TagRenderingConfigJson; - + /** + * A HTML-fragment that is shown at the center of the icon, for example: + *
{name}
+ */ + label?: string | TagRenderingConfigJson ; + /** * The color for way-elements and SVG-elements. * If the value starts with "--", the style of the body element will be queried for the corresponding variable instead diff --git a/Customizations/JSON/LayoutConfig.ts b/Customizations/JSON/LayoutConfig.ts index 7e587ae..64cfc84 100644 --- a/Customizations/JSON/LayoutConfig.ts +++ b/Customizations/JSON/LayoutConfig.ts @@ -9,6 +9,7 @@ import {Utils} from "../../Utils"; export default class LayoutConfig { public readonly id: string; public readonly maintainer: string; + public readonly credits?: string; public readonly changesetmessage?: string; public readonly version: string; public readonly language: string[]; @@ -48,6 +49,7 @@ export default class LayoutConfig { this.id = json.id; context = (context ?? "") + "." + this.id; this.maintainer = json.maintainer; + this.credits = json.credits; this.changesetmessage = json.changesetmessage; this.version = json.version; this.language = []; @@ -182,4 +184,14 @@ export default class LayoutConfig { custom.splice(0, 0, msg); return custom; } + + public ExtractImages() : Set{ + const icons = new Set() + for (const layer of this.layers) { + layer.ExtractImages().forEach(icons.add, icons) + } + icons.add(this.icon) + icons.add(this.socialImage) + return icons + } } \ No newline at end of file diff --git a/Customizations/JSON/LayoutConfigJson.ts b/Customizations/JSON/LayoutConfigJson.ts index 65f4150..0b63c72 100644 --- a/Customizations/JSON/LayoutConfigJson.ts +++ b/Customizations/JSON/LayoutConfigJson.ts @@ -24,6 +24,12 @@ export interface LayoutConfigJson { * 'cyclestreets' which become 'cyclestreets.html' */ id: string; + + /** + * Who helped to create this theme and should be attributed? + */ + credits?: string; + /** * Who does maintian this preset? */ diff --git a/Customizations/JSON/TagRenderingConfig.ts b/Customizations/JSON/TagRenderingConfig.ts index c550a30..05661b7 100644 --- a/Customizations/JSON/TagRenderingConfig.ts +++ b/Customizations/JSON/TagRenderingConfig.ts @@ -70,7 +70,7 @@ export default class TagRenderingConfig { addExtraTags: json.freeform.addExtraTags?.map((tg, i) => FromJSON.Tag(tg, `${context}.extratag[${i}]`)) ?? [] } - if(json.freeform["extraTags"] !== undefined){ + if (json.freeform["extraTags"] !== undefined) { throw `Freeform.extraTags is defined. This should probably be 'freeform.addExtraTag' (at ${context})` } if (this.freeform.key === undefined || this.freeform.key === "") { @@ -90,6 +90,9 @@ export default class TagRenderingConfig { this.multiAnswer = json.multiAnswer ?? false if (json.mappings) { + if(!Array.isArray(json.mappings)){ + throw "Tagrendering has a 'mappings'-object, but expected a list ("+context+")" + } this.mappings = json.mappings.map((mapping, i) => { @@ -254,5 +257,16 @@ export default class TagRenderingConfig { return undefined; } + public ExtractImages(isIcon: boolean): Set { + + const usedIcons = new Set() + this.render?.ExtractImages(isIcon)?.forEach(usedIcons.add, usedIcons) + + for (const mapping of this.mappings ?? []) { + mapping.then.ExtractImages(isIcon).forEach(usedIcons.add, usedIcons) + } + + return usedIcons; + } } \ No newline at end of file diff --git a/Customizations/JSON/TagRenderingConfigJson.ts b/Customizations/JSON/TagRenderingConfigJson.ts index 8d61296..cf36f66 100644 --- a/Customizations/JSON/TagRenderingConfigJson.ts +++ b/Customizations/JSON/TagRenderingConfigJson.ts @@ -1,11 +1,15 @@ import {AndOrTagConfigJson} from "./TagConfigJson"; +/** + * A TagRenderingConfigJson is a single piece of code which converts one ore more tags into a HTML-snippet. + * If the desired tags are missing and a question is defined, a question will be shown instead. + */ export interface TagRenderingConfigJson { /** * Renders this value. Note that "{key}"-parts are substituted by the corresponding values of the element. * If neither 'textFieldQuestion' nor 'mappings' are defined, this text is simply shown as default value. * - * Note that this is a HTML-interpreted value, so you can add links as e.g. {website} + * Note that this is a HTML-interpreted value, so you can add links as e.g. '{website}' or include images such as `This is of type A
` */ render?: string | any, @@ -139,4 +143,4 @@ export interface TagRenderingConfigJson { * However, it will _only_ be shown if it matches the overpass-tags of the layer it was originally defined in. */ roaming?: boolean -} \ No newline at end of file +} diff --git a/Docs/CalculatedTags.md b/Docs/CalculatedTags.md index 9731592..d531ca3 100644 --- a/Docs/CalculatedTags.md +++ b/Docs/CalculatedTags.md @@ -34,7 +34,7 @@ Adds the time that the data got loaded - pretty much the time of downloading fro Calculating tags with Javascript -------------------------------- -In some cases, it is useful to have some tags calculated based on other properties. Some useful tags are available by default (e.g. **\_lat**, **lon**, **\_country**), as detailed above. +In some cases, it is useful to have some tags calculated based on other properties. Some useful tags are available by default (e.g. **lat**, **lon**, **\_country**), as detailed above. It is also possible to calculate your own tags - but this requires some javascript knowledge. @@ -46,11 +46,29 @@ Before proceeding, some warnings: In the layer object, add a field **calculatedTags**, e.g.: -"calculatedTags": { "\_someKey": "javascript-expression", "name": "feat.properties.name ?? feat.properties.ref ?? feat.properties.operator", "\_distanceCloserThen3Km": "feat.distanceTo( some\_lon, some\_lat) < 3 ? 'yes' : 'no'" } +"calculatedTags": \[ "\_someKey=javascript-expression", "name=feat.properties.name ?? feat.properties.ref ?? feat.properties.operator", "\_distanceCloserThen3Km=feat.distanceTo( some\_lon, some\_lat) < 3 ? 'yes' : 'no'" \] + +The above code will be executed for every feature in the layer. The feature is accessible as **feat** and is an amended geojson object: - **area** contains the surface area (in square meters) of the object - **lat** and **lon** contain the latitude and longitude Some advanced functions are available on **feat** as well: + +* distanceTo +* overlapWith +* closest ### distanceTo Calculates the distance between the feature and a specified point * longitude -* latitude \ No newline at end of file +* latitude + +### overlapWith + +Gives a list of features from the specified layer which this feature overlaps with, the amount of overlap in m². The returned value is **{ feat: GeoJSONFeature, overlap: number}** + +* ...layerIds - one or more layer ids of the layer from which every feature is checked for overlap) + +### closest + +Given either a list of geojson features or a single layer name, gives the single object which is nearest to the feature. In the case of ways/polygons, only the centerpoint is considered. + +* list of features \ No newline at end of file diff --git a/Docs/Making_Your_Own_Theme.md b/Docs/Making_Your_Own_Theme.md index adfb9d5..148b17e 100644 --- a/Docs/Making_Your_Own_Theme.md +++ b/Docs/Making_Your_Own_Theme.md @@ -50,17 +50,19 @@ The preferred way to add your theme is via a Pull Request. A Pull Request is les 1) Fork this repository 2) Go to `assets/themes` and create a new directory `yourtheme` 3) Create a new file `yourtheme.json`, paste the theme configuration in there. You can find your theme configuration in the customThemeBuilder (the tab with the *Floppy disk* icon) -4) Copy all the images into this new directory: external assets can suddenly break and leak privacy - - Make sure the license is suitable, preferable a Creative Commons license. Attribution can be added at the bottom of this document - - If an SVG version is available, use the SVG version - - Make sure all the links in `yourtheme.json` are updated. You can use `./assets/themes/yourtheme/yourimage.svg` instead of the HTML link +4) Copy all the images into this new directory. **No external sources are allowed!** External image sources leak privacy or can break. + - Make sure the license is suitable, preferable a Creative Commons license or CC0-license. + - If an SVG version is available, use the SVG version + - Make sure all the links in `yourtheme.json` are updated. You can use `./assets/themes/yourtheme/yourimage.svg` instead of the HTML link + - Create a file `license_info.json` in the theme directory, which contains metadata on every artwork source 5) Add your theme to the code base: - Open [AllKnownLayouts.ts](https://github.com/pietervdvn/MapComplete/blob/master/Customizations/AllKnownLayouts.ts) - Add an import statement, e.g. `import * as yourtheme from "../assets/themes/yourtheme/yourthemes.json";` - Add your theme to the `LayoutsList`, by adding a line `new LayoutConfig(yourtheme)` - 6) Test your theme: run the project as described [above](../README.md#Dev) - 7) Happy with your theme? Time to open a Pull Request! - 8) Thanks a lot for improving MapComplete! + 6) Add some finishing touches, such as a social image. See [this blog post](https://www.h3xed.com/web-and-internet/how-to-use-og-image-meta-tag-facebook-reddit) for some hints + 7) Test your theme: run the project as described [above](../README.md#Dev) + 8) Happy with your theme? Time to open a Pull Request! + 9) Thanks a lot for improving MapComplete! The .JSON-format @@ -84,6 +86,17 @@ Every field is documented in the source code itself - you can find them here: There are few tags available that are calculated for convenience - e.g. the country an object is located at. [An overview of all these metatags is available here](Docs/CalculatedTags.md) + Some hints +------------ + +### Everything is HTML + +All the texts are actually *HTML*-snippets, so you can use `` to add bold, or `` to add images to mappings or tagrenderings. + +Some remarks: + +- links are disabled when answering a question (e.g. a link in a mapping) as it should trigger the answer - not trigger to open the link. +- If you include images, e.g. to clarify a type, make sure these are _icons_ or _diagrams_ - not actual pictures! If users see a picture, they think it is a picture of _that actual object_, not a type to clarify the type. An icon is however perceived as something more abstract. Some pitfalls --------------- @@ -128,4 +141,6 @@ For example, in the [cyclofix-theme](https://mapcomplete.osm.org/cyclofix), ther If all the layers are deselected except the bike wash layer, a shop having this tag will still match and will still show up as shop. +### Not reading the .JSON-specs +There are a few advanced features to do fancy stuff available, which are documented only in the spec above - for example, reusing background images and substituting the colours or HTML-rendering. If you need advanced stuff, read it through! diff --git a/Docs/Tools/Changesets per theme in 2021.png b/Docs/Tools/Changesets per theme in 2021.png index d9caa93..d9cc020 100644 Binary files a/Docs/Tools/Changesets per theme in 2021.png and b/Docs/Tools/Changesets per theme in 2021.png differ diff --git a/Docs/Tools/Changesets per theme.png b/Docs/Tools/Changesets per theme.png index 40ec26d..2bf6c7a 100644 Binary files a/Docs/Tools/Changesets per theme.png and b/Docs/Tools/Changesets per theme.png differ diff --git a/Docs/Tools/Changesets per version number in 2021.png b/Docs/Tools/Changesets per version number in 2021.png index 82ec538..b48243f 100644 Binary files a/Docs/Tools/Changesets per version number in 2021.png and b/Docs/Tools/Changesets per version number in 2021.png differ diff --git a/Docs/Tools/Contributors in 2021.png b/Docs/Tools/Contributors in 2021.png index 592878e..396f043 100644 Binary files a/Docs/Tools/Contributors in 2021.png and b/Docs/Tools/Contributors in 2021.png differ diff --git a/Docs/Tools/Contributors.png b/Docs/Tools/Contributors.png index 8caeda0..d6a8efc 100644 Binary files a/Docs/Tools/Contributors.png and b/Docs/Tools/Contributors.png differ diff --git a/Docs/Tools/Cumulative changesets per contributor for theme aed.png b/Docs/Tools/Cumulative changesets per contributor for theme aed.png index c6fef4c..88c62a1 100644 Binary files a/Docs/Tools/Cumulative changesets per contributor for theme aed.png and b/Docs/Tools/Cumulative changesets per contributor for theme aed.png differ diff --git a/Docs/Tools/Cumulative changesets per contributor for theme artworks.png b/Docs/Tools/Cumulative changesets per contributor for theme artworks.png index a19690d..1ccf92f 100644 Binary files a/Docs/Tools/Cumulative changesets per contributor for theme artworks.png and b/Docs/Tools/Cumulative changesets per contributor for theme artworks.png differ diff --git a/Docs/Tools/Cumulative changesets per contributor for theme benches.png b/Docs/Tools/Cumulative changesets per contributor for theme benches.png index 9473af6..7e91363 100644 Binary files a/Docs/Tools/Cumulative changesets per contributor for theme benches.png and b/Docs/Tools/Cumulative changesets per contributor for theme benches.png differ diff --git a/Docs/Tools/Cumulative changesets per contributor for theme bookcases.png b/Docs/Tools/Cumulative changesets per contributor for theme bookcases.png index 66c2e72..264ec15 100644 Binary files a/Docs/Tools/Cumulative changesets per contributor for theme bookcases.png and b/Docs/Tools/Cumulative changesets per contributor for theme bookcases.png differ diff --git a/Docs/Tools/Cumulative changesets per contributor for theme charging_stations.png b/Docs/Tools/Cumulative changesets per contributor for theme charging_stations.png index 319b46b..2a541ed 100644 Binary files a/Docs/Tools/Cumulative changesets per contributor for theme charging_stations.png and b/Docs/Tools/Cumulative changesets per contributor for theme charging_stations.png differ diff --git a/Docs/Tools/Cumulative changesets per contributor for theme climbing.png b/Docs/Tools/Cumulative changesets per contributor for theme climbing.png new file mode 100644 index 0000000..6e74180 Binary files /dev/null and b/Docs/Tools/Cumulative changesets per contributor for theme climbing.png differ diff --git a/Docs/Tools/Cumulative changesets per contributor for theme cyclofix.png b/Docs/Tools/Cumulative changesets per contributor for theme cyclofix.png index ace0a99..feb1c44 100644 Binary files a/Docs/Tools/Cumulative changesets per contributor for theme cyclofix.png and b/Docs/Tools/Cumulative changesets per contributor for theme cyclofix.png differ diff --git a/Docs/Tools/Cumulative changesets per contributor for theme drinking_water.png b/Docs/Tools/Cumulative changesets per contributor for theme drinking_water.png index f670a6a..81e263e 100644 Binary files a/Docs/Tools/Cumulative changesets per contributor for theme drinking_water.png and b/Docs/Tools/Cumulative changesets per contributor for theme drinking_water.png differ diff --git a/Docs/Tools/Cumulative changesets per contributor for theme fritures.png b/Docs/Tools/Cumulative changesets per contributor for theme fritures.png new file mode 100644 index 0000000..5068edb Binary files /dev/null and b/Docs/Tools/Cumulative changesets per contributor for theme fritures.png differ diff --git a/Docs/Tools/Cumulative changesets per contributor for theme ghostbikes.png b/Docs/Tools/Cumulative changesets per contributor for theme ghostbikes.png index b058671..502c562 100644 Binary files a/Docs/Tools/Cumulative changesets per contributor for theme ghostbikes.png and b/Docs/Tools/Cumulative changesets per contributor for theme ghostbikes.png differ diff --git a/Docs/Tools/Cumulative changesets per contributor for theme nature.png b/Docs/Tools/Cumulative changesets per contributor for theme nature.png index 4351e5a..ed8d3f8 100644 Binary files a/Docs/Tools/Cumulative changesets per contributor for theme nature.png and b/Docs/Tools/Cumulative changesets per contributor for theme nature.png differ diff --git a/Docs/Tools/Cumulative changesets per contributor for theme personal.png b/Docs/Tools/Cumulative changesets per contributor for theme personal.png index 01e7814..8f2d376 100644 Binary files a/Docs/Tools/Cumulative changesets per contributor for theme personal.png and b/Docs/Tools/Cumulative changesets per contributor for theme personal.png differ diff --git a/Docs/Tools/Cumulative changesets per contributor for theme surveillance.png b/Docs/Tools/Cumulative changesets per contributor for theme surveillance.png index 34aaf59..6b54edf 100644 Binary files a/Docs/Tools/Cumulative changesets per contributor for theme surveillance.png and b/Docs/Tools/Cumulative changesets per contributor for theme surveillance.png differ diff --git a/Docs/Tools/Cumulative changesets per contributor for theme trees.png b/Docs/Tools/Cumulative changesets per contributor for theme trees.png index c92877b..c9f96ba 100644 Binary files a/Docs/Tools/Cumulative changesets per contributor for theme trees.png and b/Docs/Tools/Cumulative changesets per contributor for theme trees.png differ diff --git a/Docs/Tools/Cumulative changesets per contributor for theme wandelknooppunten.png b/Docs/Tools/Cumulative changesets per contributor for theme wandelknooppunten.png index 38e1aa6..986d02a 100644 Binary files a/Docs/Tools/Cumulative changesets per contributor for theme wandelknooppunten.png and b/Docs/Tools/Cumulative changesets per contributor for theme wandelknooppunten.png differ diff --git a/Docs/Tools/Cumulative changesets per contributor in 2021.png b/Docs/Tools/Cumulative changesets per contributor in 2021.png index b5ebc8c..c5c3473 100644 Binary files a/Docs/Tools/Cumulative changesets per contributor in 2021.png and b/Docs/Tools/Cumulative changesets per contributor in 2021.png differ diff --git a/Docs/Tools/Cumulative changesets per contributor.png b/Docs/Tools/Cumulative changesets per contributor.png index e32cf25..08c2f0a 100644 Binary files a/Docs/Tools/Cumulative changesets per contributor.png and b/Docs/Tools/Cumulative changesets per contributor.png differ diff --git a/Docs/Tools/Cumulative changesets per created element.png b/Docs/Tools/Cumulative changesets per created element.png index be9fa2a..13c6858 100644 Binary files a/Docs/Tools/Cumulative changesets per created element.png and b/Docs/Tools/Cumulative changesets per created element.png differ diff --git a/Docs/Tools/Cumulative changesets per host in 2021.png b/Docs/Tools/Cumulative changesets per host in 2021.png index 9850759..faab500 100644 Binary files a/Docs/Tools/Cumulative changesets per host in 2021.png and b/Docs/Tools/Cumulative changesets per host in 2021.png differ diff --git a/Docs/Tools/Cumulative changesets per host.png b/Docs/Tools/Cumulative changesets per host.png index f6ef68c..008f904 100644 Binary files a/Docs/Tools/Cumulative changesets per host.png and b/Docs/Tools/Cumulative changesets per host.png differ diff --git a/Docs/Tools/Cumulative changesets per language in 2021.png b/Docs/Tools/Cumulative changesets per language in 2021.png index 25e5fcd..7d3b8ff 100644 Binary files a/Docs/Tools/Cumulative changesets per language in 2021.png and b/Docs/Tools/Cumulative changesets per language in 2021.png differ diff --git a/Docs/Tools/Cumulative changesets per language.png b/Docs/Tools/Cumulative changesets per language.png index 204d82c..3810575 100644 Binary files a/Docs/Tools/Cumulative changesets per language.png and b/Docs/Tools/Cumulative changesets per language.png differ diff --git a/Docs/Tools/Cumulative changesets per theme in 2021.png b/Docs/Tools/Cumulative changesets per theme in 2021.png index 8522d51..cd42a23 100644 Binary files a/Docs/Tools/Cumulative changesets per theme in 2021.png and b/Docs/Tools/Cumulative changesets per theme in 2021.png differ diff --git a/Docs/Tools/Cumulative changesets per theme.png b/Docs/Tools/Cumulative changesets per theme.png index b06acf1..559b1e1 100644 Binary files a/Docs/Tools/Cumulative changesets per theme.png and b/Docs/Tools/Cumulative changesets per theme.png differ diff --git a/Docs/Tools/Cumulative changesets per version number in 2021.png b/Docs/Tools/Cumulative changesets per version number in 2021.png index 23f17b6..6d4d4ba 100644 Binary files a/Docs/Tools/Cumulative changesets per version number in 2021.png and b/Docs/Tools/Cumulative changesets per version number in 2021.png differ diff --git a/Docs/Tools/Cumulative changesets per version number.png b/Docs/Tools/Cumulative changesets per version number.png index c54d573..ffc97e0 100644 Binary files a/Docs/Tools/Cumulative changesets per version number.png and b/Docs/Tools/Cumulative changesets per version number.png differ diff --git a/Docs/Tools/CumulativeContributors in 2021.png b/Docs/Tools/CumulativeContributors in 2021.png index 0106327..e7636f2 100644 Binary files a/Docs/Tools/CumulativeContributors in 2021.png and b/Docs/Tools/CumulativeContributors in 2021.png differ diff --git a/Docs/Tools/CumulativeContributors.png b/Docs/Tools/CumulativeContributors.png index d0da410..fae1827 100644 Binary files a/Docs/Tools/CumulativeContributors.png and b/Docs/Tools/CumulativeContributors.png differ diff --git a/Docs/Tools/New and changed nodes per day .png b/Docs/Tools/New and changed nodes per day .png index 25cddef..9d036a0 100644 Binary files a/Docs/Tools/New and changed nodes per day .png and b/Docs/Tools/New and changed nodes per day .png differ diff --git a/Docs/Tools/New and changed nodes per day for theme aed.png b/Docs/Tools/New and changed nodes per day for theme aed.png index 5686fbb..82720cb 100644 Binary files a/Docs/Tools/New and changed nodes per day for theme aed.png and b/Docs/Tools/New and changed nodes per day for theme aed.png differ diff --git a/Docs/Tools/New and changed nodes per day for theme artworks.png b/Docs/Tools/New and changed nodes per day for theme artworks.png index 4085656..435e7c5 100644 Binary files a/Docs/Tools/New and changed nodes per day for theme artworks.png and b/Docs/Tools/New and changed nodes per day for theme artworks.png differ diff --git a/Docs/Tools/New and changed nodes per day for theme benches.png b/Docs/Tools/New and changed nodes per day for theme benches.png index 79dde2f..ccd209a 100644 Binary files a/Docs/Tools/New and changed nodes per day for theme benches.png and b/Docs/Tools/New and changed nodes per day for theme benches.png differ diff --git a/Docs/Tools/New and changed nodes per day for theme bookcases.png b/Docs/Tools/New and changed nodes per day for theme bookcases.png index ed935cb..06d7b1f 100644 Binary files a/Docs/Tools/New and changed nodes per day for theme bookcases.png and b/Docs/Tools/New and changed nodes per day for theme bookcases.png differ diff --git a/Docs/Tools/New and changed nodes per day for theme cyclofix.png b/Docs/Tools/New and changed nodes per day for theme cyclofix.png index 7a01b57..cc1c8d2 100644 Binary files a/Docs/Tools/New and changed nodes per day for theme cyclofix.png and b/Docs/Tools/New and changed nodes per day for theme cyclofix.png differ diff --git a/Docs/Tools/New and changed nodes per day for theme ghostbikes.png b/Docs/Tools/New and changed nodes per day for theme ghostbikes.png index 9f269a0..11674d6 100644 Binary files a/Docs/Tools/New and changed nodes per day for theme ghostbikes.png and b/Docs/Tools/New and changed nodes per day for theme ghostbikes.png differ diff --git a/Docs/Tools/New and changed nodes per day for theme grb.png b/Docs/Tools/New and changed nodes per day for theme grb.png index 6cc3a0e..f169a4e 100644 Binary files a/Docs/Tools/New and changed nodes per day for theme grb.png and b/Docs/Tools/New and changed nodes per day for theme grb.png differ diff --git a/Docs/Tools/New and changed nodes per day for theme nature.png b/Docs/Tools/New and changed nodes per day for theme nature.png index 49ab011..995c67c 100644 Binary files a/Docs/Tools/New and changed nodes per day for theme nature.png and b/Docs/Tools/New and changed nodes per day for theme nature.png differ diff --git a/Docs/Tools/New and changed nodes per day for theme personal.png b/Docs/Tools/New and changed nodes per day for theme personal.png index f99a812..42c3842 100644 Binary files a/Docs/Tools/New and changed nodes per day for theme personal.png and b/Docs/Tools/New and changed nodes per day for theme personal.png differ diff --git a/Docs/Tools/New and changed nodes per day for theme surveillance.png b/Docs/Tools/New and changed nodes per day for theme surveillance.png index 9c7b9c5..b321418 100644 Binary files a/Docs/Tools/New and changed nodes per day for theme surveillance.png and b/Docs/Tools/New and changed nodes per day for theme surveillance.png differ diff --git a/Docs/Tools/New and changed nodes per day for theme trees.png b/Docs/Tools/New and changed nodes per day for theme trees.png index 1e86673..1a410a5 100644 Binary files a/Docs/Tools/New and changed nodes per day for theme trees.png and b/Docs/Tools/New and changed nodes per day for theme trees.png differ diff --git a/Docs/Tools/New and changed nodes per day for year 2021.png b/Docs/Tools/New and changed nodes per day for year 2021.png index b66827e..3f1d613 100644 Binary files a/Docs/Tools/New and changed nodes per day for year 2021.png and b/Docs/Tools/New and changed nodes per day for year 2021.png differ diff --git a/Docs/Tools/Theme distribution in 2021.png b/Docs/Tools/Theme distribution in 2021.png index 1549c1a..621d167 100644 Binary files a/Docs/Tools/Theme distribution in 2021.png and b/Docs/Tools/Theme distribution in 2021.png differ diff --git a/Docs/Tools/Theme distribution.png b/Docs/Tools/Theme distribution.png index fed62da..d0ef1ef 100644 Binary files a/Docs/Tools/Theme distribution.png and b/Docs/Tools/Theme distribution.png differ diff --git a/Docs/Tools/stats.csv b/Docs/Tools/stats.csv index ef4206d..de9bfa9 100644 --- a/Docs/Tools/stats.csv +++ b/Docs/Tools/stats.csv @@ -3239,3 +3239,81 @@ "2021-04-02", "Thierry1030", "nl", "cyclofix", "MapComplete 0.6.4a", 1, 2, "Adding data with #MapComplete for theme #cyclofix", "pietervdvn.github.io" "2021-04-02", "WandelenMetKinderen", "en", "campersite", "MapComplete 0.6.4b", 0, 5, "Adding data with #MapComplete for theme #campersite", "mapcomplete.osm.be" "2021-04-02", "WandelenMetKinderen", "nl", "playgrounds", "MapComplete 0.6.4b", 0, 2, "Adding data with #MapComplete for theme #playgrounds", "mapcomplete.osm.be" +"2021-04-03", "Awo", "en", "trees", "MapComplete 0.6.4a", 0, 2, "Adding data with #MapComplete for theme #trees", "pietervdvn.github.io" +"2021-04-03", "dkf2010", "en", "benches", "MapComplete 0.6.4b", 0, 6, "Adding data with #MapComplete for theme #benches", "mapcomplete.osm.be" +"2021-04-03", "dkf2010", "en", "charging_stations", "MapComplete 0.6.4b", 0, 2, "Adding data with #MapComplete for theme #charging_stations", "mapcomplete.osm.be" +"2021-04-03", "GOwin", "en", "HailHydrant", "MapComplete 0.6.4a", 0, 1, "Adding data with #MapComplete for theme #HailHydrant", "pietervdvn.github.io" +"2021-04-03", "GOwin", "en", "HailHydrant", "MapComplete 0.6.4a", 0, 4, "Adding data with #MapComplete for theme #HailHydrant", "pietervdvn.github.io" +"2021-04-03", "GOwin", "en", "HailHydrant", "MapComplete 0.6.4a", 1, 3, "Adding data with #MapComplete for theme #HailHydrant", "pietervdvn.github.io" +"2021-04-03", "hke2912", "en", "benches", "MapComplete 0.6.4a", 4, 9, "Adding data with #MapComplete for theme #benches", "pietervdvn.github.io" +"2021-04-03", "jhuanjho", "en", "drinking_water", "MapComplete 0.6.4b", 0, 2, "Adding data with #MapComplete for theme #drinking_water", "mapcomplete.osm.be" +"2021-04-03", "Kinjkajh", "nl", "surveillance", "MapComplete 0.6.4a", 4, 17, "Adding data with #MapComplete for theme #surveillance", "pietervdvn.github.io" +"2021-04-03", "Koen Rijnsent", "en", "personal", "MapComplete 0.6.4b", 8, 28, "Adding data with #MapComplete for theme #personal", "mapcomplete.osm.be" +"2021-04-03", "MAGONA", "en", "trees", "MapComplete 0.6.4a", 0, 1, "Adding data with #MapComplete for theme #trees", "pietervdvn.github.io" +"2021-04-03", "MAGONA", "en", "trees", "MapComplete 0.6.4a", 0, 1, "Adding data with #MapComplete for theme #trees", "pietervdvn.github.io" +"2021-04-03", "Peter Elderson", "en", "stolpersteine", "MapComplete 0.6.4b", 2, 20, "Adding data with #MapComplete for theme #stolpersteine", "mapcomplete.osm.be" +"2021-04-03", "Peter Elderson", "en", "stolpersteine", "MapComplete 0.6.4b", 37, 142, "Adding data with #MapComplete for theme #stolpersteine", "mapcomplete.osm.be" +"2021-04-03", "Peter Elderson", "en", "stolpersteine", "MapComplete 0.6.4b", 6, 61, "Adding data with #MapComplete for theme #stolpersteine", "mapcomplete.osm.be" +"2021-04-03", "Pieter Nuytinck", "en", "bookcases", "MapComplete 0.6.4a", 1, 5, "Adding data with #MapComplete for theme #bookcases", "pietervdvn.github.io" +"2021-04-03", "WinstonSmith", "en", "drinking_water", "MapComplete 0.6.4b", 1, 3, "Adding data with #MapComplete for theme #drinking_water", "mapcomplete.osm.be" +"2021-04-04", "dkf2010", "en", "benches", "MapComplete 0.6.4b", 0, 1, "Adding data with #MapComplete for theme #benches", "mapcomplete.osm.be" +"2021-04-04", "Fauranië", "en", "benches", "MapComplete 0.6.4b", 2, 2, "Adding data with #MapComplete for theme #benches", "mapcomplete.osm.be" +"2021-04-04", "Fauranië", "en", "ghostbikes", "MapComplete 0.6.4b", 1, 0, "Adding data with #MapComplete for theme #ghostbikes", "mapcomplete.osm.be" +"2021-04-04", "GOwin", "en", "HailHydrant", "MapComplete 0.6.4a", 0, 2, "Adding data with #MapComplete for theme #HailHydrant", "pietervdvn.github.io" +"2021-04-04", "JuanjoMC", "en", "cyclofix", "MapComplete 0.6.4b", 0, 4, "Adding data with #MapComplete for theme #cyclofix", "mapcomplete.osm.be" +"2021-04-04", "M!dgard", "nl", "fire", "MapComplete 0.6.4b", 1, 2, "Adding data with #MapComplete for theme #fire", "mapcomplete.braindeaddev.com" +"2021-04-04", "M!dgard", "nl", "fire", "MapComplete 0.6.4b", 2, 4, "Adding data with #MapComplete for theme #fire", "mapcomplete.braindeaddev.com" +"2021-04-04", "Peter Elderson", "en", "wandelknooppunten", "MapComplete 0.6.4b", 0, 1, "Adding data with #MapComplete for theme #wandelknooppunten", "mapcomplete.osm.be" +"2021-04-04", "Pieter Nuytinck", "en", "bookcases", "MapComplete 0.6.5", 1, 1, "Adding data with #MapComplete for theme #bookcases", "pietervdvn.github.io" +"2021-04-04", "Pieter Vander Vennet", "nl", "fritures", "MapComplete 0.6.4b", 1, 2, "Adding data with #MapComplete for theme #fritures", "mapcomplete.osm.be" +"2021-04-04", "Thierry1030", "nl", "cyclofix", "MapComplete 0.6.5", 1, 6, "Adding data with #MapComplete for theme #cyclofix", "pietervdvn.github.io" +"2021-04-04", "WinstonSmith", "en", "drinking_water", "MapComplete 0.6.4b", 1, 1, "Adding data with #MapComplete for theme #drinking_water", "mapcomplete.osm.be" +"2021-04-05", "antonbundle", "en", "bookcases", "MapComplete 0.6.4b", 1, 4, "Adding data with #MapComplete for theme #bookcases", "mapcomplete.osm.be" +"2021-04-05", "Awo", "en", "artworks", "MapComplete 0.6.5c", 0, 2, "Adding data with #MapComplete for theme #artworks", "pietervdvn.github.io" +"2021-04-05", "dentonny", "nl", "cyclofix", "MapComplete 0.6.5", 1, 2, "Adding data with #MapComplete for theme #cyclofix", "pietervdvn.github.io" +"2021-04-05", "dmlu", "en", "https://raw.githubusercontent.com/osmbe/play/master/mapcomplete/urban_fossils/urban_fossils.json", "MapComplete 0.6.4c", 1, 1, "Adding data with #MapComplete for theme #https://raw.githubusercontent.com/osmbe/play/master/mapcomplete/urban_fossils/urban_fossils.json", "mapcomplete.osm.be" +"2021-04-05", "Fauranië", "en", "benches", "MapComplete 0.6.4b", 3, 3, "Adding data with #MapComplete for theme #benches", "mapcomplete.osm.be" +"2021-04-05", "Fauranië", "en", "charging_stations", "MapComplete 0.6.4b", 2, 2, "Adding data with #MapComplete for theme #charging_stations", "mapcomplete.osm.be" +"2021-04-05", "Fauranië", "en", "cyclofix", "MapComplete 0.6.4b", 2, 2, "Adding data with #MapComplete for theme #cyclofix", "mapcomplete.osm.be" +"2021-04-05", "Fauranië", "en", "playgrounds", "MapComplete 0.6.4b", 2, 2, "Adding data with #MapComplete for theme #playgrounds", "mapcomplete.osm.be" +"2021-04-05", "Fauranië", "nl", "basketswings", "MapComplete 0.6.4b", 1, 0, "Adding data with #MapComplete for theme #basketswings", "mapcomplete.osm.be" +"2021-04-05", "lunaticstraydog", "en", "climbing", "MapComplete 0.6.4b", 1, 9, "Adding data with #MapComplete for theme #climbing", "mapcomplete.osm.be" +"2021-04-05", "M!dgard", "nl", "aed", "MapComplete 0.6.4b", 0, 3, "Adding data with #MapComplete for theme #aed", "mapcomplete.braindeaddev.com" +"2021-04-05", "Michel Stuyts", "en", "benches", "MapComplete 0.6.4b", 0, 2, "Adding data with #MapComplete for theme #benches", "mapcomplete.osm.be" +"2021-04-05", "Michel Stuyts", "en", "benches", "MapComplete 0.6.4b", 1, 2, "Adding data with #MapComplete for theme #benches", "mapcomplete.osm.be" +"2021-04-05", "Peter Elderson", "en", "stolpersteine", "MapComplete 0.6.4b", 0, 4, "Adding data with #MapComplete for theme #stolpersteine", "mapcomplete.osm.be" +"2021-04-05", "Pieter Vander Vennet", "nl", "grb", "MapComplete 0.6.4b", 0, 8, "Adding data with #MapComplete for theme #grb", "mapcomplete.osm.be" +"2021-04-05", "SuSanne Grittner", "de", "ghostbikes", "MapComplete 0.6.5c", 0, 1, "Adding data with #MapComplete for theme #ghostbikes", "pietervdvn.github.io" +"2021-04-05", "Technopolice_newBiE", "en", "surveillance", "MapComplete 0.6.4-unlocked", 92, 139, "Adding data with #MapComplete for theme #surveillance", "pietervdvn.github.io" +"2021-04-05", "Thierry1030", "nl", "cyclofix", "MapComplete 0.6.5", 1, 2, "Adding data with #MapComplete for theme #cyclofix", "pietervdvn.github.io" +"2021-04-05", "Tim Couwelier", "nl", "aed", "MapComplete 0.6.5", 1, 2, "Adding data with #MapComplete for theme #aed", "pietervdvn.github.io" +"2021-04-05", "WinstonSmith", "en", "drinking_water", "MapComplete 0.6.4b", 0, 1, "Adding data with #MapComplete for theme #drinking_water", "mapcomplete.osm.be" +"2021-04-06", "BS97n", "de", "cyclofix", "MapComplete 0.6.4d", 2, 2, "Adding data with #MapComplete for theme #cyclofix", "mapcomplete.osm.be" +"2021-04-06", "Pieter Vander Vennet", "en", "https://raw.githubusercontent.com/osmbe/play/master/mapcomplete/urban_fossils/urban_fossils.json", "MapComplete 0.6.4c", 1, 1, "Adding data with #MapComplete for theme #https://raw.githubusercontent.com/osmbe/play/master/mapcomplete/urban_fossils/urban_fossils.json", "mapcomplete.osm.be" +"2021-04-07", "bvrslypp", "en", "surveillance", "MapComplete 0.6.6a", 1, 4, "Adding data with #MapComplete for theme #surveillance", "mapcomplete.osm.be" +"2021-04-07", "dkf2010", "en", "benches", "MapComplete 0.6.6a", 1, 2, "Adding data with #MapComplete for theme #benches", "mapcomplete.osm.be" +"2021-04-07", "joost schouppe", "nl", "cyclofix", "MapComplete 0.6.6a", 0, 1, "Adding data with #MapComplete for theme #cyclofix", "mapcomplete.osm.be" +"2021-04-07", "joost schouppe", "nl", "personal", "MapComplete 0.6.6a", 0, 1, "Adding data with #MapComplete for theme #personal", "mapcomplete.osm.be" +"2021-04-07", "L'imaginaire", "en", "benches", "MapComplete 0.6.6a", 0, 2, "Adding data with #MapComplete for theme #benches", "mapcomplete.osm.be" +"2021-04-07", "L'imaginaire", "en", "playgrounds", "MapComplete 0.6.6a", 0, 2, "Adding data with #MapComplete for theme #playgrounds", "mapcomplete.osm.be" +"2021-04-07", "L'imaginaire", "nl", "cyclofix", "MapComplete 0.6.6a", 0, 2, "Adding data with #MapComplete for theme #cyclofix", "mapcomplete.osm.be" +"2021-04-07", "Pieter Vander Vennet", "en", "artworks", "MapComplete 0.6.6a", 1, 1, "Adding data with #MapComplete for theme #artworks", "mapcomplete.osm.be" +"2021-04-07", "Pieter Vander Vennet", "en", "benches", "MapComplete 0.6.6a", 1, 1, "Adding data with #MapComplete for theme #benches", "mapcomplete.osm.be" +"2021-04-07", "Pieter Vander Vennet", "en", "cyclofix", "MapComplete 0.6.6a", 1, 2, "Adding data with #MapComplete for theme #cyclofix", "mapcomplete.osm.be" +"2021-04-07", "ttt1234", "en", "surveillance", "MapComplete 0.6.6", 10, 31, "Adding data with #MapComplete for theme #surveillance", "pietervdvn.github.io" +"2021-04-07", "ttt1234", "nl", "fritures", "MapComplete 0.6.6", 1, 1, "Adding data with #MapComplete for theme #fritures", "pietervdvn.github.io" +"2021-04-07", "Wim L", "en", "bookcases", "MapComplete 0.6.6b", 1, 1, "Adding data with #MapComplete for theme #bookcases", "mapcomplete.osm.be" +"2021-04-08", "boute002", "nl", "drinking_water", "MapComplete 0.6.6b", 1, 0, "Adding data with #MapComplete for theme #drinking_water", "mapcomplete.osm.be" +"2021-04-08", "bvrslypp", "en", "surveillance", "MapComplete 0.6.6", 1, 1, "Adding data with #MapComplete for theme #surveillance", "pietervdvn.github.io" +"2021-04-08", "bvrslypp", "en", "surveillance", "MapComplete 0.6.6", 2, 3, "Adding data with #MapComplete for theme #surveillance", "pietervdvn.github.io" +"2021-04-08", "dkf2010", "en", "benches", "MapComplete 0.6.6b", 0, 2, "Adding data with #MapComplete for theme #benches", "mapcomplete.osm.be" +"2021-04-08", "Edlocks", "en", "cyclofix", "MapComplete 0.6.6", 1, 9, "Adding data with #MapComplete for theme #cyclofix", "pietervdvn.github.io" +"2021-04-08", "Erin76", "nl", "playgrounds", "MapComplete 0.6.4b", 0, 13, "Adding data with #MapComplete for theme #playgrounds", "mapcomplete.braindeaddev.com" +"2021-04-08", "joost schouppe", "nl", "personal", "MapComplete 0.6.6b", 1, 2, "Adding data with #MapComplete for theme #personal", "mapcomplete.osm.be" +"2021-04-08", "Koen Rijnsent", "en", "personal", "MapComplete 0.6.6b", 0, 4, "Adding data with #MapComplete for theme #personal", "mapcomplete.osm.be" +"2021-04-08", "Koen Rijnsent", "en", "personal", "MapComplete 0.6.6b", 7, 12, "Adding data with #MapComplete for theme #personal", "mapcomplete.osm.be" +"2021-04-08", "Pieter Vander Vennet", "nl", "nature", "MapComplete 0.6.6b", 1, 4, "Adding data with #MapComplete for theme #nature", "mapcomplete.osm.be" +"2021-04-08", "Pieter Vander Vennet", "nl", "nature", "MapComplete 0.6.6b", 2, 5, "Adding data with #MapComplete for theme #nature", "mapcomplete.osm.be" +"2021-04-08", "sjokomoeske", "en", "benches", "MapComplete 0.6.6b", 3, 4, "Adding data with #MapComplete for theme #benches", "mapcomplete.osm.be" +"2021-04-08", "sjokomoeske", "en", "playgrounds", "MapComplete 0.6.6b", 1, 2, "Adding data with #MapComplete for theme #playgrounds", "mapcomplete.osm.be" +"2021-04-08", "ttt1234", "en", "surveillance", "MapComplete 0.6.6", 3, 6, "Adding data with #MapComplete for theme #surveillance", "pietervdvn.github.io" diff --git a/Docs/URL_Parameters.md b/Docs/URL_Parameters.md new file mode 100644 index 0000000..4952640 --- /dev/null +++ b/Docs/URL_Parameters.md @@ -0,0 +1,108 @@ +custom-css +------------ +If specified, the custom css from the given link will be loaded additionaly + +test +------ +If true, 'dryrun' mode is activated. The app will behave as normal, except that changes to OSM will be printed onto the console instead of actually uploaded to osm.org +The default value is _false_ + +layout +-------- +The layout to load into MapComplete + +userlayout +------------ + +The default value is _false_ + +layer-control-toggle +---------------------- +Whether or not the layer control is shown +The default value is _false_ + +tab +----- +The tab that is shown in the welcome-message. 0 = the explanation of the theme,1 = OSM-credits, 2 = sharescreen, 3 = more themes, 4 = about mapcomplete (user must be logged in and have >50 changesets) +The default value is _0_ + +z +--- +The initial/current zoom level +The default value is set by the loaded theme + +lat +----- +The initial/current latitude +The default value is set by the loaded theme + +lon +----- +The initial/current longitude of the app +The default value is set by the loaded theme + +fs-userbadge +-------------- +Disables/Enables the user information pill (userbadge) at the top left. Disabling this disables logging in and thus disables editing all together, effectively putting MapComplete into read-only mode. +The default value is _true_ + +fs-search +----------- +Disables/Enables the search bar +The default value is _true_ + +fs-layers +----------- +Disables/Enables the layer control +The default value is _true_ + +fs-add-new +------------ +Disables/Enables the 'add new feature'-popup. (A theme without presets might not have it in the first place) +The default value is _true_ + +fs-welcome-message +-------------------- +Disables/enables the help menu or welcome message +The default value is _true_ + +fs-iframe +----------- +Disables/Enables the iframe-popup +The default value is _false_ + +fs-more-quests +---------------- +Disables/Enables the 'More Quests'-tab in the welcome message +The default value is _true_ + +fs-share-screen +----------------- +Disables/Enables the 'Share-screen'-tab in the welcome message +The default value is _true_ + +fs-geolocation +---------------- +Disables/Enables the geolocation button +The default value is _true_ + +debug +------- +If true, shows some extra debugging help such as all the available tags on every object +The default value is _false_ + +oauth_token +------------- +Used to complete the login +No default value set + +background +------------ +The id of the background layer to start with +The default value is set by the loaded theme + +layer- +----------------- +Wether or not layer with __ is shown +The default value is _true_ + diff --git a/InitUiElements.ts b/InitUiElements.ts index c1e4b67..5503057 100644 --- a/InitUiElements.ts +++ b/InitUiElements.ts @@ -36,6 +36,9 @@ import Translations from "./UI/i18n/Translations"; import MapControlButton from "./UI/MapControlButton"; import Combine from "./UI/Base/Combine"; import SelectedFeatureHandler from "./Logic/Actors/SelectedFeatureHandler"; +import LZString from "lz-string"; +import {LayoutConfigJson} from "./Customizations/JSON/LayoutConfigJson"; +import AttributionPanel from "./UI/BigComponents/AttributionPanel"; export class InitUiElements { @@ -209,7 +212,17 @@ export class InitUiElements { hashFromLocalStorage.setData(hash); dedicatedHashFromLocalStorage.setData(hash); } - const layoutToUse = new LayoutConfig(JSON.parse(atob(hash)), false); + + let json = {} + try{ + json = JSON.parse(atob(hash)); + } catch (e) { + // We try to decode with lz-string + json = JSON.parse( Utils.UnMinify(LZString.decompressFromBase64(hash))) + } + + // @ts-ignore + const layoutToUse = new LayoutConfig(json, false); userLayoutParam.setData(layoutToUse.id); return layoutToUse; } catch (e) { @@ -275,11 +288,7 @@ export class InitUiElements { const copyrightNotice = new ScrollableFullScreen( () => Translations.t.general.attribution.attributionTitle.Clone(), - () => new Combine([ - Translations.t.general.attribution.attributionContent, - "
", - new Attribution(undefined, undefined, State.state.layoutToUse, undefined) - ]), + () => new AttributionPanel(State.state.layoutToUse), "copyright" ) @@ -288,7 +297,7 @@ export class InitUiElements { copyrightNotice, new MapControlButton(Svg.osm_copyright_svg()), copyrightNotice.isShown - ).SetClass("p-0.5 md:hidden") + ).SetClass("p-0.5") new Combine([copyrightButton, checkbox]) .AttachTo("bottom-left"); @@ -416,11 +425,12 @@ export class InitUiElements { } + const newPointDialogIsShown = new UIEventSource(false); const addNewPoint = new ScrollableFullScreen( () => Translations.t.general.add.title.Clone(), - () => new SimpleAddUI(), - "new"); - + () => new SimpleAddUI(newPointDialogIsShown), + "new", + newPointDialogIsShown) addNewPoint.isShown.addCallback(isShown => { if (!isShown) { State.state.LastClickLocation.setData(undefined) @@ -436,5 +446,6 @@ export class InitUiElements { ); }); + } } \ No newline at end of file diff --git a/Logic/Actors/ImageSearcher.ts b/Logic/Actors/ImageSearcher.ts index 0c1c934..3ea5101 100644 --- a/Logic/Actors/ImageSearcher.ts +++ b/Logic/Actors/ImageSearcher.ts @@ -81,7 +81,7 @@ export class ImageSearcher extends UIEventSource<{ key: string, url: string }[]> let mapillary = tags.mapillary; const prefix = "https://www.mapillary.com/map/im/"; - let regex = /https?:\/\/www.mapillary.com\/app\/.*&pKey=([^&]*)/ + let regex = /https?:\/\/www.mapillary.com\/app\/.*pKey=([^&]*).*/ let match = mapillary.match(regex); if (match) { mapillary = match[1]; diff --git a/Logic/Actors/SelectedFeatureHandler.ts b/Logic/Actors/SelectedFeatureHandler.ts index 968a3d1..5f5bf5f 100644 --- a/Logic/Actors/SelectedFeatureHandler.ts +++ b/Logic/Actors/SelectedFeatureHandler.ts @@ -27,6 +27,10 @@ export default class SelectedFeatureHandler { featureSource.features.addCallback(_ => self.selectFeature()); selectedFeature.addCallback(feature => { + if(feature === undefined){ + hash.setData("") + } + const h = feature?.properties?.id; if(h !== undefined){ hash.setData(h) diff --git a/Logic/Tags/SubstitutingTag.ts b/Logic/Tags/SubstitutingTag.ts index 58591d5..567693c 100644 --- a/Logic/Tags/SubstitutingTag.ts +++ b/Logic/Tags/SubstitutingTag.ts @@ -18,11 +18,11 @@ export default class SubstitutingTag implements TagsFilter { this._value = value; } - private static substituteString(template: string, dict: any): string { + public static substituteString(template: string, dict: any): string { for (const k in dict) { template = template.replace(new RegExp("\\{" + k + "\\}", 'g'), dict[k]) } - return template; + return template.replace(/{.*}/g, ""); } asHumanString(linkToWiki: boolean, shorten: boolean, properties) { diff --git a/Logic/Web/QueryParameters.ts b/Logic/Web/QueryParameters.ts index 406afa2..b1adfcd 100644 --- a/Logic/Web/QueryParameters.ts +++ b/Logic/Web/QueryParameters.ts @@ -38,6 +38,10 @@ export class QueryParameters { QueryParameters.knownSources[key] = source; } } + + window["mapcomplete_query_parameter_overview"] = () => { + console.log(QueryParameters.GenerateQueryParameterDocs()) + } } private static Serialize() { @@ -84,7 +88,13 @@ export class QueryParameters { public static GenerateQueryParameterDocs(): string { const docs = []; for (const key in QueryParameters.documentation) { - docs.push("**" + key + "**: " + QueryParameters.documentation[key] + " (default value: _" + QueryParameters.defaults[key] + "_)") + docs.push([ + " "+key+" ", + "-".repeat(key.length + 2), + QueryParameters.documentation[key], + QueryParameters.defaults[key] === undefined ? "No default value set" : `The default value is _${QueryParameters.defaults[key]}_` + + ].join("\n")) } return docs.join("\n\n"); } diff --git a/Models/Constants.ts b/Models/Constants.ts index 52df36f..9091bfb 100644 --- a/Models/Constants.ts +++ b/Models/Constants.ts @@ -2,7 +2,7 @@ import { Utils } from "../Utils"; export default class Constants { - public static vNumber = "0.6.4b"; + public static vNumber = "0.6.8"; // The user journey states thresholds when a new feature gets unlocked public static userJourney = { diff --git a/Models/smallLicense.ts b/Models/smallLicense.ts new file mode 100644 index 0000000..e87473a --- /dev/null +++ b/Models/smallLicense.ts @@ -0,0 +1,6 @@ +export default interface SmallLicense { + path: string, + authors: string[], + license: string, + sources: string[] +} \ No newline at end of file diff --git a/README.md b/README.md index 223d61c..cce053c 100644 --- a/README.md +++ b/README.md @@ -142,49 +142,9 @@ Whenever a change is made -even adding a single tag- the change is uploaded into Note that changesets are closed automatically after one hour of inactivity, so we don't have to worry about closing them. -### Query parameters +# Documentation -By adding extra query parameters, more options are available to influence: - -**test**: If true, 'dryrun' mode is activated. The app will behave as normal, except that changes to OSM will be printed onto the console instead of actually uploaded to osm.org (default value: _false_) - -**layout**: The layout to load into MapComplete (default value: _bookcases_) - -**userlayout**: undefined (default value: _false_) - -**layer-control-toggle**: Wether or not the layer control is shown (default value: _false_) - -**tab**: The tab that is shown in the welcome-message. 0 = the explanation of the theme,1 = OSM-credits, 2 = sharescreen, 3 = more themes, 4 = about mapcomplete (user must be logged in and have >200 changesets) (default value: _0_) - -**z**: The initial/current zoom level (default value: _1_) - -**lat**: The initial/current latitude (default value: _0_) - -**lon**: The initial/current longitude of the app (default value: _0_) - -**fs-userbadge**: Disables/Enables the userbadge (and thus disables login capabilities) (default value: _true_) - -**fs-search**: Disables/Enables the search bar (default value: _true_) - -**fs-layers**: Disables/Enables the layer control (default value: _true_) - -**fs-add-new**: Disables/Enables the 'add new feature'-popup. (A theme without presets might not have it in the first place) (default value: _true_) - -**fs-welcome-message**: undefined (default value: _true_) - -**fs-iframe**: Disables/Enables the iframe-popup (default value: _false_) - -**fs-more-quests**: Disables/Enables the 'More Quests'-tab in the welcome message (default value: _true_) - -**fs-share-screen**: Disables/Enables the 'Share-screen'-tab in the welcome message (default value: _true_) - -**fs-geolocation**: Disables/Enables the geolocation button (default value: _true_) - -**oauth_token**: Used to complete the login (default value: _undefined_) - -**background**: The id of the background layer to start with (default value: _undefined_) - -**layer-bookcases**: Wehter or not layer bookcases is shown (default value: _true_) index.ts:104:8 +All documentation can be found in [here](Docs/) # Privacy @@ -195,53 +155,12 @@ Geolocation is available on mobile only throught hte device's GPS location (so n TODO: erase cookies of third party websites and API's -# Attributions +# Attribution Data from OpenStreetMap Background layer selection: curated by https://github.com/osmlab/editor-layer-index -Images from Wikipedia/Wikimedia - -https://commons.wikimedia.org/wiki/File:Camera_font_awesome.svg -Camera Icon, Dave Gandy, CC-BY-SA 3.0 - -https://commons.wikimedia.org/wiki/File:OOjs_UI_indicator_search-rtl.svg -Search Icon, MIT - -https://commons.wikimedia.org/wiki/File:Trash_font_awesome.svg -Trash icon by Dave Gandy, CC-BY-SA - -https://commons.wikimedia.org/wiki/File:Home-icon.svg -Home icon by Timothy Miller, CC-BY-SA 3.0 - -https://commons.wikimedia.org/wiki/File:Map_icons_by_Scott_de_Jonge_-_bicycle-store.svg -Bicycle logo, Scott de Jonge - -Nature Reserve icon via http://www.onlinewebfonts.com/icon/389579, CC BY 3.0 (@ Эдуард Черных) - -Park icon via http://www.onlinewebfonts.com/icon/425974, CC BY 3.0 (@sterankofrank) - -Forest icon via https://www.onlinewebfonts.com/icon/498112, CC BY - -Statistics icon via https://www.onlinewebfonts.com/icon/197818 - -Chronometer (on monitoring_station.svg): ANTU chronometer -https://commons.wikimedia.org/w/index.php?title=Antu_chronometer - -Fries icon: -https://www.flaticon.com/free-icon/french-fries_1144288 - -Shower icon (used in 'bike_cleaning.svg'): -https://commons.wikimedia.org/wiki/File:Shower_symbol.svg - -Bench icons from StreetComplete: https://github.com/westnordost/StreetComplete/tree/v25.0-beta1/res/graphics/quest%20icons, GPLv3.0 +Icons are attributed in various 'license_info.json'-files and can be found in the app. -Urinal icon: https://thenounproject.com/term/urinal/1307984/ - -24/7 icon: https://www.vecteezy.com/vector-art/1394992-24-7-service-and-support-icon-set - -Translation-icon: https://commons.wikimedia.org/wiki/File:OOjs_UI_icon_language-ltr.svg - -PingPong-table icon: Font Awesome Free 5.2.0 by @fontawesome - https://fontawesome.com \ No newline at end of file diff --git a/Svg.ts b/Svg.ts index cae6cc7..ca23326 100644 --- a/Svg.ts +++ b/Svg.ts @@ -39,6 +39,11 @@ export default class Svg { public static Ornament_Horiz_6_svg() { return new FixedUiElement(Svg.Ornament_Horiz_6);} public static Ornament_Horiz_6_ui() { return new FixedUiElement(Svg.Ornament_Horiz_6_img);} + public static SocialImageForeground = " image/svg+xml 010110010011010110010011  010110010011010110010011  " + public static SocialImageForeground_img = Img.AsImageElement(Svg.SocialImageForeground) + public static SocialImageForeground_svg() { return new FixedUiElement(Svg.SocialImageForeground);} + public static SocialImageForeground_ui() { return new FixedUiElement(Svg.SocialImageForeground_img);} + public static add = " image/svg+xml " public static add_img = Img.AsImageElement(Svg.add) public static add_svg() { return new FixedUiElement(Svg.add);} @@ -344,4 +349,4 @@ export default class Svg { public static wikipedia_svg() { return new FixedUiElement(Svg.wikipedia);} public static wikipedia_ui() { return new FixedUiElement(Svg.wikipedia_img);} -public static All = {"Ornament-Horiz-0.svg": Svg.Ornament_Horiz_0,"Ornament-Horiz-1.svg": Svg.Ornament_Horiz_1,"Ornament-Horiz-2.svg": Svg.Ornament_Horiz_2,"Ornament-Horiz-3.svg": Svg.Ornament_Horiz_3,"Ornament-Horiz-4.svg": Svg.Ornament_Horiz_4,"Ornament-Horiz-5.svg": Svg.Ornament_Horiz_5,"Ornament-Horiz-6.svg": Svg.Ornament_Horiz_6,"add.svg": Svg.add,"addSmall.svg": Svg.addSmall,"ampersand.svg": Svg.ampersand,"arrow-left-smooth.svg": Svg.arrow_left_smooth,"arrow-right-smooth.svg": Svg.arrow_right_smooth,"back.svg": Svg.back,"bug.svg": Svg.bug,"camera-plus.svg": Svg.camera_plus,"checkmark.svg": Svg.checkmark,"circle.svg": Svg.circle,"clock.svg": Svg.clock,"close.svg": Svg.close,"compass.svg": Svg.compass,"cross_bottom_right.svg": Svg.cross_bottom_right,"crosshair-blue-center.svg": Svg.crosshair_blue_center,"crosshair-blue.svg": Svg.crosshair_blue,"crosshair.svg": Svg.crosshair,"delete_icon.svg": Svg.delete_icon,"direction.svg": Svg.direction,"direction_gradient.svg": Svg.direction_gradient,"down.svg": Svg.down,"envelope.svg": Svg.envelope,"floppy.svg": Svg.floppy,"gear.svg": Svg.gear,"help.svg": Svg.help,"home.svg": Svg.home,"home_white_bg.svg": Svg.home_white_bg,"josm_logo.svg": Svg.josm_logo,"layers.svg": Svg.layers,"layersAdd.svg": Svg.layersAdd,"logo.svg": Svg.logo,"logout.svg": Svg.logout,"mapcomplete_logo.svg": Svg.mapcomplete_logo,"mapillary.svg": Svg.mapillary,"min.svg": Svg.min,"no_checkmark.svg": Svg.no_checkmark,"or.svg": Svg.or,"osm-copyright.svg": Svg.osm_copyright,"osm-logo-us.svg": Svg.osm_logo_us,"osm-logo.svg": Svg.osm_logo,"pencil.svg": Svg.pencil,"phone.svg": Svg.phone,"pin.svg": Svg.pin,"plus.svg": Svg.plus,"pop-out.svg": Svg.pop_out,"reload.svg": Svg.reload,"ring.svg": Svg.ring,"search.svg": Svg.search,"send_email.svg": Svg.send_email,"share.svg": Svg.share,"square.svg": Svg.square,"star.svg": Svg.star,"star_half.svg": Svg.star_half,"star_outline.svg": Svg.star_outline,"star_outline_half.svg": Svg.star_outline_half,"statistics.svg": Svg.statistics,"translate.svg": Svg.translate,"up.svg": Svg.up,"wikidata.svg": Svg.wikidata,"wikimedia-commons-white.svg": Svg.wikimedia_commons_white,"wikipedia.svg": Svg.wikipedia};} +public static All = {"Ornament-Horiz-0.svg": Svg.Ornament_Horiz_0,"Ornament-Horiz-1.svg": Svg.Ornament_Horiz_1,"Ornament-Horiz-2.svg": Svg.Ornament_Horiz_2,"Ornament-Horiz-3.svg": Svg.Ornament_Horiz_3,"Ornament-Horiz-4.svg": Svg.Ornament_Horiz_4,"Ornament-Horiz-5.svg": Svg.Ornament_Horiz_5,"Ornament-Horiz-6.svg": Svg.Ornament_Horiz_6,"SocialImageForeground.svg": Svg.SocialImageForeground,"add.svg": Svg.add,"addSmall.svg": Svg.addSmall,"ampersand.svg": Svg.ampersand,"arrow-left-smooth.svg": Svg.arrow_left_smooth,"arrow-right-smooth.svg": Svg.arrow_right_smooth,"back.svg": Svg.back,"bug.svg": Svg.bug,"camera-plus.svg": Svg.camera_plus,"checkmark.svg": Svg.checkmark,"circle.svg": Svg.circle,"clock.svg": Svg.clock,"close.svg": Svg.close,"compass.svg": Svg.compass,"cross_bottom_right.svg": Svg.cross_bottom_right,"crosshair-blue-center.svg": Svg.crosshair_blue_center,"crosshair-blue.svg": Svg.crosshair_blue,"crosshair.svg": Svg.crosshair,"delete_icon.svg": Svg.delete_icon,"direction.svg": Svg.direction,"direction_gradient.svg": Svg.direction_gradient,"down.svg": Svg.down,"envelope.svg": Svg.envelope,"floppy.svg": Svg.floppy,"gear.svg": Svg.gear,"help.svg": Svg.help,"home.svg": Svg.home,"home_white_bg.svg": Svg.home_white_bg,"josm_logo.svg": Svg.josm_logo,"layers.svg": Svg.layers,"layersAdd.svg": Svg.layersAdd,"logo.svg": Svg.logo,"logout.svg": Svg.logout,"mapcomplete_logo.svg": Svg.mapcomplete_logo,"mapillary.svg": Svg.mapillary,"min.svg": Svg.min,"no_checkmark.svg": Svg.no_checkmark,"or.svg": Svg.or,"osm-copyright.svg": Svg.osm_copyright,"osm-logo-us.svg": Svg.osm_logo_us,"osm-logo.svg": Svg.osm_logo,"pencil.svg": Svg.pencil,"phone.svg": Svg.phone,"pin.svg": Svg.pin,"plus.svg": Svg.plus,"pop-out.svg": Svg.pop_out,"reload.svg": Svg.reload,"ring.svg": Svg.ring,"search.svg": Svg.search,"send_email.svg": Svg.send_email,"share.svg": Svg.share,"square.svg": Svg.square,"star.svg": Svg.star,"star_half.svg": Svg.star_half,"star_outline.svg": Svg.star_outline,"star_outline_half.svg": Svg.star_outline_half,"statistics.svg": Svg.statistics,"translate.svg": Svg.translate,"up.svg": Svg.up,"wikidata.svg": Svg.wikidata,"wikimedia-commons-white.svg": Svg.wikimedia_commons_white,"wikipedia.svg": Svg.wikipedia};} diff --git a/UI/BigComponents/Attribution.ts b/UI/BigComponents/Attribution.ts index 46934b4..dac7a0e 100644 --- a/UI/BigComponents/Attribution.ts +++ b/UI/BigComponents/Attribution.ts @@ -10,6 +10,9 @@ import Loc from "../../Models/Loc"; import LeafletMap from "../../Models/LeafletMap"; import * as L from "leaflet" +/** + * The bottom right attribution panel in the leaflet map + */ export default class Attribution extends UIElement { private readonly _location: UIEventSource; diff --git a/UI/BigComponents/AttributionPanel.ts b/UI/BigComponents/AttributionPanel.ts new file mode 100644 index 0000000..343425e --- /dev/null +++ b/UI/BigComponents/AttributionPanel.ts @@ -0,0 +1,69 @@ +import {UIElement} from "../UIElement"; +import Combine from "../Base/Combine"; +import Translations from "../i18n/Translations"; +import Attribution from "./Attribution"; +import State from "../../State"; +import {UIEventSource} from "../../Logic/UIEventSource"; +import LayoutConfig from "../../Customizations/JSON/LayoutConfig"; +import {FixedUiElement} from "../Base/FixedUiElement"; +import * as licenses from "../../assets/generated/license_info.json" +import SmallLicense from "../../Models/smallLicense"; +import {Icon} from "leaflet"; +import Img from "../Base/Img"; +import {Utils} from "../../Utils"; + +/** + * The attribution panel shown on mobile + */ +export default class AttributionPanel extends Combine { + + private static LicenseObject = AttributionPanel.GenerateLicenses(); + + constructor(layoutToUse: UIEventSource) { + super([ + Translations.t.general.attribution.attributionContent, + + ((layoutToUse.data.maintainer ?? "") == "") ? "" : Translations.t.general.attribution.themeBy.Subs({author: layoutToUse.data.maintainer}), + layoutToUse.data.credits , + "
", + new Attribution(undefined, undefined, State.state.layoutToUse, undefined), + "
", + Translations.t.general.attribution.iconAttribution.title.Clone().SetClass("font-bold pt-12 pb-3"), + ...Utils.NoNull(Array.from(layoutToUse.data.ExtractImages())) + .map(AttributionPanel.IconAttribution) + ]); + this.SetClass("flex flex-col") + } + + private static IconAttribution(iconPath: string) { + if (iconPath.startsWith("http")) { + iconPath = "." + new URL(iconPath).pathname; + } + + const license: SmallLicense = AttributionPanel.LicenseObject[iconPath] + if (license == undefined) { + return undefined; + } + if(license.license.indexOf("trivial")>=0){ + return undefined; + } + + return new Combine([ + ``, + new Combine([ + new FixedUiElement(license.authors.join("; ")).SetClass("font-bold"), + new Combine([license.license, license.sources.length > 0 ? " - " : "", + ...license.sources.map(link => `${new URL(link).hostname} `)]).SetClass("block") + ]).SetClass("flex flex-col") + ]).SetClass("flex") + } + + private static GenerateLicenses() { + const allLicenses = {} + for (const key in licenses) { + const license: SmallLicense = licenses[key]; + allLicenses[license.path] = license + } + return allLicenses; + } +} \ No newline at end of file diff --git a/UI/BigComponents/MoreScreen.ts b/UI/BigComponents/MoreScreen.ts index 6fe0524..e5b0361 100644 --- a/UI/BigComponents/MoreScreen.ts +++ b/UI/BigComponents/MoreScreen.ts @@ -85,16 +85,12 @@ export default class MoreScreen extends UIElement { const linkButton: UIElement[] = [] - for (const k in AllKnownLayouts.allSets) { - const layout: LayoutConfig = AllKnownLayouts.allSets[k]; - if (k === personal.id) { + for (const layout of AllKnownLayouts.layoutsList) { + if (layout.id === personal.id) { if (State.state.osmConnection.userDetails.data.csCount < Constants.userJourney.personalLayoutUnlock) { continue; } } - if (layout.id !== k) { - continue; // This layout was added multiple time due to an uppercase - } linkButton.push(this.createLinkButton(layout)); } diff --git a/UI/BigComponents/SimpleAddUI.ts b/UI/BigComponents/SimpleAddUI.ts index 0574d9d..9f1a109 100644 --- a/UI/BigComponents/SimpleAddUI.ts +++ b/UI/BigComponents/SimpleAddUI.ts @@ -37,7 +37,7 @@ export default class SimpleAddUI extends UIElement { private readonly goToInboxButton: UIElement = new SubtleButton(Svg.envelope_ui(), Translations.t.general.goToInbox, {url: "https://www.openstreetmap.org/messages/inbox", newTab: false}); - constructor() { + constructor(isShown: UIEventSource) { super(State.state.locationControl.map(loc => loc.zoom)); const self = this; this.ListenTo(Locale.language); @@ -64,6 +64,18 @@ export default class SimpleAddUI extends UIElement { State.state.layerControlIsOpened.setData(true); }) + // IS shown is the state of the dialog - we reset the choice if the dialog dissappears + isShown.addCallback(isShown => + { + if(!isShown){ + self._confirmPreset.setData(undefined) + } + }) + // If the click location changes, we reset the dialog as well + State.state.LastClickLocation.addCallback(() => { + self._confirmPreset.setData(undefined) + }) + } InnerRender(): string { @@ -143,7 +155,9 @@ export default class SimpleAddUI extends UIElement { "", Translations.t.general.add.confirmButton.Subs({category: preset.name}), ""])).SetClass("break-words"); - confirmButton.onClick(this.CreatePoint(preset.tags)); + confirmButton.onClick( + this.CreatePoint(preset.tags) + ); if (!this._confirmPreset.data.layerToAddTo.isDisplayed.data) { return new Combine([ @@ -158,7 +172,7 @@ export default class SimpleAddUI extends UIElement { let tagInfo = ""; const csCount = State.state.osmConnection.userDetails.data.csCount; if (csCount > Constants.userJourney.tagsVisibleAt) { - tagInfo = this._confirmPreset.data.tags.map(t => t.asHumanString(csCount > Constants.userJourney.tagsVisibleAndWikiLinked, true, {})).join("&"); + tagInfo = this._confirmPreset.data.tags.map(t => t.asHumanString(csCount > Constants.userJourney.tagsVisibleAndWikiLinked, true)).join("&"); tagInfo = `
More information about the preset: ${tagInfo}` } @@ -186,7 +200,7 @@ export default class SimpleAddUI extends UIElement { const csCount = State.state.osmConnection.userDetails.data.csCount; let tagInfo = undefined; if (csCount > Constants.userJourney.tagsVisibleAt) { - const presets = preset.tags.map(t => new Combine ([t.asHumanString(false, true, {}), " "]).SetClass("subtle break-words") ) + const presets = preset.tags.map(t => new Combine([t.asHumanString(false, true), " "]).SetClass("subtle break-words")) tagInfo = new Combine(presets) } const button: UIElement = @@ -220,11 +234,17 @@ export default class SimpleAddUI extends UIElement { private CreatePoint(tags: Tag[]) { return () => { + console.log("Create Point Triggered") const loc = State.state.LastClickLocation.data; let feature = State.state.changes.createElement(tags, loc.lat, loc.lon); State.state.selectedElement.setData(feature); + this._confirmPreset.setData(undefined); } } + public OnClose(){ + console.log("On close triggered") + this._confirmPreset.setData(undefined) + } } \ No newline at end of file diff --git a/UI/CustomGenerator/CustomGeneratorPanel.ts b/UI/CustomGenerator/CustomGeneratorPanel.ts index 99414cb..e1a1592 100644 --- a/UI/CustomGenerator/CustomGeneratorPanel.ts +++ b/UI/CustomGenerator/CustomGeneratorPanel.ts @@ -17,7 +17,8 @@ import {LocalStorageSource} from "../../Logic/Web/LocalStorageSource"; import HelpText from "./HelpText"; import Svg from "../../Svg"; import Constants from "../../Models/Constants"; - +import LZString from "lz-string"; +import {Utils} from "../../Utils"; export default class CustomGeneratorPanel extends UIElement { private mainPanel: UIElement; @@ -40,7 +41,7 @@ export default class CustomGeneratorPanel extends UIElement { private InitMainPanel(layout: LayoutConfigJson, userDetails: UserDetails, connection: OsmConnection) { const es = new UIEventSource(layout); - const encoded = es.map(config => btoa(JSON.stringify(config))); + const encoded = es.map(config => LZString.compressToBase64(Utils.MinifyJSON(JSON.stringify(config, null, 0)))); encoded.addCallback(encoded => LocalStorageSource.Get("last-custom-theme")) const liveUrl = encoded.map(encoded => `./index.html?userlayout=${es.data.id}#${encoded}`) const testUrl = encoded.map(encoded => `./index.html?test=true&userlayout=${es.data.id}#${encoded}`) diff --git a/UI/CustomGenerator/TagRenderingPanel.ts b/UI/CustomGenerator/TagRenderingPanel.ts index 0633411..302a1a3 100644 --- a/UI/CustomGenerator/TagRenderingPanel.ts +++ b/UI/CustomGenerator/TagRenderingPanel.ts @@ -21,15 +21,14 @@ import Constants from "../../Models/Constants"; export default class TagRenderingPanel extends InputElement { + public IsImage = false; + public options: { title?: string; description?: string; disableQuestions?: boolean; isImage?: boolean; }; + public readonly validText: UIElement; + IsSelected: UIEventSource = new UIEventSource(false); private intro: UIElement; private settingsTable: UIElement; - - public IsImage = false; private readonly _value: UIEventSource; - public options: { title?: string; description?: string; disableQuestions?: boolean; isImage?: boolean; }; - public readonly validText : UIElement; - constructor(languages: UIEventSource, currentlySelected: UIEventSource>, userDetails: UserDetails, @@ -47,11 +46,11 @@ export default class TagRenderingPanel extends InputElement", options?.title ?? "TagRendering", "", + this.intro = new Combine(["

", options?.title ?? "TagRendering", "

", options?.description ?? "A tagrendering converts OSM-tags into a value on screen. Fill out the field 'render' with the text that should appear. Note that `{key}` will be replaced with the corresponding `value`, if present.
For specific known tags (e.g. if `foo=bar`, make a mapping). "]) this.IsImage = options?.isImage ?? false; @@ -61,10 +60,20 @@ export default class TagRenderingPanel extends InputElement, id: string | string[], name: string, description: string | UIElement): SingleSetting { return new SingleSetting(value, input, id, name, description); } - + this._value.addCallback(value => { - if(value?.freeform?.key == ""){ + let doPing = false; + if (value?.freeform?.key == "") { value.freeform = undefined; + doPing = true; + } + + if (value?.render == "") { + value.render = undefined; + doPing = true; + } + + if (doPing) { this._value.ping(); } }) @@ -72,7 +81,7 @@ export default class TagRenderingPanel extends InputElementFreeform key", @@ -90,11 +99,11 @@ export default class TagRenderingPanel extends InputElement)[] = [ setting( - options?.noLanguage ? new TextField({placeholder:"Rendering"}) : - new MultiLingualTextFields(languages), "render", "Value to show", + options?.noLanguage ? new TextField({placeholder: "Rendering"}) : + new MultiLingualTextFields(languages), "render", "Value to show", "Renders this value. Note that {key}-parts are substituted by the corresponding values of the element. If neither 'textFieldQuestion' nor 'mappings' are defined, this text is simply shown as default value." + "

" + - "Furhtermore, some special functions are supported:"+SpecialVisualizations.HelpMessage.Render()), + "Furhtermore, some special functions are supported:" + SpecialVisualizations.HelpMessage.Render()), questionsNotUnlocked ? `You need at least ${Constants.userJourney.themeGeneratorFullUnlock} changesets to unlock the 'question'-field and to use your theme to edit OSM data` : "", ...(options?.disableQuestions ? [] : questionSettings), @@ -114,17 +123,17 @@ export default class TagRenderingPanel extends InputElement { - try{ - new TagRenderingConfig(json,undefined, options?.title ?? ""); + try { + new TagRenderingConfig(json, undefined, options?.title ?? ""); return ""; - }catch(e){ - return ""+e+"" + } catch (e) { + return "" + e + "" } })); - + } InnerRender(): string { @@ -138,8 +147,6 @@ export default class TagRenderingPanel extends InputElement = new UIEventSource(false); - IsValid(t: TagRenderingConfigJson): boolean { return false; } diff --git a/UI/SubstitutedTranslation.ts b/UI/SubstitutedTranslation.ts index cd132fd..24c200f 100644 --- a/UI/SubstitutedTranslation.ts +++ b/UI/SubstitutedTranslation.ts @@ -9,7 +9,7 @@ import SpecialVisualizations from "./SpecialVisualizations"; import {Utils} from "../Utils"; export class SubstitutedTranslation extends UIElement { - private static cachedTranslations: + private static cachedTranslations: Map, SubstitutedTranslation>>> = new Map, SubstitutedTranslation>>>(); private readonly tags: UIEventSource; private readonly translation: Translation; @@ -34,39 +34,39 @@ export class SubstitutedTranslation extends UIElement { this.SetClass("w-full") } - private static GenerateMap(){ - return new Map, SubstitutedTranslation>() - } - private static GenerateSubCache(){ - return new Map, SubstitutedTranslation>>(); - } - public static construct( translation: Translation, tags: UIEventSource): SubstitutedTranslation { - - /* let cachedTranslations = Utils.getOrSetDefault(SubstitutedTranslation.cachedTranslations, SubstitutedTranslation.GenerateSubCache); - const innerMap = Utils.getOrSetDefault(cachedTranslations, translation, SubstitutedTranslation.GenerateMap); - const cachedTranslation = innerMap.get(tags); - if (cachedTranslation !== undefined) { - return cachedTranslation; - }*/ + /* let cachedTranslations = Utils.getOrSetDefault(SubstitutedTranslation.cachedTranslations, SubstitutedTranslation.GenerateSubCache); + const innerMap = Utils.getOrSetDefault(cachedTranslations, translation, SubstitutedTranslation.GenerateMap); + + const cachedTranslation = innerMap.get(tags); + if (cachedTranslation !== undefined) { + return cachedTranslation; + }*/ const st = new SubstitutedTranslation(translation, tags); - // innerMap.set(tags, st); + // innerMap.set(tags, st); return st; } public static SubstituteKeys(txt: string, tags: any) { for (const key in tags) { - // Poor mans replace all - txt = txt.split("{" + key + "}").join(tags[key]); + txt = txt.replace(new RegExp("{" + key + "}", "g"), tags[key]) } return txt; } + private static GenerateMap() { + return new Map, SubstitutedTranslation>() + } + + private static GenerateSubCache() { + return new Map, SubstitutedTranslation>>(); + } + InnerRender(): string { - if(this.content.length == 1){ + if (this.content.length == 1) { return this.content[0].Render(); } return new Combine(this.content).Render(); @@ -117,8 +117,8 @@ export class SubstitutedTranslation extends UIElement { } } - // IF we end up here, no changes have to be made - return [new FixedUiElement(template)]; + // IF we end up here, no changes have to be made - except to remove any resting {} + return [new FixedUiElement(template.replace(/{.*}/g, ""))]; } } \ No newline at end of file diff --git a/UI/i18n/Translation.ts b/UI/i18n/Translation.ts index 3808757..279b0a9 100644 --- a/UI/i18n/Translation.ts +++ b/UI/i18n/Translation.ts @@ -8,6 +8,8 @@ export class Translation extends UIElement { public static forcedLanguage = undefined; public readonly translations: object + return + allIcons; constructor(translations: object, context?: string) { super(Locale.language) @@ -17,6 +19,9 @@ export class Translation extends UIElement { let count = 0; for (const translationsKey in translations) { count++; + if(typeof(translations[translationsKey]) != "string"){ + throw "Error in an object depicting a translation: a non-string object was found. ("+context+")\n You probably put some other section accidentally in the translation" + } } this.translations = translations; if (count === 0) { @@ -46,7 +51,7 @@ export class Translation extends UIElement { public SupportedLanguages(): string[] { const langs = [] for (const translationsKey in this.translations) { - if(translationsKey === "#"){ + if (translationsKey === "#") { continue; } langs.push(translationsKey) @@ -102,7 +107,6 @@ export class Translation extends UIElement { return new Translation(this.translations) } - FirstSentence() { const tr = {}; @@ -115,4 +119,38 @@ export class Translation extends UIElement { return new Translation(tr); } + + public ExtractImages(isIcon = false): string[] { + const allIcons: string[] = [] + for (const key in this.translations) { + const render = this.translations[key] + + if (isIcon) { + const icons = render.split(";").filter(part => part.match(/(\.svg|\.png|\.jpg)$/) != null) + allIcons.push(...icons) + } else if (!Utils.runningFromConsole) { + // This might be a tagrendering containing some img as html + const htmlElement = document.createElement("div") + htmlElement.innerHTML = render + const images = Array.from(htmlElement.getElementsByTagName("img")).map(img => img.src) + allIcons.push(...images) + } else { + // We are running this in ts-node (~= nodejs), and can not access document + // So, we fallback to simple regex + try { + const matches = render.match(/]+>/g) + if (matches != null) { + const sources = matches.map(img => img.match(/src=("[^"]+"|'[^']+'|[^/ ]+)/)) + .filter(match => match != null) + .map(match => match[1].trim().replace(/^['"]/, '').replace(/['"]$/, '')); + allIcons.push(...sources) + } + }catch(e){ + console.error("Could not search for images: ", render, this.txt) + throw e + } + } + } + return allIcons.filter(icon => icon != undefined) + } } \ No newline at end of file diff --git a/Utils.ts b/Utils.ts index 941255b..4ac8d4c 100644 --- a/Utils.ts +++ b/Utils.ts @@ -10,6 +10,8 @@ export class Utils { public static runningFromConsole = false; public static readonly assets_path = "./assets/svg/"; + private static knownKeys = ["addExtraTags", "and", "calculatedTags", "changesetmessage", "clustering", "color", "condition", "customCss", "dashArray", "defaultBackgroundId", "description", "descriptionTail", "doNotDownload", "enableAddNewPoints", "enableBackgroundLayerSelection", "enableGeolocation", "enableLayers", "enableMoreQuests", "enableSearch", "enableShareScreen", "enableUserBadge", "freeform", "hideFromOverview", "hideInAnswer", "icon", "iconOverlays", "iconSize", "id", "if", "ifnot", "isShown", "key", "language", "layers", "lockLocation", "maintainer", "mappings", "maxzoom", "maxZoom", "minNeededElements", "minzoom", "multiAnswer", "name", "or", "osmTags", "passAllFeatures", "presets", "question", "render", "roaming", "roamingRenderings", "rotation", "shortDescription", "socialImage", "source", "startLat", "startLon", "startZoom", "tagRenderings", "tags", "then", "title", "titleIcons", "type", "version", "wayHandling", "widenFactor", "width"] + private static extraKeys = ["nl", "en", "fr", "de", "pt", "es", "name", "phone", "email", "amenity", "leisure", "highway", "building", "yes", "no", "true", "false"] static EncodeXmlValue(str) { return str.replace(/&/g, '&') @@ -202,6 +204,42 @@ export class Utils { return {x: Utils.lon2tile(lon, z), y: Utils.lat2tile(lat, z), z: z} } + public static MinifyJSON(stringified: string): string { + stringified = stringified.replace(/\|/g, "||"); + + const keys = Utils.knownKeys.concat(Utils.extraKeys); + for (let i = 0; i < keys.length; i++) { + const knownKey = keys[i]; + let code = i; + if (i >= 124) { + code += 1; // Character 127 is our 'escape' character | + } + let replacement = "|" + String.fromCharCode(code) + stringified = stringified.replace(new RegExp(`\"${knownKey}\":`, "g"), replacement); + } + + return stringified; + } + + public static UnMinify(minified: string): string { + + const parts = minified.split("|"); + let result = parts.shift(); + const keys = Utils.knownKeys.concat(Utils.extraKeys); + + for (const part of parts) { + if (part == "") { + // Empty string => this was a || originally + result += "|" + continue + } + const i = part.charCodeAt(0); + result += "\"" + keys[i] + "\":" + part.substring(1) + } + + return result; + } + private static tile2long(x, z) { return (x / Math.pow(2, z) * 360 - 180); } diff --git a/assets/SocialImage.png b/assets/SocialImage.png new file mode 100644 index 0000000..6b8d144 Binary files /dev/null and b/assets/SocialImage.png differ diff --git a/assets/generic_osm_background.png b/assets/generic_osm_background.png new file mode 100644 index 0000000..bcf619e Binary files /dev/null and b/assets/generic_osm_background.png differ diff --git a/assets/layers/benches/license_info.json b/assets/layers/benches/license_info.json new file mode 100644 index 0000000..0b125ce --- /dev/null +++ b/assets/layers/benches/license_info.json @@ -0,0 +1,10 @@ +[ + { + "authors": [ + "Pieter Vander Vennet" + ], + "path": "picnic_table.svg", + "license": "CC0", + "sources": [] + } +] \ No newline at end of file diff --git a/assets/layers/bicycle_library/license_info.json b/assets/layers/bicycle_library/license_info.json new file mode 100644 index 0000000..8ebd0f3 --- /dev/null +++ b/assets/layers/bicycle_library/license_info.json @@ -0,0 +1,10 @@ +[ + { + "authors": [ + "Pieter Vander Vennet" + ], + "path": "bicycle_library.svg", + "license": "CC0", + "sources": [] + } +] \ No newline at end of file diff --git a/assets/layers/bicycle_tube_vending_machine/license_info.json b/assets/layers/bicycle_tube_vending_machine/license_info.json new file mode 100644 index 0000000..fe85c0b --- /dev/null +++ b/assets/layers/bicycle_tube_vending_machine/license_info.json @@ -0,0 +1,18 @@ +[ + { + "authors": [ + "Pieter Vander Vennet" + ], + "path": "pinIcon.svg", + "license": "CC0", + "sources": [] + }, + { + "authors": [ + "Pieter Vander Vennet" + ], + "path": "tube.svg", + "license": "CC0", + "sources": [] + } +] \ No newline at end of file diff --git a/assets/layers/bike_cafe/license_info.json b/assets/layers/bike_cafe/license_info.json new file mode 100644 index 0000000..4dd843e --- /dev/null +++ b/assets/layers/bike_cafe/license_info.json @@ -0,0 +1,16 @@ +[ + { + "authors": [ + "Pieter Fiers", + "Thibault Declercq", + "Pierre Barban", + "Joost Schouppe", + "Pieter Vander Vennet" + ], + "path": "bike_cafe.svg", + "license": "CC-BY-SA", + "sources": [ + "https://osoc.be/editions/2020/cyclofix" + ] + } +] \ No newline at end of file diff --git a/assets/layers/bike_cleaning/license_info.json b/assets/layers/bike_cleaning/license_info.json new file mode 100644 index 0000000..6462add --- /dev/null +++ b/assets/layers/bike_cleaning/license_info.json @@ -0,0 +1,18 @@ +[ + { + "authors": [ + "Pieter Vander Vennet" + ], + "path": "bike_cleaning.svg", + "license": "CC0", + "sources": [] + }, + { + "authors": [ + "Pieter Vander Vennet" + ], + "path": "bike_cleaning_icon.svg", + "license": "CC0", + "sources": [] + } +] \ No newline at end of file diff --git a/assets/layers/bike_monitoring_station/license_info.json b/assets/layers/bike_monitoring_station/license_info.json new file mode 100644 index 0000000..5cf3c9f --- /dev/null +++ b/assets/layers/bike_monitoring_station/license_info.json @@ -0,0 +1,12 @@ +[ + { + "authors": [ + "Fabián Alexis" + ], + "path": "monitoring_station.svg", + "license": "CC-BY-SA 3.0", + "sources": [ + "https://commons.wikimedia.org/wiki/File:Antu_chronometer-reset.svg" + ] + } +] \ No newline at end of file diff --git a/assets/layers/bike_parking/bike_parking.json b/assets/layers/bike_parking/bike_parking.json index af9a49b..4c86ac8 100644 --- a/assets/layers/bike_parking/bike_parking.json +++ b/assets/layers/bike_parking/bike_parking.json @@ -293,7 +293,6 @@ "question": { "en": "Does this bicycle parking have spots for cargo bikes?", "nl": "Heeft deze fietsparking plaats voor bakfietsen?", - "fr": "TODO: fr", "gl": "Este aparcadoiro de bicicletas ten espazo para bicicletas de carga?", "de": "Gibt es auf diesem Fahrrad-Parkplatz Plätze für Lastenfahrräder?" }, @@ -303,7 +302,6 @@ "then": { "en": "This parking has room for cargo bikes", "nl": "Deze parking heeft plaats voor bakfietsen", - "fr": "TODO: fr", "gl": "Este aparcadoiro ten espazo para bicicletas de carga.", "de": "Dieser Parkplatz bietet Platz für Lastenfahrräder" } @@ -313,7 +311,6 @@ "then": { "en": "This parking has designated (official) spots for cargo bikes.", "nl": "Er zijn speciale plaatsen voorzien voor bakfietsen", - "fr": "TODO: fr", "gl": "Este aparcadoiro ten espazos designados (oficiais) para bicicletas de carga.", "de": "Dieser Parkplatz verfügt über ausgewiesene (offizielle) Plätze für Lastenfahrräder." } @@ -323,7 +320,6 @@ "then": { "en": "You're not allowed to park cargo bikes", "nl": "Je mag hier geen bakfietsen parkeren", - "fr": "TODO: fr", "gl": "Non está permitido aparcar bicicletas de carga", "de": "Es ist nicht erlaubt, Lastenfahrräder zu parken" } diff --git a/assets/layers/bike_parking/license_info.json b/assets/layers/bike_parking/license_info.json new file mode 100644 index 0000000..4e53f86 --- /dev/null +++ b/assets/layers/bike_parking/license_info.json @@ -0,0 +1,100 @@ +[ + { + "authors": [ + "Gitte Vande Graveele" + ], + "path": "bollard.svg", + "license": "CC-BY-SA", + "sources": [ + "https://osoc.be/editions/2020/walk-by-brussels" + ] + }, + { + "authors": [ + "Gitte Vande Graveele" + ], + "path": "handlebar_holder.svg", + "license": "CC-BY-SA", + "sources": [ + "https://osoc.be/editions/2020/walk-by-brussels" + ] + }, + { + "authors": [ + "Pieter Fiers", + "Thibault Declercq", + "Pierre Barban", + "Joost Schouppe", + "Pieter Vander Vennet" + ], + "path": "parking.svg", + "license": "CC-BY-SA", + "sources": [ + "https://osoc.be/editions/2020/cyclofix" + ] + }, + { + "authors": [ + "Pieter Fiers", + "Thibault Declercq", + "Pierre Barban", + "Joost Schouppe", + "Pieter Vander Vennet" + ], + "path": "parking_old.svg", + "license": "CC-BY-SA", + "sources": [ + "https://osoc.be/editions/2020/cyclofix" + ] + }, + { + "authors": [ + "Gitte Vande Graveele" + ], + "path": "rack.svg", + "license": "CC-BY-SA", + "sources": [ + "https://osoc.be/editions/2020/walk-by-brussels" + ] + }, + { + "authors": [ + "Gitte Vande Graveele" + ], + "path": "shed.svg", + "license": "CC-BY-SA", + "sources": [ + "https://osoc.be/editions/2020/walk-by-brussels" + ] + }, + { + "authors": [ + "Gitte Vande Graveele" + ], + "path": "staple.svg", + "license": "CC-BY-SA", + "sources": [ + "https://osoc.be/editions/2020/walk-by-brussels" + ] + }, + { + "authors": [ + "Gitte Vande Graveele" + ], + "path": "two_tier.svg", + "license": "CC-BY-SA", + "sources": [ + "https://osoc.be/editions/2020/walk-by-brussels" + ] + }, + { + "authors": [ + "Gitte Vande Graveele" + ], + "path": "wall_loops.svg", + "license": "CC-BY-SA", + "sources": [ + "https://osoc.be/editions/2020/walk-by-brussels" + ] + } +] \ No newline at end of file diff --git a/assets/layers/bike_repair_station/bike_repair_station.json b/assets/layers/bike_repair_station/bike_repair_station.json index 862de26..307c155 100644 --- a/assets/layers/bike_repair_station/bike_repair_station.json +++ b/assets/layers/bike_repair_station/bike_repair_station.json @@ -533,8 +533,8 @@ "service:bicycle:pump=yes" ], "description": { - "en": "A device to inflate your tires on a fixed location in the public space.

Examples of bicycle pumps

", - "nl": "Een apparaat waar je je fietsbanden kan oppompen, beschikbaar in de publieke ruimte. De fietspomp in je kelder telt dus niet.

Voorbeelden

" + "en": "A device to inflate your tires on a fixed location in the public space.

Examples of bicycle pumps

", + "nl": "Een apparaat waar je je fietsbanden kan oppompen, beschikbaar in de publieke ruimte. De fietspomp in je kelder telt dus niet.

Voorbeelden

Examples of bicycle pumps

" } }, { diff --git a/assets/layers/bike_repair_station/license_info.json b/assets/layers/bike_repair_station/license_info.json new file mode 100644 index 0000000..91cf7a7 --- /dev/null +++ b/assets/layers/bike_repair_station/license_info.json @@ -0,0 +1,126 @@ +[ + { + "authors": [ + "Pieter Fiers", + "Thibault Declercq", + "Pierre Barban", + "Joost Schouppe", + "Pieter Vander Vennet" + ], + "path": "bike_pump.svg", + "license": "CC-BY-SA", + "sources": [ + "https://osoc.be/editions/2020/cyclofix" + ] + }, + { + "authors": [ + "Pieter Fiers", + "Thibault Declercq", + "Pierre Barban", + "Joost Schouppe", + "Pieter Vander Vennet" + ], + "path": "broken_pump.svg", + "license": "CC-BY-SA", + "sources": [ + "https://osoc.be/editions/2020/cyclofix" + ] + }, + { + "authors": [ + "Pieter Fiers", + "Thibault Declercq", + "Pierre Barban", + "Joost Schouppe", + "Pieter Vander Vennet" + ], + "path": "broken_pump_2.svg", + "license": "CC-BY-SA", + "sources": [ + "https://osoc.be/editions/2020/cyclofix" + ] + }, + { + "authors": [ + "Pieter Fiers", + "Thibault Declercq", + "Pierre Barban", + "Joost Schouppe", + "Pieter Vander Vennet" + ], + "path": "pump.svg", + "license": "CC-BY-SA", + "sources": [ + "https://osoc.be/editions/2020/cyclofix" + ] + }, + { + "authors": [ + "Turvec Solutions" + ], + "path": "pump_example.png", + "license": "Used with permission; all rights reserved", + "note": "Used with permission after email conversation, can be assumed to be CC-BY", + "sources": [ + "https://turvec.com/product/public-bike-pump/" + ] + }, + { + "authors": [ + "Pieter Vander Vennet" + ], + "path": "pump_example_manual.jpg", + "license": "CC0", + "sources": [] + }, + { + "authors": [ + "©Altinnova" + ], + "path": "pump_example_round.jpg", + "license": "Used with permission; all rights reserved", + "sources": [ + "https://www.altinnova.com", + "https://www.teeken.de/produkte/stadtmobiliar/green-air1/12?lang=3" + ] + }, + { + "authors": [ + "Pieter Fiers", + "Thibault Declercq", + "Pierre Barban", + "Joost Schouppe", + "Pieter Vander Vennet" + ], + "path": "repair_station.svg", + "license": "CC-BY-SA", + "sources": [ + "https://osoc.be/editions/2020/cyclofix" + ] + }, + { + "authors": [ + "Polarbear24" + ], + "path": "repair_station_example.jpg", + "license": "CC-BY-SA 4.0", + "sources": [ + "https://wiki.openstreetmap.org/wiki/File:Public_Bike_Repair_Station.jpg" + ] + }, + { + "authors": [ + "Pieter Fiers", + "Thibault Declercq", + "Pierre Barban", + "Joost Schouppe", + "Pieter Vander Vennet" + ], + "path": "repair_station_pump.svg", + "license": "CC-BY-SA", + "sources": [ + "https://osoc.be/editions/2020/cyclofix" + ] + } +] \ No newline at end of file diff --git a/assets/layers/bike_shop/bike_shop.json b/assets/layers/bike_shop/bike_shop.json index 0bc027b..bbb94e0 100644 --- a/assets/layers/bike_shop/bike_shop.json +++ b/assets/layers/bike_shop/bike_shop.json @@ -58,8 +58,7 @@ { "if": { "and": [ - "shop=sports", - "name~*" + "shop=sports" ] }, "then": { @@ -68,18 +67,10 @@ "fr": "Magasin de sport {name}" } }, - { - "if": "shop=sports", - "then": { - "en": "Sport gear shop", - "nl": "Sportwinkel", - "fr": "Magasin de sport" - } - }, { "if": { "and": [ - "shop!~bicycle", + "shop!~.*bicycle.*", "shop~*" ] }, @@ -88,9 +79,24 @@ { "if": { "and": [ - "name~*", + { + "or": [ + "service:bicycle:rental=yes", + "amenity=bicycle_rental" + ] + } + ] + }, + "then": { + "nl": "Fietsverhuur {name}", + "en": "Bicycle rental {name}" + } + }, + { + "if": { + "and": [ "service:bicycle:retail!~yes", - "service:bicycle:repair!~no" + "service:bicycle:repair=yes" ] }, "then": { @@ -104,22 +110,6 @@ { "if": { "and": [ - "service:bicycle:retail!~yes", - "service:bicycle:repair!~no" - ] - }, - "then": { - "en": "Bike repair", - "nl": "Fietsenmaker", - "fr": "Réparateur de vélo", - "gl": "Arranxo de bicicletas", - "de": "Fahrradwerkstatt" - } - }, - { - "if": { - "and": [ - "name~*", "service:bicycle:repair!~yes" ] }, @@ -131,33 +121,6 @@ "de": "Fahrradgeschäft {name}" } }, - { - "if": "service:bicycle:repair!~yes", - "then": { - "en": "Bike shop", - "nl": "Fietswinkel", - "fr": "Magasin de vélo", - "gl": "Tenda de bicicletas", - "de": "Fahrradgeschäft" - } - }, - { - "if": { - "and": [ - "name~*", - { - "or": [ - "service:bicycle:rental=yes", - "amenity=bicycle_rental" - ] - } - ] - }, - "then": { - "nl": "Fietsverhuur {name}", - "en": "Bicycle rental {name}" - } - }, { "if": "name~*", "then": { diff --git a/assets/layers/bike_shop/license_info.json b/assets/layers/bike_shop/license_info.json new file mode 100644 index 0000000..af036ad --- /dev/null +++ b/assets/layers/bike_shop/license_info.json @@ -0,0 +1,58 @@ +[ + { + "authors": [ + "Pieter Fiers", + "Thibault Declercq", + "Pierre Barban", + "Joost Schouppe", + "Pieter Vander Vennet" + ], + "path": "pump.svg", + "license": "CC-BY-SA", + "sources": [ + "https://osoc.be/editions/2020/cyclofix" + ] + }, + { + "authors": [ + "Pieter Fiers", + "Thibault Declercq", + "Pierre Barban", + "Joost Schouppe", + "Pieter Vander Vennet" + ], + "path": "repair_shop.svg", + "license": "CC-BY-SA", + "sources": [ + "https://osoc.be/editions/2020/cyclofix" + ] + }, + { + "authors": [ + "Pieter Fiers", + "Thibault Declercq", + "Pierre Barban", + "Joost Schouppe", + "Pieter Vander Vennet" + ], + "path": "shop.svg", + "license": "CC-BY-SA", + "sources": [ + "https://osoc.be/editions/2020/cyclofix" + ] + }, + { + "authors": [ + "Pieter Fiers", + "Thibault Declercq", + "Pierre Barban", + "Joost Schouppe", + "Pieter Vander Vennet" + ], + "path": "tools.svg", + "license": "CC-BY-SA", + "sources": [ + "https://osoc.be/editions/2020/cyclofix" + ] + } +] \ No newline at end of file diff --git a/assets/layers/bird_hide/license_info.json b/assets/layers/bird_hide/license_info.json new file mode 100644 index 0000000..73f3ddb --- /dev/null +++ b/assets/layers/bird_hide/license_info.json @@ -0,0 +1,22 @@ +[ + { + "authors": [ + "Font Awesome" + ], + "path": "birdhide.svg", + "license": "CC-BY 4.0", + "sources": [ + "https://fontawesome.com" + ] + }, + { + "authors": [ + "Font Awesome Free 5.2.0 by @fontawesome" + ], + "path": "birdshelter.svg", + "license": "CC-BY-SA 4.0", + "sources": [ + "https://fontawesome.com\r" + ] + } +] \ No newline at end of file diff --git a/assets/layers/cycling_themed_object/license_info.json b/assets/layers/cycling_themed_object/license_info.json new file mode 100644 index 0000000..30582c5 --- /dev/null +++ b/assets/layers/cycling_themed_object/license_info.json @@ -0,0 +1,10 @@ +[ + { + "authors": [ + "Pieter Vander Vennet" + ], + "path": "other_services.svg", + "license": "CC0", + "sources": [] + } +] \ No newline at end of file diff --git a/assets/layers/drinking_water/drinking_water.json b/assets/layers/drinking_water/drinking_water.json index acc7fe4..6a84102 100644 --- a/assets/layers/drinking_water/drinking_water.json +++ b/assets/layers/drinking_water/drinking_water.json @@ -82,21 +82,21 @@ "if": "operational_status=", "then": { "en": "This drinking water works", - "nl": "Deze drinkwaterfonteint werkt" + "nl": "Deze drinkwaterfontein werkt" } }, { "if": "operational_status=broken", "then": { "en": "This drinking water is broken", - "nl": "Deze drinkwaterfonteint is kapot" + "nl": "Deze drinkwaterfontein is kapot" } }, { "if": "operational_status=closed", "then": { "en": "This drinking water is closed", - "nl": "Deze drinkwaterfonteint is afgesloten" + "nl": "Deze drinkwaterfontein is afgesloten" } } ] diff --git a/assets/layers/drinking_water/license_info.json b/assets/layers/drinking_water/license_info.json new file mode 100644 index 0000000..9a07669 --- /dev/null +++ b/assets/layers/drinking_water/license_info.json @@ -0,0 +1,16 @@ +[ + { + "authors": [ + "Pieter Fiers", + "Thibault Declercq", + "Pierre Barban", + "Joost Schouppe", + "Pieter Vander Vennet" + ], + "path": "drips.svg", + "license": "CC-BY-SA", + "sources": [ + "https://osoc.be/editions/2020/cyclofix" + ] + } +] \ No newline at end of file diff --git a/assets/layers/ghost_bike/license_info.json b/assets/layers/ghost_bike/license_info.json new file mode 100644 index 0000000..d46c19d --- /dev/null +++ b/assets/layers/ghost_bike/license_info.json @@ -0,0 +1,10 @@ +[ + { + "authors": [ + "Pieter Vander Vennet" + ], + "path": "ghost_bike.svg", + "license": "CC0", + "sources": [] + } +] \ No newline at end of file diff --git a/assets/layers/information_board/license_info.json b/assets/layers/information_board/license_info.json new file mode 100644 index 0000000..3dc32b2 --- /dev/null +++ b/assets/layers/information_board/license_info.json @@ -0,0 +1,10 @@ +[ + { + "authors": [], + "path": "board.svg", + "license": "CC0", + "sources": [ + "https://wiki.openstreetmap.org/wiki/File:Board-14.svg" + ] + } +] \ No newline at end of file diff --git a/assets/layers/maps/license_info.json b/assets/layers/maps/license_info.json new file mode 100644 index 0000000..3777e54 --- /dev/null +++ b/assets/layers/maps/license_info.json @@ -0,0 +1,42 @@ +[ + { + "authors": [ + "OpenStreetMap", + " Pieter Vander Vennet", + " M!dgard" + ], + "path": "map-stickered.svg", + "license": "CC-BY-SA", + "sources": [ + "https://OpenStreetMap.org", + " https://wiki.openstreetmap.org/wiki/Logos" + ] + }, + { + "authors": [], + "path": "map.svg", + "license": "CC-BY-SA", + "sources": [ + "https://www.OpenStreetMap.org" + ], + "note": "Modified OpenStreetMap logo" + }, + { + "authors": [], + "path": "osm-logo-buggy-attr.svg", + "license": "CC-BY-SA", + "sources": [ + "https://www.OpenStreetMap.org" + ], + "note": "Modified OpenStreetMap logo" + }, + { + "authors": [], + "path": "osm-logo-white-bg.svg", + "license": "CC-BY-SA", + "sources": [ + "https://www.OpenStreetMap.org" + ], + "note": "Modified OpenStreetMap logo" + } +] \ No newline at end of file diff --git a/assets/layers/nature_reserve/license_info.json b/assets/layers/nature_reserve/license_info.json new file mode 100644 index 0000000..c7e2310 --- /dev/null +++ b/assets/layers/nature_reserve/license_info.json @@ -0,0 +1,42 @@ +[ + { + "authors": [ + "Agentschap Natuur en Bos" + ], + "path": "ANB.jpg", + "license": "Logo; All rights reserved", + "sources": [ + "https://www.natuurenbos.be/" + ] + }, + { + "authors": [ + "Natuurpunt" + ], + "path": "Natuurpunt.jpg", + "license": "Logo; All rights reserved", + "sources": [ + "https://www.natuurpunt.be/" + ] + }, + { + "authors": [ + "Groen" + ], + "path": "groen_logo.svg", + "license": "All rights reserved", + "sources": [ + "https://www.groen.be/" + ] + }, + { + "authors": [ + "@ Эдуард Черных" + ], + "path": "nature_reserve.svg", + "license": "CC-BY 3.0", + "sources": [ + "https://www.onlinewebfonts.com/icon/389579" + ] + } +] \ No newline at end of file diff --git a/assets/layers/nature_reserve/nature_reserve.json b/assets/layers/nature_reserve/nature_reserve.json index faabad8..4de9ca2 100644 --- a/assets/layers/nature_reserve/nature_reserve.json +++ b/assets/layers/nature_reserve/nature_reserve.json @@ -20,7 +20,7 @@ { "if": { "and": [ - "name:nl~" + "name:nl~*" ] }, "then": { @@ -333,14 +333,14 @@ } }, { - "#": "Surface are", + "#": "Surface area", "render": { - "en": "Surface area: {_surface:ha}Ha", - "mappings": { + "en": "Surface area: {_surface:ha}Ha" + }, + "mappings":[ { "if": "_surface:ha=0", - "then": "" - } - } + "then": {"*":""} + }] } ], "hideUnderlayingFeaturesMinPercentage": 10, @@ -372,4 +372,4 @@ } ] } - \ No newline at end of file + diff --git a/assets/layers/play_forest/icon.jpg b/assets/layers/play_forest/icon.jpg deleted file mode 100644 index 5a0b42b..0000000 Binary files a/assets/layers/play_forest/icon.jpg and /dev/null differ diff --git a/assets/layers/play_forest/license_info.json b/assets/layers/play_forest/license_info.json new file mode 100644 index 0000000..696a885 --- /dev/null +++ b/assets/layers/play_forest/license_info.json @@ -0,0 +1,12 @@ +[ + { + "authors": [ + "Agentschap Natuur en Bos" + ], + "path": "icon.svg", + "license": "?", + "sources": [ + "https://www.natuurenbos.be/spelen" + ] + } +] \ No newline at end of file diff --git a/assets/layers/playground/playground.json b/assets/layers/playground/playground.json index df78ce6..416934c 100644 --- a/assets/layers/playground/playground.json +++ b/assets/layers/playground/playground.json @@ -313,7 +313,7 @@ ], "hideUnderlayingFeaturesMinPercentage": 0, "icon": { - "render": "https://upload.wikimedia.org/wikipedia/commons/0/00/Map_icons_by_Scott_de_Jonge_-_playground.svg" + "render": "./assets/themes/playgrounds/playground.svg" }, "iconOverlays": [ { @@ -347,4 +347,4 @@ } ], "wayHandling": 2 -} \ No newline at end of file +} diff --git a/assets/layers/public_bookcases/public_bookcases.json b/assets/layers/public_bookcases/public_bookcases.json index c159920..13f990e 100644 --- a/assets/layers/public_bookcases/public_bookcases.json +++ b/assets/layers/public_bookcases/public_bookcases.json @@ -37,7 +37,15 @@ ] }, "icon": { - "render": "./assets/themes/bookcases/bookcase.svg" + "render": "./assets/themes/bookcases/bookcase.svg;" + }, + "label": { + "mappings": [ + { + "if": "name~*", + "then": "
{name}
" + } + ] }, "color": { "render": "#0000ff" diff --git a/assets/layers/sport_pitch/license_info.json b/assets/layers/sport_pitch/license_info.json new file mode 100644 index 0000000..c0b1696 --- /dev/null +++ b/assets/layers/sport_pitch/license_info.json @@ -0,0 +1,13 @@ +[ + { + "authors": [ + "@fontawesome" + ], + "path": "tabletennis.svg", + "license": "CC-BY 4.0", + "sources": [ + "https://commons.wikimedia.org/wiki/File:Font_Awesome_5_solid_table-tennis.svg", + " https://fontawesome.com" + ] + } +] \ No newline at end of file diff --git a/assets/layers/surveillance_cameras/surveillance_cameras.json b/assets/layers/surveillance_cameras/surveillance_cameras.json index 83dc80d..5ac7e6d 100644 --- a/assets/layers/surveillance_cameras/surveillance_cameras.json +++ b/assets/layers/surveillance_cameras/surveillance_cameras.json @@ -295,7 +295,7 @@ }, "render": { "en": "Mounting method: {mount}", - "nl": "Montage: {mount}" + "nl": "Montage: {camera:mount}" }, "freeform": { "key": "camera:mount" diff --git a/assets/layers/toilets/license_info.json b/assets/layers/toilets/license_info.json new file mode 100644 index 0000000..3df10fd --- /dev/null +++ b/assets/layers/toilets/license_info.json @@ -0,0 +1,27 @@ +[ + { + "authors": [], + "path": "toilets.svg", + "license": "CC0", + "sources": [ + "https://wiki.openstreetmap.org/wiki/File:Toilets-16.svg" + ] + }, + { + "authors": [ + "asianson.design", + " Pieter Vander Vennet" + ], + "path": "urinal.svg", + "license": "CC-BY", + "sources": [ + "https://thenounproject.com/term/urinal/1307984/" + ] + }, + { + "authors": [], + "path": "wheelchair.svg", + "license": "CC0", + "sources": [] + } +] \ No newline at end of file diff --git a/assets/layers/trees/Onroerend_Erfgoed_logo_without_text.svg b/assets/layers/trees/Onroerend_Erfgoed_logo_without_text.svg new file mode 100644 index 0000000..08a1c7f --- /dev/null +++ b/assets/layers/trees/Onroerend_Erfgoed_logo_without_text.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/assets/layers/trees/license_info.json b/assets/layers/trees/license_info.json new file mode 100644 index 0000000..934db79 --- /dev/null +++ b/assets/layers/trees/license_info.json @@ -0,0 +1,12 @@ +[ + { + "authors": [ + "M!dgard" + ], + "path": "Onroerend_Erfgoed_logo_without_text.svg", + "license": "CC0", + "sources": [ + "https://commons.wikimedia.org/wiki/File:Onroerend_Erfgoed_logo_without_text.svg" + ] + } +] \ No newline at end of file diff --git a/assets/layers/trees/tree_nodes.json b/assets/layers/trees/tree_nodes.json index 644ce39..3efd880 100644 --- a/assets/layers/trees/tree_nodes.json +++ b/assets/layers/trees/tree_nodes.json @@ -277,8 +277,8 @@ ] }, "then": { - "nl": "\"\"/ Erkend als houtig erfgoed door Onroerend Erfgoed Vlaanderen", - "en": "\"\"/ Registered as heritage by Onroerend Erfgoed Flanders" + "nl": "\"\"/ Erkend als houtig erfgoed door Onroerend Erfgoed Vlaanderen", + "en": "\"\"/ Registered as heritage by Onroerend Erfgoed Flanders" } }, { @@ -339,8 +339,8 @@ }, { "render": { - "nl": "\"\"/ Onroerend Erfgoed-ID: {ref:OnroerendErfgoed}", - "en": "\"\"/ Onroerend Erfgoed ID: {ref:OnroerendErfgoed}" + "nl": "\"\"/ Onroerend Erfgoed-ID: {ref:OnroerendErfgoed}", + "en": "\"\"/ Onroerend Erfgoed ID: {ref:OnroerendErfgoed}" }, "question": { "nl": "Wat is het ID uitgegeven door Onroerend Erfgoed Vlaanderen?", @@ -359,8 +359,8 @@ }, { "render": { - "nl": "\"\"/ Wikidata: {wikidata}", - "en": "\"\"/ Wikidata: {wikidata}" + "nl": "\"\"/ Wikidata: {wikidata}", + "en": "\"\"/ Wikidata: {wikidata}" }, "question": { "nl": "Wat is het Wikidata-ID van deze boom?", diff --git a/assets/layers/viewpoint/license_info.json b/assets/layers/viewpoint/license_info.json new file mode 100644 index 0000000..3c96b2f --- /dev/null +++ b/assets/layers/viewpoint/license_info.json @@ -0,0 +1,10 @@ +[ + { + "authors": [], + "path": "viewpoint.svg", + "license": "CC0", + "sources": [ + "https://wiki.openstreetmap.org/wiki/File:Viewpoint-16.svg" + ] + } +] \ No newline at end of file diff --git a/assets/license_info.json b/assets/license_info.json new file mode 100644 index 0000000..79c0350 --- /dev/null +++ b/assets/license_info.json @@ -0,0 +1,64 @@ +[ + { + "authors": [ + "Pieter Vander Vennet" + ], + "path": "SocialImage.png", + "license": "CC0", + "sources": [] + }, + { + "authors": [ + "OpenStreetMap" + ], + "path": "generic_osm_background.png", + "license": "CC-BY-SA", + "sources": [ + "https://www.OpenStreetMap.org" + ] + }, + { + "authors": [ + "Mangrove Reviews" + ], + "path": "mangrove_logo.png", + "license": "logo; All rights reserved", + "sources": [ + "https://mangrove.reviews/" + ] + }, + { + "authors": [ + "Pieter Vander Vennet" + ], + "path": "social_image_front.png", + "license": "CC-BY-SA", + "sources": [ + "" + ] + }, + { + "authors": [ + "Pieter Vander Vennet", + " OpenStreetMap" + ], + "path": "weblogo.png", + "license": "Logo; CC-BY-SA", + "sources": [ + "https://mapcomplete.osm.be", + " https://www.openstreetmap.org" + ] + }, + { + "authors": [ + "Pieter Vander Vennet", + " OpenStreetMap" + ], + "path": "weblogo.svg", + "license": "Logo; CC-BY-SA", + "sources": [ + "https://mapcomplete.osm.be", + " https://www.openstreetmap.org" + ] + } +] \ No newline at end of file diff --git a/assets/social_image_front.png b/assets/social_image_front.png new file mode 100644 index 0000000..f766405 Binary files /dev/null and b/assets/social_image_front.png differ diff --git a/assets/svg/SocialImageForeground.svg b/assets/svg/SocialImageForeground.svg new file mode 100644 index 0000000..fa9e138 --- /dev/null +++ b/assets/svg/SocialImageForeground.svg @@ -0,0 +1,2522 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 010110010011010110010011  + 010110010011010110010011  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/svg/license_info.json b/assets/svg/license_info.json new file mode 100644 index 0000000..1587895 --- /dev/null +++ b/assets/svg/license_info.json @@ -0,0 +1,554 @@ +[ + { + "authors": [ + "Pieter Vander Vennet" + ], + "path": "SocialImageForeground.svg", + "license": "CC-BY-SA", + "sources": [ + "" + ] + }, + { + "authors": [ + "Pieter Vander Vennet" + ], + "path": "add.svg", + "license": "CC0", + "sources": [ + "" + ] + }, + { + "authors": [ + "Pieter Vander Vennet" + ], + "path": "addSmall.svg", + "license": "CC0", + "sources": [] + }, + { + "authors": [], + "path": "ampersand.svg", + "license": "CC0; trivial", + "sources": [] + }, + { + "authors": [ + "Pieter Vander Vennet" + ], + "path": "arrow-left-smooth.svg", + "license": "CC0", + "sources": [] + }, + { + "authors": [ + "Pieter Vander Vennet" + ], + "path": "arrow-right-smooth.svg", + "license": "CC0", + "sources": [] + }, + { + "authors": [ + "Pieter Vander Vennet" + ], + "path": "back.svg", + "license": "CC0", + "sources": [] + }, + { + "authors": [ + "Github" + ], + "path": "bug.svg", + "license": "MIT", + "sources": [ + "https://commons.wikimedia.org/wiki/File:Octicons-bug.svg", + " https://github.com/primer/octicons" + ] + }, + { + "path": "camera-plus.svg", + "license": "CC-BY-SA 3.0", + "authors": [ + "Dave Gandy", + "Pieter Vander Vennet" + ], + "sources": [ + "https://fontawesome.com/", + "https://commons.wikimedia.org/wiki/File:Camera_font_awesome.svg" + ] + }, + { + "authors": [ + "Pieter Vander Vennet" + ], + "path": "checkmark.svg", + "license": "CC0", + "sources": [] + }, + { + "authors": [ + "Pieter Vander Vennet" + ], + "path": "circle.svg", + "license": "CC0", + "sources": [] + }, + { + "authors": [ + "Pieter Vander Vennet" + ], + "path": "clock.svg", + "license": "CC0", + "sources": [] + }, + { + "authors": [], + "path": "close.svg", + "license": "CC0; trivial", + "sources": [] + }, + { + "authors": [], + "path": "compass.svg", + "license": "CC0; trivial", + "sources": [] + }, + { + "authors": [], + "path": "cross_bottom_right.svg", + "license": "CC0; trivial", + "sources": [] + }, + { + "authors": [], + "path": "crosshair-blue-center.svg", + "license": "CC0; trivial", + "sources": [] + }, + { + "authors": [], + "path": "crosshair-blue.svg", + "license": "CC0; trivial", + "sources": [] + }, + { + "authors": [], + "path": "crosshair.svg", + "license": "CC0; trivial", + "sources": [] + }, + { + "authors": [ + "Dave Gandy" + ], + "path": "delete_icon.svg", + "license": "CC-BY-SA", + "sources": [ + "https://commons.wikimedia.org/wiki/File:Trash_font_awesome.svg\rT" + ] + }, + { + "authors": [], + "path": "direction.svg", + "license": "CC0; trivial", + "sources": [] + }, + { + "authors": [], + "path": "direction_gradient.svg", + "license": "CC0; trivial", + "sources": [] + }, + { + "authors": [], + "path": "down.svg", + "license": "CC0; trivial", + "sources": [] + }, + { + "authors": [], + "path": "envelope.svg", + "license": "CC0; trivial", + "sources": [] + }, + { + "authors": [ + "The Tango Desktop Project" + ], + "path": "floppy.svg", + "license": "CC0", + "sources": [ + "https://commons.wikimedia.org/wiki/File:Media-floppy.svg", + " http://tango.freedesktop.org/Tango_Desktop_Project" + ] + }, + { + "authors": [], + "path": "gear.svg", + "license": "CC0; trivial", + "sources": [] + }, + { + "authors": [], + "path": "help.svg", + "license": "CC0; trivial", + "sources": [] + }, + { + "authors": [ + "Timothy Miller" + ], + "path": "home.svg", + "license": "CC-BY-SA 3.0", + "sources": [ + "https://commons.wikimedia.org/wiki/File:Home-icon.svg" + ] + }, + { + "authors": [ + "Timothy Miller" + ], + "path": "home_white_bg.svg", + "license": "CC-BY-SA 3.0", + "sources": [ + "https://commons.wikimedia.org/wiki/File:Home-icon.svg" + ] + }, + { + "authors": [ + "JOSM Team" + ], + "path": "josm_logo.svg", + "license": "CC0", + "sources": [ + "https://wiki.openstreetmap.org/wiki/File:JOSM_Logotype_2019.svg", + " https://josm.openstreetmap.de/" + ] + }, + { + "authors": [], + "path": "layers.svg", + "license": "CC0; trivial", + "sources": [] + }, + { + "authors": [], + "path": "layersAdd.svg", + "license": "CC0; trivial", + "sources": [] + }, + { + "path": "Ornament-Horiz-0.svg", + "license": "CC-BY", + "authors": [ + "Nightwolfdezines" + ], + "sources": [ + "https://www.vecteezy.com/vector-art/226361-ornaments-and-flourishes" + ] + }, + { + "path": "Ornament-Horiz-1.svg", + "license": "CC-BY", + "authors": [ + "Nightwolfdezines" + ], + "sources": [ + "https://www.vecteezy.com/vector-art/226361-ornaments-and-flourishes" + ] + }, + { + "path": "Ornament-Horiz-2.svg", + "license": "CC-BY", + "authors": [ + "Nightwolfdezines" + ], + "sources": [ + "https://www.vecteezy.com/vector-art/226361-ornaments-and-flourishes" + ] + }, + { + "path": "Ornament-Horiz-3.svg", + "license": "CC-BY", + "authors": [ + "Nightwolfdezines" + ], + "sources": [ + "https://www.vecteezy.com/vector-art/226361-ornaments-and-flourishes" + ] + }, + { + "path": "Ornament-Horiz-4.svg", + "license": "CC-BY", + "authors": [ + "Nightwolfdezines" + ], + "sources": [ + "https://www.vecteezy.com/vector-art/226361-ornaments-and-flourishes" + ] + }, + { + "path": "Ornament-Horiz-5.svg", + "license": "CC-BY", + "authors": [ + "Nightwolfdezines" + ], + "sources": [ + "https://www.vecteezy.com/vector-art/226361-ornaments-and-flourishes" + ] + }, + { + "path": "Ornament-Horiz-6.svg", + "license": "CC-BY", + "authors": [ + "Nightwolfdezines" + ], + "sources": [ + "https://www.vecteezy.com/vector-art/226361-ornaments-and-flourishes" + ] + }, + { + "authors": [], + "path": "star.svg", + "license": "CC0; trivial", + "sources": [] + }, + { + "authors": [], + "path": "star_outline.svg", + "license": "CC0; trivial", + "sources": [] + }, + { + "authors": [], + "path": "star_half.svg", + "license": "CC0; trivial", + "sources": [] + }, + { + "authors": [], + "path": "star_outline_half.svg", + "license": "CC0; trivial", + "sources": [] + }, + { + "authors": [], + "path": "logo.svg", + "license": "CC0; trivial", + "sources": [] + }, + { + "authors": [], + "path": "logout.svg", + "license": "CC0; trivial", + "sources": [] + }, + { + "authors": [ + "Pieter Vander Vennet", + " OSM" + ], + "path": "mapcomplete_logo.svg", + "license": "Logo; CC-BY-SA", + "sources": [ + "" + ] + }, + { + "authors": [ + "Mapillary" + ], + "path": "mapillary.svg", + "license": "Logo; All rights reserved", + "sources": [ + "https://mapillary.com/" + ] + }, + { + "authors": [], + "path": "min.svg", + "license": "CC0; trivial", + "sources": [] + }, + { + "authors": [], + "path": "no_checkmark.svg", + "license": "CC0; trivial", + "sources": [] + }, + { + "authors": [], + "path": "or.svg", + "license": "CC0; trivial", + "sources": [] + }, + { + "authors": [], + "path": "osm-copyright.svg", + "license": "logo; all rights reserved", + "sources": [ + "https://www.OpenStreetMap.org" + ] + }, + { + "authors": [ + "OpenStreetMap U.S. Chapter" + ], + "path": "osm-logo-us.svg", + "license": "Logo", + "sources": [ + "https://www.openstreetmap.us/" + ] + }, + { + "authors": [], + "path": "osm-logo.svg", + "license": "logo; all rights reserved", + "sources": [ + "https://www.OpenStreetMap.org" + ] + }, + { + "authors": [ + "GitHub Octicons" + ], + "path": "pencil.svg", + "license": "MIT", + "sources": [ + "https://github.com/primer/octicons", + " https://commons.wikimedia.org/wiki/File:Octicons-pencil.svg" + ] + }, + { + "authors": [ + "@ tyskrat" + ], + "path": "phone.svg", + "license": "CC-BY 3.0", + "sources": [ + "https://www.onlinewebfonts.com/icon/1059" + ] + }, + { + "authors": [], + "path": "pin.svg", + "license": "CC0; trivial", + "sources": [] + }, + { + "authors": [], + "path": "plus.svg", + "license": "CC0; trivial", + "sources": [] + }, + { + "authors": [ + "@fatih" + ], + "path": "pop-out.svg", + "license": "CC-BY 3.0", + "sources": [ + "https://www.onlinewebfonts.com/icon/2151" + ] + }, + { + "authors": [], + "path": "reload.svg", + "license": "CC0; trivial", + "sources": [] + }, + { + "authors": [], + "path": "ring.svg", + "license": "CC0; trivial", + "sources": [] + }, + { + "authors": [ + "OOjs UI Team and other contributors" + ], + "path": "search.svg", + "license": "MIT", + "sources": [ + "https://commons.wikimedia.org/wiki/File:OOjs_UI_indicator_search-rtl.svg", + "https://phabricator.wikimedia.org/diffusion/GOJU/browse/master/AUTHORS.txt" + ] + }, + { + "authors": [], + "path": "send_email.svg", + "license": "CC0; trivial", + "sources": [] + }, + { + "authors": [], + "path": "share.svg", + "license": "CC0; trivial", + "sources": [] + }, + { + "authors": [], + "path": "square.svg", + "license": "CC0; trivial", + "sources": [] + }, + { + "authors": [ + "@felpgrc" + ], + "path": "statistics.svg", + "license": "CC-BY 3.0", + "sources": [ + "https://www.onlinewebfonts.com/icon/197818" + ] + }, + { + "authors": [ + "MGalloway (WMF)" + ], + "path": "translate.svg", + "license": "CC-BY-SA 3.0", + "sources": [ + "https://commons.wikimedia.org/wiki/File:OOjs_UI_icon_language-ltr.svg" + ] + }, + { + "authors": [], + "path": "up.svg", + "license": "CC0; trivial", + "sources": [] + }, + { + "authors": [ + "Wikidata" + ], + "path": "wikidata.svg", + "license": "Logo; All rights reserved", + "sources": [ + "https://www.wikidata.org" + ] + }, + { + "authors": [ + "Wikimedia" + ], + "path": "wikimedia-commons-white.svg", + "license": "Logo; All rights reserved", + "sources": [ + "https://commons.wikimedia.org" + ] + }, + { + "authors": [ + "Wikipedia" + ], + "path": "wikipedia.svg", + "license": "Logo; All rights reserved", + "sources": [ + "https://www.wikipedia.org/" + ] + } +] \ No newline at end of file diff --git a/assets/themes/aed/aed.json b/assets/themes/aed/aed.json index ef7e454..f15d3a1 100644 --- a/assets/themes/aed/aed.json +++ b/assets/themes/aed/aed.json @@ -125,7 +125,12 @@ "nl": "Toegankelijkheid is {access}", "de": "Zugang ist {access}" }, - "condition": "indoor=yes", + "condition": { + "or": [ + "indoor=yes", + "access~*" + ] + }, "freeform": { "key": "access", "addExtraTags": [ @@ -209,7 +214,10 @@ } }, { - "render": "{defibrillator:location}", + "render": { + "nl": "Meer informatie over de locatie:
{defibrillator:location}", + "en": "Extra information about the location:
{defibrillator:location}" + }, "question": { "en": "Please give some explanation on where the defibrillator can be found", "ca": "Dóna detalls d'on es pot trobar el desfibril·lador", diff --git a/assets/themes/aed/license_info.json b/assets/themes/aed/license_info.json new file mode 100644 index 0000000..bc06751 --- /dev/null +++ b/assets/themes/aed/license_info.json @@ -0,0 +1,22 @@ +[ + { + "authors": [ + "MaxxL" + ], + "path": "aed.svg", + "license": "CC0", + "sources": [ + "https://commons.wikimedia.org/wiki/File:ISO_7010_E010.svg" + ] + }, + { + "authors": [ + "M!dgard" + ], + "path": "logo.svg", + "license": "CC-BY-SA 4.0", + "sources": [ + "https://commons.wikimedia.org/wiki/File:ISO_7010_E010.svg" + ] + } +] \ No newline at end of file diff --git a/assets/themes/artwork/license_info.json b/assets/themes/artwork/license_info.json new file mode 100644 index 0000000..ea964fe --- /dev/null +++ b/assets/themes/artwork/license_info.json @@ -0,0 +1,10 @@ +[ + { + "authors": [], + "path": "artwork.svg", + "license": "CC0", + "sources": [ + "https://wiki.openstreetmap.org/wiki/File:Statue-14.svg" + ] + } +] \ No newline at end of file diff --git a/assets/themes/benches/license_info.json b/assets/themes/benches/license_info.json new file mode 100644 index 0000000..864ed5e --- /dev/null +++ b/assets/themes/benches/license_info.json @@ -0,0 +1,24 @@ +[ + { + "authors": [ + "Tobias Zwick" + ], + "path": "bench_poi.svg", + "license": "CC-BY-SA 4.0", + "sources": [ + "https://github.com/streetcomplete/StreetComplete/blob/v25.0-beta1/res/graphics/authors.txt", + "https://github.com/streetcomplete/StreetComplete/tree/v25.0-beta1/res/graphics/quest%20icons" + ] + }, + { + "authors": [ + "Tobias Zwick" + ], + "path": "bench_public_transport.svg", + "license": "CC-BY-SA 4.0", + "sources": [ + "https://github.com/streetcomplete/StreetComplete/blob/v25.0-beta1/res/graphics/authors.txt", + "https://github.com/streetcomplete/StreetComplete/tree/v25.0-beta1/res/graphics/quest%20icons" + ] + } +] \ No newline at end of file diff --git a/assets/themes/bicycle_library/license_info.json b/assets/themes/bicycle_library/license_info.json new file mode 100644 index 0000000..baa0c3d --- /dev/null +++ b/assets/themes/bicycle_library/license_info.json @@ -0,0 +1,10 @@ +[ + { + "authors": [ + "Pieter Vander Vennet" + ], + "path": "logo.svg", + "license": "CC0", + "sources": [] + } +] \ No newline at end of file diff --git a/assets/themes/bookcases/license_info.json b/assets/themes/bookcases/license_info.json new file mode 100644 index 0000000..3d08aae --- /dev/null +++ b/assets/themes/bookcases/license_info.json @@ -0,0 +1,10 @@ +[ + { + "authors": [], + "path": "bookcase.svg", + "license": "CC0", + "sources": [ + "https://wiki.openstreetmap.org/wiki/File:Public_bookcase-14.svg" + ] + } +] \ No newline at end of file diff --git a/assets/themes/buurtnatuur/license_info.json b/assets/themes/buurtnatuur/license_info.json new file mode 100644 index 0000000..83a40d0 --- /dev/null +++ b/assets/themes/buurtnatuur/license_info.json @@ -0,0 +1,72 @@ +[ + { + "authors": [ + "Agentschap Natuur en Bos" + ], + "path": "ANB.jpg", + "license": "Logo; All rights reserved", + "sources": [ + "https://www.natuurenbos.be/" + ] + }, + { + "authors": [ + "Natuurpunt" + ], + "path": "Natuurpunt.jpg", + "license": "Logo; All rights reserved", + "sources": [ + "https://www.natuurpunt.be/" + ] + }, + { + "authors": [ + "@ Federico Sibella" + ], + "path": "forest.svg", + "license": "CC-BY 3.0", + "sources": [ + "https://www.onlinewebfonts.com/icon/498112" + ] + }, + { + "authors": [ + "Groen" + ], + "path": "groen_logo.svg", + "license": "Logo; All rights reserved", + "sources": [ + "https://www.groen.be/" + ] + }, + { + "authors": [ + "@ Эдуард Черных" + ], + "path": "nature_reserve.svg", + "license": "CC-BY 3.0", + "sources": [ + "https://www.onlinewebfonts.com/icon/389579" + ] + }, + { + "authors": [ + "@sterankofrank" + ], + "path": "park.svg", + "license": "CC-BY 3.0", + "sources": [ + "http://www.onlinewebfonts.com/icon/425974" + ] + }, + { + "authors": [ + "Groen" + ], + "path": "social_image.jpg", + "license": "All rights reserved", + "sources": [ + "" + ] + } +] \ No newline at end of file diff --git a/assets/themes/campersites/license_info.json b/assets/themes/campersites/license_info.json new file mode 100644 index 0000000..05ac3da --- /dev/null +++ b/assets/themes/campersites/license_info.json @@ -0,0 +1,45 @@ +[ + { + "path": "Barßel_Wohnmobilstellplatz.jpg", + "authors": [ + "ES01" + ], + "license": "CC-BY-SA 3.0", + "sources": [ + "https://commons.wikimedia.org/wiki/File:Bar%C3%9Fel_Wohnmobilstellplatz.jpg" + ] + }, + { + "path": "caravan.svg", + "authors": [ + "OsmAnd" + ], + "license": "CC0", + "sources": [ + "https://github.com/osmandapp/Osmand/blob/master/LICENSE", + "https://github.com/osmandapp/OsmAnd-resources/blob/36d8b90a8933e0a28f9ee19f28abbd520f9da3c7/icons/svg/accommodation/caravan.svg" + ] + }, + { + "path": "caravan_green.svg", + "authors": [ + "OsmAnd" + ], + "license": "CC0", + "sources": [ + "https://github.com/osmandapp/Osmand/blob/master/LICENSE", + "https://github.com/osmandapp/OsmAnd-resources/blob/36d8b90a8933e0a28f9ee19f28abbd520f9da3c7/icons/svg/accommodation/caravan.svg" + ] + }, + { + "path": "sanitary_dump_station.svg", + "authors": [ + "OsmAnd" + ], + "license": "CC0", + "sources": [ + "https://github.com/osmandapp/Osmand/blob/master/LICENSE", + "https://github.com/osmandapp/OsmAnd-resources/blob/16892d8b2fc00dd422abfb2fef967d5ccd05eeac/icons/svg/poi/sanitary_dump_station.svg" + ] + } +] \ No newline at end of file diff --git a/assets/themes/charging_stations/license_info.json b/assets/themes/charging_stations/license_info.json new file mode 100644 index 0000000..9c36751 --- /dev/null +++ b/assets/themes/charging_stations/license_info.json @@ -0,0 +1,31 @@ +[ + { + "authors": [ + "Stijn Wens" + ], + "path": "bicycle.svg", + "license": "CC0", + "sources": [ + "https://wens.be/free-antwerpenize-bicycle-font", + " https://antwerpenize.be/post/634396003556081664/antwerpenize-lettertype" + ] + }, + { + "authors": [], + "path": "car.svg", + "license": "CC0", + "sources": [] + }, + { + "authors": [], + "path": "logo.svg", + "license": "CC0; trivial", + "sources": [] + }, + { + "authors": [], + "path": "plug.svg", + "license": "CC0; trivial", + "sources": [] + } +] \ No newline at end of file diff --git a/assets/themes/climbing/license_info.json b/assets/themes/climbing/license_info.json new file mode 100644 index 0000000..d603611 --- /dev/null +++ b/assets/themes/climbing/license_info.json @@ -0,0 +1,79 @@ +[ + { + "authors": [ + "Christian Neumann" + ], + "path": "climbing_gym.svg", + "license": "CC-BY-SA 3.0", + "sources": [ + "https://utopicode.de/", + "https://github.com/chrneumann/MapComplete" + ] + }, + { + "authors": [ + "Christian Neumann" + ], + "path": "climbing_icon.svg", + "license": "CC-BY-SA 3.0", + "sources": [ + "https://utopicode.de/", + "https://github.com/chrneumann/MapComplete" + ] + }, + { + "authors": [ + "Christian Neumann" + ], + "path": "climbing_no_rope.svg", + "license": "CC-BY-SA 3.0", + "sources": [ + "https://utopicode.de/", + "https://github.com/chrneumann/MapComplete" + ] + }, + { + "authors": [ + "Christian Neumann" + ], + "path": "climbing_rope.svg", + "license": "CC-BY-SA 3.0", + "sources": [ + "https://utopicode.de/", + "https://github.com/chrneumann/MapComplete" + ] + }, + { + "authors": [ + "Christian Neumann" + ], + "path": "climbing_route.svg", + "license": "CC-BY-SA 3.0", + "sources": [ + "https://utopicode.de/", + "https://github.com/chrneumann/MapComplete" + ] + }, + { + "authors": [ + "Christian Neumann" + ], + "path": "climbing_unknown.svg", + "license": "CC-BY-SA 3.0", + "sources": [ + "https://utopicode.de/", + "https://github.com/chrneumann/MapComplete" + ] + }, + { + "authors": [ + "Christian Neumann" + ], + "path": "club.svg", + "license": "CC-BY-SA 3.0", + "sources": [ + "https://utopicode.de/", + "https://github.com/chrneumann/MapComplete" + ] + } +] \ No newline at end of file diff --git a/assets/themes/cyclestreets/license_info.json b/assets/themes/cyclestreets/license_info.json new file mode 100644 index 0000000..95ff5de --- /dev/null +++ b/assets/themes/cyclestreets/license_info.json @@ -0,0 +1,22 @@ +[ + { + "authors": [ + "The RedBurn" + ], + "path": "F111.svg", + "license": "CC0", + "sources": [ + "https://commons.wikimedia.org/wiki/File:Belgian_road_sign_F111_nl.svg" + ] + }, + { + "authors": [ + "The RedBurn" + ], + "path": "F113.svg", + "license": "CC0", + "sources": [ + "https://commons.wikimedia.org/wiki/File:Belgian_road_sign_F113_nl.svg" + ] + } +] \ No newline at end of file diff --git a/assets/themes/cyclofix/cyclofix.json b/assets/themes/cyclofix/cyclofix.json index da22a93..c3b4947 100644 --- a/assets/themes/cyclofix/cyclofix.json +++ b/assets/themes/cyclofix/cyclofix.json @@ -22,6 +22,7 @@ "de" ], "maintainer": "MapComplete", + "credits": "Originally created during Open Summer of Code by Pieter Fiers, Thibault Declercq, Pierre Barban, Joost Schouppe and Pieter Vander Vennet", "icon": "assets/themes/cyclofix/logo.svg", "version": "0", "startLat": 0, diff --git a/assets/themes/cyclofix/license_info.json b/assets/themes/cyclofix/license_info.json new file mode 100644 index 0000000..a754752 --- /dev/null +++ b/assets/themes/cyclofix/license_info.json @@ -0,0 +1,36 @@ +[ + { + "authors": [ + "De Fietsambassade" + ], + "path": "fietsambassade_gent_logo.svg", + "license": "Logo; All rights reserved", + "sources": [ + "https://fietsambassade.gent.be" + ] + }, + { + "authors": [ + "De Fietsambassade" + ], + "path": "fietsambassade_gent_logo_small.svg", + "license": "Logo; All rights reserved", + "sources": [ + "https://fietsambassade.gent.be" + ] + }, + { + "authors": [ + "Pieter Fiers", + "Thibault Declercq", + "Pierre Barban", + "Joost Schouppe", + "Pieter Vander Vennet" + ], + "path": "logo.svg", + "license": "CC-BY-SA", + "sources": [ + "https://osoc.be/editions/2020/cyclofix" + ] + } +] \ No newline at end of file diff --git a/assets/themes/cyclofix/unused_assets/license_info.json b/assets/themes/cyclofix/unused_assets/license_info.json new file mode 100644 index 0000000..acc14ae --- /dev/null +++ b/assets/themes/cyclofix/unused_assets/license_info.json @@ -0,0 +1,44 @@ +[ + { + "authors": [ + "Pieter Fiers", + "Thibault Declercq", + "Pierre Barban", + "Joost Schouppe", + "Pieter Vander Vennet" + ], + "path": "place_with_pump.svg", + "license": "CC-BY-SA", + "sources": [ + "https://osoc.be/editions/2020/cyclofix" + ] + }, + { + "authors": [ + "Pieter Fiers", + "Thibault Declercq", + "Pierre Barban", + "Joost Schouppe", + "Pieter Vander Vennet" + ], + "path": "non_bike_repair_shop.svg", + "license": "CC-BY-SA", + "sources": [ + "https://osoc.be/editions/2020/cyclofix" + ] + }, + { + "authors": [ + "Pieter Fiers", + "Thibault Declercq", + "Pierre Barban", + "Joost Schouppe", + "Pieter Vander Vennet" + ], + "path": "non_bike_shop.svg", + "license": "CC-BY-SA", + "sources": [ + "https://osoc.be/editions/2020/cyclofix" + ] + } +] \ No newline at end of file diff --git a/assets/themes/cyclofix/unused_assets/staples-annotated.png b/assets/themes/cyclofix/unused_assets/staples-annotated.png deleted file mode 100644 index a558083..0000000 Binary files a/assets/themes/cyclofix/unused_assets/staples-annotated.png and /dev/null differ diff --git a/assets/themes/drinking_water/license_info.json b/assets/themes/drinking_water/license_info.json new file mode 100644 index 0000000..b4a60e9 --- /dev/null +++ b/assets/themes/drinking_water/license_info.json @@ -0,0 +1,16 @@ +[ + { + "authors": [ + "Pieter Fiers", + "Thibault Declercq", + "Pierre Barban", + "Joost Schouppe", + "Pieter Vander Vennet" + ], + "path": "logo.svg", + "license": "CC-BY-SA", + "sources": [ + "https://osoc.be/editions/2020/cyclofix" + ] + } +] \ No newline at end of file diff --git a/assets/themes/facadegardens/license_info.json b/assets/themes/facadegardens/license_info.json new file mode 100644 index 0000000..05d8cb1 --- /dev/null +++ b/assets/themes/facadegardens/license_info.json @@ -0,0 +1,102 @@ +[ + { + "authors": [ + "Klimaan VZW" + ], + "path": "bloei.svg", + "license": "CC-BY-SA 3.0", + "sources": [ + "https://klimaan.be/" + ] + }, + { + "authors": [ + "Klimaan VZW" + ], + "path": "bodembedekker.svg", + "license": "CC-BY-SA 3.0", + "sources": [ + "https://klimaan.be/" + ] + }, + { + "authors": [ + "Klimaan VZW" + ], + "path": "eetbaar.svg", + "license": "CC-BY-SA 3.0", + "sources": [ + "https://klimaan.be/" + ] + }, + { + "authors": [ + "Klimaan VZW" + ], + "path": "gevelton.svg", + "license": "CC-BY-SA 3.0", + "sources": [ + "https://klimaan.be/" + ] + }, + { + "authors": [ + "Klimaan VZW" + ], + "path": "geveltuin.svg", + "license": "CC-BY-SA 3.0", + "sources": [ + "https://klimaan.be/" + ] + }, + { + "authors": [ + "Klimaan VZW" + ], + "path": "halfzon.svg", + "license": "CC-BY-SA 3.0", + "sources": [ + "https://klimaan.be/" + ] + }, + { + "authors": [ + "Klimaan VZW" + ], + "path": "klimplant.svg", + "license": "CC-BY-SA 3.0", + "sources": [ + "https://klimaan.be/" + ] + }, + { + "authors": [ + "Klimaan VZW" + ], + "path": "schaduw.svg", + "license": "CC-BY-SA 3.0", + "sources": [ + "https://klimaan.be/" + ] + }, + { + "authors": [ + "Klimaan VZW" + ], + "path": "struik.svg", + "license": "CC-BY-SA 3.0", + "sources": [ + "https://klimaan.be/" + ] + }, + { + "authors": [ + "Klimaan VZW" + ], + "path": "zon.svg", + "license": "CC-BY-SA 3.0", + "sources": [ + "https://klimaan.be/" + ] + } +] \ No newline at end of file diff --git a/assets/themes/fritures/fritures.json b/assets/themes/fritures/fritures.json index ae64d57..99cb659 100644 --- a/assets/themes/fritures/fritures.json +++ b/assets/themes/fritures/fritures.json @@ -223,7 +223,9 @@ } } ] - } + }, + "questions", + "reviews" ], "icon": { "render": "./assets/themes/fritures/fries.svg" @@ -253,4 +255,4 @@ } ], "roamingRenderings": [] -} \ No newline at end of file +} diff --git a/assets/themes/fritures/license_info.json b/assets/themes/fritures/license_info.json new file mode 100644 index 0000000..ba2f607 --- /dev/null +++ b/assets/themes/fritures/license_info.json @@ -0,0 +1,22 @@ +[ + { + "authors": [ + "Freepik" + ], + "path": "logo.svg", + "license": "CC-BY", + "sources": [ + "https://www.flaticon.com/free-icon/french-fries_1144288" + ] + }, + { + "authors": [ + "Freepik" + ], + "path": "fries.svg", + "license": "CC-BY", + "sources": [ + "https://www.flaticon.com/free-icon/french-fries_1144288" + ] + } +] \ No newline at end of file diff --git a/assets/themes/fruit_trees/fruit_tree.svg b/assets/themes/fruit_trees/fruit_tree.svg new file mode 100644 index 0000000..5a0e8e9 --- /dev/null +++ b/assets/themes/fruit_trees/fruit_tree.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/themes/fruit_trees/fruit_trees.json b/assets/themes/fruit_trees/fruit_trees.json index 9189a3e..d6a2e6b 100644 --- a/assets/themes/fruit_trees/fruit_trees.json +++ b/assets/themes/fruit_trees/fruit_trees.json @@ -13,13 +13,14 @@ "nl" ], "maintainer": "", - "icon": "https://upload.wikimedia.org/wikipedia/commons/4/4e/Low_Hanging_Fruit_-_The_Noun_Project.svg", + "icon": "./assets/themes/fruit_trees/fruit_tree.svg", "version": "0", "startLat": 0, "startLon": 0, "startZoom": 1, "widenFactor": 0.001, "socialImage": "", + "hideFromOverview": true, "layers": [ { "id": "orchards", @@ -27,11 +28,12 @@ "nl": "Boomgaarden" }, "minzoom": 12, - "overpassTags": { + "source":{ + "osmTags": { "and": [ "landuse=orchard" ] - }, + } }, "title": { "render": { "nl": "Boomgaard" @@ -72,11 +74,12 @@ "nl": "Boom" }, "minzoom": 12, - "overpassTags": { + "source":{ + "osmTags": { "and": [ "natural=tree" ] - }, + }}, "title": { "render": { "nl": "Boom" @@ -138,7 +141,7 @@ ], "hideUnderlayingFeaturesMinPercentage": 0, "icon": { - "render": "https://upload.wikimedia.org/wikipedia/commons/4/4e/Low_Hanging_Fruit_-_The_Noun_Project.svg" + "render": "./assets/themes/fruit_trees/fruit_tree.svg" }, "width": { "render": "8" @@ -165,4 +168,4 @@ } ], "roamingRenderings": [] -} \ No newline at end of file +} diff --git a/assets/themes/fruit_trees/license_info.json b/assets/themes/fruit_trees/license_info.json new file mode 100644 index 0000000..2a9ca2e --- /dev/null +++ b/assets/themes/fruit_trees/license_info.json @@ -0,0 +1,12 @@ +[ + { + "path": "fruit_tree.svg", + "authors": [ + "The Noun Project" + ], + "license": "CC0", + "sources": [ + "https://upload.wikimedia.org/wikipedia/commons/4/4e/Low_Hanging_Fruit_-_The_Noun_Project.svg" + ] + } +] \ No newline at end of file diff --git a/assets/themes/ghostbikes/license_info.json b/assets/themes/ghostbikes/license_info.json new file mode 100644 index 0000000..baa0c3d --- /dev/null +++ b/assets/themes/ghostbikes/license_info.json @@ -0,0 +1,10 @@ +[ + { + "authors": [ + "Pieter Vander Vennet" + ], + "path": "logo.svg", + "license": "CC0", + "sources": [] + } +] \ No newline at end of file diff --git a/assets/themes/maps/license_info.json b/assets/themes/maps/license_info.json new file mode 100644 index 0000000..48ba539 --- /dev/null +++ b/assets/themes/maps/license_info.json @@ -0,0 +1,12 @@ +[ + { + "authors": [ + "CC0" + ], + "path": "logo.svg", + "license": "CC0", + "sources": [ + "https://wiki.openstreetmap.org/wiki/File:Board-14.svg" + ] + } +] \ No newline at end of file diff --git a/assets/themes/nature/license_info.json b/assets/themes/nature/license_info.json new file mode 100644 index 0000000..7437376 --- /dev/null +++ b/assets/themes/nature/license_info.json @@ -0,0 +1,12 @@ +[ + { + "authors": [ + "Font Awesome" + ], + "path": "logo.svg", + "license": "CC-BY 4.0", + "sources": [ + "https://fontawesome.com" + ] + } +] \ No newline at end of file diff --git a/assets/themes/nature/tree.svg b/assets/themes/nature/tree.svg deleted file mode 100644 index 0b5a595..0000000 --- a/assets/themes/nature/tree.svg +++ /dev/null @@ -1,129 +0,0 @@ - - - - - - - - - image/svg+xml - - - - - Openclipart - - - Oak Tree - 2013-11-13T14:27:32 - Oak tree in black and white - https://openclipart.org/detail/188718/oak-tree-by-iggyoblomov-188718 - - - IggyOblomov - - - - - forest - nature - oak - oak tree - quercus - tree - trees - vegetation - - - - - - - - - - - diff --git a/assets/themes/playgrounds/license_info.json b/assets/themes/playgrounds/license_info.json new file mode 100644 index 0000000..f2f73d0 --- /dev/null +++ b/assets/themes/playgrounds/license_info.json @@ -0,0 +1,13 @@ +[ + { + "authors": [ + "Scott de Jonge" + ], + "path": "playground.svg", + "license": "CC-BY 3.0", + "sources": [ + "https://commons.wikimedia.org/wiki/File:Map_icons_by_Scott_de_Jonge_-_playground.svg", + " https://github.com/scottdejonge/map-icons/blob/b74a0e00afdd6b734883671da7a9e5f30497353e/src/icons/playground.svg" + ] + } +] \ No newline at end of file diff --git a/assets/themes/shops/license_info.json b/assets/themes/shops/license_info.json new file mode 100644 index 0000000..2bacdcb --- /dev/null +++ b/assets/themes/shops/license_info.json @@ -0,0 +1,10 @@ +[ + { + "authors": [], + "path": "shop.svg", + "license": "CC0", + "sources": [ + "https://wiki.openstreetmap.org/wiki/File:Convenience-14.svg" + ] + } +] \ No newline at end of file diff --git a/assets/themes/surveillance_cameras/direction_360.svg b/assets/themes/surveillance_cameras/direction_360.svg deleted file mode 100644 index fc60a9a..0000000 --- a/assets/themes/surveillance_cameras/direction_360.svg +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - diff --git a/assets/themes/surveillance_cameras/license_info.json b/assets/themes/surveillance_cameras/license_info.json new file mode 100644 index 0000000..a3303b9 --- /dev/null +++ b/assets/themes/surveillance_cameras/license_info.json @@ -0,0 +1,34 @@ +[ + { + "authors": [ + "Pieter Vander Vennet" + ], + "path": "cam_left.svg", + "license": "CC0", + "sources": [] + }, + { + "authors": [ + "Pieter Vander Vennet" + ], + "path": "cam_right.svg", + "license": "CC0", + "sources": [] + }, + { + "authors": [ + "Pieter Vander Vennet" + ], + "path": "dome.svg", + "license": "CC0", + "sources": [] + }, + { + "authors": [ + "Pieter Vander Vennet" + ], + "path": "logo.svg", + "license": "CC0", + "sources": [] + } +] \ No newline at end of file diff --git a/assets/themes/toilets/license_info.json b/assets/themes/toilets/license_info.json new file mode 100644 index 0000000..663374b --- /dev/null +++ b/assets/themes/toilets/license_info.json @@ -0,0 +1,10 @@ +[ + { + "authors": [], + "path": "toilets.svg", + "license": "CC0", + "sources": [ + "https://wiki.openstreetmap.org/wiki/File:Toilets-16.svg" + ] + } +] \ No newline at end of file diff --git a/assets/themes/tourism_information/logo.svg b/assets/themes/tourism_information/logo.svg deleted file mode 100644 index a1c0b6b..0000000 --- a/assets/themes/tourism_information/logo.svg +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - diff --git a/assets/themes/trees/license_info.json b/assets/themes/trees/license_info.json new file mode 100644 index 0000000..e2c358d --- /dev/null +++ b/assets/themes/trees/license_info.json @@ -0,0 +1,52 @@ +[ + { + "path": "broadleaved.svg", + "authors": [ + "Midgard" + ], + "license": "CC BY-SA 4.0", + "sources": [ + "https://www.openstreetmap.org/user/M!dgard" + ] + }, + { + "path": "leafless.svg", + "authors": [ + "Midgard" + ], + "license": "CC BY-SA 4.0", + "sources": [ + "https://www.openstreetmap.org/user/M!dgard" + ] + }, + { + "path": "logo.svg", + "authors": [ + "Midgard" + ], + "license": "CC BY-SA 4.0", + "sources": [ + "https://www.openstreetmap.org/user/M!dgard" + ] + }, + { + "path": "needleleaved.svg", + "authors": [ + "Midgard" + ], + "license": "CC BY-SA 4.0", + "sources": [ + "https://www.openstreetmap.org/user/M!dgard" + ] + }, + { + "path": "unknown.svg", + "authors": [ + "Midgard" + ], + "license": "CC BY-SA 4.0", + "sources": [ + "https://www.openstreetmap.org/user/M!dgard" + ] + } +] \ No newline at end of file diff --git a/assets/themes/widths/license_info.json b/assets/themes/widths/license_info.json new file mode 100644 index 0000000..8034093 --- /dev/null +++ b/assets/themes/widths/license_info.json @@ -0,0 +1,8 @@ +[ + { + "authors": [], + "path": "icon.svg", + "license": "CC0; trivial", + "sources": [] + } +] \ No newline at end of file diff --git a/assets/translations.json b/assets/translations.json index bd79b4f..2986817 100644 --- a/assets/translations.json +++ b/assets/translations.json @@ -519,7 +519,15 @@ "nl": "Met dank aan" }, "attributionContent": { - "en": "

All data is provided by OpenStreetMap, freely reusable under the Open DataBase License.

Some images are provided by Wikimedia

" + "en": "

All data is provided by OpenStreetMap, freely reusable under the Open DataBase License.

" + }, + "themeBy": { + "en": "Theme maintained by {author}" + }, + "iconAttribution": { + "title": { + "en": "Used icons" + } } }, @@ -774,8 +782,8 @@ "de": "

Kundenspezifische Themen

Dies sind zuvor besuchte benutzergenerierte Themen" }, "aboutMapcomplete": { - "en": "

About MapComplete

MapComplete is an OpenStreetMap editor that is meant to help everyone to easily add information on a single theme.

Only features relevant to a single theme are shown with a few predefined questions, in order to keep things simple and extremly user-friendly.The theme maintainer can also choose a language for the interface, choose to disable elements or even to embed it into a different website without any UI-element at all.

However, another important part of MapComplete is to always offer the next step to learn more about OpenStreetMap:

  • An iframe without UI-elements will link to a full-screen version
  • The fullscreen version offers information about OpenStreetMap
  • If you're not logged in, you're asked to log in
  • If you answered a single question, you are allowed to add points
  • At a certain point, the actual added tags appear which later get linked to the wiki...

Do you notice an issue with MapComplete? Do you have a feature request? Do you want to help translating? Head over to the source code or issue tracker. Follow the edit count on OsmCha

", - "nl": "

Over MapComplete

MapComplete is een OpenStreetMap-editor om eenvoudig informatie toe te voegen over één enkel onderwerp.

Om de editor zo simpel en gebruiksvriendelijk mogelijk te houden, worden enkel objecten relevant voor het thema getoond.Voor deze objecten kunnen dan vragen beantwoord worden, of men kan een nieuw punt van dit thema toevoegen.De maker van het thema kan er ook voor opteren om een aantal elementen van de gebruikersinterface uit te schakelen of de taal ervan in te stellen.

Een ander belangrijk aspect is om bezoekers stap voor stap meer te leren over OpenStreetMap:

  • Een iframe zonder verdere uitleg linkt naar de volledige versie van MapComplete
  • De volledige versie heeft uitleg over OpenStreetMap
  • Als je niet aangemeld bent, wordt er je gevraagd dit te doen
  • Als je minstens één vraag hebt beantwoord, kan je punten gaan toevoegen.
  • Heb je genoeg changesets, dan verschijnen de tags die wat later doorlinken naar de wiki

Merk je een bug of wil je een extra feature? Wil je helpen vertalen? Bezoek dan de broncode en issue tracker. Volg de edits op OsmCha

", + "en": "

About MapComplete

With MapComplete you can enrich OpenStreetMap with information on a single theme. Answer a few questions, and within minutes your contributions will be available around the globe!
The theme maintainer defines elements, questions and languages for the theme.

Find out more
MapComplete always offers the next step to learn more about OpenStreetMap:

  • If MapComplete is embedded in a website (as an iframe), it links to a full-screen version
  • The full-screen version offers information about OpenStreetMap
  • Viewing the information is available without login, but editing requires a login to OpenStreetMap.
  • If you are not logged in, you are asked to log in
  • Once you answered a single question, you are allowed to add points of interest to the map
  • At a certain point, the actual added tags (attribute keys and values) appear which later get linked to the wiki pages

Did you notice an issue with MapComplete? Do you have a feature request? Do you want to help translate? Head over to the source code or issue tracker.

Want to see your progress? Follow the edit count on OsmCha.

", + "nl": "

Over MapComplete

Met MapComplete kun je OpenStreetMap verrijken met informatie over een bepaald thema. Beantwoord enkele vragen, en binnen een paar minuten is jouw bijdrage wereldwijd beschikbaar!
De maker van het thema bepaalt de elementen, vragen en taalversies voor het thema.

Ontdek meer
MapComplete biedt altijd de volgende stap om meer te leren over OpenStreetMap:

  • Als MapComplete is ingebed in een website (als een iframe), dan linkt het naar de volledige versie van MapComplete
  • De volledige versie heeft uitleg over OpenStreetMap
  • Bekijken kan zonder aanmelding, maar voor wijzigen heb je een OpenStreetMap account nodig
  • Als je niet aangemeld bent, wordt je gevraagd dit te doen
  • Als je minstens één vraag hebt beantwoord, kan je elementen gaan toevoegen.
  • Heb je genoeg changesets, dan verschijnen de tags (attributen) die later ook doorlinken naar de wiki-pagina's

Merk je een bug of wil je een extra feature? Wil je helpen vertalen? Bezoek dan de broncode en issue tracker.

Wil je je vorderingen zien? Volg de edits op OsmCha.

", "de": "

Über MapComplete

MapComplete ist ein OpenStreetMap-Editor, der jedem helfen soll, auf einfache Weise Informationen zu einem Einzelthema hinzuzufügen.

Nur Merkmale, die für ein einzelnes Thema relevant sind, werden mit einigen vordefinierten Fragen gezeigt, um die Dinge einfach und extrem benutzerfreundlich zu halten.Der Themen-Betreuer kann auch eine Sprache für die Schnittstelle wählen, Elemente deaktivieren oder sogar in eine andere Website ohne jegliches UI-Element einbetten.

Ein weiterer wichtiger Teil von MapComplete ist jedoch, immer den nächsten Schritt anzubietenum mehr über OpenStreetMap zu erfahren:

  • Ein iframe ohne UI-Elemente verlinkt zu einer Vollbildversion
  • Die Vollbildversion bietet Informationen über OpenStreetMap
  • Wenn Sie nicht eingeloggt sind, werden Sie gebeten, sich einzuloggen
  • Wenn Sie eine einzige Frage beantwortet haben, dürfen Sie Punkte hinzufügen
  • An einem bestimmten Punkt erscheinen die tatsächlich hinzugefügten Tags, die später mit dem Wiki verlinkt werden...

Fällt Ihnen ein Problem mit MapComplete auf? Haben Sie einen Feature-Wunsch? Wollen Sie beim Übersetzen helfen? Gehen Sie zum Quellcode oder zur Problemverfolgung.

" }, "backgroundMap": { @@ -1059,4 +1067,4 @@ "nl": "Meld je aan om een beoordeling te geven" } } -} \ No newline at end of file +} diff --git a/index.html b/index.html index 005e4f9..c2cd5e8 100644 --- a/index.html +++ b/index.html @@ -21,10 +21,26 @@ + MapComplete - + + + + + + + + + + + + + + + +