diff --git a/.github/workflows/deploy_prod.yml b/.github/workflows/deploy_prod.yml index 1532d8e8d..55e513bc9 100644 --- a/.github/workflows/deploy_prod.yml +++ b/.github/workflows/deploy_prod.yml @@ -73,9 +73,8 @@ jobs: git add * if git status | grep -q "Changes to be committed" then - git commit -am "Deploying a new version" + git commit -am "Deploying a new version of mapcomplete" git push else echo "No changes to commit" fi - diff --git a/Docs/Architecture.md b/Docs/Architecture.md index 36d0585c8..94ac0d25a 100644 --- a/Docs/Architecture.md +++ b/Docs/Architecture.md @@ -1,7 +1,7 @@ Architecture ============ -This document aims to give an architectural overview of how MapCompelte is built. It should give some feeling on how +This document aims to give an architectural overview of how MapComplete is built. It should give some feeling on how everything fits together. Servers? @@ -59,7 +59,7 @@ There are some basic elements, such as: - `List` There is one special component: the `VariableUIElement` -The `VariableUIElement` takes a `UIEventSource` and will dynamicaly show whatever the `UIEventSource` contains at the moment. +The `VariableUIElement` takes a `UIEventSource` and will dynamically show whatever the `UIEventSource` contains at the moment. For example: @@ -107,7 +107,7 @@ If Tailwind is not enough, use `baseUiElement.SetStyle("background: red; someOth ### An example -For example: the user should input wether or not a shop is closed during public holidays. There are three options: +For example: the user should input whether or not a shop is closed during public holidays. There are three options: 1. closed 2. opened as usual diff --git a/Docs/BuiltinIndex.md b/Docs/BuiltinIndex.md index 5cc6210d4..9a73783b6 100644 --- a/Docs/BuiltinIndex.md +++ b/Docs/BuiltinIndex.md @@ -11,13 +11,14 @@ - [Existing builtin tagrenderings](#existing-builtin-tagrenderings) + [images](#images) + [luminous_or_lit](#luminous_or_lit) + + [reviews](#reviews) + + [website](#website) + + [phone](#phone) + + [email](#email) + [wikipedia](#wikipedia) + [bench.*bench-questions](#bench*bench-questions) + [opening_hours](#opening_hours) + [artwork.*artwork-question](#artwork*artwork-question) - + [website](#website) - + [phone](#phone) - + [email](#email) + [description](#description) + [payment-options](#payment-options) + [payment-options-advanced](#payment-options-advanced) @@ -33,7 +34,6 @@ + [internet](#internet) + [internet-fee](#internet-fee) + [internet-ssid](#internet-ssid) - + [reviews](#reviews) + [questions](#questions) + [climbing.website](#climbingwebsite) + [climbing.fee](#climbingfee) @@ -58,6 +58,7 @@ + [minimap](#minimap) + [mastodon](#mastodon) + [contact](#contact) + + [diets](#diets) + [etymology.wikipedia-etymology](#etymologywikipedia-etymology) + [toilet.relevant-questions](#toiletrelevant-questions) + [denominations-notes](#denominations-notes) @@ -91,8 +92,10 @@ - advertising - ambulancestation + - animal_shelter - artwork - atm + - bank - barrier - bench - bench_at_pt @@ -134,6 +137,7 @@ - hackerspace - hotel - hydrant + - ice_cream - indoors - information_board - kerbs @@ -155,6 +159,7 @@ - rainbow_crossings - reception_desk - recycling + - route_marker - shops - shower - slow_roads @@ -191,6 +196,139 @@ +### reviews + + + + + + - animal_shelter + - cafe_pub + - dogpark + - fitness_centre + - food + - hackerspace + - hotel + - pharmacy + - shops + - veterinary + + + + +### website + + + + + + - animal_shelter + - bicycle_library + - bicycle_rental + - bike_cafe + - bike_shop + - bike_themed_object + - cafe_pub + - car_rental + - climbing_club + - climbing_gym + - dentist + - doctors + - elongated_coin + - fitness_centre + - food + - governments + - hackerspace + - hotel + - kindergarten_childcare + - nature_reserve + - observation_tower + - pharmacy + - physiotherapist + - playground + - recycling + - school + - shops + - sports_centre + - tertiary_education + - vending_machine + - veterinary + + + + +### phone + + + + + + - animal_shelter + - bicycle_library + - bicycle_rental + - bike_cafe + - bike_shop + - bike_themed_object + - cafe_pub + - car_rental + - climbing_club + - climbing_gym + - dentist + - doctors + - fitness_centre + - food + - governments + - hackerspace + - hotel + - kindergarten_childcare + - pharmacy + - physiotherapist + - recycling + - school + - shops + - sports_centre + - tertiary_education + - vending_machine + - veterinary + + + + +### email + + + + + + - animal_shelter + - bicycle_library + - bicycle_rental + - bike_cafe + - bike_shop + - bike_themed_object + - cafe_pub + - car_rental + - climbing_club + - climbing_gym + - dentist + - doctors + - fitness_centre + - food + - governments + - hackerspace + - hotel + - kindergarten_childcare + - pharmacy + - physiotherapist + - recycling + - school + - shops + - sports_centre + - tertiary_education + + + + ### wikipedia @@ -234,6 +372,7 @@ - dentist - fitness_centre - food + - ice_cream - kindergarten_childcare - pharmacy - postoffices @@ -259,116 +398,6 @@ -### website - - - - - - - bicycle_library - - bicycle_rental - - bike_cafe - - bike_shop - - bike_themed_object - - cafe_pub - - car_rental - - climbing_club - - climbing_gym - - dentist - - doctors - - elongated_coin - - fitness_centre - - food - - governments - - hackerspace - - hotel - - kindergarten_childcare - - nature_reserve - - observation_tower - - pharmacy - - physiotherapist - - playground - - recycling - - school - - shops - - sports_centre - - tertiary_education - - vending_machine - - veterinary - - - - -### phone - - - - - - - bicycle_library - - bicycle_rental - - bike_cafe - - bike_shop - - bike_themed_object - - cafe_pub - - car_rental - - climbing_club - - climbing_gym - - dentist - - doctors - - fitness_centre - - food - - governments - - hackerspace - - hotel - - kindergarten_childcare - - pharmacy - - physiotherapist - - recycling - - school - - shops - - sports_centre - - tertiary_education - - vending_machine - - veterinary - - - - -### email - - - - - - - bicycle_library - - bicycle_rental - - bike_cafe - - bike_shop - - bike_themed_object - - cafe_pub - - car_rental - - climbing_club - - climbing_gym - - dentist - - doctors - - fitness_centre - - food - - governments - - hackerspace - - hotel - - kindergarten_childcare - - pharmacy - - physiotherapist - - recycling - - school - - shops - - sports_centre - - tertiary_education - - - - ### description @@ -395,6 +424,7 @@ - cafe_pub - climbing_gym - food + - ice_cream - observation_tower - questions - questions @@ -517,6 +547,7 @@ - food - hackerspace - hotel + - ice_cream - observation_tower - sports_centre - transit_stops @@ -604,25 +635,6 @@ -### reviews - - - - - - - cafe_pub - - dogpark - - fitness_centre - - food - - hackerspace - - hotel - - pharmacy - - shops - - veterinary - - - - ### questions @@ -900,6 +912,18 @@ - hospital + - ice_cream + + + + +### diets + + + + + + - ice_cream diff --git a/Docs/BuiltinLayers.md b/Docs/BuiltinLayers.md index adbc40ebf..202433d81 100644 --- a/Docs/BuiltinLayers.md +++ b/Docs/BuiltinLayers.md @@ -24,26 +24,20 @@ 1. [gps_track](#gps_track) - [Basic tags for this layer](#basic-tags-for-this-layer) - [Supported attributes](#supported-attributes) - + [just_created](#just_created) + [Privacy notice](#privacy-notice) + [export_as_gpx](#export_as_gpx) + [export_as_geojson](#export_as_geojson) + [upload_to_osm](#upload_to_osm) + [minimap](#minimap) + [delete](#delete) - + [leftover-questions](#leftover-questions) - + [all-tags](#all-tags) 1. [range](#range) - [Basic tags for this layer](#basic-tags-for-this-layer) - [Supported attributes](#supported-attributes) 1. [last_click](#last_click) - [Basic tags for this layer](#basic-tags-for-this-layer) - [Supported attributes](#supported-attributes) - + [just_created](#just_created) + [add_new](#add_new) + [add_note](#add_note) - + [leftover-questions](#leftover-questions) - + [all-tags](#all-tags) * [Filters](#filters) 1. [conflation](#conflation) - [Basic tags for this layer](#basic-tags-for-this-layer) @@ -58,19 +52,13 @@ * [Themes using this layer](#themes-using-this-layer) - [Basic tags for this layer](#basic-tags-for-this-layer) - [Supported attributes](#supported-attributes) - + [just_created](#just_created) - + [leftover-questions](#leftover-questions) - + [all-tags](#all-tags) 1. [import_candidate](#import_candidate) - [Basic tags for this layer](#basic-tags-for-this-layer) - [Supported attributes](#supported-attributes) - + [just_created](#just_created) + [all_tags](#all_tags) - + [leftover-questions](#leftover-questions) 1. [usersettings](#usersettings) - [Basic tags for this layer](#basic-tags-for-this-layer) - [Supported attributes](#supported-attributes) - + [just_created](#just_created) + [profile](#profile) + [language_picker](#language_picker) + [inbox](#inbox) @@ -95,7 +83,6 @@ + [contributor-thanks](#contributor-thanks) + [show_debug](#show_debug) + [debug](#debug) - + [leftover-questions](#leftover-questions) 1. [Normal layers](#normal-layers) @@ -133,7 +120,7 @@ MapComplete has a few data layers available in the theme which have special prop - + Highlights the currently selected element. Override this layer to have different colors @@ -176,7 +163,7 @@ Elements must have the all of following tags to be shown on this layer: - + Meta layer showing the current location of the user. Add this to your theme and override the icon to change the appearance of the current location. The object will always have `id=gps` and will have _all_ the properties included in the [`Coordinates`-object](https://developer.mozilla.org/en-US/docs/Web/API/GeolocationCoordinates) (except latitude and longitude) returned by the browser, such as `speed`, `altitude`, `heading`, .... @@ -219,7 +206,7 @@ Elements must have the all of following tags to be shown on this layer: - + Meta layer which contains the previous locations of the user as single points. This is mainly for technical reasons, e.g. to keep match the distance to the modified object @@ -264,7 +251,7 @@ Elements must have the all of following tags to be shown on this layer: - + Meta layer showing the home location of the user. The home location can be set in the [profile settings](https://www.openstreetmap.org/profile/edit) of OpenStreetMap. @@ -343,36 +330,6 @@ Elements must have the all of following tags to be shown on this layer: -Warning: - -this quick overview is incomplete - - - -attribute | type | values which are supported by this layer ------------ | ------ | ------------------------------------------ -[](https://taginfo.openstreetmap.org/keys/id#values) [id](https://wiki.openstreetmap.org/wiki/Key:id) | Multiple choice | - - - - -### just_created - - - -This element shows a 'thank you' that the contributor has recently created this element - -This tagrendering has no question and is thus read-only - - - - - - - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` - - -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` - ### Privacy notice @@ -441,26 +398,6 @@ This tagrendering has no question and is thus read-only -### leftover-questions - - - -This tagrendering has no question and is thus read-only - - - - - -### all-tags - - - -This tagrendering has no question and is thus read-only - - - - - range ======= @@ -512,7 +449,7 @@ Elements must have the all of following tags to be shown on this layer: -
{renderings}{first_preset}
' height="100px"> + This layer defines how to render the 'last click'-location. By default, it will show a marker with the possibility to add a new point (if there are some presets) and/or to add a new note (if the 'note' layer attribute is set). If none are possible, this layer won't show up @@ -547,36 +484,6 @@ Elements must have the all of following tags to be shown on this layer: -Warning: - -this quick overview is incomplete - - - -attribute | type | values which are supported by this layer ------------ | ------ | ------------------------------------------ -[](https://taginfo.openstreetmap.org/keys/id#values) [id](https://wiki.openstreetmap.org/wiki/Key:id) | Multiple choice | - - - - -### just_created - - - -This element shows a 'thank you' that the contributor has recently created this element - -This tagrendering has no question and is thus read-only - - - - - - - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` - - -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` - ### add_new @@ -603,26 +510,6 @@ This tagrendering is only visible in the popup if the following condition is met -### leftover-questions - - - -This tagrendering has no question and is thus read-only - - - - - -### all-tags - - - -This tagrendering has no question and is thus read-only - - - - - #### Filters @@ -631,7 +518,7 @@ This tagrendering has no question and is thus read-only id | question | osmTags ---- | ---------- | --------- -action.0 | only_if_action_is_possible | has_note_layer=yes\|has_presets=yes +action.0 | only_if_action_is_possible | has_note_layer=yes \|has_presets=yes @@ -641,7 +528,7 @@ action.0 | only_if_action_is_possible | has_note_layer=yes\|has_presets=yes - + If the import-button moves OSM points, the imported way points or conflates, a preview is shown. This layer defines how this preview is rendered. This layer cannot be included in a theme. @@ -682,7 +569,7 @@ Elements must have the all of following tags to be shown on this layer: - + Layer rendering the little scissors for the minimap in the 'splitRoadWizard' @@ -723,7 +610,7 @@ Elements must have the all of following tags to be shown on this layer: - + Layer rendering the way to split in the 'splitRoadWizard'. This one is used instead of the variable rendering by the themes themselves, as they might not always be very visible @@ -814,56 +701,6 @@ Elements must have the all of following tags to be shown on this layer: -Warning: - -this quick overview is incomplete - - - -attribute | type | values which are supported by this layer ------------ | ------ | ------------------------------------------ -[](https://taginfo.openstreetmap.org/keys/id#values) [id](https://wiki.openstreetmap.org/wiki/Key:id) | Multiple choice | - - - - -### just_created - - - -This element shows a 'thank you' that the contributor has recently created this element - -This tagrendering has no question and is thus read-only - - - - - - - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` - - -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` - - - -### leftover-questions - - - -This tagrendering has no question and is thus read-only - - - - - -### all-tags - - - -This tagrendering has no question and is thus read-only - - - import_candidate @@ -871,7 +708,7 @@ This tagrendering has no question and is thus read-only - + Layer used as template in the importHelper @@ -905,36 +742,6 @@ Elements must have the all of following tags to be shown on this layer: -Warning: - -this quick overview is incomplete - - - -attribute | type | values which are supported by this layer ------------ | ------ | ------------------------------------------ -[](https://taginfo.openstreetmap.org/keys/id#values) [id](https://wiki.openstreetmap.org/wiki/Key:id) | Multiple choice | - - - - -### just_created - - - -This element shows a 'thank you' that the contributor has recently created this element - -This tagrendering has no question and is thus read-only - - - - - - - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` - - -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` - ### all_tags @@ -947,16 +754,6 @@ This tagrendering has no question and is thus read-only -### leftover-questions - - - -This tagrendering has no question and is thus read-only - - - - - usersettings ============== @@ -1004,7 +801,6 @@ this quick overview is incomplete attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ -[](https://taginfo.openstreetmap.org/keys/id#values) [id](https://wiki.openstreetmap.org/wiki/Key:id) | Multiple choice | [](https://taginfo.openstreetmap.org/keys/__url_parameter_initialized:language#values) [__url_parameter_initialized:language](https://wiki.openstreetmap.org/wiki/Key:__url_parameter_initialized:language) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:__url_parameter_initialized:language%3Dyes) [](https://taginfo.openstreetmap.org/keys/mapcomplete-preferred-background-layer#values) [mapcomplete-preferred-background-layer](https://wiki.openstreetmap.org/wiki/Key:mapcomplete-preferred-background-layer) | Multiple choice | [](https://wiki.openstreetmap.org/wiki/Tag:mapcomplete-preferred-background-layer%3D) [osm](https://wiki.openstreetmap.org/wiki/Tag:mapcomplete-preferred-background-layer%3Dosm) [photo](https://wiki.openstreetmap.org/wiki/Tag:mapcomplete-preferred-background-layer%3Dphoto) [map](https://wiki.openstreetmap.org/wiki/Tag:mapcomplete-preferred-background-layer%3Dmap) [](https://wiki.openstreetmap.org/wiki/Tag:mapcomplete-preferred-background-layer%3D) [](https://taginfo.openstreetmap.org/keys/mapcomplete-pictures-license#values) [mapcomplete-pictures-license](https://wiki.openstreetmap.org/wiki/Key:mapcomplete-pictures-license) | Multiple choice | [CC0](https://wiki.openstreetmap.org/wiki/Tag:mapcomplete-pictures-license%3DCC0) [CC-BY 4.0](https://wiki.openstreetmap.org/wiki/Tag:mapcomplete-pictures-license%3DCC-BY 4.0) [CC-BY-SA 4.0](https://wiki.openstreetmap.org/wiki/Tag:mapcomplete-pictures-license%3DCC-BY-SA 4.0) @@ -1020,25 +816,6 @@ attribute | type | values which are supported by this layer -### just_created - - - -This element shows a 'thank you' that the contributor has recently created this element - -This tagrendering has no question and is thus read-only - - - - - - - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` - - -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` - - - ### profile @@ -1108,7 +885,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_theme:backgroundLayer~.+&mapcomplete-preferred-background-layer~.+&_theme:backgroundLayer!=` +This tagrendering is only visible in the popup if the following condition is met: `_theme:backgroundLayer~.+ &mapcomplete-preferred-background-layer~.+ &_theme:backgroundLayer!=` @@ -1269,7 +1046,7 @@ This tagrendering has no question and is thus read-only - - *Click the 'translate'-icon next to a string to enter or update a piece of text. You need a Weblate-account for this. Create one with your OSM-username to automatically unlock translation mode.* corresponds with `mapcomplete-translation-mode=yes|mapcomplete-translation-mode=true|mapcomplete-translation-mode=mobile` + - *Click the 'translate'-icon next to a string to enter or update a piece of text. You need a Weblate-account for this. Create one with your OSM-username to automatically unlock translation mode.* corresponds with `mapcomplete-translation-mode=yes |mapcomplete-translation-mode=true |mapcomplete-translation-mode=mobile` @@ -1287,7 +1064,7 @@ This tagrendering has no question and is thus read-only - *Completely translated* corresponds with `_translation_percentage=100` -This tagrendering is only visible in the popup if the following condition is met: `mapcomplete-translation-mode=yes|mapcomplete-translation-mode=true|mapcomplete-translation-mode=mobile` +This tagrendering is only visible in the popup if the following condition is met: `mapcomplete-translation-mode=yes |mapcomplete-translation-mode=true |mapcomplete-translation-mode=mobile` @@ -1299,7 +1076,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_translation_links~.+&mapcomplete-translation-mode=true|mapcomplete-translation-mode=mobile` +This tagrendering is only visible in the popup if the following condition is met: `_translation_links~.+ &mapcomplete-translation-mode=true |mapcomplete-translation-mode=mobile` @@ -1395,16 +1172,6 @@ This tagrendering is only visible in the popup if the following condition is met -### leftover-questions - - - -This tagrendering has no question and is thus read-only - - - - - Normal layers =============== @@ -1417,6 +1184,7 @@ The following layers are included in MapComplete: - [address](./Layers/address.md) - [advertising](./Layers/advertising.md) - [ambulancestation](./Layers/ambulancestation.md) + - [animal_shelter](./Layers/animal_shelter.md) - [artwork](./Layers/artwork.md) - [atm](./Layers/atm.md) - [bank](./Layers/bank.md) @@ -1477,6 +1245,7 @@ The following layers are included in MapComplete: - [hospital](./Layers/hospital.md) - [hotel](./Layers/hotel.md) - [hydrant](./Layers/hydrant.md) + - [ice_cream](./Layers/ice_cream.md) - [icons](./Layers/icons.md) - [id_presets](./Layers/id_presets.md) - [import_candidate](./Layers/import_candidate.md) @@ -1514,6 +1283,7 @@ The following layers are included in MapComplete: - [range](./Layers/range.md) - [reception_desk](./Layers/reception_desk.md) - [recycling](./Layers/recycling.md) + - [route_marker](./Layers/route_marker.md) - [school](./Layers/school.md) - [selected_element](./Layers/selected_element.md) - [shelter](./Layers/shelter.md) diff --git a/Docs/BuiltinQuestions.md b/Docs/BuiltinQuestions.md index 75fb48454..00d22a40f 100644 --- a/Docs/BuiltinQuestions.md +++ b/Docs/BuiltinQuestions.md @@ -59,6 +59,7 @@ Special library layer which does not need a '.questions'-prefix before being imp + [sugar_free](#sugar_free) + [lactose_free](#lactose_free) + [gluten_free](#gluten_free) + + [vegan](#vegan) @@ -127,6 +128,7 @@ attribute | type | values which are supported by this layer [](https://taginfo.openstreetmap.org/keys/diet:sugar_free#values) [diet:sugar_free](https://wiki.openstreetmap.org/wiki/Key:diet:sugar_free) | Multiple choice | [only](https://wiki.openstreetmap.org/wiki/Tag:diet:sugar_free%3Donly) [yes](https://wiki.openstreetmap.org/wiki/Tag:diet:sugar_free%3Dyes) [limited](https://wiki.openstreetmap.org/wiki/Tag:diet:sugar_free%3Dlimited) [no](https://wiki.openstreetmap.org/wiki/Tag:diet:sugar_free%3Dno) [](https://taginfo.openstreetmap.org/keys/diet:lactose_free#values) [diet:lactose_free](https://wiki.openstreetmap.org/wiki/Key:diet:lactose_free) | Multiple choice | [only](https://wiki.openstreetmap.org/wiki/Tag:diet:lactose_free%3Donly) [yes](https://wiki.openstreetmap.org/wiki/Tag:diet:lactose_free%3Dyes) [limited](https://wiki.openstreetmap.org/wiki/Tag:diet:lactose_free%3Dlimited) [no](https://wiki.openstreetmap.org/wiki/Tag:diet:lactose_free%3Dno) [](https://taginfo.openstreetmap.org/keys/diet:gluten_free#values) [diet:gluten_free](https://wiki.openstreetmap.org/wiki/Key:diet:gluten_free) | Multiple choice | [only](https://wiki.openstreetmap.org/wiki/Tag:diet:gluten_free%3Donly) [yes](https://wiki.openstreetmap.org/wiki/Tag:diet:gluten_free%3Dyes) [limited](https://wiki.openstreetmap.org/wiki/Tag:diet:gluten_free%3Dlimited) [no](https://wiki.openstreetmap.org/wiki/Tag:diet:gluten_free%3Dno) +[](https://taginfo.openstreetmap.org/keys/diet:vegan#values) [diet:vegan](https://wiki.openstreetmap.org/wiki/Key:diet:vegan) | Multiple choice | [only](https://wiki.openstreetmap.org/wiki/Tag:diet:vegan%3Donly) [yes](https://wiki.openstreetmap.org/wiki/Tag:diet:vegan%3Dyes) [limited](https://wiki.openstreetmap.org/wiki/Tag:diet:vegan%3Dlimited) [no](https://wiki.openstreetmap.org/wiki/Tag:diet:vegan%3Dno) @@ -559,7 +561,7 @@ The question is *What coins can you use to pay here?* - *5 francs coins are accepted* corresponds with `payment:coins:denominations=5 CHF` -This tagrendering is only visible in the popup if the following condition is met: `payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$` +This tagrendering is only visible in the popup if the following condition is met: `payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$` @@ -588,7 +590,7 @@ The question is *what notes can you use to pay here?* - *1000 francs notes are accepted* corresponds with `payment:notes:denominations=1000 CHF` -This tagrendering is only visible in the popup if the following condition is met: `payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$` +This tagrendering is only visible in the popup if the following condition is met: `payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$` @@ -602,7 +604,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` @@ -633,7 +635,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -756,6 +758,8 @@ The question is *Does this place offer internet access?* - *This place offers wired internet access* corresponds with `internet_access=wired` +This tagrendering has labels `internet-all` + ### internet-fee @@ -773,7 +777,9 @@ The question is *Is there a fee for internet access?* - *Internet access is free at this place, for customers only* corresponds with `internet_access:fee=customers` -This tagrendering is only visible in the popup if the following condition is met: `internet_access!=no&internet_access~.+` +This tagrendering is only visible in the popup if the following condition is met: `internet_access!=no &internet_access~.+` + +This tagrendering has labels `internet-all` @@ -796,6 +802,8 @@ This is rendered with `The network name is {internet_access:ssid}` This tagrendering is only visible in the popup if the following condition is met: `internet_access=wlan` +This tagrendering has labels `internet-all` + ### luminous_or_lit @@ -808,10 +816,10 @@ The question is *Is this object lit or does it emit light?* - - *This object both emits light and is lighted by an external light source* corresponds with `lit=yes&luminous=yes` + - *This object both emits light and is lighted by an external light source* corresponds with `lit=yes &luminous=yes` - *This object emits light* corresponds with `luminous=yes` - *This object is lit externally, e.g. by a spotlight or other lights* corresponds with `lit=yes` - - *This object does not emit light and is not lighted by externally* corresponds with `lit=no&luminous=no` + - *This object does not emit light and is not lighted by externally* corresponds with `lit=no &luminous=no` @@ -870,6 +878,8 @@ The question is *Does this shop have a sugar free offering?* - *This shop has no sugar free offering* corresponds with `diet:sugar_free=no` +This tagrendering has labels `diets` + ### lactose_free @@ -885,9 +895,11 @@ The question is *Does {title()} have a lactose-free offering?* - *Only sells lactose free products* corresponds with `diet:lactose_free=only` - *Big lactose free offering* corresponds with `diet:lactose_free=yes` - *Limited lactose free offering* corresponds with `diet:lactose_free=limited` - - *No lactose free offering* corresponds with `diet:lactose_free=no` + - *This shop has no lactose free offering* corresponds with `diet:lactose_free=no` +This tagrendering has labels `diets` + ### gluten_free @@ -904,6 +916,28 @@ The question is *Does this shop have a gluten free offering?* - *This shop has a big gluten free offering* corresponds with `diet:gluten_free=yes` - *This shop has a limited gluten free offering* corresponds with `diet:gluten_free=limited` - *This shop has no gluten free offering* corresponds with `diet:gluten_free=no` - + + +This tagrendering has labels `diets` + + + +### vegan + + + +The question is *Does this place offer a vegan option?* + + + + + + - *This place only sells vegan products* corresponds with `diet:vegan=only` + - *This shop has a big vegan offering* corresponds with `diet:vegan=yes` + - *This shop has a limited vegan offering* corresponds with `diet:vegan=limited` + - *This shop has no vegan offering* corresponds with `diet:vegan=no` + + +This tagrendering has labels `diets` This document is autogenerated from [assets/layers/questions/questions.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/layers/questions/questions.json) diff --git a/Docs/LanguagePicker.md b/Docs/LanguagePicker.md index b73b93f7b..aaf1e1f3d 100644 --- a/Docs/LanguagePicker.md +++ b/Docs/LanguagePicker.md @@ -5,7 +5,7 @@ In my [little OpenStreetMap-editor](https://mapcomplete.org) translations are provided by contributors on [hosted weblate](https://hosted.weblate.org/projects/mapcomplete/), where thousands of text snippets have been translated already in the past year - which is awesome. -However, the language picker was a bit dry: it used to have codes for every langauge, e.g. `nl`, `en`, `ja`, 'pt_BR', 'zh_Hant'... Quite boring and not really user-friendly - but easy to implement. +However, the language picker was a bit dry: it used to have codes for every language, e.g. `nl`, `en`, `ja`, 'pt_BR', 'zh_Hant'... Quite boring and not really user-friendly - but easy to implement. Today, I decided to give these an overhaul. I wanted to show proper language names in them. But: in which _language_ should we show the language overview? diff --git a/Docs/Layers/address.md b/Docs/Layers/address.md index 4fcf609d2..7dde4b09e 100644 --- a/Docs/Layers/address.md +++ b/Docs/Layers/address.md @@ -5,7 +5,7 @@ - + Addresses @@ -58,7 +58,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -153,7 +153,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/advertising.md b/Docs/Layers/advertising.md index 65cba1831..47809cc92 100644 --- a/Docs/Layers/advertising.md +++ b/Docs/Layers/advertising.md @@ -5,7 +5,7 @@ - + We will complete data from advertising features with reference, operator and lit @@ -76,7 +76,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -151,10 +151,10 @@ The question is *Is this object lit or does it emit light?* - *This is a neon-tube light* corresponds with `luminous=neon` - - *This object both emits light and is lighted by an external light source* corresponds with `lit=yes&luminous=yes` + - *This object both emits light and is lighted by an external light source* corresponds with `lit=yes &luminous=yes` - *This object emits light* corresponds with `luminous=yes` - *This object is lit externally, e.g. by a spotlight or other lights* corresponds with `lit=yes` - - *This object does not emit light and is not lighted by externally* corresponds with `lit=no&luminous=no` + - *This object does not emit light and is not lighted by externally* corresponds with `lit=no &luminous=no` @@ -221,7 +221,7 @@ The question is *From how many sides you can watch advertisments?* - *This object has advertisements on both sides* corresponds with `sides=2` -This tagrendering is only visible in the popup if the following condition is met: `advertising=poster_box|advertising=screen|advertising=billboard` +This tagrendering is only visible in the popup if the following condition is met: `advertising=poster_box |advertising=screen |advertising=billboard` @@ -291,7 +291,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/all_streets.md b/Docs/Layers/all_streets.md index f32a27ced..42a2da3f9 100644 --- a/Docs/Layers/all_streets.md +++ b/Docs/Layers/all_streets.md @@ -15,6 +15,7 @@ Layer to mark any street as cyclestreet - This layer is shown at zoomlevel **18** and higher + - Not rendered on the map by default. If you want to rendering this on the map, override `mapRenderings` @@ -63,10 +64,10 @@ The question is *Is the street {name} a cyclestreet?* - - *This street is a cyclestreet (and has a speed limit of 30 km/h)* corresponds with `cyclestreet=yes&maxspeed=30&overtaking:motor_vehicle=no` + - *This street is a cyclestreet (and has a speed limit of 30 km/h)* corresponds with `cyclestreet=yes &maxspeed=30 &overtaking:motor_vehicle=no` - *This street is a bicycle road* corresponds with `bicycle_road=yes` - This option cannot be chosen as answer - - *This street is a bicycle road (has a speed limit of 30 km/h and vehicles are not allowed) (sign will be asked later)* corresponds with `bicycle_road=yes&maxspeed=30&source:maxspeed=DE:bicycle_road&vehicle=no&bicycle=designated` + - *This street is a bicycle road (has a speed limit of 30 km/h and vehicles are not allowed) (sign will be asked later)* corresponds with `bicycle_road=yes &maxspeed=30 &source:maxspeed=DE:bicycle_road &vehicle=no &bicycle=designated` - *This street is a cyclestreet* corresponds with `cyclestreet=yes` - *This street will become a cyclestreet soon* corresponds with `proposed:cyclestreet=yes` - *This street will become a bicycle road soon* corresponds with `proposed:bicycle_road=yes` @@ -92,7 +93,7 @@ The question is *What sign does this bicycle road have?* - *There are no supplementary signs at this bicycle road.* corresponds with `traffic_sign=DE:244.1` -This tagrendering is only visible in the popup if the following condition is met: `bicycle_road=yes&_country=de` +This tagrendering is only visible in the popup if the following condition is met: `bicycle_road=yes &_country=de` @@ -127,7 +128,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -175,7 +176,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/all_vending_machine.md b/Docs/Layers/all_vending_machine.md index 6d7e4f02f..d72be7244 100644 --- a/Docs/Layers/all_vending_machine.md +++ b/Docs/Layers/all_vending_machine.md @@ -5,7 +5,7 @@ - + Layer showing vending machines @@ -75,7 +75,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -212,7 +212,7 @@ The question is *What coins can you use to pay here?* - *5 francs coins are accepted* corresponds with `payment:coins:denominations=5 CHF` -This tagrendering is only visible in the popup if the following condition is met: `payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$` +This tagrendering is only visible in the popup if the following condition is met: `payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$` @@ -241,7 +241,7 @@ The question is *what notes can you use to pay here?* - *1000 francs notes are accepted* corresponds with `payment:notes:denominations=1000 CHF` -This tagrendering is only visible in the popup if the following condition is met: `payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$` +This tagrendering is only visible in the popup if the following condition is met: `payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$` @@ -414,7 +414,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/ambulancestation.md b/Docs/Layers/ambulancestation.md index 493eb314a..0e1ebcc03 100644 --- a/Docs/Layers/ambulancestation.md +++ b/Docs/Layers/ambulancestation.md @@ -5,7 +5,7 @@ - + An ambulance station is an area for storage of ambulance vehicles, medical equipment, personal protective equipment, and other medical supplies. @@ -71,7 +71,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -202,7 +202,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/animal_shelter.md b/Docs/Layers/animal_shelter.md new file mode 100644 index 000000000..de9dcdab0 --- /dev/null +++ b/Docs/Layers/animal_shelter.md @@ -0,0 +1,266 @@ +[//]: # (WARNING: this file is automatically generated. Please find the sources at the bottom and edit those sources) + + animal_shelter +================ + + + + + +An animal shelter is a facility where animals in trouble are brought and facility's staff (volunteers or not) feeds them and cares of them, rehabilitating and healing them if necessary. This definition includes kennels for abandoned dogs, catteries for abandoned cats, shelters for other abandoned pets and wildlife recovery centres. + + + + + + + - This layer is shown at zoomlevel **0** and higher + + +This is a special layer - data is not sourced from OpenStreetMap + + + + Supported attributes +---------------------- + + + +Warning: + +this quick overview is incomplete + + + +attribute | type | values which are supported by this layer +----------- | ------ | ------------------------------------------ +[](https://taginfo.openstreetmap.org/keys/id#values) [id](https://wiki.openstreetmap.org/wiki/Key:id) | Multiple choice | +[](https://taginfo.openstreetmap.org/keys/name#values) [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) | +[](https://taginfo.openstreetmap.org/keys/website#values) [website](https://wiki.openstreetmap.org/wiki/Key:website) | [url](../SpecialInputElements.md#url) | +[](https://taginfo.openstreetmap.org/keys/phone#values) [phone](https://wiki.openstreetmap.org/wiki/Key:phone) | [phone](../SpecialInputElements.md#phone) | +[](https://taginfo.openstreetmap.org/keys/email#values) [email](https://wiki.openstreetmap.org/wiki/Key:email) | [email](../SpecialInputElements.md#email) | +[](https://taginfo.openstreetmap.org/keys/purpose#values) [purpose](https://wiki.openstreetmap.org/wiki/Key:purpose) | Multiple choice | [adoption](https://wiki.openstreetmap.org/wiki/Tag:purpose%3Dadoption) [sanctuary](https://wiki.openstreetmap.org/wiki/Tag:purpose%3Dsanctuary) [release](https://wiki.openstreetmap.org/wiki/Tag:purpose%3Drelease) +[](https://taginfo.openstreetmap.org/keys/opening_hours#values) [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) | [opening_hours](../SpecialInputElements.md#opening_hours) | + + + + +### just_created + + + +This element shows a 'thank you' that the contributor has recently created this element + +This tagrendering has no question and is thus read-only + + + + + + - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` + + +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` + + + +### images + + + +This block shows the known images which are linked with the `image`-keys, but also via `mapillary` and `wikidata` and shows the button to upload new images + +This tagrendering has no question and is thus read-only + + + + + +### reviews + + + +Shows the reviews module (including the possibility to leave a review) + +This tagrendering has no question and is thus read-only + + + + + +### 2 + + + +The question is *What is the name of this animal shelter?* + +This rendering asks information about the property [name](https://wiki.openstreetmap.org/wiki/Key:name) + +This is rendered with `This animal shelter is named {name}` + + + + + +### website + + + +The question is *What is the website of {title()}?* + +This rendering asks information about the property [website](https://wiki.openstreetmap.org/wiki/Key:website) + +This is rendered with `{website}` + + + + + + - *{contact:website}* corresponds with `contact:website~.+` + - This option cannot be chosen as answer + + +This tagrendering has labels `contact` + + + +### phone + + + +The question is *What is the phone number of {title()}?* + +This rendering asks information about the property [phone](https://wiki.openstreetmap.org/wiki/Key:phone) + +This is rendered with `{phone}` + + + + + + - *{contact:phone}* corresponds with `contact:phone~.+` + - This option cannot be chosen as answer + + +This tagrendering has labels `contact` + + + +### email + + + +The question is *What is the email address of {title()}?* + +This rendering asks information about the property [email](https://wiki.openstreetmap.org/wiki/Key:email) + +This is rendered with `{email}` + + + + + + - *{contact:email}* corresponds with `contact:email~.+` + - This option cannot be chosen as answer + + +This tagrendering has labels `contact` + + + +### 6 + + + +The question is *What is the purpose of the animal shelter?* + + + + + + - *Animals are kept here until adopted by a new owner* corresponds with `purpose=adoption` + - *Animals are taken care of for the rest of their lives* corresponds with `purpose=sanctuary` + - *Injured animals are rehabilitated here until they can be released in nature again * corresponds with `purpose=release` + + + + +### 7 + + + +The question is *When is this animal shelter opened?* + +This rendering asks information about the property [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) + +This is rendered with `{opening_hours_table()}` + + + + + +### leftover-questions + + + +This tagrendering has no question and is thus read-only + + + + + +### minimap + + + +Shows a small map with the feature. Added by default to every popup + +This tagrendering has no question and is thus read-only + + + + + +### move-button + + + +This tagrendering has no question and is thus read-only + + + + + +### delete-button + + + +This tagrendering has no question and is thus read-only + + + + + +### last_edit + + + +Gives some metainfo about the last edit and who did edit it - rendering only + +This tagrendering has no question and is thus read-only + + + +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` + + + +### all-tags + + + +This tagrendering has no question and is thus read-only + + + +This document is autogenerated from [assets/layers/animal_shelter/animal_shelter.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/layers/animal_shelter/animal_shelter.json) diff --git a/Docs/Layers/artwork.md b/Docs/Layers/artwork.md index 1763fb0fd..ec456367e 100644 --- a/Docs/Layers/artwork.md +++ b/Docs/Layers/artwork.md @@ -5,7 +5,7 @@ - + An open map of statues, busts, graffitis and other artwork all over the world @@ -82,7 +82,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -249,7 +249,7 @@ The question is *Does this bench have a backrest?* - - *This bench is two-sided and shares the backrest* corresponds with `backrest=yes&two_sided=yes` + - *This bench is two-sided and shares the backrest* corresponds with `backrest=yes &two_sided=yes` - *Does have a backrest* corresponds with `backrest=yes` - *Does not have a backrest* corresponds with `backrest=no` @@ -479,7 +479,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` @@ -502,7 +502,7 @@ This tagrendering has no question and is thus read-only id | question | osmTags ---- | ---------- | --------- has_image.0 | With and without images (default) | -has_image.1 | Has at least one image | image~.+\|image:0~.+\|image:1~.+\|image:2~.+\|image:3~.+\|mapillary~.+ +has_image.1 | Has at least one image | image~.+ \|image:0~.+ \|image:1~.+ \|image:2~.+ \|image:3~.+ \|mapillary~.+ has_image.2 | Probably does not have an image | diff --git a/Docs/Layers/atm.md b/Docs/Layers/atm.md index 31a14538e..28fea1303 100644 --- a/Docs/Layers/atm.md +++ b/Docs/Layers/atm.md @@ -5,7 +5,7 @@ - + ATMs to withdraw money @@ -73,7 +73,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -280,7 +280,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/bank.md b/Docs/Layers/bank.md index 50ac7d42d..18284936d 100644 --- a/Docs/Layers/bank.md +++ b/Docs/Layers/bank.md @@ -5,7 +5,7 @@ - + A financial institution to deposit money @@ -67,7 +67,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -120,7 +120,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/banks_with_atm.md b/Docs/Layers/banks_with_atm.md index a426960d3..9ed77afad 100644 --- a/Docs/Layers/banks_with_atm.md +++ b/Docs/Layers/banks_with_atm.md @@ -5,7 +5,7 @@ - + A financial institution to deposit money @@ -67,7 +67,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -120,7 +120,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/barrier.md b/Docs/Layers/barrier.md index 8fc340762..4c1096150 100644 --- a/Docs/Layers/barrier.md +++ b/Docs/Layers/barrier.md @@ -5,7 +5,7 @@ - + Obstacles while cycling, such as bollards and cycle barriers @@ -76,7 +76,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -179,7 +179,7 @@ This is rendered with `Maximum width: {maxwidth:physical} m` -This tagrendering is only visible in the popup if the following condition is met: `cycle_barrier!=double&cycle_barrier!=triple&_referencing_ways~.+` +This tagrendering is only visible in the popup if the following condition is met: `cycle_barrier!=double &cycle_barrier!=triple &_referencing_ways~.+` @@ -195,7 +195,7 @@ This is rendered with `Space between barriers (along the length of the road): { -This tagrendering is only visible in the popup if the following condition is met: `cycle_barrier=double|cycle_barrier=triple` +This tagrendering is only visible in the popup if the following condition is met: `cycle_barrier=double |cycle_barrier=triple` @@ -211,7 +211,7 @@ This is rendered with `Width of opening: {width:opening} m` -This tagrendering is only visible in the popup if the following condition is met: `cycle_barrier=double|cycle_barrier=triple` +This tagrendering is only visible in the popup if the following condition is met: `cycle_barrier=double |cycle_barrier=triple` @@ -227,7 +227,7 @@ This is rendered with `Overlap: {overlap} m` -This tagrendering is only visible in the popup if the following condition is met: `cycle_barrier=double|cycle_barrier=triple` +This tagrendering is only visible in the popup if the following condition is met: `cycle_barrier=double |cycle_barrier=triple` @@ -273,7 +273,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/bench.md b/Docs/Layers/bench.md index e9869f60e..81525630a 100644 --- a/Docs/Layers/bench.md +++ b/Docs/Layers/bench.md @@ -5,7 +5,7 @@ - + A bench is a wooden, metal, stone, … surface where a human can sit. This layers visualises them and asks a few questions about them. @@ -81,7 +81,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -107,7 +107,7 @@ The question is *Does this bench have a backrest?* - - *This bench is two-sided and shares the backrest* corresponds with `backrest=yes&two_sided=yes` + - *This bench is two-sided and shares the backrest* corresponds with `backrest=yes &two_sided=yes` - *Does have a backrest* corresponds with `backrest=yes` - *Does not have a backrest* corresponds with `backrest=no` @@ -283,7 +283,7 @@ The question is *Does this bench act as memorial for someone or something?* - *This bench is a not a memorial for someone or something* corresponds with `not:historic=memorial` -This tagrendering is only visible in the popup if the following condition is met: `historic=memorial|inscription~.+|memorial=bench|tourism=artwork` +This tagrendering is only visible in the popup if the following condition is met: `historic=memorial |inscription~.+ |memorial=bench |tourism=artwork` This tagrendering has labels `bench-questions` @@ -448,7 +448,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` @@ -470,7 +470,7 @@ This tagrendering has no question and is thus read-only id | question | osmTags ---- | ---------- | --------- -bench_is_memorial.0 | is a memorial | historic=memorial\|memorial=bench +bench_is_memorial.0 | is a memorial | historic=memorial \|memorial=bench @@ -487,7 +487,7 @@ has_backrest.2 | Has no backrest | backrest=no id | question | osmTags ---- | ---------- | --------- has_image.0 | With and without images (default) | -has_image.1 | Has at least one image | image~.+\|image:0~.+\|image:1~.+\|image:2~.+\|image:3~.+\|mapillary~.+ +has_image.1 | Has at least one image | image~.+ \|image:0~.+ \|image:1~.+ \|image:2~.+ \|image:3~.+ \|mapillary~.+ has_image.2 | Probably does not have an image | diff --git a/Docs/Layers/bench_at_pt.md b/Docs/Layers/bench_at_pt.md index b2ad3bb86..28ba0509f 100644 --- a/Docs/Layers/bench_at_pt.md +++ b/Docs/Layers/bench_at_pt.md @@ -5,7 +5,7 @@ - + A layer showing all public-transport-stops which do have a bench @@ -68,7 +68,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -157,7 +157,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/bicycle_library.md b/Docs/Layers/bicycle_library.md index d926e49a5..f5df517a8 100644 --- a/Docs/Layers/bicycle_library.md +++ b/Docs/Layers/bicycle_library.md @@ -5,7 +5,7 @@ - + A facility where bicycles can be lent for longer period of times @@ -75,7 +75,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -200,7 +200,7 @@ This is rendered with `Lending a bicycle costs {charge}` - *Lending a bicycle is free* corresponds with `fee=no` - - *Lending a bicycle costs €20/year and €20 warranty* corresponds with `fee=yes&charge=€20warranty + €20/year` + - *Lending a bicycle costs €20/year and €20 warranty* corresponds with `fee=yes &charge=€20warranty + €20/year` @@ -278,7 +278,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/bicycle_rental.md b/Docs/Layers/bicycle_rental.md index 46e5d474c..674c669c9 100644 --- a/Docs/Layers/bicycle_rental.md +++ b/Docs/Layers/bicycle_rental.md @@ -5,7 +5,7 @@ - + Bicycle rental stations @@ -79,7 +79,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -105,9 +105,9 @@ The question is *What kind of bicycle rental is this?* - - *This is a shop whose main focus is bicycle rental* corresponds with `shop=rental&bicycle_rental=shop` + - *This is a shop whose main focus is bicycle rental* corresponds with `shop=rental &bicycle_rental=shop` - *This is a rental business which rents out various objects and/or vehicles. It rents out bicycles too, but this is not the main focus* corresponds with `shop=rental` - - *This is a shop which sells or repairs bicycles, but also rents out bicycles* corresponds with `service:bicycle:rental=yes&shop=bicycle` + - *This is a shop which sells or repairs bicycles, but also rents out bicycles* corresponds with `service:bicycle:rental=yes &shop=bicycle` - *This is an automated docking station, where a bicycle is mechanically locked to a structure* corresponds with `bicycle_rental=docking_station` - *A machine is present which dispenses and accepts keys, eventually after authentication and/or payment. The bicycles are parked nearby* corresponds with `bicycle_rental=key_dispensing_machine` - *This is a dropoff point, e.g. a reserved parking to place the bicycles clearly marked as being for the rental service only* corresponds with `bicycle_rental=dropoff_point` @@ -195,7 +195,7 @@ This is rendered with `

Opening hours

{opening_hours_table(opening_hours -This tagrendering is only visible in the popup if the following condition is met: `shop~.+|opening_hours~.+` +This tagrendering is only visible in the popup if the following condition is met: `shop~.+ |opening_hours~.+` @@ -451,7 +451,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/bicycle_rental_non_docking.md b/Docs/Layers/bicycle_rental_non_docking.md index c9b127d21..256aa6b9d 100644 --- a/Docs/Layers/bicycle_rental_non_docking.md +++ b/Docs/Layers/bicycle_rental_non_docking.md @@ -5,7 +5,7 @@ - + Bicycle rental stations @@ -78,7 +78,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -104,9 +104,9 @@ The question is *What kind of bicycle rental is this?* - - *This is a shop whose main focus is bicycle rental* corresponds with `shop=rental&bicycle_rental=shop` + - *This is a shop whose main focus is bicycle rental* corresponds with `shop=rental &bicycle_rental=shop` - *This is a rental business which rents out various objects and/or vehicles. It rents out bicycles too, but this is not the main focus* corresponds with `shop=rental` - - *This is a shop which sells or repairs bicycles, but also rents out bicycles* corresponds with `service:bicycle:rental=yes&shop=bicycle` + - *This is a shop which sells or repairs bicycles, but also rents out bicycles* corresponds with `service:bicycle:rental=yes &shop=bicycle` - *This is an automated docking station, where a bicycle is mechanically locked to a structure* corresponds with `bicycle_rental=docking_station` - *A machine is present which dispenses and accepts keys, eventually after authentication and/or payment. The bicycles are parked nearby* corresponds with `bicycle_rental=key_dispensing_machine` - *This is a dropoff point, e.g. a reserved parking to place the bicycles clearly marked as being for the rental service only* corresponds with `bicycle_rental=dropoff_point` @@ -194,7 +194,7 @@ This is rendered with `

Opening hours

{opening_hours_table(opening_hours -This tagrendering is only visible in the popup if the following condition is met: `shop~.+|opening_hours~.+` +This tagrendering is only visible in the popup if the following condition is met: `shop~.+ |opening_hours~.+` @@ -450,7 +450,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/bicycle_tube_vending_machine.md b/Docs/Layers/bicycle_tube_vending_machine.md index 2859ae344..999ff5b9f 100644 --- a/Docs/Layers/bicycle_tube_vending_machine.md +++ b/Docs/Layers/bicycle_tube_vending_machine.md @@ -5,7 +5,7 @@ - + A layer showing vending machines for bicycle tubes (either purpose-built bicycle tube vending machines or classical vending machines with bicycle tubes and optionally additional bicycle related objects such as lights, gloves, locks, …) @@ -71,7 +71,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -264,7 +264,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/bike_cafe.md b/Docs/Layers/bike_cafe.md index 70c265511..ac8e43c3d 100644 --- a/Docs/Layers/bike_cafe.md +++ b/Docs/Layers/bike_cafe.md @@ -5,7 +5,7 @@ - + A bike café is a café geared towards cyclists, for example with services such as a pump, with lots of bicycle-related decoration, … @@ -74,7 +74,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -274,7 +274,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/bike_cleaning.md b/Docs/Layers/bike_cleaning.md index 3f0fe2e66..f30727070 100644 --- a/Docs/Layers/bike_cleaning.md +++ b/Docs/Layers/bike_cleaning.md @@ -5,7 +5,7 @@ - + A layer showing facilities where one can clean their bike @@ -68,7 +68,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -123,7 +123,7 @@ This is rendered with `Using the cleaning service costs {charge}` - *There is a fee to use this cleaning service* corresponds with `fee=yes` -This tagrendering is only visible in the popup if the following condition is met: `amenity=bike_wash|amenity=bicycle_wash` +This tagrendering is only visible in the popup if the following condition is met: `amenity=bike_wash |amenity=bicycle_wash` @@ -179,7 +179,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/bike_parking.md b/Docs/Layers/bike_parking.md index a2c6c332d..8cb2d99af 100644 --- a/Docs/Layers/bike_parking.md +++ b/Docs/Layers/bike_parking.md @@ -5,7 +5,7 @@ - + A layer showing where you can park your bike @@ -74,7 +74,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -271,7 +271,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/bike_repair_station.md b/Docs/Layers/bike_repair_station.md index 1c1c2713b..124dfe555 100644 --- a/Docs/Layers/bike_repair_station.md +++ b/Docs/Layers/bike_repair_station.md @@ -5,7 +5,7 @@ - + A layer showing bicycle pumps and bicycle repair tool stands @@ -79,7 +79,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -105,9 +105,9 @@ The question is *Which services are available at this location?* - - *There is only a pump present* corresponds with `service:bicycle:tools=no&service:bicycle:pump=yes` - - *There are only tools (screwdrivers, pliers, …) present* corresponds with `service:bicycle:tools=yes&service:bicycle:pump=no` - - *There are both tools and a pump present* corresponds with `service:bicycle:tools=yes&service:bicycle:pump=yes` + - *There is only a pump present* corresponds with `service:bicycle:tools=no &service:bicycle:pump=yes` + - *There are only tools (screwdrivers, pliers, …) present* corresponds with `service:bicycle:tools=yes &service:bicycle:pump=no` + - *There are both tools and a pump present* corresponds with `service:bicycle:tools=yes &service:bicycle:pump=yes` @@ -262,7 +262,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `email~.+&service:bicycle:pump:operational_status=broken` +This tagrendering is only visible in the popup if the following condition is met: `email~.+ &service:bicycle:pump:operational_status=broken` @@ -417,7 +417,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/bike_shop.md b/Docs/Layers/bike_shop.md index 3608947d1..7b6fe79da 100644 --- a/Docs/Layers/bike_shop.md +++ b/Docs/Layers/bike_shop.md @@ -5,7 +5,7 @@ - + A shop specifically selling bicycles or related items @@ -90,7 +90,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -119,7 +119,7 @@ This tagrendering has no question and is thus read-only - *This business focuses on rental* corresponds with `shop=rental` -This tagrendering is only visible in the popup if the following condition is met: `shop~.+&shop!~^(bicycle)$&shop!~^(sports)$` +This tagrendering is only visible in the popup if the following condition is met: `shop~.+ &shop!~^(bicycle)$ &shop!~^(sports)$` @@ -323,7 +323,7 @@ This is rendered with `{capacity:city_bike} city bikes can be rented here` -This tagrendering is only visible in the popup if the following condition is met: `rental~^(.*city_bike.*)$&service:bicycle:rental=yes` +This tagrendering is only visible in the popup if the following condition is met: `rental~^(.*city_bike.*)$ &service:bicycle:rental=yes` This tagrendering has labels `bicycle_rental` @@ -341,7 +341,7 @@ This is rendered with `{capacity:ebike} electrical bikes can be rented here` -This tagrendering is only visible in the popup if the following condition is met: `rental~^(.*ebike.*)$&service:bicycle:rental=yes` +This tagrendering is only visible in the popup if the following condition is met: `rental~^(.*ebike.*)$ &service:bicycle:rental=yes` This tagrendering has labels `bicycle_rental` @@ -359,7 +359,7 @@ This is rendered with `{capacity:kid_bike} bikes for children can be rented her -This tagrendering is only visible in the popup if the following condition is met: `rental~^(.*kid_bike.*)$&service:bicycle:rental=yes` +This tagrendering is only visible in the popup if the following condition is met: `rental~^(.*kid_bike.*)$ &service:bicycle:rental=yes` This tagrendering has labels `bicycle_rental` @@ -377,7 +377,7 @@ This is rendered with `{capacity:bmx} BMX bikes can be rented here` -This tagrendering is only visible in the popup if the following condition is met: `rental~^(.*bmx.*)$&service:bicycle:rental=yes` +This tagrendering is only visible in the popup if the following condition is met: `rental~^(.*bmx.*)$ &service:bicycle:rental=yes` This tagrendering has labels `bicycle_rental` @@ -395,7 +395,7 @@ This is rendered with `{capacity:mtb} mountainbikes can be rented here` -This tagrendering is only visible in the popup if the following condition is met: `rental~^(.*mtb.*)$&service:bicycle:rental=yes` +This tagrendering is only visible in the popup if the following condition is met: `rental~^(.*mtb.*)$ &service:bicycle:rental=yes` This tagrendering has labels `bicycle_rental` @@ -413,7 +413,7 @@ This is rendered with `{capacity:bicycle_pannier} bicycle panniers can be rente -This tagrendering is only visible in the popup if the following condition is met: `rental~^(.*bicycle_pannier.*)$&service:bicycle:rental=yes` +This tagrendering is only visible in the popup if the following condition is met: `rental~^(.*bicycle_pannier.*)$ &service:bicycle:rental=yes` This tagrendering has labels `bicycle_rental` @@ -431,7 +431,7 @@ This is rendered with `{capacity:tandem_bicycle} tandem can be rented here` -This tagrendering is only visible in the popup if the following condition is met: `rental~^(.*tandem_bicycle.*)$&service:bicycle:rental=yes` +This tagrendering is only visible in the popup if the following condition is met: `rental~^(.*tandem_bicycle.*)$ &service:bicycle:rental=yes` This tagrendering has labels `bicycle_rental` @@ -592,7 +592,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` @@ -621,14 +621,14 @@ open_now.0 | Open now | _isOpen=yes id | question | osmTags ---- | ---------- | --------- -sells_second-hand.0 | Sells second-hand bicycles | service:bicycle:second_hand=yes\|service:bicycle:second_hand=only +sells_second-hand.0 | Sells second-hand bicycles | service:bicycle:second_hand=yes \|service:bicycle:second_hand=only id | question | osmTags ---- | ---------- | --------- -offers_diy_repair.0 | Offers DIY bike repair | service:bicycle:diy=yes\|service:bicycle:diy=only +offers_diy_repair.0 | Offers DIY bike repair | service:bicycle:diy=yes \|service:bicycle:diy=only This document is autogenerated from [assets/layers/bike_shop/bike_shop.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/layers/bike_shop/bike_shop.json) diff --git a/Docs/Layers/bike_themed_object.md b/Docs/Layers/bike_themed_object.md index c6588d226..6165be406 100644 --- a/Docs/Layers/bike_themed_object.md +++ b/Docs/Layers/bike_themed_object.md @@ -5,7 +5,7 @@ - + A layer with bike-themed objects but who don't match any other layer @@ -71,7 +71,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -213,7 +213,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/binocular.md b/Docs/Layers/binocular.md index dbfa085bf..eb89e61ae 100644 --- a/Docs/Layers/binocular.md +++ b/Docs/Layers/binocular.md @@ -5,7 +5,7 @@ - + Binoculars @@ -68,7 +68,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -169,7 +169,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/birdhide.md b/Docs/Layers/birdhide.md index b1bb1be28..8e1e9824a 100644 --- a/Docs/Layers/birdhide.md +++ b/Docs/Layers/birdhide.md @@ -5,7 +5,7 @@ - + A birdhide @@ -69,7 +69,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -96,9 +96,9 @@ The question is *Is this a bird blind or a bird watching shelter?* - *Bird blind* corresponds with `shelter=no` - - *Bird hide* corresponds with `amenity=shelter&building=yes&shelter=yes` - - *Bird tower hide* corresponds with `building=tower&bird_hide=tower` - - *Bird hide shelter* corresponds with `amenity=shelter|building=yes|shelter=yes` + - *Bird hide* corresponds with `amenity=shelter &building=yes &shelter=yes` + - *Bird tower hide* corresponds with `building=tower &bird_hide=tower` + - *Bird hide shelter* corresponds with `amenity=shelter |building=yes |shelter=yes` - This option cannot be chosen as answer @@ -194,7 +194,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` @@ -216,14 +216,14 @@ This tagrendering has no question and is thus read-only id | question | osmTags ---- | ---------- | --------- -wheelchair.0 | Wheelchair accessible | wheelchair=yes\|wheelchair=designated\|wheelchair=permissive +wheelchair.0 | Wheelchair accessible | wheelchair=yes \|wheelchair=designated \|wheelchair=permissive id | question | osmTags ---- | ---------- | --------- -shelter.0 | Only covered birdhides | shelter=yes\|building~.+&covered!=no +shelter.0 | Only covered birdhides | shelter=yes \|building~.+ &covered!=no This document is autogenerated from [assets/layers/birdhide/birdhide.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/layers/birdhide/birdhide.json) diff --git a/Docs/Layers/cafe_pub.md b/Docs/Layers/cafe_pub.md index 4e78bc008..73ba1090a 100644 --- a/Docs/Layers/cafe_pub.md +++ b/Docs/Layers/cafe_pub.md @@ -5,7 +5,7 @@ - + A layer showing cafés and pubs where one can gather around a drink. The layer asks for some relevant questions @@ -81,7 +81,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -378,7 +378,7 @@ The question is *Is there a fee for internet access?* - *Internet access is free at this place, for customers only* corresponds with `internet_access:fee=customers` -This tagrendering is only visible in the popup if the following condition is met: `internet_access!=no&internet_access~.+` +This tagrendering is only visible in the popup if the following condition is met: `internet_access!=no &internet_access~.+` @@ -467,7 +467,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` @@ -510,7 +510,7 @@ accepts_cards.0 | Accepts payment cards | payment:cards=yes id | question | osmTags ---- | ---------- | --------- -has_internet.0 | Offers internet | internet_access=wlan\|internet_access=yes\|internet_access=wired +has_internet.0 | Offers internet | internet_access=wlan \|internet_access=yes \|internet_access=wired diff --git a/Docs/Layers/car_rental.md b/Docs/Layers/car_rental.md index 178aaeb93..8bfb05b9a 100644 --- a/Docs/Layers/car_rental.md +++ b/Docs/Layers/car_rental.md @@ -5,7 +5,7 @@ - + Places where you can rent a car @@ -59,7 +59,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -216,7 +216,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/caravansites.md b/Docs/Layers/caravansites.md index 0b19a91c4..89267c9d0 100644 --- a/Docs/Layers/caravansites.md +++ b/Docs/Layers/caravansites.md @@ -5,7 +5,7 @@ - + camper sites @@ -15,6 +15,7 @@ camper sites - This layer is shown at zoomlevel **10** and higher + - Not rendered on the map by default. If you want to rendering this on the map, override `mapRenderings` @@ -78,7 +79,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -181,7 +182,7 @@ The question is *Does this place provide internet access?* - *There is internet access* corresponds with `internet_access=yes` - - *There is internet access* corresponds with `internet_access=wifi|internet_access=wlan` + - *There is internet access* corresponds with `internet_access=wifi |internet_access=wlan` - This option cannot be chosen as answer - *There is no internet access* corresponds with `internet_access=no` @@ -313,7 +314,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/charging_station.md b/Docs/Layers/charging_station.md index 100e02f9b..ca6f9ecb6 100644 --- a/Docs/Layers/charging_station.md +++ b/Docs/Layers/charging_station.md @@ -5,7 +5,7 @@ - + A charging station @@ -147,7 +147,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -238,67 +238,67 @@ The question is *Which charging connections are available here?* - *Schuko wall plug without ground pin (CEE7/4 type F)* corresponds with `socket:schuko=1` - Unselecting this answer will add - - *Schuko wall plug without ground pin (CEE7/4 type F)* corresponds with `socket:schuko~.+&socket:schuko!=1` + - *Schuko wall plug without ground pin (CEE7/4 type F)* corresponds with `socket:schuko~.+ &socket:schuko!=1` - This option cannot be chosen as answer - *European wall plug with ground pin (CEE7/4 type E)* corresponds with `socket:typee=1` - Unselecting this answer will add - - *European wall plug with ground pin (CEE7/4 type E)* corresponds with `socket:typee~.+&socket:typee!=1` + - *European wall plug with ground pin (CEE7/4 type E)* corresponds with `socket:typee~.+ &socket:typee!=1` - This option cannot be chosen as answer - *Chademo* corresponds with `socket:chademo=1` - Unselecting this answer will add - - *Chademo* corresponds with `socket:chademo~.+&socket:chademo!=1` + - *Chademo* corresponds with `socket:chademo~.+ &socket:chademo!=1` - This option cannot be chosen as answer - *Type 1 with cable (J1772)* corresponds with `socket:type1_cable=1` - Unselecting this answer will add - - *Type 1 with cable (J1772)* corresponds with `socket:type1_cable~.+&socket:type1_cable!=1` + - *Type 1 with cable (J1772)* corresponds with `socket:type1_cable~.+ &socket:type1_cable!=1` - This option cannot be chosen as answer - *Type 1 without cable (J1772)* corresponds with `socket:type1=1` - Unselecting this answer will add - - *Type 1 without cable (J1772)* corresponds with `socket:type1~.+&socket:type1!=1` + - *Type 1 without cable (J1772)* corresponds with `socket:type1~.+ &socket:type1!=1` - This option cannot be chosen as answer - *Type 1 CCS (aka Type 1 Combo)* corresponds with `socket:type1_combo=1` - Unselecting this answer will add - - *Type 1 CCS (aka Type 1 Combo)* corresponds with `socket:type1_combo~.+&socket:type1_combo!=1` + - *Type 1 CCS (aka Type 1 Combo)* corresponds with `socket:type1_combo~.+ &socket:type1_combo!=1` - This option cannot be chosen as answer - *Tesla Supercharger* corresponds with `socket:tesla_supercharger=1` - Unselecting this answer will add - - *Tesla Supercharger* corresponds with `socket:tesla_supercharger~.+&socket:tesla_supercharger!=1` + - *Tesla Supercharger* corresponds with `socket:tesla_supercharger~.+ &socket:tesla_supercharger!=1` - This option cannot be chosen as answer - *Type 2 (mennekes)* corresponds with `socket:type2=1` - Unselecting this answer will add - - *Type 2 (mennekes)* corresponds with `socket:type2~.+&socket:type2!=1` + - *Type 2 (mennekes)* corresponds with `socket:type2~.+ &socket:type2!=1` - This option cannot be chosen as answer - *Type 2 CCS (mennekes)* corresponds with `socket:type2_combo=1` - Unselecting this answer will add - - *Type 2 CCS (mennekes)* corresponds with `socket:type2_combo~.+&socket:type2_combo!=1` + - *Type 2 CCS (mennekes)* corresponds with `socket:type2_combo~.+ &socket:type2_combo!=1` - This option cannot be chosen as answer - *Type 2 with cable (mennekes)* corresponds with `socket:type2_cable=1` - Unselecting this answer will add - - *Type 2 with cable (mennekes)* corresponds with `socket:type2_cable~.+&socket:type2_cable!=1` + - *Type 2 with cable (mennekes)* corresponds with `socket:type2_cable~.+ &socket:type2_cable!=1` - This option cannot be chosen as answer - *Tesla Supercharger CCS (a branded type2_css)* corresponds with `socket:tesla_supercharger_ccs=1` - Unselecting this answer will add - - *Tesla Supercharger CCS (a branded type2_css)* corresponds with `socket:tesla_supercharger_ccs~.+&socket:tesla_supercharger_ccs!=1` + - *Tesla Supercharger CCS (a branded type2_css)* corresponds with `socket:tesla_supercharger_ccs~.+ &socket:tesla_supercharger_ccs!=1` - This option cannot be chosen as answer - *Tesla Supercharger (destination)* corresponds with `socket:tesla_destination=1` - Unselecting this answer will add - - *Tesla Supercharger (destination)* corresponds with `socket:tesla_destination~.+&socket:tesla_destination!=1&_country=us` + - *Tesla Supercharger (destination)* corresponds with `socket:tesla_destination~.+ &socket:tesla_destination!=1 &_country=us` - This option cannot be chosen as answer - *Tesla supercharger (destination) (A Type 2 with cable branded as tesla)* corresponds with `socket:tesla_destination=1` - Unselecting this answer will add - - *Tesla supercharger (destination) (A Type 2 with cable branded as tesla)* corresponds with `socket:tesla_destination~.+&socket:tesla_destination!=1&_country!=us` + - *Tesla supercharger (destination) (A Type 2 with cable branded as tesla)* corresponds with `socket:tesla_destination~.+ &socket:tesla_destination!=1 &_country!=us` - This option cannot be chosen as answer - *USB to charge phones and small electronics* corresponds with `socket:USB-A=1` - Unselecting this answer will add - - *USB to charge phones and small electronics* corresponds with `socket:USB-A~.+&socket:USB-A!=1` + - *USB to charge phones and small electronics* corresponds with `socket:USB-A~.+ &socket:USB-A!=1` - This option cannot be chosen as answer - *Bosch Active Connect with 3 pins and cable* corresponds with `socket:bosch_3pin=1` - Unselecting this answer will add - - *Bosch Active Connect with 3 pins and cable* corresponds with `socket:bosch_3pin~.+&socket:bosch_3pin!=1` + - *Bosch Active Connect with 3 pins and cable* corresponds with `socket:bosch_3pin~.+ &socket:bosch_3pin!=1` - This option cannot be chosen as answer - *Bosch Active Connect with 5 pins and cable* corresponds with `socket:bosch_5pin=1` - Unselecting this answer will add - - *Bosch Active Connect with 5 pins and cable* corresponds with `socket:bosch_5pin~.+&socket:bosch_5pin!=1` + - *Bosch Active Connect with 5 pins and cable* corresponds with `socket:bosch_5pin~.+ &socket:bosch_5pin!=1` - This option cannot be chosen as answer @@ -316,7 +316,7 @@ This is rendered with `There are {socket:schuko} plugs o -This tagrendering is only visible in the popup if the following condition is met: `socket:schuko~.+&socket:schuko!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:schuko~.+ &socket:schuko!=0` @@ -332,7 +332,7 @@ This is rendered with `There are {socket:typee} plugs of -This tagrendering is only visible in the popup if the following condition is met: `socket:typee~.+&socket:typee!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:typee~.+ &socket:typee!=0` @@ -348,7 +348,7 @@ This is rendered with `There are {socket:chademo} plugs -This tagrendering is only visible in the popup if the following condition is met: `socket:chademo~.+&socket:chademo!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:chademo~.+ &socket:chademo!=0` @@ -364,7 +364,7 @@ This is rendered with `There are {socket:type1_cable} pl -This tagrendering is only visible in the popup if the following condition is met: `socket:type1_cable~.+&socket:type1_cable!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:type1_cable~.+ &socket:type1_cable!=0` @@ -380,7 +380,7 @@ This is rendered with `There are {socket:type1} plugs of -This tagrendering is only visible in the popup if the following condition is met: `socket:type1~.+&socket:type1!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:type1~.+ &socket:type1!=0` @@ -396,7 +396,7 @@ This is rendered with `There are {socket:type1_combo} pl -This tagrendering is only visible in the popup if the following condition is met: `socket:type1_combo~.+&socket:type1_combo!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:type1_combo~.+ &socket:type1_combo!=0` @@ -412,7 +412,7 @@ This is rendered with `There are {socket:tesla_supercharger} -This tagrendering is only visible in the popup if the following condition is met: `socket:tesla_supercharger~.+&socket:tesla_supercharger!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:tesla_supercharger~.+ &socket:tesla_supercharger!=0` @@ -428,7 +428,7 @@ This is rendered with `There are {socket:type2} plugs of -This tagrendering is only visible in the popup if the following condition is met: `socket:type2~.+&socket:type2!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:type2~.+ &socket:type2!=0` @@ -444,7 +444,7 @@ This is rendered with `There are {socket:type2_combo} pl -This tagrendering is only visible in the popup if the following condition is met: `socket:type2_combo~.+&socket:type2_combo!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:type2_combo~.+ &socket:type2_combo!=0` @@ -460,7 +460,7 @@ This is rendered with `There are {socket:type2_cable} pl -This tagrendering is only visible in the popup if the following condition is met: `socket:type2_cable~.+&socket:type2_cable!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:type2_cable~.+ &socket:type2_cable!=0` @@ -476,7 +476,7 @@ This is rendered with `There are {socket:tesla_supercharger_ -This tagrendering is only visible in the popup if the following condition is met: `socket:tesla_supercharger_ccs~.+&socket:tesla_supercharger_ccs!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:tesla_supercharger_ccs~.+ &socket:tesla_supercharger_ccs!=0` @@ -492,7 +492,7 @@ This is rendered with `There are {socket:tesla_destination}< -This tagrendering is only visible in the popup if the following condition is met: `socket:tesla_destination~.+&socket:tesla_destination!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:tesla_destination~.+ &socket:tesla_destination!=0` @@ -508,7 +508,7 @@ This is rendered with `There are {socket:tesla_destination}< -This tagrendering is only visible in the popup if the following condition is met: `socket:tesla_destination~.+&socket:tesla_destination!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:tesla_destination~.+ &socket:tesla_destination!=0` @@ -524,7 +524,7 @@ This is rendered with `There are {socket:USB-A} plugs of -This tagrendering is only visible in the popup if the following condition is met: `socket:USB-A~.+&socket:USB-A!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:USB-A~.+ &socket:USB-A!=0` @@ -540,7 +540,7 @@ This is rendered with `There are {socket:bosch_3pin} plu -This tagrendering is only visible in the popup if the following condition is met: `socket:bosch_3pin~.+&socket:bosch_3pin!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:bosch_3pin~.+ &socket:bosch_3pin!=0` @@ -556,7 +556,7 @@ This is rendered with `There are {socket:bosch_5pin} plu -This tagrendering is only visible in the popup if the following condition is met: `socket:bosch_5pin~.+&socket:bosch_5pin!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:bosch_5pin~.+ &socket:bosch_5pin!=0` @@ -577,7 +577,7 @@ This is rendered with `
Schuko wall plu - *Schuko wall plug without ground pin (CEE7/4 type F) outputs 230 volt* corresponds with `socket:schuko:voltage=230 V` -This tagrendering is only visible in the popup if the following condition is met: `socket:schuko~.+&socket:schuko!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:schuko~.+ &socket:schuko!=0` This tagrendering has labels `technical` @@ -600,7 +600,7 @@ This is rendered with `
Schuko wall plu - *Schuko wall plug without ground pin (CEE7/4 type F) outputs at most 16 A* corresponds with `socket:schuko:current=16 A` -This tagrendering is only visible in the popup if the following condition is met: `socket:schuko~.+&socket:schuko!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:schuko~.+ &socket:schuko!=0` This tagrendering has labels `technical` @@ -623,7 +623,7 @@ This is rendered with `
Schuko wall plu - *Schuko wall plug without ground pin (CEE7/4 type F) outputs at most 3.6 kw A* corresponds with `socket:schuko:output=3.6 kW` -This tagrendering is only visible in the popup if the following condition is met: `socket:schuko~.+&socket:schuko!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:schuko~.+ &socket:schuko!=0` This tagrendering has labels `technical` @@ -646,7 +646,7 @@ This is rendered with `
European wall p - *European wall plug with ground pin (CEE7/4 type E) outputs 230 volt* corresponds with `socket:typee:voltage=230 V` -This tagrendering is only visible in the popup if the following condition is met: `socket:typee~.+&socket:typee!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:typee~.+ &socket:typee!=0` This tagrendering has labels `technical` @@ -669,7 +669,7 @@ This is rendered with `
European wall p - *European wall plug with ground pin (CEE7/4 type E) outputs at most 16 A* corresponds with `socket:typee:current=16 A` -This tagrendering is only visible in the popup if the following condition is met: `socket:typee~.+&socket:typee!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:typee~.+ &socket:typee!=0` This tagrendering has labels `technical` @@ -693,7 +693,7 @@ This is rendered with `
European wall p - *European wall plug with ground pin (CEE7/4 type E) outputs at most 22 kw A* corresponds with `socket:typee:output=22 kW` -This tagrendering is only visible in the popup if the following condition is met: `socket:typee~.+&socket:typee!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:typee~.+ &socket:typee!=0` This tagrendering has labels `technical` @@ -716,7 +716,7 @@ This is rendered with `
Chademo - *Chademo outputs 500 volt* corresponds with `socket:chademo:voltage=500 V` -This tagrendering is only visible in the popup if the following condition is met: `socket:chademo~.+&socket:chademo!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:chademo~.+ &socket:chademo!=0` This tagrendering has labels `technical` @@ -739,7 +739,7 @@ This is rendered with `
Chademo - *Chademo outputs at most 120 A* corresponds with `socket:chademo:current=120 A` -This tagrendering is only visible in the popup if the following condition is met: `socket:chademo~.+&socket:chademo!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:chademo~.+ &socket:chademo!=0` This tagrendering has labels `technical` @@ -762,7 +762,7 @@ This is rendered with `
Chademo - *Chademo outputs at most 50 kw A* corresponds with `socket:chademo:output=50 kW` -This tagrendering is only visible in the popup if the following condition is met: `socket:chademo~.+&socket:chademo!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:chademo~.+ &socket:chademo!=0` This tagrendering has labels `technical` @@ -786,7 +786,7 @@ This is rendered with `
Type 1 with cab - *Type 1 with cable (J1772) outputs 240 volt* corresponds with `socket:type1_cable:voltage=240 V` -This tagrendering is only visible in the popup if the following condition is met: `socket:type1_cable~.+&socket:type1_cable!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:type1_cable~.+ &socket:type1_cable!=0` This tagrendering has labels `technical` @@ -809,7 +809,7 @@ This is rendered with `
Type 1 with cab - *Type 1 with cable (J1772) outputs at most 32 A* corresponds with `socket:type1_cable:current=32 A` -This tagrendering is only visible in the popup if the following condition is met: `socket:type1_cable~.+&socket:type1_cable!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:type1_cable~.+ &socket:type1_cable!=0` This tagrendering has labels `technical` @@ -833,7 +833,7 @@ This is rendered with `
Type 1 with cab - *Type 1 with cable (J1772) outputs at most 7 kw A* corresponds with `socket:type1_cable:output=7 kW` -This tagrendering is only visible in the popup if the following condition is met: `socket:type1_cable~.+&socket:type1_cable!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:type1_cable~.+ &socket:type1_cable!=0` This tagrendering has labels `technical` @@ -857,7 +857,7 @@ This is rendered with `
Type 1 witho - *Type 1 without cable (J1772) outputs 240 volt* corresponds with `socket:type1:voltage=240 V` -This tagrendering is only visible in the popup if the following condition is met: `socket:type1~.+&socket:type1!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:type1~.+ &socket:type1!=0` This tagrendering has labels `technical` @@ -880,7 +880,7 @@ This is rendered with `
Type 1 witho - *Type 1 without cable (J1772) outputs at most 32 A* corresponds with `socket:type1:current=32 A` -This tagrendering is only visible in the popup if the following condition is met: `socket:type1~.+&socket:type1!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:type1~.+ &socket:type1!=0` This tagrendering has labels `technical` @@ -906,7 +906,7 @@ This is rendered with `
Type 1 witho - *Type 1 without cable (J1772) outputs at most 7.2 kw A* corresponds with `socket:type1:output=7.2 kW` -This tagrendering is only visible in the popup if the following condition is met: `socket:type1~.+&socket:type1!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:type1~.+ &socket:type1!=0` This tagrendering has labels `technical` @@ -930,7 +930,7 @@ This is rendered with `
Type 1 CCS - *Type 1 CCS (aka Type 1 Combo) outputs 1000 volt* corresponds with `socket:type1_combo:voltage=1000 V` -This tagrendering is only visible in the popup if the following condition is met: `socket:type1_combo~.+&socket:type1_combo!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:type1_combo~.+ &socket:type1_combo!=0` This tagrendering has labels `technical` @@ -954,7 +954,7 @@ This is rendered with `
Type 1 CCS - *Type 1 CCS (aka Type 1 Combo) outputs at most 125 A* corresponds with `socket:type1_combo:current=125 A` -This tagrendering is only visible in the popup if the following condition is met: `socket:type1_combo~.+&socket:type1_combo!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:type1_combo~.+ &socket:type1_combo!=0` This tagrendering has labels `technical` @@ -980,7 +980,7 @@ This is rendered with `
Type 1 CCS - *Type 1 CCS (aka Type 1 Combo) outputs at most 350 kw A* corresponds with `socket:type1_combo:output=350 kW` -This tagrendering is only visible in the popup if the following condition is met: `socket:type1_combo~.+&socket:type1_combo!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:type1_combo~.+ &socket:type1_combo!=0` This tagrendering has labels `technical` @@ -1003,7 +1003,7 @@ This is rendered with `
Tesla Superchar - *Tesla Supercharger outputs 480 volt* corresponds with `socket:tesla_supercharger:voltage=480 V` -This tagrendering is only visible in the popup if the following condition is met: `socket:tesla_supercharger~.+&socket:tesla_supercharger!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:tesla_supercharger~.+ &socket:tesla_supercharger!=0` This tagrendering has labels `technical` @@ -1027,7 +1027,7 @@ This is rendered with `
Tesla Superchar - *Tesla Supercharger outputs at most 350 A* corresponds with `socket:tesla_supercharger:current=350 A` -This tagrendering is only visible in the popup if the following condition is met: `socket:tesla_supercharger~.+&socket:tesla_supercharger!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:tesla_supercharger~.+ &socket:tesla_supercharger!=0` This tagrendering has labels `technical` @@ -1052,7 +1052,7 @@ This is rendered with `
Tesla Superchar - *Tesla Supercharger outputs at most 250 kw A* corresponds with `socket:tesla_supercharger:output=250 kW` -This tagrendering is only visible in the popup if the following condition is met: `socket:tesla_supercharger~.+&socket:tesla_supercharger!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:tesla_supercharger~.+ &socket:tesla_supercharger!=0` This tagrendering has labels `technical` @@ -1076,7 +1076,7 @@ This is rendered with `
Type 2 (men - *Type 2 (mennekes) outputs 400 volt* corresponds with `socket:type2:voltage=400 V` -This tagrendering is only visible in the popup if the following condition is met: `socket:type2~.+&socket:type2!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:type2~.+ &socket:type2!=0` This tagrendering has labels `technical` @@ -1100,7 +1100,7 @@ This is rendered with `
Type 2 (men - *Type 2 (mennekes) outputs at most 32 A* corresponds with `socket:type2:current=32 A` -This tagrendering is only visible in the popup if the following condition is met: `socket:type2~.+&socket:type2!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:type2~.+ &socket:type2!=0` This tagrendering has labels `technical` @@ -1124,7 +1124,7 @@ This is rendered with `
Type 2 (men - *Type 2 (mennekes) outputs at most 22 kw A* corresponds with `socket:type2:output=22 kW` -This tagrendering is only visible in the popup if the following condition is met: `socket:type2~.+&socket:type2!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:type2~.+ &socket:type2!=0` This tagrendering has labels `technical` @@ -1148,7 +1148,7 @@ This is rendered with `
Type 2 CCS - *Type 2 CCS (mennekes) outputs 920 volt* corresponds with `socket:type2_combo:voltage=920 V` -This tagrendering is only visible in the popup if the following condition is met: `socket:type2_combo~.+&socket:type2_combo!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:type2_combo~.+ &socket:type2_combo!=0` This tagrendering has labels `technical` @@ -1172,7 +1172,7 @@ This is rendered with `
Type 2 CCS - *Type 2 CCS (mennekes) outputs at most 350 A* corresponds with `socket:type2_combo:current=350 A` -This tagrendering is only visible in the popup if the following condition is met: `socket:type2_combo~.+&socket:type2_combo!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:type2_combo~.+ &socket:type2_combo!=0` This tagrendering has labels `technical` @@ -1195,7 +1195,7 @@ This is rendered with `
Type 2 CCS - *Type 2 CCS (mennekes) outputs at most 50 kw A* corresponds with `socket:type2_combo:output=50 kW` -This tagrendering is only visible in the popup if the following condition is met: `socket:type2_combo~.+&socket:type2_combo!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:type2_combo~.+ &socket:type2_combo!=0` This tagrendering has labels `technical` @@ -1219,7 +1219,7 @@ This is rendered with `
Type 2 with cab - *Type 2 with cable (mennekes) outputs 400 volt* corresponds with `socket:type2_cable:voltage=400 V` -This tagrendering is only visible in the popup if the following condition is met: `socket:type2_cable~.+&socket:type2_cable!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:type2_cable~.+ &socket:type2_cable!=0` This tagrendering has labels `technical` @@ -1243,7 +1243,7 @@ This is rendered with `
Type 2 with cab - *Type 2 with cable (mennekes) outputs at most 32 A* corresponds with `socket:type2_cable:current=32 A` -This tagrendering is only visible in the popup if the following condition is met: `socket:type2_cable~.+&socket:type2_cable!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:type2_cable~.+ &socket:type2_cable!=0` This tagrendering has labels `technical` @@ -1267,7 +1267,7 @@ This is rendered with `
Type 2 with cab - *Type 2 with cable (mennekes) outputs at most 22 kw A* corresponds with `socket:type2_cable:output=22 kW` -This tagrendering is only visible in the popup if the following condition is met: `socket:type2_cable~.+&socket:type2_cable!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:type2_cable~.+ &socket:type2_cable!=0` This tagrendering has labels `technical` @@ -1291,7 +1291,7 @@ This is rendered with `
Tesla Superchar - *Tesla Supercharger CCS (a branded Type 2 CSS) outputs 920 volt* corresponds with `socket:tesla_supercharger_ccs:voltage=920 V` -This tagrendering is only visible in the popup if the following condition is met: `socket:tesla_supercharger_ccs~.+&socket:tesla_supercharger_ccs!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:tesla_supercharger_ccs~.+ &socket:tesla_supercharger_ccs!=0` This tagrendering has labels `technical` @@ -1315,7 +1315,7 @@ This is rendered with `
Tesla Superchar - *Tesla Supercharger CCS (a branded type2_css) outputs at most 350 A* corresponds with `socket:tesla_supercharger_ccs:current=350 A` -This tagrendering is only visible in the popup if the following condition is met: `socket:tesla_supercharger_ccs~.+&socket:tesla_supercharger_ccs!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:tesla_supercharger_ccs~.+ &socket:tesla_supercharger_ccs!=0` This tagrendering has labels `technical` @@ -1338,7 +1338,7 @@ This is rendered with `
Tesla Superchar - *Tesla Supercharger CCS (a branded Type 2 CSS) outputs at most 50 kw A* corresponds with `socket:tesla_supercharger_ccs:output=50 kW` -This tagrendering is only visible in the popup if the following condition is met: `socket:tesla_supercharger_ccs~.+&socket:tesla_supercharger_ccs!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:tesla_supercharger_ccs~.+ &socket:tesla_supercharger_ccs!=0` This tagrendering has labels `technical` @@ -1361,7 +1361,7 @@ This is rendered with `
Tesla Superchar - *Tesla Supercharger (Destination) outputs 480 volt* corresponds with `socket:tesla_destination:voltage=480 V` -This tagrendering is only visible in the popup if the following condition is met: `socket:tesla_destination~.+&socket:tesla_destination!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:tesla_destination~.+ &socket:tesla_destination!=0` This tagrendering has labels `technical` @@ -1385,7 +1385,7 @@ This is rendered with `
Tesla Superchar - *Tesla Supercharger (Destination) outputs at most 350 A* corresponds with `socket:tesla_destination:current=350 A` -This tagrendering is only visible in the popup if the following condition is met: `socket:tesla_destination~.+&socket:tesla_destination!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:tesla_destination~.+ &socket:tesla_destination!=0` This tagrendering has labels `technical` @@ -1410,7 +1410,7 @@ This is rendered with `
Tesla Superchar - *Tesla Supercharger (Destination) outputs at most 250 kw A* corresponds with `socket:tesla_destination:output=250 kW` -This tagrendering is only visible in the popup if the following condition is met: `socket:tesla_destination~.+&socket:tesla_destination!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:tesla_destination~.+ &socket:tesla_destination!=0` This tagrendering has labels `technical` @@ -1434,7 +1434,7 @@ This is rendered with `
Tesla superchar - *Tesla Supercharger (Destination) (A Type 2 with cable branded as Tesla) outputs 400 volt* corresponds with `socket:tesla_destination:voltage=400 V` -This tagrendering is only visible in the popup if the following condition is met: `socket:tesla_destination~.+&socket:tesla_destination!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:tesla_destination~.+ &socket:tesla_destination!=0` This tagrendering has labels `technical` @@ -1458,7 +1458,7 @@ This is rendered with `
Tesla Superchar - *Tesla Supercharger (Destination) (A Type 2 with cable branded as Tesla) outputs at most 32 A* corresponds with `socket:tesla_destination:current=32 A` -This tagrendering is only visible in the popup if the following condition is met: `socket:tesla_destination~.+&socket:tesla_destination!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:tesla_destination~.+ &socket:tesla_destination!=0` This tagrendering has labels `technical` @@ -1482,7 +1482,7 @@ This is rendered with `
Tesla Superchar - *Tesla Supercharger (Destination) (A Type 2 with cable branded as Tesla) outputs at most 22 kw A* corresponds with `socket:tesla_destination:output=22 kW` -This tagrendering is only visible in the popup if the following condition is met: `socket:tesla_destination~.+&socket:tesla_destination!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:tesla_destination~.+ &socket:tesla_destination!=0` This tagrendering has labels `technical` @@ -1505,7 +1505,7 @@ This is rendered with `
USB to char - *USB to charge phones and small electronics outputs 5 volt* corresponds with `socket:USB-A:voltage=5 V` -This tagrendering is only visible in the popup if the following condition is met: `socket:USB-A~.+&socket:USB-A!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:USB-A~.+ &socket:USB-A!=0` This tagrendering has labels `technical` @@ -1529,7 +1529,7 @@ This is rendered with `
USB to char - *USB to charge phones and small electronics outputs at most 2 A* corresponds with `socket:USB-A:current=2 A` -This tagrendering is only visible in the popup if the following condition is met: `socket:USB-A~.+&socket:USB-A!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:USB-A~.+ &socket:USB-A!=0` This tagrendering has labels `technical` @@ -1553,7 +1553,7 @@ This is rendered with `
USB to char - *USB to charge phones and small electronics outputs at most 10w A* corresponds with `socket:USB-A:output=10W` -This tagrendering is only visible in the popup if the following condition is met: `socket:USB-A~.+&socket:USB-A!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:USB-A~.+ &socket:USB-A!=0` This tagrendering has labels `technical` @@ -1576,7 +1576,7 @@ This is rendered with `
Bosch Active Co -This tagrendering is only visible in the popup if the following condition is met: `socket:bosch_3pin~.+&socket:bosch_3pin!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:bosch_3pin~.+ &socket:bosch_3pin!=0` This tagrendering has labels `technical` @@ -1599,7 +1599,7 @@ This is rendered with `
Bosch Active Co -This tagrendering is only visible in the popup if the following condition is met: `socket:bosch_3pin~.+&socket:bosch_3pin!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:bosch_3pin~.+ &socket:bosch_3pin!=0` This tagrendering has labels `technical` @@ -1622,7 +1622,7 @@ This is rendered with `
Bosch Active Co -This tagrendering is only visible in the popup if the following condition is met: `socket:bosch_3pin~.+&socket:bosch_3pin!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:bosch_3pin~.+ &socket:bosch_3pin!=0` This tagrendering has labels `technical` @@ -1645,7 +1645,7 @@ This is rendered with `
Bosch Active Co -This tagrendering is only visible in the popup if the following condition is met: `socket:bosch_5pin~.+&socket:bosch_5pin!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:bosch_5pin~.+ &socket:bosch_5pin!=0` This tagrendering has labels `technical` @@ -1668,7 +1668,7 @@ This is rendered with `
Bosch Active Co -This tagrendering is only visible in the popup if the following condition is met: `socket:bosch_5pin~.+&socket:bosch_5pin!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:bosch_5pin~.+ &socket:bosch_5pin!=0` This tagrendering has labels `technical` @@ -1691,7 +1691,7 @@ This is rendered with `
Bosch Active Co -This tagrendering is only visible in the popup if the following condition is met: `socket:bosch_5pin~.+&socket:bosch_5pin!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:bosch_5pin~.+ &socket:bosch_5pin!=0` This tagrendering has labels `technical` @@ -1726,11 +1726,11 @@ The question is *Does one have to pay to use this charging station?* - - *Free to use (without authenticating)* corresponds with `fee=no&authentication:none=yes` - - *Free to use, but one has to authenticate* corresponds with `fee=no&authentication:none=no` + - *Free to use (without authenticating)* corresponds with `fee=no &authentication:none=yes` + - *Free to use, but one has to authenticate* corresponds with `fee=no &authentication:none=no` - *Free to use* corresponds with `fee=no` - This option cannot be chosen as answer - - *Paid use, but free for customers of the hotel/pub/hospital/… who operates the charging station* corresponds with `fee=yes&fee:conditional=no @ customers` + - *Paid use, but free for customers of the hotel/pub/hospital/… who operates the charging station* corresponds with `fee=yes &fee:conditional=no @ customers` - *Paid use* corresponds with `fee=yes` @@ -1774,7 +1774,7 @@ The question is *Which methods of payment are accepted here?* - Unselecting this answer will add payment:membership_card=no -This tagrendering is only visible in the popup if the following condition is met: `fee=yes|charge~.+` +This tagrendering is only visible in the popup if the following condition is met: `fee=yes |charge~.+` @@ -1820,7 +1820,7 @@ This is rendered with `Authenticate by calling or SMS'ing to + A charging station @@ -145,7 +145,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -236,67 +236,67 @@ The question is *Which charging connections are available here?* - *Schuko wall plug without ground pin (CEE7/4 type F)* corresponds with `socket:schuko=1` - Unselecting this answer will add - - *Schuko wall plug without ground pin (CEE7/4 type F)* corresponds with `socket:schuko~.+&socket:schuko!=1` + - *Schuko wall plug without ground pin (CEE7/4 type F)* corresponds with `socket:schuko~.+ &socket:schuko!=1` - This option cannot be chosen as answer - *European wall plug with ground pin (CEE7/4 type E)* corresponds with `socket:typee=1` - Unselecting this answer will add - - *European wall plug with ground pin (CEE7/4 type E)* corresponds with `socket:typee~.+&socket:typee!=1` + - *European wall plug with ground pin (CEE7/4 type E)* corresponds with `socket:typee~.+ &socket:typee!=1` - This option cannot be chosen as answer - *Chademo* corresponds with `socket:chademo=1` - Unselecting this answer will add - - *Chademo* corresponds with `socket:chademo~.+&socket:chademo!=1` + - *Chademo* corresponds with `socket:chademo~.+ &socket:chademo!=1` - This option cannot be chosen as answer - *Type 1 with cable (J1772)* corresponds with `socket:type1_cable=1` - Unselecting this answer will add - - *Type 1 with cable (J1772)* corresponds with `socket:type1_cable~.+&socket:type1_cable!=1` + - *Type 1 with cable (J1772)* corresponds with `socket:type1_cable~.+ &socket:type1_cable!=1` - This option cannot be chosen as answer - *Type 1 without cable (J1772)* corresponds with `socket:type1=1` - Unselecting this answer will add - - *Type 1 without cable (J1772)* corresponds with `socket:type1~.+&socket:type1!=1` + - *Type 1 without cable (J1772)* corresponds with `socket:type1~.+ &socket:type1!=1` - This option cannot be chosen as answer - *Type 1 CCS (aka Type 1 Combo)* corresponds with `socket:type1_combo=1` - Unselecting this answer will add - - *Type 1 CCS (aka Type 1 Combo)* corresponds with `socket:type1_combo~.+&socket:type1_combo!=1` + - *Type 1 CCS (aka Type 1 Combo)* corresponds with `socket:type1_combo~.+ &socket:type1_combo!=1` - This option cannot be chosen as answer - *Tesla Supercharger* corresponds with `socket:tesla_supercharger=1` - Unselecting this answer will add - - *Tesla Supercharger* corresponds with `socket:tesla_supercharger~.+&socket:tesla_supercharger!=1` + - *Tesla Supercharger* corresponds with `socket:tesla_supercharger~.+ &socket:tesla_supercharger!=1` - This option cannot be chosen as answer - *Type 2 (mennekes)* corresponds with `socket:type2=1` - Unselecting this answer will add - - *Type 2 (mennekes)* corresponds with `socket:type2~.+&socket:type2!=1` + - *Type 2 (mennekes)* corresponds with `socket:type2~.+ &socket:type2!=1` - This option cannot be chosen as answer - *Type 2 CCS (mennekes)* corresponds with `socket:type2_combo=1` - Unselecting this answer will add - - *Type 2 CCS (mennekes)* corresponds with `socket:type2_combo~.+&socket:type2_combo!=1` + - *Type 2 CCS (mennekes)* corresponds with `socket:type2_combo~.+ &socket:type2_combo!=1` - This option cannot be chosen as answer - *Type 2 with cable (mennekes)* corresponds with `socket:type2_cable=1` - Unselecting this answer will add - - *Type 2 with cable (mennekes)* corresponds with `socket:type2_cable~.+&socket:type2_cable!=1` + - *Type 2 with cable (mennekes)* corresponds with `socket:type2_cable~.+ &socket:type2_cable!=1` - This option cannot be chosen as answer - *Tesla Supercharger CCS (a branded type2_css)* corresponds with `socket:tesla_supercharger_ccs=1` - Unselecting this answer will add - - *Tesla Supercharger CCS (a branded type2_css)* corresponds with `socket:tesla_supercharger_ccs~.+&socket:tesla_supercharger_ccs!=1` + - *Tesla Supercharger CCS (a branded type2_css)* corresponds with `socket:tesla_supercharger_ccs~.+ &socket:tesla_supercharger_ccs!=1` - This option cannot be chosen as answer - *Tesla Supercharger (destination)* corresponds with `socket:tesla_destination=1` - Unselecting this answer will add - - *Tesla Supercharger (destination)* corresponds with `socket:tesla_destination~.+&socket:tesla_destination!=1&_country=us` + - *Tesla Supercharger (destination)* corresponds with `socket:tesla_destination~.+ &socket:tesla_destination!=1 &_country=us` - This option cannot be chosen as answer - *Tesla supercharger (destination) (A Type 2 with cable branded as tesla)* corresponds with `socket:tesla_destination=1` - Unselecting this answer will add - - *Tesla supercharger (destination) (A Type 2 with cable branded as tesla)* corresponds with `socket:tesla_destination~.+&socket:tesla_destination!=1&_country!=us` + - *Tesla supercharger (destination) (A Type 2 with cable branded as tesla)* corresponds with `socket:tesla_destination~.+ &socket:tesla_destination!=1 &_country!=us` - This option cannot be chosen as answer - *USB to charge phones and small electronics* corresponds with `socket:USB-A=1` - Unselecting this answer will add - - *USB to charge phones and small electronics* corresponds with `socket:USB-A~.+&socket:USB-A!=1` + - *USB to charge phones and small electronics* corresponds with `socket:USB-A~.+ &socket:USB-A!=1` - This option cannot be chosen as answer - *Bosch Active Connect with 3 pins and cable* corresponds with `socket:bosch_3pin=1` - Unselecting this answer will add - - *Bosch Active Connect with 3 pins and cable* corresponds with `socket:bosch_3pin~.+&socket:bosch_3pin!=1` + - *Bosch Active Connect with 3 pins and cable* corresponds with `socket:bosch_3pin~.+ &socket:bosch_3pin!=1` - This option cannot be chosen as answer - *Bosch Active Connect with 5 pins and cable* corresponds with `socket:bosch_5pin=1` - Unselecting this answer will add - - *Bosch Active Connect with 5 pins and cable* corresponds with `socket:bosch_5pin~.+&socket:bosch_5pin!=1` + - *Bosch Active Connect with 5 pins and cable* corresponds with `socket:bosch_5pin~.+ &socket:bosch_5pin!=1` - This option cannot be chosen as answer @@ -314,7 +314,7 @@ This is rendered with `There are {socket:schuko} plugs o -This tagrendering is only visible in the popup if the following condition is met: `socket:schuko~.+&socket:schuko!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:schuko~.+ &socket:schuko!=0` @@ -330,7 +330,7 @@ This is rendered with `There are {socket:typee} plugs of -This tagrendering is only visible in the popup if the following condition is met: `socket:typee~.+&socket:typee!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:typee~.+ &socket:typee!=0` @@ -346,7 +346,7 @@ This is rendered with `There are {socket:chademo} plugs -This tagrendering is only visible in the popup if the following condition is met: `socket:chademo~.+&socket:chademo!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:chademo~.+ &socket:chademo!=0` @@ -362,7 +362,7 @@ This is rendered with `There are {socket:type1_cable} pl -This tagrendering is only visible in the popup if the following condition is met: `socket:type1_cable~.+&socket:type1_cable!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:type1_cable~.+ &socket:type1_cable!=0` @@ -378,7 +378,7 @@ This is rendered with `There are {socket:type1} plugs of -This tagrendering is only visible in the popup if the following condition is met: `socket:type1~.+&socket:type1!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:type1~.+ &socket:type1!=0` @@ -394,7 +394,7 @@ This is rendered with `There are {socket:type1_combo} pl -This tagrendering is only visible in the popup if the following condition is met: `socket:type1_combo~.+&socket:type1_combo!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:type1_combo~.+ &socket:type1_combo!=0` @@ -410,7 +410,7 @@ This is rendered with `There are {socket:tesla_supercharger} -This tagrendering is only visible in the popup if the following condition is met: `socket:tesla_supercharger~.+&socket:tesla_supercharger!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:tesla_supercharger~.+ &socket:tesla_supercharger!=0` @@ -426,7 +426,7 @@ This is rendered with `There are {socket:type2} plugs of -This tagrendering is only visible in the popup if the following condition is met: `socket:type2~.+&socket:type2!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:type2~.+ &socket:type2!=0` @@ -442,7 +442,7 @@ This is rendered with `There are {socket:type2_combo} pl -This tagrendering is only visible in the popup if the following condition is met: `socket:type2_combo~.+&socket:type2_combo!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:type2_combo~.+ &socket:type2_combo!=0` @@ -458,7 +458,7 @@ This is rendered with `There are {socket:type2_cable} pl -This tagrendering is only visible in the popup if the following condition is met: `socket:type2_cable~.+&socket:type2_cable!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:type2_cable~.+ &socket:type2_cable!=0` @@ -474,7 +474,7 @@ This is rendered with `There are {socket:tesla_supercharger_ -This tagrendering is only visible in the popup if the following condition is met: `socket:tesla_supercharger_ccs~.+&socket:tesla_supercharger_ccs!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:tesla_supercharger_ccs~.+ &socket:tesla_supercharger_ccs!=0` @@ -490,7 +490,7 @@ This is rendered with `There are {socket:tesla_destination}< -This tagrendering is only visible in the popup if the following condition is met: `socket:tesla_destination~.+&socket:tesla_destination!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:tesla_destination~.+ &socket:tesla_destination!=0` @@ -506,7 +506,7 @@ This is rendered with `There are {socket:tesla_destination}< -This tagrendering is only visible in the popup if the following condition is met: `socket:tesla_destination~.+&socket:tesla_destination!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:tesla_destination~.+ &socket:tesla_destination!=0` @@ -522,7 +522,7 @@ This is rendered with `There are {socket:USB-A} plugs of -This tagrendering is only visible in the popup if the following condition is met: `socket:USB-A~.+&socket:USB-A!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:USB-A~.+ &socket:USB-A!=0` @@ -538,7 +538,7 @@ This is rendered with `There are {socket:bosch_3pin} plu -This tagrendering is only visible in the popup if the following condition is met: `socket:bosch_3pin~.+&socket:bosch_3pin!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:bosch_3pin~.+ &socket:bosch_3pin!=0` @@ -554,7 +554,7 @@ This is rendered with `There are {socket:bosch_5pin} plu -This tagrendering is only visible in the popup if the following condition is met: `socket:bosch_5pin~.+&socket:bosch_5pin!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:bosch_5pin~.+ &socket:bosch_5pin!=0` @@ -575,7 +575,7 @@ This is rendered with `
Schuko wall plu - *Schuko wall plug without ground pin (CEE7/4 type F) outputs 230 volt* corresponds with `socket:schuko:voltage=230 V` -This tagrendering is only visible in the popup if the following condition is met: `socket:schuko~.+&socket:schuko!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:schuko~.+ &socket:schuko!=0` This tagrendering has labels `technical` @@ -598,7 +598,7 @@ This is rendered with `
Schuko wall plu - *Schuko wall plug without ground pin (CEE7/4 type F) outputs at most 16 A* corresponds with `socket:schuko:current=16 A` -This tagrendering is only visible in the popup if the following condition is met: `socket:schuko~.+&socket:schuko!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:schuko~.+ &socket:schuko!=0` This tagrendering has labels `technical` @@ -621,7 +621,7 @@ This is rendered with `
Schuko wall plu - *Schuko wall plug without ground pin (CEE7/4 type F) outputs at most 3.6 kw A* corresponds with `socket:schuko:output=3.6 kW` -This tagrendering is only visible in the popup if the following condition is met: `socket:schuko~.+&socket:schuko!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:schuko~.+ &socket:schuko!=0` This tagrendering has labels `technical` @@ -644,7 +644,7 @@ This is rendered with `
European wall p - *European wall plug with ground pin (CEE7/4 type E) outputs 230 volt* corresponds with `socket:typee:voltage=230 V` -This tagrendering is only visible in the popup if the following condition is met: `socket:typee~.+&socket:typee!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:typee~.+ &socket:typee!=0` This tagrendering has labels `technical` @@ -667,7 +667,7 @@ This is rendered with `
European wall p - *European wall plug with ground pin (CEE7/4 type E) outputs at most 16 A* corresponds with `socket:typee:current=16 A` -This tagrendering is only visible in the popup if the following condition is met: `socket:typee~.+&socket:typee!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:typee~.+ &socket:typee!=0` This tagrendering has labels `technical` @@ -691,7 +691,7 @@ This is rendered with `
European wall p - *European wall plug with ground pin (CEE7/4 type E) outputs at most 22 kw A* corresponds with `socket:typee:output=22 kW` -This tagrendering is only visible in the popup if the following condition is met: `socket:typee~.+&socket:typee!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:typee~.+ &socket:typee!=0` This tagrendering has labels `technical` @@ -714,7 +714,7 @@ This is rendered with `
Chademo - *Chademo outputs 500 volt* corresponds with `socket:chademo:voltage=500 V` -This tagrendering is only visible in the popup if the following condition is met: `socket:chademo~.+&socket:chademo!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:chademo~.+ &socket:chademo!=0` This tagrendering has labels `technical` @@ -737,7 +737,7 @@ This is rendered with `
Chademo - *Chademo outputs at most 120 A* corresponds with `socket:chademo:current=120 A` -This tagrendering is only visible in the popup if the following condition is met: `socket:chademo~.+&socket:chademo!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:chademo~.+ &socket:chademo!=0` This tagrendering has labels `technical` @@ -760,7 +760,7 @@ This is rendered with `
Chademo - *Chademo outputs at most 50 kw A* corresponds with `socket:chademo:output=50 kW` -This tagrendering is only visible in the popup if the following condition is met: `socket:chademo~.+&socket:chademo!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:chademo~.+ &socket:chademo!=0` This tagrendering has labels `technical` @@ -784,7 +784,7 @@ This is rendered with `
Type 1 with cab - *Type 1 with cable (J1772) outputs 240 volt* corresponds with `socket:type1_cable:voltage=240 V` -This tagrendering is only visible in the popup if the following condition is met: `socket:type1_cable~.+&socket:type1_cable!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:type1_cable~.+ &socket:type1_cable!=0` This tagrendering has labels `technical` @@ -807,7 +807,7 @@ This is rendered with `
Type 1 with cab - *Type 1 with cable (J1772) outputs at most 32 A* corresponds with `socket:type1_cable:current=32 A` -This tagrendering is only visible in the popup if the following condition is met: `socket:type1_cable~.+&socket:type1_cable!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:type1_cable~.+ &socket:type1_cable!=0` This tagrendering has labels `technical` @@ -831,7 +831,7 @@ This is rendered with `
Type 1 with cab - *Type 1 with cable (J1772) outputs at most 7 kw A* corresponds with `socket:type1_cable:output=7 kW` -This tagrendering is only visible in the popup if the following condition is met: `socket:type1_cable~.+&socket:type1_cable!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:type1_cable~.+ &socket:type1_cable!=0` This tagrendering has labels `technical` @@ -855,7 +855,7 @@ This is rendered with `
Type 1 witho - *Type 1 without cable (J1772) outputs 240 volt* corresponds with `socket:type1:voltage=240 V` -This tagrendering is only visible in the popup if the following condition is met: `socket:type1~.+&socket:type1!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:type1~.+ &socket:type1!=0` This tagrendering has labels `technical` @@ -878,7 +878,7 @@ This is rendered with `
Type 1 witho - *Type 1 without cable (J1772) outputs at most 32 A* corresponds with `socket:type1:current=32 A` -This tagrendering is only visible in the popup if the following condition is met: `socket:type1~.+&socket:type1!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:type1~.+ &socket:type1!=0` This tagrendering has labels `technical` @@ -904,7 +904,7 @@ This is rendered with `
Type 1 witho - *Type 1 without cable (J1772) outputs at most 7.2 kw A* corresponds with `socket:type1:output=7.2 kW` -This tagrendering is only visible in the popup if the following condition is met: `socket:type1~.+&socket:type1!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:type1~.+ &socket:type1!=0` This tagrendering has labels `technical` @@ -928,7 +928,7 @@ This is rendered with `
Type 1 CCS - *Type 1 CCS (aka Type 1 Combo) outputs 1000 volt* corresponds with `socket:type1_combo:voltage=1000 V` -This tagrendering is only visible in the popup if the following condition is met: `socket:type1_combo~.+&socket:type1_combo!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:type1_combo~.+ &socket:type1_combo!=0` This tagrendering has labels `technical` @@ -952,7 +952,7 @@ This is rendered with `
Type 1 CCS - *Type 1 CCS (aka Type 1 Combo) outputs at most 125 A* corresponds with `socket:type1_combo:current=125 A` -This tagrendering is only visible in the popup if the following condition is met: `socket:type1_combo~.+&socket:type1_combo!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:type1_combo~.+ &socket:type1_combo!=0` This tagrendering has labels `technical` @@ -978,7 +978,7 @@ This is rendered with `
Type 1 CCS - *Type 1 CCS (aka Type 1 Combo) outputs at most 350 kw A* corresponds with `socket:type1_combo:output=350 kW` -This tagrendering is only visible in the popup if the following condition is met: `socket:type1_combo~.+&socket:type1_combo!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:type1_combo~.+ &socket:type1_combo!=0` This tagrendering has labels `technical` @@ -1001,7 +1001,7 @@ This is rendered with `
Tesla Superchar - *Tesla Supercharger outputs 480 volt* corresponds with `socket:tesla_supercharger:voltage=480 V` -This tagrendering is only visible in the popup if the following condition is met: `socket:tesla_supercharger~.+&socket:tesla_supercharger!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:tesla_supercharger~.+ &socket:tesla_supercharger!=0` This tagrendering has labels `technical` @@ -1025,7 +1025,7 @@ This is rendered with `
Tesla Superchar - *Tesla Supercharger outputs at most 350 A* corresponds with `socket:tesla_supercharger:current=350 A` -This tagrendering is only visible in the popup if the following condition is met: `socket:tesla_supercharger~.+&socket:tesla_supercharger!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:tesla_supercharger~.+ &socket:tesla_supercharger!=0` This tagrendering has labels `technical` @@ -1050,7 +1050,7 @@ This is rendered with `
Tesla Superchar - *Tesla Supercharger outputs at most 250 kw A* corresponds with `socket:tesla_supercharger:output=250 kW` -This tagrendering is only visible in the popup if the following condition is met: `socket:tesla_supercharger~.+&socket:tesla_supercharger!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:tesla_supercharger~.+ &socket:tesla_supercharger!=0` This tagrendering has labels `technical` @@ -1074,7 +1074,7 @@ This is rendered with `
Type 2 (men - *Type 2 (mennekes) outputs 400 volt* corresponds with `socket:type2:voltage=400 V` -This tagrendering is only visible in the popup if the following condition is met: `socket:type2~.+&socket:type2!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:type2~.+ &socket:type2!=0` This tagrendering has labels `technical` @@ -1098,7 +1098,7 @@ This is rendered with `
Type 2 (men - *Type 2 (mennekes) outputs at most 32 A* corresponds with `socket:type2:current=32 A` -This tagrendering is only visible in the popup if the following condition is met: `socket:type2~.+&socket:type2!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:type2~.+ &socket:type2!=0` This tagrendering has labels `technical` @@ -1122,7 +1122,7 @@ This is rendered with `
Type 2 (men - *Type 2 (mennekes) outputs at most 22 kw A* corresponds with `socket:type2:output=22 kW` -This tagrendering is only visible in the popup if the following condition is met: `socket:type2~.+&socket:type2!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:type2~.+ &socket:type2!=0` This tagrendering has labels `technical` @@ -1146,7 +1146,7 @@ This is rendered with `
Type 2 CCS - *Type 2 CCS (mennekes) outputs 920 volt* corresponds with `socket:type2_combo:voltage=920 V` -This tagrendering is only visible in the popup if the following condition is met: `socket:type2_combo~.+&socket:type2_combo!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:type2_combo~.+ &socket:type2_combo!=0` This tagrendering has labels `technical` @@ -1170,7 +1170,7 @@ This is rendered with `
Type 2 CCS - *Type 2 CCS (mennekes) outputs at most 350 A* corresponds with `socket:type2_combo:current=350 A` -This tagrendering is only visible in the popup if the following condition is met: `socket:type2_combo~.+&socket:type2_combo!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:type2_combo~.+ &socket:type2_combo!=0` This tagrendering has labels `technical` @@ -1193,7 +1193,7 @@ This is rendered with `
Type 2 CCS - *Type 2 CCS (mennekes) outputs at most 50 kw A* corresponds with `socket:type2_combo:output=50 kW` -This tagrendering is only visible in the popup if the following condition is met: `socket:type2_combo~.+&socket:type2_combo!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:type2_combo~.+ &socket:type2_combo!=0` This tagrendering has labels `technical` @@ -1217,7 +1217,7 @@ This is rendered with `
Type 2 with cab - *Type 2 with cable (mennekes) outputs 400 volt* corresponds with `socket:type2_cable:voltage=400 V` -This tagrendering is only visible in the popup if the following condition is met: `socket:type2_cable~.+&socket:type2_cable!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:type2_cable~.+ &socket:type2_cable!=0` This tagrendering has labels `technical` @@ -1241,7 +1241,7 @@ This is rendered with `
Type 2 with cab - *Type 2 with cable (mennekes) outputs at most 32 A* corresponds with `socket:type2_cable:current=32 A` -This tagrendering is only visible in the popup if the following condition is met: `socket:type2_cable~.+&socket:type2_cable!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:type2_cable~.+ &socket:type2_cable!=0` This tagrendering has labels `technical` @@ -1265,7 +1265,7 @@ This is rendered with `
Type 2 with cab - *Type 2 with cable (mennekes) outputs at most 22 kw A* corresponds with `socket:type2_cable:output=22 kW` -This tagrendering is only visible in the popup if the following condition is met: `socket:type2_cable~.+&socket:type2_cable!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:type2_cable~.+ &socket:type2_cable!=0` This tagrendering has labels `technical` @@ -1289,7 +1289,7 @@ This is rendered with `
Tesla Superchar - *Tesla Supercharger CCS (a branded Type 2 CSS) outputs 920 volt* corresponds with `socket:tesla_supercharger_ccs:voltage=920 V` -This tagrendering is only visible in the popup if the following condition is met: `socket:tesla_supercharger_ccs~.+&socket:tesla_supercharger_ccs!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:tesla_supercharger_ccs~.+ &socket:tesla_supercharger_ccs!=0` This tagrendering has labels `technical` @@ -1313,7 +1313,7 @@ This is rendered with `
Tesla Superchar - *Tesla Supercharger CCS (a branded type2_css) outputs at most 350 A* corresponds with `socket:tesla_supercharger_ccs:current=350 A` -This tagrendering is only visible in the popup if the following condition is met: `socket:tesla_supercharger_ccs~.+&socket:tesla_supercharger_ccs!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:tesla_supercharger_ccs~.+ &socket:tesla_supercharger_ccs!=0` This tagrendering has labels `technical` @@ -1336,7 +1336,7 @@ This is rendered with `
Tesla Superchar - *Tesla Supercharger CCS (a branded Type 2 CSS) outputs at most 50 kw A* corresponds with `socket:tesla_supercharger_ccs:output=50 kW` -This tagrendering is only visible in the popup if the following condition is met: `socket:tesla_supercharger_ccs~.+&socket:tesla_supercharger_ccs!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:tesla_supercharger_ccs~.+ &socket:tesla_supercharger_ccs!=0` This tagrendering has labels `technical` @@ -1359,7 +1359,7 @@ This is rendered with `
Tesla Superchar - *Tesla Supercharger (Destination) outputs 480 volt* corresponds with `socket:tesla_destination:voltage=480 V` -This tagrendering is only visible in the popup if the following condition is met: `socket:tesla_destination~.+&socket:tesla_destination!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:tesla_destination~.+ &socket:tesla_destination!=0` This tagrendering has labels `technical` @@ -1383,7 +1383,7 @@ This is rendered with `
Tesla Superchar - *Tesla Supercharger (Destination) outputs at most 350 A* corresponds with `socket:tesla_destination:current=350 A` -This tagrendering is only visible in the popup if the following condition is met: `socket:tesla_destination~.+&socket:tesla_destination!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:tesla_destination~.+ &socket:tesla_destination!=0` This tagrendering has labels `technical` @@ -1408,7 +1408,7 @@ This is rendered with `
Tesla Superchar - *Tesla Supercharger (Destination) outputs at most 250 kw A* corresponds with `socket:tesla_destination:output=250 kW` -This tagrendering is only visible in the popup if the following condition is met: `socket:tesla_destination~.+&socket:tesla_destination!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:tesla_destination~.+ &socket:tesla_destination!=0` This tagrendering has labels `technical` @@ -1432,7 +1432,7 @@ This is rendered with `
Tesla superchar - *Tesla Supercharger (Destination) (A Type 2 with cable branded as Tesla) outputs 400 volt* corresponds with `socket:tesla_destination:voltage=400 V` -This tagrendering is only visible in the popup if the following condition is met: `socket:tesla_destination~.+&socket:tesla_destination!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:tesla_destination~.+ &socket:tesla_destination!=0` This tagrendering has labels `technical` @@ -1456,7 +1456,7 @@ This is rendered with `
Tesla Superchar - *Tesla Supercharger (Destination) (A Type 2 with cable branded as Tesla) outputs at most 32 A* corresponds with `socket:tesla_destination:current=32 A` -This tagrendering is only visible in the popup if the following condition is met: `socket:tesla_destination~.+&socket:tesla_destination!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:tesla_destination~.+ &socket:tesla_destination!=0` This tagrendering has labels `technical` @@ -1480,7 +1480,7 @@ This is rendered with `
Tesla Superchar - *Tesla Supercharger (Destination) (A Type 2 with cable branded as Tesla) outputs at most 22 kw A* corresponds with `socket:tesla_destination:output=22 kW` -This tagrendering is only visible in the popup if the following condition is met: `socket:tesla_destination~.+&socket:tesla_destination!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:tesla_destination~.+ &socket:tesla_destination!=0` This tagrendering has labels `technical` @@ -1503,7 +1503,7 @@ This is rendered with `
USB to char - *USB to charge phones and small electronics outputs 5 volt* corresponds with `socket:USB-A:voltage=5 V` -This tagrendering is only visible in the popup if the following condition is met: `socket:USB-A~.+&socket:USB-A!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:USB-A~.+ &socket:USB-A!=0` This tagrendering has labels `technical` @@ -1527,7 +1527,7 @@ This is rendered with `
USB to char - *USB to charge phones and small electronics outputs at most 2 A* corresponds with `socket:USB-A:current=2 A` -This tagrendering is only visible in the popup if the following condition is met: `socket:USB-A~.+&socket:USB-A!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:USB-A~.+ &socket:USB-A!=0` This tagrendering has labels `technical` @@ -1551,7 +1551,7 @@ This is rendered with `
USB to char - *USB to charge phones and small electronics outputs at most 10w A* corresponds with `socket:USB-A:output=10W` -This tagrendering is only visible in the popup if the following condition is met: `socket:USB-A~.+&socket:USB-A!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:USB-A~.+ &socket:USB-A!=0` This tagrendering has labels `technical` @@ -1574,7 +1574,7 @@ This is rendered with `
Bosch Active Co -This tagrendering is only visible in the popup if the following condition is met: `socket:bosch_3pin~.+&socket:bosch_3pin!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:bosch_3pin~.+ &socket:bosch_3pin!=0` This tagrendering has labels `technical` @@ -1597,7 +1597,7 @@ This is rendered with `
Bosch Active Co -This tagrendering is only visible in the popup if the following condition is met: `socket:bosch_3pin~.+&socket:bosch_3pin!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:bosch_3pin~.+ &socket:bosch_3pin!=0` This tagrendering has labels `technical` @@ -1620,7 +1620,7 @@ This is rendered with `
Bosch Active Co -This tagrendering is only visible in the popup if the following condition is met: `socket:bosch_3pin~.+&socket:bosch_3pin!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:bosch_3pin~.+ &socket:bosch_3pin!=0` This tagrendering has labels `technical` @@ -1643,7 +1643,7 @@ This is rendered with `
Bosch Active Co -This tagrendering is only visible in the popup if the following condition is met: `socket:bosch_5pin~.+&socket:bosch_5pin!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:bosch_5pin~.+ &socket:bosch_5pin!=0` This tagrendering has labels `technical` @@ -1666,7 +1666,7 @@ This is rendered with `
Bosch Active Co -This tagrendering is only visible in the popup if the following condition is met: `socket:bosch_5pin~.+&socket:bosch_5pin!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:bosch_5pin~.+ &socket:bosch_5pin!=0` This tagrendering has labels `technical` @@ -1689,7 +1689,7 @@ This is rendered with `
Bosch Active Co -This tagrendering is only visible in the popup if the following condition is met: `socket:bosch_5pin~.+&socket:bosch_5pin!=0` +This tagrendering is only visible in the popup if the following condition is met: `socket:bosch_5pin~.+ &socket:bosch_5pin!=0` This tagrendering has labels `technical` @@ -1724,11 +1724,11 @@ The question is *Does one have to pay to use this charging station?* - - *Free to use (without authenticating)* corresponds with `fee=no&authentication:none=yes` - - *Free to use, but one has to authenticate* corresponds with `fee=no&authentication:none=no` + - *Free to use (without authenticating)* corresponds with `fee=no &authentication:none=yes` + - *Free to use, but one has to authenticate* corresponds with `fee=no &authentication:none=no` - *Free to use* corresponds with `fee=no` - This option cannot be chosen as answer - - *Paid use, but free for customers of the hotel/pub/hospital/… who operates the charging station* corresponds with `fee=yes&fee:conditional=no @ customers` + - *Paid use, but free for customers of the hotel/pub/hospital/… who operates the charging station* corresponds with `fee=yes &fee:conditional=no @ customers` - *Paid use* corresponds with `fee=yes` @@ -1772,7 +1772,7 @@ The question is *Which methods of payment are accepted here?* - Unselecting this answer will add payment:membership_card=no -This tagrendering is only visible in the popup if the following condition is met: `fee=yes|charge~.+` +This tagrendering is only visible in the popup if the following condition is met: `fee=yes |charge~.+` @@ -1818,7 +1818,7 @@ This is rendered with `Authenticate by calling or SMS'ing to ](https://taginfo.openstreetmap.org/keys/id#values) [id](https://wiki.openstreetmap.org/wiki/Key:id) | Multiple choice | -[](https://taginfo.openstreetmap.org/keys/url#values) [url](https://wiki.openstreetmap.org/wiki/Key:url) | [url](../SpecialInputElements.md#url) | -[](https://taginfo.openstreetmap.org/keys/climbing:length#values) [climbing:length](https://wiki.openstreetmap.org/wiki/Key:climbing:length) | [pfloat](../SpecialInputElements.md#pfloat) | -[](https://taginfo.openstreetmap.org/keys/climbing:grade:french:min#values) [climbing:grade:french:min](https://wiki.openstreetmap.org/wiki/Key:climbing:grade:french:min) | [string](../SpecialInputElements.md#string) | -[](https://taginfo.openstreetmap.org/keys/climbing:grade:french:max#values) [climbing:grade:french:max](https://wiki.openstreetmap.org/wiki/Key:climbing:grade:french:max) | [string](../SpecialInputElements.md#string) | -[](https://taginfo.openstreetmap.org/keys/climbing:boulder#values) [climbing:boulder](https://wiki.openstreetmap.org/wiki/Key:climbing:boulder) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:climbing:boulder%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:climbing:boulder%3Dno) [limited](https://wiki.openstreetmap.org/wiki/Tag:climbing:boulder%3Dlimited) -[](https://taginfo.openstreetmap.org/keys/climbing:toprope#values) [climbing:toprope](https://wiki.openstreetmap.org/wiki/Key:climbing:toprope) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:climbing:toprope%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:climbing:toprope%3Dno) -[](https://taginfo.openstreetmap.org/keys/climbing:sport#values) [climbing:sport](https://wiki.openstreetmap.org/wiki/Key:climbing:sport) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:climbing:sport%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:climbing:sport%3Dno) -[](https://taginfo.openstreetmap.org/keys/climbing:traditional#values) [climbing:traditional](https://wiki.openstreetmap.org/wiki/Key:climbing:traditional) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:climbing:traditional%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:climbing:traditional%3Dno) -[](https://taginfo.openstreetmap.org/keys/climbing:bolts:max#values) [climbing:bolts:max](https://wiki.openstreetmap.org/wiki/Key:climbing:bolts:max) | [pnat](../SpecialInputElements.md#pnat) | -[](https://taginfo.openstreetmap.org/keys/charge#values) [charge](https://wiki.openstreetmap.org/wiki/Key:charge) | [string](../SpecialInputElements.md#string) | [](https://wiki.openstreetmap.org/wiki/Tag:charge%3D) - - - - -### just_created - - - -This element shows a 'thank you' that the contributor has recently created this element - -This tagrendering has no question and is thus read-only - - - - - - - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` - - -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` - - - -### website - - - -The question is *Is there a (unofficial) website with more informations (e.g. topos)?* - -This rendering asks information about the property [url](https://wiki.openstreetmap.org/wiki/Key:url) - -This is rendered with `{url}` - - - -This tagrendering is only visible in the popup if the following condition is met: `leisure!~^(sports_centre)$&sport=climbing` - - - -### average_length - - - -The question is *What is the (average) length of the routes in meters?* - -This rendering asks information about the property [climbing:length](https://wiki.openstreetmap.org/wiki/Key:climbing:length) - -This is rendered with `The routes are {canonical(climbing:length)} long on average` - - - - - -### min_difficulty - - - -The question is *What is the grade of the easiest route here, according to the french classification system?* - -This rendering asks information about the property [climbing:grade:french:min](https://wiki.openstreetmap.org/wiki/Key:climbing:grade:french:min) - -This is rendered with `The lowest grade is {climbing:grade:french:min} according to the french/belgian system` - - - - - -### max_difficulty - - - -The question is *What is the highest grade route here, according to the french classification system?* - -This rendering asks information about the property [climbing:grade:french:max](https://wiki.openstreetmap.org/wiki/Key:climbing:grade:french:max) - -This is rendered with `The highest grade is {climbing:grade:french:max} according to the french/belgian system` - - - -This tagrendering is only visible in the popup if the following condition is met: `climbing!~^(route)$&climbing:sport=yes|sport=climbing` - - - -### bouldering - - - -The question is *Is bouldering possible here?* - - - - - - - *Bouldering is possible here* corresponds with `climbing:boulder=yes` - - *Bouldering is not possible here* corresponds with `climbing:boulder=no` - - *Bouldering is possible, although there are only a few problems* corresponds with `climbing:boulder=limited` - - *There are {climbing:boulder} boulder problems* corresponds with `climbing:boulder~.+` - - This option cannot be chosen as answer - - - - -### toprope - - - -The question is *Is toprope climbing possible here?* - - - - - - - *Toprope climbing is possible here* corresponds with `climbing:toprope=yes` - - *Toprope climbing is not possible here* corresponds with `climbing:toprope=no` - - *There are {climbing:toprope} toprope routes* corresponds with `climbing:toprope~.+` - - This option cannot be chosen as answer - - - - -### sportclimbing - - - -The question is *Is sport climbing possible here on fixed anchors?* - - - - - - - *Sport climbing is possible here* corresponds with `climbing:sport=yes` - - *Sport climbing is not possible here* corresponds with `climbing:sport=no` - - *There are {climbing:sport} sport climbing routes* corresponds with `climbing:sport~.+` - - This option cannot be chosen as answer - - - - -### trad_climbing - - - -The question is *Is traditional climbing possible here?* - - - - - - - *Traditional climbing is possible here* corresponds with `climbing:traditional=yes` - - *Traditional climbing is not possible here* corresponds with `climbing:traditional=no` - - *There are {climbing:traditional} traditional climbing routes* corresponds with `climbing:traditional~.+` - - This option cannot be chosen as answer - - - - -### max_bolts - - - -The question is *How many bolts do routes in {title()} have at most?* - -This rendering asks information about the property [climbing:bolts:max](https://wiki.openstreetmap.org/wiki/Key:climbing:bolts:max) - -This is rendered with `The sport climbing routes here have at most {climbing:bolts:max} bolts.
This is without relays and indicates how much quickdraws a climber needs
` - - - - - -### fee - - - -The question is *Is a fee required to climb here?* - -This rendering asks information about the property [charge](https://wiki.openstreetmap.org/wiki/Key:charge) - -This is rendered with `A fee of {charge} should be paid for climbing here` - - - - - - - *Climbing here is free of charge* corresponds with `fee=no` - - *Paying a fee is required to climb here* corresponds with `fee=yes` - - - - -### leftover-questions - - - -This tagrendering has no question and is thus read-only - - - - - -### minimap - - - -Shows a small map with the feature. Added by default to every popup - -This tagrendering has no question and is thus read-only - - - - - -### last_edit - - - -Gives some metainfo about the last edit and who did edit it - rendering only - -This tagrendering has no question and is thus read-only - - - -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` - - - -### all-tags - - - -This tagrendering has no question and is thus read-only - - - -This document is autogenerated from [assets/layers/climbing/climbing.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/layers/climbing/climbing.json) diff --git a/Docs/Layers/climbing_area.md b/Docs/Layers/climbing_area.md index 45c92d534..e934de254 100644 --- a/Docs/Layers/climbing_area.md +++ b/Docs/Layers/climbing_area.md @@ -5,7 +5,7 @@ - + An area where climbing is possible, e.g. a crag, site, boulder, … Contains aggregation of routes @@ -73,7 +73,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -184,7 +184,7 @@ This is rendered with `The rock type is {rock}` - *Limestone* corresponds with `rock=limestone` -This tagrendering is only visible in the popup if the following condition is met: `climbing=crag|natural=cliff|natural=bare_rock` +This tagrendering is only visible in the popup if the following condition is met: `climbing=crag |natural=cliff |natural=bare_rock` @@ -200,7 +200,7 @@ This is rendered with `{url} -This tagrendering is only visible in the popup if the following condition is met: `leisure!~^(sports_centre)$&sport=climbing` +This tagrendering is only visible in the popup if the following condition is met: `leisure!~^(sports_centre)$ &sport=climbing` @@ -263,7 +263,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/climbing_club.md b/Docs/Layers/climbing_club.md index 00a84787b..bc863f2aa 100644 --- a/Docs/Layers/climbing_club.md +++ b/Docs/Layers/climbing_club.md @@ -5,7 +5,7 @@ - + A climbing club or organisation @@ -71,7 +71,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -201,7 +201,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/climbing_gym.md b/Docs/Layers/climbing_gym.md index 81d97216d..d97a0d12d 100644 --- a/Docs/Layers/climbing_gym.md +++ b/Docs/Layers/climbing_gym.md @@ -5,7 +5,7 @@ - + A climbing gym @@ -86,7 +86,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -246,10 +246,10 @@ The question is *Can one rent climbing shoes here?* - - *Climbing shoes can be borrowed for free here* corresponds with `service:climbing_shoes:rental=yes&service:climbing_shoes:rental:fee=no` - - *Climbing shoes can be rented here for {service:climbing_shoes:rental:charge}* corresponds with `service:climbing_shoes:rental=yes&service:climbing_shoes:rental:charge~.+` + - *Climbing shoes can be borrowed for free here* corresponds with `service:climbing_shoes:rental=yes &service:climbing_shoes:rental:fee=no` + - *Climbing shoes can be rented here for {service:climbing_shoes:rental:charge}* corresponds with `service:climbing_shoes:rental=yes &service:climbing_shoes:rental:charge~.+` - This option cannot be chosen as answer - - *Climbing shoes can be rented here* corresponds with `service:climbing_shoes:rental=yes&service:climbing_shoes:rental:fee=yes` + - *Climbing shoes can be rented here* corresponds with `service:climbing_shoes:rental=yes &service:climbing_shoes:rental:fee=yes` - *Climbing shoes can not be rented here* corresponds with `service:climbing_shoes:rental=no` @@ -265,8 +265,8 @@ The question is *Can one rent a climbing harness here?* - - *A climbing harness can be borrowed for free here* corresponds with `service:climbing_harness:rental=yes&service:climbing_harness:rental:fee=no` - - *A climbing harness can be rented here for {service:climbing_harness:rental:charge}* corresponds with `service:climbing_harness:rental=yes&service:climbing_harness:rental:charge~.+` + - *A climbing harness can be borrowed for free here* corresponds with `service:climbing_harness:rental=yes &service:climbing_harness:rental:fee=no` + - *A climbing harness can be rented here for {service:climbing_harness:rental:charge}* corresponds with `service:climbing_harness:rental=yes &service:climbing_harness:rental:charge~.+` - This option cannot be chosen as answer - *A climbing harness can be rented here* corresponds with `service:climbing_harness:rental=yes` - *A climbing harness can not be rented here* corresponds with `service:climbing_harness:rental=no` @@ -285,8 +285,8 @@ The question is *Can one rent a belay device here?* - *Belay devices are provided at each rope* corresponds with `service:climbing_belay_device:provided_at_each_rope=yes` - - *A belay device can be borrowed for free here* corresponds with `service:climbing_belay_device:rental=yes&service:climbing_belay_device:rental:fee=no` - - *A belay device can be rented here for {service:climbing_belay_device:rental:charge}* corresponds with `service:climbing_belay_device:rental=yes&service:climbing_belay_device:rental:charge~.+` + - *A belay device can be borrowed for free here* corresponds with `service:climbing_belay_device:rental=yes &service:climbing_belay_device:rental:fee=no` + - *A belay device can be rented here for {service:climbing_belay_device:rental:charge}* corresponds with `service:climbing_belay_device:rental=yes &service:climbing_belay_device:rental:charge~.+` - This option cannot be chosen as answer - *A belay device can be rented here* corresponds with `service:climbing_belay_device:rental=yes` - *A belay device can not be rented here* corresponds with `service:climbing_belay_device:rental=no` @@ -304,8 +304,8 @@ The question is *Can one rent a climbing rope here?* - - *A climbing rope can be borrowed for free here* corresponds with `service:climbing_rope:rental=yes&service:climbing_rope:rental:fee=no` - - *A climbing rope can be rented here for {service:climbing_rope:rental:charge}* corresponds with `service:climbing_rope:rental=yes&service:climbing_rope:rental:charge~.+` + - *A climbing rope can be borrowed for free here* corresponds with `service:climbing_rope:rental=yes &service:climbing_rope:rental:fee=no` + - *A climbing rope can be rented here for {service:climbing_rope:rental:charge}* corresponds with `service:climbing_rope:rental=yes &service:climbing_rope:rental:charge~.+` - This option cannot be chosen as answer - *A climbing rope can be rented here* corresponds with `service:climbing_rope:rental=yes` - *A climbing rope can not be rented here* corresponds with `service:climbing_rope:rental=no` @@ -408,7 +408,7 @@ This is rendered with `The highest grade is {climbing:grade:french:max} accordi -This tagrendering is only visible in the popup if the following condition is met: `climbing!~^(route)$&climbing:sport=yes|sport=climbing` +This tagrendering is only visible in the popup if the following condition is met: `climbing!~^(route)$ &climbing:sport=yes |sport=climbing` @@ -479,7 +479,7 @@ The question is *Is there a fee for internet access?* - *Internet access is free at this place, for customers only* corresponds with `internet_access:fee=customers` -This tagrendering is only visible in the popup if the following condition is met: `internet_access!=no&internet_access~.+` +This tagrendering is only visible in the popup if the following condition is met: `internet_access!=no &internet_access~.+` @@ -536,7 +536,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/climbing_opportunity.md b/Docs/Layers/climbing_opportunity.md index a4f96a1ef..88de3e6a7 100644 --- a/Docs/Layers/climbing_opportunity.md +++ b/Docs/Layers/climbing_opportunity.md @@ -5,7 +5,7 @@ - + Fallback layer with items on which climbing _might_ be possible. It is loaded when zoomed in a lot, to prevent duplicate items to be added @@ -67,7 +67,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -133,7 +133,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/climbing_route.md b/Docs/Layers/climbing_route.md index 5fad3788a..521e6b5c9 100644 --- a/Docs/Layers/climbing_route.md +++ b/Docs/Layers/climbing_route.md @@ -5,7 +5,7 @@ - + A single climbing route and its properties. Some properties are derived from the containing features @@ -74,7 +74,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -216,7 +216,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/clock.md b/Docs/Layers/clock.md index f56011b31..b2b80ff1c 100644 --- a/Docs/Layers/clock.md +++ b/Docs/Layers/clock.md @@ -5,7 +5,7 @@ - + Layer with public clocks @@ -75,7 +75,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -289,7 +289,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/crab_address.md b/Docs/Layers/crab_address.md index 9a895e2bf..aa7b3d37e 100644 --- a/Docs/Layers/crab_address.md +++ b/Docs/Layers/crab_address.md @@ -5,7 +5,7 @@ - + Address data for Flanders by the governement, suited for import into OpenStreetMap. Datadump from 2021-10-26. This layer contains only visualisation logic. Import buttons should be added via an override. Note that HNRLABEL contains the original value, whereas _HNRLABEL contains a slightly cleaned version @@ -55,7 +55,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -101,7 +101,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/crossings.md b/Docs/Layers/crossings.md index 1c4f46547..e755e95d8 100644 --- a/Docs/Layers/crossings.md +++ b/Docs/Layers/crossings.md @@ -5,7 +5,7 @@ - + Crossings for pedestrians and cyclists @@ -82,7 +82,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -207,7 +207,7 @@ The question is *Does this traffic light have a button to request green light?* - *This traffic light does not have a button to request green light* corresponds with `button_operated=no` -This tagrendering is only visible in the popup if the following condition is met: `highway=traffic_signals|crossing=traffic_signals` +This tagrendering is only visible in the popup if the following condition is met: `highway=traffic_signals |crossing=traffic_signals` @@ -245,7 +245,7 @@ The question is *Does this traffic light have vibration signals to aid crossing - *The button for this traffic light does not have a vibration signal to indicate that it is safe to cross.* corresponds with `traffic_signals:vibration=no` -This tagrendering is only visible in the popup if the following condition is met: `crossing=traffic_signals&button_operated=yes` +This tagrendering is only visible in the popup if the following condition is met: `crossing=traffic_signals &button_operated=yes` @@ -355,7 +355,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/cultural_places_without_etymology.md b/Docs/Layers/cultural_places_without_etymology.md index f43d3c83b..16697fd1b 100644 --- a/Docs/Layers/cultural_places_without_etymology.md +++ b/Docs/Layers/cultural_places_without_etymology.md @@ -5,7 +5,7 @@ - + All objects which have an etymology known @@ -67,7 +67,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -190,7 +190,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/cycleways_and_roads.md b/Docs/Layers/cycleways_and_roads.md index 152328a16..d8d91168f 100644 --- a/Docs/Layers/cycleways_and_roads.md +++ b/Docs/Layers/cycleways_and_roads.md @@ -5,7 +5,7 @@ - + All infrastructure that someone can cycle over, accompanied with questions about this infrastructure @@ -88,7 +88,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -203,7 +203,7 @@ This is rendered with `This cyleway is made of {cycleway:surface}` - *This cycleway is made from raw ground* corresponds with `cycleway:surface=ground` -This tagrendering is only visible in the popup if the following condition is met: `cycleway=shared_lane|cycleway=lane|cycleway=track` +This tagrendering is only visible in the popup if the following condition is met: `cycleway=shared_lane |cycleway=lane |cycleway=track` @@ -227,7 +227,7 @@ The question is *What is the smoothness of this cycleway?* - *Impassable / No wheeled vehicle* corresponds with `cycleway:smoothness=impassable` -This tagrendering is only visible in the popup if the following condition is met: `cycleway=shared_lane|cycleway=lane|cycleway=track` +This tagrendering is only visible in the popup if the following condition is met: `cycleway=shared_lane |cycleway=lane |cycleway=track` @@ -285,7 +285,7 @@ The question is *What is the smoothness of this street?* - *Impassable / No wheeled vehicle* corresponds with `smoothness=impassable` -This tagrendering is only visible in the popup if the following condition is met: `cycleway=no|highway=cycleway` +This tagrendering is only visible in the popup if the following condition is met: `cycleway=no |highway=cycleway` @@ -321,7 +321,7 @@ The question is *What traffic sign does this cycleway have?* - *No traffic sign present* corresponds with `cycleway:traffic_sign=none` -This tagrendering is only visible in the popup if the following condition is met: `cycleway=lane|cycleway=track&_country=be` +This tagrendering is only visible in the popup if the following condition is met: `cycleway=lane |cycleway=track &_country=be` @@ -346,7 +346,7 @@ The question is *What traffic sign does this cycleway have?* - *No traffic sign present* corresponds with `traffic_sign=none` -This tagrendering is only visible in the popup if the following condition is met: `highway=cycleway|highway=path&_country=be|_country=nl` +This tagrendering is only visible in the popup if the following condition is met: `highway=cycleway |highway=path &_country=be |_country=nl` @@ -369,7 +369,7 @@ The question is *Does the traffic sign D7 ( + A layer showing defibrillators which can be used in case of emergency. This contains public defibrillators, but also defibrillators which might need staff to fetch the actual device @@ -82,7 +82,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -402,7 +402,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` @@ -425,7 +425,7 @@ This tagrendering has no question and is thus read-only id | question | osmTags ---- | ---------- | --------- has_image.0 | With and without images (default) | -has_image.1 | Has at least one image | image~.+\|image:0~.+\|image:1~.+\|image:2~.+\|image:3~.+\|mapillary~.+ +has_image.1 | Has at least one image | image~.+ \|image:0~.+ \|image:1~.+ \|image:2~.+ \|image:3~.+ \|mapillary~.+ has_image.2 | Probably does not have an image | diff --git a/Docs/Layers/dentist.md b/Docs/Layers/dentist.md index d52b4b840..bf407a671 100644 --- a/Docs/Layers/dentist.md +++ b/Docs/Layers/dentist.md @@ -5,7 +5,7 @@ - + This layer shows dentist offices @@ -71,7 +71,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -233,7 +233,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/direction.md b/Docs/Layers/direction.md index 59aab447e..394f28518 100644 --- a/Docs/Layers/direction.md +++ b/Docs/Layers/direction.md @@ -5,7 +5,7 @@ - + This layer visualizes directions @@ -55,7 +55,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -91,7 +91,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/doctors.md b/Docs/Layers/doctors.md index 81d4a1973..c0832c3ff 100644 --- a/Docs/Layers/doctors.md +++ b/Docs/Layers/doctors.md @@ -5,7 +5,7 @@ - + This layer shows doctor offices @@ -73,7 +73,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -264,7 +264,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/dogfoodb.md b/Docs/Layers/dogfoodb.md index f10efed28..8cdc36984 100644 --- a/Docs/Layers/dogfoodb.md +++ b/Docs/Layers/dogfoodb.md @@ -5,7 +5,7 @@ - + A layer showing restaurants and fast-food amenities (with a special rendering for friteries) @@ -94,7 +94,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -455,6 +455,8 @@ The question is *Does this shop have a sugar free offering?* - *This shop has no sugar free offering* corresponds with `diet:sugar_free=no` +This tagrendering has labels `diets` + ### gluten_free @@ -473,6 +475,8 @@ The question is *Does this shop have a gluten free offering?* - *This shop has no gluten free offering* corresponds with `diet:gluten_free=no` +This tagrendering has labels `diets` + ### lactose_free @@ -491,6 +495,8 @@ The question is *Does {title()} have a lactose-free offering?* - *No lactose free offering* corresponds with `diet:lactose_free=no` +This tagrendering has labels `diets` + ### organic (no friture) @@ -675,7 +681,7 @@ The question is *Is there a fee for internet access?* - *Internet access is free at this place, for customers only* corresponds with `internet_access:fee=customers` -This tagrendering is only visible in the popup if the following condition is met: `internet_access!=no&internet_access~.+` +This tagrendering is only visible in the popup if the following condition is met: `internet_access!=no &internet_access~.+` @@ -764,7 +770,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` @@ -793,7 +799,7 @@ open_now.0 | Open now | _isOpen=yes id | question | osmTags ---- | ---------- | --------- -reservation.0 | Reservation not required | reservation=no\|reservation=optional\| +reservation.0 | Reservation not required | reservation=no \|reservation=optional \| @@ -809,49 +815,49 @@ food-category.2 | Only restaurants | amenity=restaurant id | question | osmTags ---- | ---------- | --------- -vegetarian.0 | Has a vegetarian menu | diet:vegetarian=yes\|diet:vegetarian=only\|diet:vegan=yes\|diet:vegan=only +vegetarian.0 | Has a vegetarian menu | diet:vegetarian=yes \|diet:vegetarian=only \|diet:vegan=yes \|diet:vegan=only id | question | osmTags ---- | ---------- | --------- -vegan.0 | Has a vegan menu | diet:vegan=yes\|diet:vegan=only +vegan.0 | Has a vegan menu | diet:vegan=yes \|diet:vegan=only id | question | osmTags ---- | ---------- | --------- -halal.0 | Has a halal menu | diet:halal=yes\|diet:halal=only +halal.0 | Has a halal menu | diet:halal=yes \|diet:halal=only id | question | osmTags ---- | ---------- | --------- -has_organic.0 | Has organic options | organic=yes\|organic=only +has_organic.0 | Has organic options | organic=yes \|organic=only id | question | osmTags ---- | ---------- | --------- -sugar_free.0 | Has a sugar-free offering | diet:sugar_free=yes\|diet:sugar_free=only\|diet:sugar_free=limited +sugar_free.0 | Has a sugar-free offering | diet:sugar_free=yes \|diet:sugar_free=only \|diet:sugar_free=limited id | question | osmTags ---- | ---------- | --------- -gluten_free.0 | Has a gluten free offering | diet:gluten_free=yes\|diet:gluten_free=only\|diet:gluten_free=limited +gluten_free.0 | Has a gluten free offering | diet:gluten_free=yes \|diet:gluten_free=only \|diet:gluten_free=limited id | question | osmTags ---- | ---------- | --------- -lactose_free.0 | Has a lactose free offering | diet:lactose_free=yes\|diet:lactose_free=only\|diet:lactose_free=limited +lactose_free.0 | Has a lactose free offering | diet:lactose_free=yes \|diet:lactose_free=only \|diet:lactose_free=limited @@ -873,7 +879,7 @@ accepts_cards.0 | Accepts payment cards | payment:cards=yes id | question | osmTags ---- | ---------- | --------- dogs.0 | No preference towards dogs (default) | -dogs.1 | Dogs allowed | dog=unleashed\|dog=yes +dogs.1 | Dogs allowed | dog=unleashed \|dog=yes dogs.2 | No dogs allowed | dog=no diff --git a/Docs/Layers/dogpark.md b/Docs/Layers/dogpark.md index 61094640c..e09a293d4 100644 --- a/Docs/Layers/dogpark.md +++ b/Docs/Layers/dogpark.md @@ -5,7 +5,7 @@ - + A layer showing dogparks, which are areas where dog are allowed to run without a leash @@ -69,7 +69,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -185,7 +185,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/dogshop.md b/Docs/Layers/dogshop.md index e1d22611b..5776fbda0 100644 --- a/Docs/Layers/dogshop.md +++ b/Docs/Layers/dogshop.md @@ -5,7 +5,7 @@ - + A shop @@ -47,7 +47,7 @@ attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ [](https://taginfo.openstreetmap.org/keys/id#values) [id](https://wiki.openstreetmap.org/wiki/Key:id) | Multiple choice | [](https://taginfo.openstreetmap.org/keys/name#values) [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) | -[](https://taginfo.openstreetmap.org/keys/shop#values) [shop](https://wiki.openstreetmap.org/wiki/Key:shop) | [string](../SpecialInputElements.md#string) | [agrarian](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dagrarian) [alcohol](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dalcohol) [anime](https://wiki.openstreetmap.org/wiki/Tag:shop%3Danime) [antiques](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dantiques) [appliance](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dappliance) [art](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dart) [baby_goods](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbaby_goods) [bag](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbag) [bakery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbakery) [bathroom_furnishing](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbathroom_furnishing) [beauty](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbeauty) [bed](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbed) [beverages](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbeverages) [bicycle](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbicycle) [boat](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dboat) [bookmaker](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbookmaker) [books](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbooks) [brewing_supplies](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbrewing_supplies) [butcher](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbutcher) [camera](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcamera) [candles](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcandles) [cannabis](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcannabis) [car](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcar) [car_parts](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcar_parts) [car_repair](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcar_repair) [caravan](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcaravan) [carpet](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcarpet) [catalogue](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcatalogue) [charity](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcharity) [cheese](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcheese) [chemist](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dchemist) [chocolate](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dchocolate) [clothes](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dclothes) [coffee](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcoffee) [collector](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcollector) [computer](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcomputer) [confectionery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dconfectionery) [convenience](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dconvenience) [copyshop](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcopyshop) [cosmetics](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcosmetics) [country_store](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcountry_store) [craft](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcraft) [curtain](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcurtain) [dairy](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddairy) [deli](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddeli) [department_store](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddepartment_store) [doityourself](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddoityourself) [doors](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddoors) [dry_cleaning](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddry_cleaning) [e-cigarette](https://wiki.openstreetmap.org/wiki/Tag:shop%3De-cigarette) [electrical](https://wiki.openstreetmap.org/wiki/Tag:shop%3Delectrical) [electronics](https://wiki.openstreetmap.org/wiki/Tag:shop%3Delectronics) [erotic](https://wiki.openstreetmap.org/wiki/Tag:shop%3Derotic) [fabric](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfabric) [farm](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfarm) [fashion_accessories](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfashion_accessories) [fireplace](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfireplace) [fishing](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfishing) [flooring](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dflooring) [florist](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dflorist) [frame](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dframe) [frozen_food](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfrozen_food) [fuel](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfuel) [funeral_directors](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfuneral_directors) [furniture](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfurniture) [games](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgames) [garden_centre](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgarden_centre) [gas](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgas) [general](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgeneral) [gift](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgift) [greengrocer](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgreengrocer) [hairdresser](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhairdresser) [hairdresser_supply](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhairdresser_supply) [hardware](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhardware) [health_food](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhealth_food) [hearing_aids](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhearing_aids) [herbalist](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dherbalist) [hifi](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhifi) [hobby](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhobby) [household_linen](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhousehold_linen) [houseware](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhouseware) [hunting](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhunting) [interior_decoration](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dinterior_decoration) [jewelry](https://wiki.openstreetmap.org/wiki/Tag:shop%3Djewelry) [kiosk](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dkiosk) [kitchen](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dkitchen) [laundry](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dlaundry) [leather](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dleather) [lighting](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dlighting) [locksmith](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dlocksmith) [lottery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dlottery) [mall](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmall) [massage](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmassage) [medical_supply](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmedical_supply) [military_surplus](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmilitary_surplus) [mobile_phone](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmobile_phone) [model](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmodel) [money_lender](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmoney_lender) [motorcycle](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmotorcycle) [motorcycle_repair](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmotorcycle_repair) [music](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmusic) [musical_instrument](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmusical_instrument) [newsagent](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dnewsagent) [nutrition_supplements](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dnutrition_supplements) [optician](https://wiki.openstreetmap.org/wiki/Tag:shop%3Doptician) [outdoor](https://wiki.openstreetmap.org/wiki/Tag:shop%3Doutdoor) [outpost](https://wiki.openstreetmap.org/wiki/Tag:shop%3Doutpost) [paint](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpaint) [party](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dparty) [pastry](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpastry) [pawnbroker](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpawnbroker) [perfumery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dperfumery) [pet](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpet) [pet_grooming](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpet_grooming) [photo](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dphoto) [pottery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpottery) [printer_ink](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dprinter_ink) [psychic](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpsychic) [pyrotechnics](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpyrotechnics) [radiotechnics](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dradiotechnics) [religion](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dreligion) [rental](https://wiki.openstreetmap.org/wiki/Tag:shop%3Drental) [repair](https://wiki.openstreetmap.org/wiki/Tag:shop%3Drepair) [scuba_diving](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dscuba_diving) [seafood](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dseafood) [second_hand](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dsecond_hand) [sewing](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dsewing) [shoe_repair](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dshoe_repair) [shoes](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dshoes) [spices](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dspices) [sports](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dsports) [stationery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dstationery) [storage_rental](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dstorage_rental) [supermarket](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dsupermarket) [swimming_pool](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dswimming_pool) [tailor](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtailor) [tattoo](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtattoo) [tea](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtea) [telecommunication](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtelecommunication) [ticket](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dticket) [tiles](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtiles) [tobacco](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtobacco) [tool_hire](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtool_hire) [toys](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtoys) [trade](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtrade) [travel_agency](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtravel_agency) [trophy](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtrophy) [tyres](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtyres) [vacuum_cleaner](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dvacuum_cleaner) [variety_store](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dvariety_store) [video](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dvideo) [video_games](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dvideo_games) [watches](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwatches) [water](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwater) [water_sports](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwater_sports) [weapons](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dweapons) [wholesale](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwholesale) [wigs](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwigs) [window_blind](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwindow_blind) [wine](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwine) +[](https://taginfo.openstreetmap.org/keys/shop#values) [shop](https://wiki.openstreetmap.org/wiki/Key:shop) | [string](../SpecialInputElements.md#string) | [vacant](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dvacant) [agrarian](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dagrarian) [alcohol](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dalcohol) [anime](https://wiki.openstreetmap.org/wiki/Tag:shop%3Danime) [antiques](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dantiques) [appliance](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dappliance) [art](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dart) [baby_goods](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbaby_goods) [bag](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbag) [bakery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbakery) [bathroom_furnishing](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbathroom_furnishing) [beauty](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbeauty) [bed](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbed) [beverages](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbeverages) [bicycle](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbicycle) [boat](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dboat) [bookmaker](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbookmaker) [books](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbooks) [brewing_supplies](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbrewing_supplies) [butcher](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbutcher) [camera](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcamera) [candles](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcandles) [cannabis](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcannabis) [car](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcar) [car_parts](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcar_parts) [car_repair](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcar_repair) [caravan](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcaravan) [carpet](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcarpet) [catalogue](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcatalogue) [charity](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcharity) [cheese](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcheese) [chemist](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dchemist) [chocolate](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dchocolate) [clothes](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dclothes) [coffee](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcoffee) [collector](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcollector) [computer](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcomputer) [confectionery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dconfectionery) [convenience](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dconvenience) [copyshop](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcopyshop) [cosmetics](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcosmetics) [country_store](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcountry_store) [craft](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcraft) [curtain](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcurtain) [dairy](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddairy) [deli](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddeli) [department_store](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddepartment_store) [doityourself](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddoityourself) [doors](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddoors) [dry_cleaning](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddry_cleaning) [e-cigarette](https://wiki.openstreetmap.org/wiki/Tag:shop%3De-cigarette) [electrical](https://wiki.openstreetmap.org/wiki/Tag:shop%3Delectrical) [electronics](https://wiki.openstreetmap.org/wiki/Tag:shop%3Delectronics) [erotic](https://wiki.openstreetmap.org/wiki/Tag:shop%3Derotic) [fabric](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfabric) [farm](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfarm) [fashion_accessories](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfashion_accessories) [fireplace](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfireplace) [fishing](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfishing) [flooring](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dflooring) [florist](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dflorist) [frame](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dframe) [frozen_food](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfrozen_food) [fuel](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfuel) [funeral_directors](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfuneral_directors) [furniture](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfurniture) [games](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgames) [garden_centre](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgarden_centre) [gas](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgas) [general](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgeneral) [gift](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgift) [greengrocer](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgreengrocer) [hairdresser](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhairdresser) [hairdresser_supply](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhairdresser_supply) [hardware](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhardware) [health_food](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhealth_food) [hearing_aids](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhearing_aids) [herbalist](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dherbalist) [hifi](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhifi) [honey](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhoney) [household_linen](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhousehold_linen) [houseware](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhouseware) [hunting](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhunting) [interior_decoration](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dinterior_decoration) [jewelry](https://wiki.openstreetmap.org/wiki/Tag:shop%3Djewelry) [kiosk](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dkiosk) [kitchen](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dkitchen) [laundry](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dlaundry) [leather](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dleather) [lighting](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dlighting) [locksmith](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dlocksmith) [lottery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dlottery) [mall](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmall) [massage](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmassage) [medical_supply](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmedical_supply) [military_surplus](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmilitary_surplus) [mobile_phone](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmobile_phone) [model](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmodel) [money_lender](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmoney_lender) [motorcycle](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmotorcycle) [motorcycle_repair](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmotorcycle_repair) [music](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmusic) [musical_instrument](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmusical_instrument) [newsagent](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dnewsagent) [nutrition_supplements](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dnutrition_supplements) [nuts](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dnuts) [optician](https://wiki.openstreetmap.org/wiki/Tag:shop%3Doptician) [outdoor](https://wiki.openstreetmap.org/wiki/Tag:shop%3Doutdoor) [outpost](https://wiki.openstreetmap.org/wiki/Tag:shop%3Doutpost) [paint](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpaint) [party](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dparty) [pasta](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpasta) [pastry](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpastry) [pawnbroker](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpawnbroker) [perfumery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dperfumery) [pet](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpet) [pet_grooming](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpet_grooming) [photo](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dphoto) [pottery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpottery) [printer_ink](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dprinter_ink) [psychic](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpsychic) [pyrotechnics](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpyrotechnics) [radiotechnics](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dradiotechnics) [religion](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dreligion) [rental](https://wiki.openstreetmap.org/wiki/Tag:shop%3Drental) [repair](https://wiki.openstreetmap.org/wiki/Tag:shop%3Drepair) [rice](https://wiki.openstreetmap.org/wiki/Tag:shop%3Drice) [scuba_diving](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dscuba_diving) [seafood](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dseafood) [second_hand](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dsecond_hand) [sewing](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dsewing) [shoe_repair](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dshoe_repair) [shoes](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dshoes) [spices](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dspices) [sports](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dsports) [stationery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dstationery) [storage_rental](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dstorage_rental) [supermarket](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dsupermarket) [swimming_pool](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dswimming_pool) [tailor](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtailor) [tattoo](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtattoo) [tea](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtea) [telecommunication](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtelecommunication) [ticket](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dticket) [tiles](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtiles) [tobacco](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtobacco) [tool_hire](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtool_hire) [toys](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtoys) [trade](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtrade) [travel_agency](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtravel_agency) [trophy](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtrophy) [tyres](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtyres) [vacuum_cleaner](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dvacuum_cleaner) [variety_store](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dvariety_store) [video](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dvideo) [video_games](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dvideo_games) [watches](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwatches) [water](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwater) [water_sports](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwater_sports) [weapons](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dweapons) [wholesale](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwholesale) [wigs](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwigs) [window_blind](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwindow_blind) [wine](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwine) [](https://taginfo.openstreetmap.org/keys/second_hand#values) [second_hand](https://wiki.openstreetmap.org/wiki/Key:second_hand) | Multiple choice | [only](https://wiki.openstreetmap.org/wiki/Tag:second_hand%3Donly) [yes](https://wiki.openstreetmap.org/wiki/Tag:second_hand%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:second_hand%3Dno) [](https://taginfo.openstreetmap.org/keys/opening_hours#values) [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) | [opening_hours](../SpecialInputElements.md#opening_hours) | [](https://taginfo.openstreetmap.org/keys/website#values) [website](https://wiki.openstreetmap.org/wiki/Key:website) | [url](../SpecialInputElements.md#url) | @@ -80,7 +80,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -124,10 +124,11 @@ This is rendered with `This is a {shop}` + - *Vacant Shop* corresponds with `shop=vacant` - *Farm Supply Shop* corresponds with `shop=agrarian` - *Liquor Store* corresponds with `shop=alcohol` - *Anime / Manga Shop* corresponds with `shop=anime` - - *Antiques Shop* corresponds with `shop=antiques` + - *Antique Shop* corresponds with `shop=antiques` - *Appliance Store* corresponds with `shop=appliance` - *Art Store* corresponds with `shop=art` - *Baby Goods Store* corresponds with `shop=baby_goods` @@ -140,7 +141,7 @@ This is rendered with `This is a {shop}` - *Bicycle Shop* corresponds with `shop=bicycle` - *Boat Store* corresponds with `shop=boat` - *Bookmaker* corresponds with `shop=bookmaker` - - *Book Store* corresponds with `shop=books` + - *Bookstore* corresponds with `shop=books` - *Brewing Supply Store* corresponds with `shop=brewing_supplies` - *Butcher* corresponds with `shop=butcher` - *Camera Equipment Store* corresponds with `shop=camera` @@ -164,11 +165,11 @@ This is rendered with `This is a {shop}` - *Convenience Store* corresponds with `shop=convenience` - *Copy Store* corresponds with `shop=copyshop` - *Cosmetics Store* corresponds with `shop=cosmetics` - - *Country Store* corresponds with `shop=country_store` + - *Rural Supplies Store* corresponds with `shop=country_store` - *Arts & Crafts Store* corresponds with `shop=craft` - *Curtain Store* corresponds with `shop=curtain` - *Dairy Store* corresponds with `shop=dairy` - - *Deli* corresponds with `shop=deli` + - *Delicatessen* corresponds with `shop=deli` - *Department Store* corresponds with `shop=department_store` - *DIY Store* corresponds with `shop=doityourself` - *Door Shop* corresponds with `shop=doors` @@ -198,11 +199,11 @@ This is rendered with `This is a {shop}` - *Hairdresser* corresponds with `shop=hairdresser` - *Hairdresser Supply Store* corresponds with `shop=hairdresser_supply` - *Hardware Store* corresponds with `shop=hardware` - - *Health Food Shop* corresponds with `shop=health_food` + - *Health Food Store* corresponds with `shop=health_food` - *Hearing Aids Store* corresponds with `shop=hearing_aids` - *Herbalist* corresponds with `shop=herbalist` - *Hifi Store* corresponds with `shop=hifi` - - *Hobby Shop* corresponds with `shop=hobby` + - *Honey Store* corresponds with `shop=honey` - *Household Linen Shop* corresponds with `shop=household_linen` - *Houseware Store* corresponds with `shop=houseware` - *Hunting Shop* corresponds with `shop=hunting` @@ -226,18 +227,20 @@ This is rendered with `This is a {shop}` - *Motorcycle Repair Shop* corresponds with `shop=motorcycle_repair` - *Music Store* corresponds with `shop=music` - *Musical Instrument Store* corresponds with `shop=musical_instrument` - - *Newspaper/Magazine Shop* corresponds with `shop=newsagent` + - *Newsstand* corresponds with `shop=newsagent` - *Nutrition Supplements Store* corresponds with `shop=nutrition_supplements` + - *Nuts Shop* corresponds with `shop=nuts` - *Optician* corresponds with `shop=optician` - *Outdoors Store* corresponds with `shop=outdoor` - *Online Retailer Outpost* corresponds with `shop=outpost` - *Paint Store* corresponds with `shop=paint` - *Party Supply Store* corresponds with `shop=party` + - *Pasta Store* corresponds with `shop=pasta` - *Pastry Shop* corresponds with `shop=pastry` - - *Pawn Shop* corresponds with `shop=pawnbroker` + - *Pawnshop* corresponds with `shop=pawnbroker` - *Perfume Store* corresponds with `shop=perfumery` - *Pet Store* corresponds with `shop=pet` - - *Pet Grooming Store* corresponds with `shop=pet_grooming` + - *Pet Groomer* corresponds with `shop=pet_grooming` - *Photography Store* corresponds with `shop=photo` - *Pottery Store* corresponds with `shop=pottery` - *Printer Ink Store* corresponds with `shop=printer_ink` @@ -247,9 +250,10 @@ This is rendered with `This is a {shop}` - *Religious Store* corresponds with `shop=religion` - *Rental Shop* corresponds with `shop=rental` - *Repair Shop* corresponds with `shop=repair` + - *Rice Store* corresponds with `shop=rice` - *Scuba Diving Shop* corresponds with `shop=scuba_diving` - *Seafood Shop* corresponds with `shop=seafood` - - *Consignment/Thrift Store* corresponds with `shop=second_hand` + - *Thrift Store* corresponds with `shop=second_hand` - *Sewing Supply Shop* corresponds with `shop=sewing` - *Shoe Repair Shop* corresponds with `shop=shoe_repair` - *Shoe Store* corresponds with `shop=shoes` @@ -273,7 +277,7 @@ This is rendered with `This is a {shop}` - *Trophy Shop* corresponds with `shop=trophy` - *Tire Store* corresponds with `shop=tyres` - *Vacuum Cleaner Store* corresponds with `shop=vacuum_cleaner` - - *Variety Store* corresponds with `shop=variety_store` + - *Discount Store* corresponds with `shop=variety_store` - *Video Store* corresponds with `shop=video` - *Video Game Store* corresponds with `shop=video_games` - *Watches Shop* corresponds with `shop=watches` @@ -303,7 +307,7 @@ The question is *Does this shop sell second-hand items?* - *This shop only sells brand-new items* corresponds with `second_hand=no` -This tagrendering is only visible in the popup if the following condition is met: `shop=clothes|shop=car|shop=books|shop=charity|shop=car_repair|shop=furniture|shop=bicycle|shop=bicycle|shop=mobile_phone|shop=computer|shop=toys` +This tagrendering is only visible in the popup if the following condition is met: `shop=clothes |shop=car |shop=books |shop=charity |shop=car_repair |shop=furniture |shop=bicycle |shop=bicycle |shop=mobile_phone |shop=computer |shop=toys` @@ -470,7 +474,26 @@ The question is *What paper formats does this shop offer?* - Unselecting this answer will add service:print:A0=no -This tagrendering is only visible in the popup if the following condition is met: `shop~^(.*copyshop.*)$|shop~^(.*stationery.*)$|service:print=yes` +This tagrendering is only visible in the popup if the following condition is met: `shop~^(.*copyshop.*)$ |shop~^(.*stationery.*)$ |service:print=yes` + + + +### key_cutter + + + +The question is *Does this shop offer key cutting?* + + + + + + - *This shop is also specialized in key cutting* corresponds with `craft=key_cutter` + - *This shop offers key cutting as a service* corresponds with `service:key_cutting=yes` + - *This shops does not offer key cutting as a service* corresponds with `service:key_cutting=no` + + +This tagrendering is only visible in the popup if the following condition is met: `shop=shoe_repair |service:key_cutting~.+ |craft=key_cutting |shop=diy |shop=doityourself |shop=home_improvement |shop=hardware |shop=locksmith |shop=repair` @@ -509,7 +532,7 @@ The question is *Is there a fee for internet access?* - *Internet access is free at this place, for customers only* corresponds with `internet_access:fee=customers` -This tagrendering is only visible in the popup if the following condition is met: `internet_access!=no&internet_access~.+` +This tagrendering is only visible in the popup if the following condition is met: `internet_access!=no &internet_access~.+` @@ -549,7 +572,7 @@ The question is *Does this shop offer organic products?* - *This shop does not offer organic products* corresponds with `organic=no` -This tagrendering is only visible in the popup if the following condition is met: `shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=clothes|shop=shoes|shop=butcher|shop=cosmetics|shop=deli|shop=bakery|shop=alcohol|shop=seafood|shop=beverages|shop=florist` +This tagrendering is only visible in the popup if the following condition is met: `shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=clothes |shop=shoes |shop=butcher |shop=cosmetics |shop=deli |shop=bakery |shop=alcohol |shop=seafood |shop=beverages |shop=florist` @@ -569,7 +592,9 @@ The question is *Does this shop have a sugar free offering?* - *This shop has no sugar free offering* corresponds with `diet:sugar_free=no` -This tagrendering is only visible in the popup if the following condition is met: `shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream` +This tagrendering is only visible in the popup if the following condition is met: `shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream` + +This tagrendering has labels `diets` @@ -589,7 +614,9 @@ The question is *Does this shop have a gluten free offering?* - *This shop has no gluten free offering* corresponds with `diet:gluten_free=no` -This tagrendering is only visible in the popup if the following condition is met: `shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream` +This tagrendering is only visible in the popup if the following condition is met: `shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream` + +This tagrendering has labels `diets` @@ -609,7 +636,9 @@ The question is *Does {title()} have a lactose-free offering?* - *No lactose free offering* corresponds with `diet:lactose_free=no` -This tagrendering is only visible in the popup if the following condition is met: `shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream` +This tagrendering is only visible in the popup if the following condition is met: `shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream` + +This tagrendering has labels `diets` @@ -679,7 +708,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` @@ -736,35 +765,35 @@ accepts_cards.0 | Accepts payment cards | payment:cards=yes id | question | osmTags ---- | ---------- | --------- -has_organic.0 | Has organic options | organic=yes\|organic=only +has_organic.0 | Has organic options | organic=yes \|organic=only id | question | osmTags ---- | ---------- | --------- -second_hand.0 | Only show shops selling second-hand items | shop=second_hand\|shop=charity\|second_hand=yes\|second_hand=only +second_hand.0 | Only show shops selling second-hand items | shop=second_hand \|shop=charity \|second_hand=yes \|second_hand=only id | question | osmTags ---- | ---------- | --------- -sugar_free.0 | Has a sugar-free offering | diet:sugar_free=yes\|diet:sugar_free=only\|diet:sugar_free=limited +sugar_free.0 | Has a sugar-free offering | diet:sugar_free=yes \|diet:sugar_free=only \|diet:sugar_free=limited id | question | osmTags ---- | ---------- | --------- -gluten_free.0 | Has a gluten free offering | diet:gluten_free=yes\|diet:gluten_free=only\|diet:gluten_free=limited +gluten_free.0 | Has a gluten free offering | diet:gluten_free=yes \|diet:gluten_free=only \|diet:gluten_free=limited id | question | osmTags ---- | ---------- | --------- -lactose_free.0 | Has a lactose free offering | diet:lactose_free=yes\|diet:lactose_free=only\|diet:lactose_free=limited +lactose_free.0 | Has a lactose free offering | diet:lactose_free=yes \|diet:lactose_free=only \|diet:lactose_free=limited This document is autogenerated from [assets/themes/pets/pets.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/themes/pets/pets.json) diff --git a/Docs/Layers/drinking_water.md b/Docs/Layers/drinking_water.md index 9942749b8..52a306d8d 100644 --- a/Docs/Layers/drinking_water.md +++ b/Docs/Layers/drinking_water.md @@ -5,7 +5,7 @@ - + A layer showing drinking water fountains @@ -14,7 +14,7 @@ A layer showing drinking water fountains - - This layer is shown at zoomlevel **13** and higher + - This layer is shown at zoomlevel **0** and higher - This layer will automatically load [drinking_water](./drinking_water.md) into the layout as it depends on it: a calculated tag loads features from this layer (calculatedTag[0] which calculates the value for _closest_other_drinking_water) - This layer is needed as dependency for layer [drinking_water](#drinking_water) @@ -73,7 +73,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -190,7 +190,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/dumpstations.md b/Docs/Layers/dumpstations.md index 1dd141f77..f7f5e595a 100644 --- a/Docs/Layers/dumpstations.md +++ b/Docs/Layers/dumpstations.md @@ -5,7 +5,7 @@ - + Sanitary dump stations @@ -15,6 +15,7 @@ Sanitary dump stations - This layer is shown at zoomlevel **10** and higher + - Not rendered on the map by default. If you want to rendering this on the map, override `mapRenderings` @@ -74,7 +75,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -235,7 +236,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/education_institutions_without_etymology.md b/Docs/Layers/education_institutions_without_etymology.md index 7d44a3350..2a86f70a3 100644 --- a/Docs/Layers/education_institutions_without_etymology.md +++ b/Docs/Layers/education_institutions_without_etymology.md @@ -5,7 +5,7 @@ - + All objects which have an etymology known @@ -67,7 +67,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -190,7 +190,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/elevator.md b/Docs/Layers/elevator.md index 1da424300..f71b41c8a 100644 --- a/Docs/Layers/elevator.md +++ b/Docs/Layers/elevator.md @@ -5,7 +5,7 @@ - + This layer show elevators and asks for operational status and elevator dimensions. Useful for wheelchair accessibility information @@ -76,7 +76,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -284,7 +284,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/elongated_coin.md b/Docs/Layers/elongated_coin.md index 067b778d4..44d4dd487 100644 --- a/Docs/Layers/elongated_coin.md +++ b/Docs/Layers/elongated_coin.md @@ -5,7 +5,7 @@ - + Layer showing penny presses. @@ -77,7 +77,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -277,7 +277,7 @@ The question is *What coins can you use to pay here?* - *5 francs coins are accepted* corresponds with `payment:coins:denominations=5 CHF` -This tagrendering is only visible in the popup if the following condition is met: `payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$` +This tagrendering is only visible in the popup if the following condition is met: `payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$` @@ -409,7 +409,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/entrance.md b/Docs/Layers/entrance.md index 88c0bc060..656a300b5 100644 --- a/Docs/Layers/entrance.md +++ b/Docs/Layers/entrance.md @@ -5,7 +5,7 @@ - + A layer showing entrances and offering capabilities to survey some advanced data which is important for e.g. wheelchair users (but also bicycle users, people who want to deliver, …) @@ -77,7 +77,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -268,7 +268,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/etymology.md b/Docs/Layers/etymology.md index efa89c1d2..29e144883 100644 --- a/Docs/Layers/etymology.md +++ b/Docs/Layers/etymology.md @@ -5,7 +5,7 @@ - + All objects which have an etymology known @@ -68,7 +68,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -191,7 +191,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/extinguisher.md b/Docs/Layers/extinguisher.md index a66a99075..3852afe2c 100644 --- a/Docs/Layers/extinguisher.md +++ b/Docs/Layers/extinguisher.md @@ -5,7 +5,7 @@ - + Map layer to show fire extinguishers. @@ -67,7 +67,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -135,7 +135,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/facadegardens.md b/Docs/Layers/facadegardens.md index de5136581..27a1af844 100644 --- a/Docs/Layers/facadegardens.md +++ b/Docs/Layers/facadegardens.md @@ -5,7 +5,7 @@ - + Facade gardens @@ -15,6 +15,7 @@ Facade gardens - This layer is shown at zoomlevel **12** and higher + - Not rendered on the map by default. If you want to rendering this on the map, override `mapRenderings` @@ -72,7 +73,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -249,7 +250,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/fietsstraat.md b/Docs/Layers/fietsstraat.md index dcac7d333..8aec81e40 100644 --- a/Docs/Layers/fietsstraat.md +++ b/Docs/Layers/fietsstraat.md @@ -15,6 +15,7 @@ A cyclestreet is a street where motorized traffic is not allowed to overtake a c - This layer is shown at zoomlevel **7** and higher + - Not rendered on the map by default. If you want to rendering this on the map, override `mapRenderings` @@ -62,10 +63,10 @@ The question is *Is the street {name} a cyclestreet?* - - *This street is a cyclestreet (and has a speed limit of 30 km/h)* corresponds with `cyclestreet=yes&maxspeed=30&overtaking:motor_vehicle=no` + - *This street is a cyclestreet (and has a speed limit of 30 km/h)* corresponds with `cyclestreet=yes &maxspeed=30 &overtaking:motor_vehicle=no` - *This street is a bicycle road* corresponds with `bicycle_road=yes` - This option cannot be chosen as answer - - *This street is a bicycle road (has a speed limit of 30 km/h and vehicles are not allowed) (sign will be asked later)* corresponds with `bicycle_road=yes&maxspeed=30&source:maxspeed=DE:bicycle_road&vehicle=no&bicycle=designated` + - *This street is a bicycle road (has a speed limit of 30 km/h and vehicles are not allowed) (sign will be asked later)* corresponds with `bicycle_road=yes &maxspeed=30 &source:maxspeed=DE:bicycle_road &vehicle=no &bicycle=designated` - *This street is a cyclestreet* corresponds with `cyclestreet=yes` - *This street will become a cyclestreet soon* corresponds with `proposed:cyclestreet=yes` - *This street will become a bicycle road soon* corresponds with `proposed:bicycle_road=yes` @@ -91,7 +92,7 @@ The question is *What sign does this bicycle road have?* - *There are no supplementary signs at this bicycle road.* corresponds with `traffic_sign=DE:244.1` -This tagrendering is only visible in the popup if the following condition is met: `bicycle_road=yes&_country=de` +This tagrendering is only visible in the popup if the following condition is met: `bicycle_road=yes &_country=de` @@ -126,7 +127,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -174,7 +175,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/fire_station.md b/Docs/Layers/fire_station.md index 8d2c78525..da2fafa30 100644 --- a/Docs/Layers/fire_station.md +++ b/Docs/Layers/fire_station.md @@ -5,7 +5,7 @@ - + Map layer to show fire stations. @@ -71,7 +71,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -131,7 +131,7 @@ This is rendered with `This station is operated by {operator}.` - - *Bureau of Fire Protection* corresponds with `operator=Bureau of Fire Protection&operator:type=government` + - *Bureau of Fire Protection* corresponds with `operator=Bureau of Fire Protection &operator:type=government` @@ -202,7 +202,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/fitness_centre.md b/Docs/Layers/fitness_centre.md index 9d6483660..35c498363 100644 --- a/Docs/Layers/fitness_centre.md +++ b/Docs/Layers/fitness_centre.md @@ -5,7 +5,7 @@ - + Layer showing fitness centres @@ -73,7 +73,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -291,7 +291,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/fitness_station.md b/Docs/Layers/fitness_station.md index 94a3ae10a..63deaddf4 100644 --- a/Docs/Layers/fitness_station.md +++ b/Docs/Layers/fitness_station.md @@ -5,7 +5,7 @@ - + Find a fitness station near you, and add missing ones. @@ -70,7 +70,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -219,7 +219,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/fixme.md b/Docs/Layers/fixme.md index 27d29ce75..0ccf5c172 100644 --- a/Docs/Layers/fixme.md +++ b/Docs/Layers/fixme.md @@ -5,7 +5,7 @@ - + OSM objects that likely need to be fixed, based on a FIXME tag. @@ -67,7 +67,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -146,6 +146,6 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` This document is autogenerated from [assets/layers/fixme/fixme.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/layers/fixme/fixme.json) diff --git a/Docs/Layers/food.md b/Docs/Layers/food.md index f586efc8e..f225dfdf6 100644 --- a/Docs/Layers/food.md +++ b/Docs/Layers/food.md @@ -5,7 +5,7 @@ - + A layer showing restaurants and fast-food amenities (with a special rendering for friteries) @@ -98,7 +98,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -459,6 +459,8 @@ The question is *Does this shop have a sugar free offering?* - *This shop has no sugar free offering* corresponds with `diet:sugar_free=no` +This tagrendering has labels `diets` + ### gluten_free @@ -477,6 +479,8 @@ The question is *Does this shop have a gluten free offering?* - *This shop has no gluten free offering* corresponds with `diet:gluten_free=no` +This tagrendering has labels `diets` + ### lactose_free @@ -495,6 +499,8 @@ The question is *Does {title()} have a lactose-free offering?* - *No lactose free offering* corresponds with `diet:lactose_free=no` +This tagrendering has labels `diets` + ### organic (no friture) @@ -679,7 +685,7 @@ The question is *Is there a fee for internet access?* - *Internet access is free at this place, for customers only* corresponds with `internet_access:fee=customers` -This tagrendering is only visible in the popup if the following condition is met: `internet_access!=no&internet_access~.+` +This tagrendering is only visible in the popup if the following condition is met: `internet_access!=no &internet_access~.+` @@ -768,7 +774,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` @@ -797,7 +803,7 @@ open_now.0 | Open now | _isOpen=yes id | question | osmTags ---- | ---------- | --------- -reservation.0 | Reservation not required | reservation=no\|reservation=optional\| +reservation.0 | Reservation not required | reservation=no \|reservation=optional \| @@ -813,49 +819,49 @@ food-category.2 | Only restaurants | amenity=restaurant id | question | osmTags ---- | ---------- | --------- -vegetarian.0 | Has a vegetarian menu | diet:vegetarian=yes\|diet:vegetarian=only\|diet:vegan=yes\|diet:vegan=only +vegetarian.0 | Has a vegetarian menu | diet:vegetarian=yes \|diet:vegetarian=only \|diet:vegan=yes \|diet:vegan=only id | question | osmTags ---- | ---------- | --------- -vegan.0 | Has a vegan menu | diet:vegan=yes\|diet:vegan=only +vegan.0 | Has a vegan menu | diet:vegan=yes \|diet:vegan=only id | question | osmTags ---- | ---------- | --------- -halal.0 | Has a halal menu | diet:halal=yes\|diet:halal=only +halal.0 | Has a halal menu | diet:halal=yes \|diet:halal=only id | question | osmTags ---- | ---------- | --------- -has_organic.0 | Has organic options | organic=yes\|organic=only +has_organic.0 | Has organic options | organic=yes \|organic=only id | question | osmTags ---- | ---------- | --------- -sugar_free.0 | Has a sugar-free offering | diet:sugar_free=yes\|diet:sugar_free=only\|diet:sugar_free=limited +sugar_free.0 | Has a sugar-free offering | diet:sugar_free=yes \|diet:sugar_free=only \|diet:sugar_free=limited id | question | osmTags ---- | ---------- | --------- -gluten_free.0 | Has a gluten free offering | diet:gluten_free=yes\|diet:gluten_free=only\|diet:gluten_free=limited +gluten_free.0 | Has a gluten free offering | diet:gluten_free=yes \|diet:gluten_free=only \|diet:gluten_free=limited id | question | osmTags ---- | ---------- | --------- -lactose_free.0 | Has a lactose free offering | diet:lactose_free=yes\|diet:lactose_free=only\|diet:lactose_free=limited +lactose_free.0 | Has a lactose free offering | diet:lactose_free=yes \|diet:lactose_free=only \|diet:lactose_free=limited @@ -877,7 +883,7 @@ accepts_cards.0 | Accepts payment cards | payment:cards=yes id | question | osmTags ---- | ---------- | --------- dogs.0 | No preference towards dogs (default) | -dogs.1 | Dogs allowed | dog=unleashed\|dog=yes +dogs.1 | Dogs allowed | dog=unleashed \|dog=yes dogs.2 | No dogs allowed | dog=no diff --git a/Docs/Layers/friture.md b/Docs/Layers/friture.md index 360525abc..fb63fc2a0 100644 --- a/Docs/Layers/friture.md +++ b/Docs/Layers/friture.md @@ -5,7 +5,7 @@ - + A layer showing restaurants and fast-food amenities (with a special rendering for friteries) @@ -94,7 +94,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -455,6 +455,8 @@ The question is *Does this shop have a sugar free offering?* - *This shop has no sugar free offering* corresponds with `diet:sugar_free=no` +This tagrendering has labels `diets` + ### gluten_free @@ -473,6 +475,8 @@ The question is *Does this shop have a gluten free offering?* - *This shop has no gluten free offering* corresponds with `diet:gluten_free=no` +This tagrendering has labels `diets` + ### lactose_free @@ -491,6 +495,8 @@ The question is *Does {title()} have a lactose-free offering?* - *No lactose free offering* corresponds with `diet:lactose_free=no` +This tagrendering has labels `diets` + ### organic (no friture) @@ -675,7 +681,7 @@ The question is *Is there a fee for internet access?* - *Internet access is free at this place, for customers only* corresponds with `internet_access:fee=customers` -This tagrendering is only visible in the popup if the following condition is met: `internet_access!=no&internet_access~.+` +This tagrendering is only visible in the popup if the following condition is met: `internet_access!=no &internet_access~.+` @@ -764,7 +770,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` @@ -793,7 +799,7 @@ open_now.0 | Open now | _isOpen=yes id | question | osmTags ---- | ---------- | --------- -reservation.0 | Reservation not required | reservation=no\|reservation=optional\| +reservation.0 | Reservation not required | reservation=no \|reservation=optional \| @@ -809,49 +815,49 @@ food-category.2 | Only restaurants | amenity=restaurant id | question | osmTags ---- | ---------- | --------- -vegetarian.0 | Has a vegetarian menu | diet:vegetarian=yes\|diet:vegetarian=only\|diet:vegan=yes\|diet:vegan=only +vegetarian.0 | Has a vegetarian menu | diet:vegetarian=yes \|diet:vegetarian=only \|diet:vegan=yes \|diet:vegan=only id | question | osmTags ---- | ---------- | --------- -vegan.0 | Has a vegan menu | diet:vegan=yes\|diet:vegan=only +vegan.0 | Has a vegan menu | diet:vegan=yes \|diet:vegan=only id | question | osmTags ---- | ---------- | --------- -halal.0 | Has a halal menu | diet:halal=yes\|diet:halal=only +halal.0 | Has a halal menu | diet:halal=yes \|diet:halal=only id | question | osmTags ---- | ---------- | --------- -has_organic.0 | Has organic options | organic=yes\|organic=only +has_organic.0 | Has organic options | organic=yes \|organic=only id | question | osmTags ---- | ---------- | --------- -sugar_free.0 | Has a sugar-free offering | diet:sugar_free=yes\|diet:sugar_free=only\|diet:sugar_free=limited +sugar_free.0 | Has a sugar-free offering | diet:sugar_free=yes \|diet:sugar_free=only \|diet:sugar_free=limited id | question | osmTags ---- | ---------- | --------- -gluten_free.0 | Has a gluten free offering | diet:gluten_free=yes\|diet:gluten_free=only\|diet:gluten_free=limited +gluten_free.0 | Has a gluten free offering | diet:gluten_free=yes \|diet:gluten_free=only \|diet:gluten_free=limited id | question | osmTags ---- | ---------- | --------- -lactose_free.0 | Has a lactose free offering | diet:lactose_free=yes\|diet:lactose_free=only\|diet:lactose_free=limited +lactose_free.0 | Has a lactose free offering | diet:lactose_free=yes \|diet:lactose_free=only \|diet:lactose_free=limited @@ -873,7 +879,7 @@ accepts_cards.0 | Accepts payment cards | payment:cards=yes id | question | osmTags ---- | ---------- | --------- dogs.0 | No preference towards dogs (default) | -dogs.1 | Dogs allowed | dog=unleashed\|dog=yes +dogs.1 | Dogs allowed | dog=unleashed \|dog=yes dogs.2 | No dogs allowed | dog=no diff --git a/Docs/Layers/ghost_bike.md b/Docs/Layers/ghost_bike.md index 42c94fc94..0cf80b944 100644 --- a/Docs/Layers/ghost_bike.md +++ b/Docs/Layers/ghost_bike.md @@ -5,7 +5,7 @@ - + A layer showing memorials for cyclists, killed in road accidents @@ -70,7 +70,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -211,7 +211,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/governments.md b/Docs/Layers/governments.md index 972356e0a..473c950e3 100644 --- a/Docs/Layers/governments.md +++ b/Docs/Layers/governments.md @@ -5,7 +5,7 @@ - + This layer show governmental buildings. It was setup as commissioned layer for the client of OSOC '22 @@ -70,7 +70,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -198,7 +198,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/guidepost.md b/Docs/Layers/guidepost.md index e29df1547..07c79d2db 100644 --- a/Docs/Layers/guidepost.md +++ b/Docs/Layers/guidepost.md @@ -5,7 +5,7 @@ - + Guideposts (also known as fingerposts or finger posts) are often found along official hiking/cycling/riding/skiing routes to indicate the directions to different destinations @@ -68,7 +68,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -84,6 +84,30 @@ This tagrendering has no question and is thus read-only +### type + + + +The question is *What kind of routes are shown on this guidepost?* + + + + + + - *This guidepost shows bicycle routes* corresponds with `bicycle=yes` + - Unselecting this answer will add + - *This guidepost shows hiking routes* corresponds with `hiking=yes` + - Unselecting this answer will add + - *This guidepost shows mountain bike routes* corresponds with `mtb=yes` + - Unselecting this answer will add + - *This guidepost shows horse riding routes* corresponds with `horse=yes` + - Unselecting this answer will add + - *This guidepost shows ski routes* corresponds with `ski=yes` + - Unselecting this answer will add + + + + ### leftover-questions @@ -136,7 +160,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/hackerspace.md b/Docs/Layers/hackerspace.md index dcf2e7d37..0de203e0a 100644 --- a/Docs/Layers/hackerspace.md +++ b/Docs/Layers/hackerspace.md @@ -5,7 +5,7 @@ - + Hackerspace @@ -80,7 +80,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -430,7 +430,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/health_and_social_places_without_etymology.md b/Docs/Layers/health_and_social_places_without_etymology.md index 1bbd8f4e5..ecb6b7d79 100644 --- a/Docs/Layers/health_and_social_places_without_etymology.md +++ b/Docs/Layers/health_and_social_places_without_etymology.md @@ -5,7 +5,7 @@ - + All objects which have an etymology known @@ -67,7 +67,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -190,7 +190,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/hospital.md b/Docs/Layers/hospital.md index 72080c912..7bc8461f8 100644 --- a/Docs/Layers/hospital.md +++ b/Docs/Layers/hospital.md @@ -5,7 +5,7 @@ - + A layer showing hospital grounds @@ -73,7 +73,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -219,7 +219,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/hotel.md b/Docs/Layers/hotel.md index 49abe4609..4880a559a 100644 --- a/Docs/Layers/hotel.md +++ b/Docs/Layers/hotel.md @@ -5,7 +5,7 @@ - + Layer showing all hotels @@ -75,7 +75,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -236,7 +236,7 @@ The question is *Is there a fee for internet access?* - *Internet access is free at this place, for customers only* corresponds with `internet_access:fee=customers` -This tagrendering is only visible in the popup if the following condition is met: `internet_access!=no&internet_access~.+` +This tagrendering is only visible in the popup if the following condition is met: `internet_access!=no &internet_access~.+` @@ -303,7 +303,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/hydrant.md b/Docs/Layers/hydrant.md index c9d3fdd3b..df83e43bb 100644 --- a/Docs/Layers/hydrant.md +++ b/Docs/Layers/hydrant.md @@ -5,7 +5,7 @@ - + Map layer to show fire hydrants. @@ -73,7 +73,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -243,7 +243,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/ice_cream.md b/Docs/Layers/ice_cream.md new file mode 100644 index 000000000..2201ed4b7 --- /dev/null +++ b/Docs/Layers/ice_cream.md @@ -0,0 +1,331 @@ +[//]: # (WARNING: this file is automatically generated. Please find the sources at the bottom and edit those sources) + + ice_cream +=========== + + + + + +A place where ice cream is sold over the counter + + + + + + + - This layer is shown at zoomlevel **0** and higher + + + + +#### Themes using this layer + + + + + + - [icecream](https://mapcomplete.org/icecream) + - [personal](https://mapcomplete.org/personal) + - [shops](https://mapcomplete.org/shops) + + +This is a special layer - data is not sourced from OpenStreetMap + + + + Supported attributes +---------------------- + + + +Warning: + +this quick overview is incomplete + + + +attribute | type | values which are supported by this layer +----------- | ------ | ------------------------------------------ +[](https://taginfo.openstreetmap.org/keys/id#values) [id](https://wiki.openstreetmap.org/wiki/Key:id) | Multiple choice | +[](https://taginfo.openstreetmap.org/keys/name#values) [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) | +[](https://taginfo.openstreetmap.org/keys/opening_hours#values) [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) | [opening_hours](../SpecialInputElements.md#opening_hours) | +[](https://taginfo.openstreetmap.org/keys/phone#values) [phone](https://wiki.openstreetmap.org/wiki/Key:phone) | [phone](../SpecialInputElements.md#phone) | +[](https://taginfo.openstreetmap.org/keys/email#values) [email](https://wiki.openstreetmap.org/wiki/Key:email) | [email](../SpecialInputElements.md#email) | +[](https://taginfo.openstreetmap.org/keys/website#values) [website](https://wiki.openstreetmap.org/wiki/Key:website) | [url](../SpecialInputElements.md#url) | +[](https://taginfo.openstreetmap.org/keys/diet:sugar_free#values) [diet:sugar_free](https://wiki.openstreetmap.org/wiki/Key:diet:sugar_free) | Multiple choice | [only](https://wiki.openstreetmap.org/wiki/Tag:diet:sugar_free%3Donly) [yes](https://wiki.openstreetmap.org/wiki/Tag:diet:sugar_free%3Dyes) [limited](https://wiki.openstreetmap.org/wiki/Tag:diet:sugar_free%3Dlimited) [no](https://wiki.openstreetmap.org/wiki/Tag:diet:sugar_free%3Dno) +[](https://taginfo.openstreetmap.org/keys/diet:lactose_free#values) [diet:lactose_free](https://wiki.openstreetmap.org/wiki/Key:diet:lactose_free) | Multiple choice | [only](https://wiki.openstreetmap.org/wiki/Tag:diet:lactose_free%3Donly) [yes](https://wiki.openstreetmap.org/wiki/Tag:diet:lactose_free%3Dyes) [limited](https://wiki.openstreetmap.org/wiki/Tag:diet:lactose_free%3Dlimited) [no](https://wiki.openstreetmap.org/wiki/Tag:diet:lactose_free%3Dno) +[](https://taginfo.openstreetmap.org/keys/diet:gluten_free#values) [diet:gluten_free](https://wiki.openstreetmap.org/wiki/Key:diet:gluten_free) | Multiple choice | [only](https://wiki.openstreetmap.org/wiki/Tag:diet:gluten_free%3Donly) [yes](https://wiki.openstreetmap.org/wiki/Tag:diet:gluten_free%3Dyes) [limited](https://wiki.openstreetmap.org/wiki/Tag:diet:gluten_free%3Dlimited) [no](https://wiki.openstreetmap.org/wiki/Tag:diet:gluten_free%3Dno) +[](https://taginfo.openstreetmap.org/keys/wheelchair#values) [wheelchair](https://wiki.openstreetmap.org/wiki/Key:wheelchair) | Multiple choice | [designated](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Ddesignated) [yes](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dyes) [limited](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dlimited) [no](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dno) + + + + +### just_created + + + +This element shows a 'thank you' that the contributor has recently created this element + +This tagrendering has no question and is thus read-only + + + + + + - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` + + +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` + + + +### images + + + +This block shows the known images which are linked with the `image`-keys, but also via `mapillary` and `wikidata` and shows the button to upload new images + +This tagrendering has no question and is thus read-only + + + + + +### 1 + + + +The question is *What is the name of this ice cream parlor?* + +This rendering asks information about the property [name](https://wiki.openstreetmap.org/wiki/Key:name) + +This is rendered with `This ice cream parlor is named {name}` + + + + + +### opening_hours + + + +The question is *What are the opening hours of {title()}?* + +This rendering asks information about the property [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) + +This is rendered with `

Opening hours

{opening_hours_table(opening_hours)}` + + + + + +### phone + + + +The question is *What is the phone number of {title()}?* + +This rendering asks information about the property [phone](https://wiki.openstreetmap.org/wiki/Key:phone) + +This is rendered with `
{phone}` + + + + + + - *{contact:phone}* corresponds with `contact:phone~.+` + - This option cannot be chosen as answer + + +This tagrendering has labels `contact` + + + +### email + + + +The question is *What is the email address of {title()}?* + +This rendering asks information about the property [email](https://wiki.openstreetmap.org/wiki/Key:email) + +This is rendered with `{email}` + + + + + + - *{contact:email}* corresponds with `contact:email~.+` + - This option cannot be chosen as answer + + +This tagrendering has labels `contact` + + + +### website + + + +The question is *What is the website of {title()}?* + +This rendering asks information about the property [website](https://wiki.openstreetmap.org/wiki/Key:website) + +This is rendered with `{website}` + + + + + + - *{contact:website}* corresponds with `contact:website~.+` + - This option cannot be chosen as answer + + +This tagrendering has labels `contact` + + + +### sugar_free + + + +The question is *Does this shop have a sugar free offering?* + + + + + + - *This shop only sells sugar free products* corresponds with `diet:sugar_free=only` + - *This shop has a big sugar free offering* corresponds with `diet:sugar_free=yes` + - *This shop has a limited sugar free offering* corresponds with `diet:sugar_free=limited` + - *This shop has no sugar free offering* corresponds with `diet:sugar_free=no` + + +This tagrendering has labels `diets` + + + +### lactose_free + + + +The question is *Does {title()} have a lactose-free offering?* + + + + + + - *Only sells lactose free products* corresponds with `diet:lactose_free=only` + - *Big lactose free offering* corresponds with `diet:lactose_free=yes` + - *Limited lactose free offering* corresponds with `diet:lactose_free=limited` + - *No lactose free offering* corresponds with `diet:lactose_free=no` + + +This tagrendering has labels `diets` + + + +### gluten_free + + + +The question is *Does this shop have a gluten free offering?* + + + + + + - *This shop only sells gluten free products* corresponds with `diet:gluten_free=only` + - *This shop has a big gluten free offering* corresponds with `diet:gluten_free=yes` + - *This shop has a limited gluten free offering* corresponds with `diet:gluten_free=limited` + - *This shop has no gluten free offering* corresponds with `diet:gluten_free=no` + + +This tagrendering has labels `diets` + + + +### payment-options + + + +The question is *Which methods of payment are accepted here?* + + + + + + - *Cash is accepted here* corresponds with `payment:cash=yes` + - Unselecting this answer will add payment:cash=no + - *Payment cards are accepted here* corresponds with `payment:cards=yes` + - Unselecting this answer will add payment:cards=no + - *Payment by QR-code is possible here* corresponds with `payment:qr_code=yes` + - Unselecting this answer will add payment:qr_code=no + + + + +### wheelchair-access + + + +The question is *Is this place accessible with a wheelchair?* + + + + + + - *This place is specially adapted for wheelchair users* corresponds with `wheelchair=designated` + - *This place is easily reachable with a wheelchair* corresponds with `wheelchair=yes` + - *It is possible to reach this place in a wheelchair, but it is not easy* corresponds with `wheelchair=limited` + - *This place is not reachable with a wheelchair* corresponds with `wheelchair=no` + + + + +### leftover-questions + + + +This tagrendering has no question and is thus read-only + + + + + +### minimap + + + +Shows a small map with the feature. Added by default to every popup + +This tagrendering has no question and is thus read-only + + + + + +### last_edit + + + +Gives some metainfo about the last edit and who did edit it - rendering only + +This tagrendering has no question and is thus read-only + + + +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` + + + +### all-tags + + + +This tagrendering has no question and is thus read-only + + + +This document is autogenerated from [assets/layers/ice_cream/ice_cream.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/layers/ice_cream/ice_cream.json) diff --git a/Docs/Layers/indoors.md b/Docs/Layers/indoors.md index fea1ebf51..e16446493 100644 --- a/Docs/Layers/indoors.md +++ b/Docs/Layers/indoors.md @@ -85,7 +85,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -154,7 +154,7 @@ This is rendered with `This room has the reference number {ref}` -This tagrendering is only visible in the popup if the following condition is met: `indoor=room|indoor=area|indoor=corridor` +This tagrendering is only visible in the popup if the following condition is met: `indoor=room |indoor=area |indoor=corridor` @@ -170,7 +170,7 @@ This is rendered with `This room is named {name}` -This tagrendering is only visible in the popup if the following condition is met: `indoor=room|indoor=area|indoor=corridor` +This tagrendering is only visible in the popup if the following condition is met: `indoor=room |indoor=area |indoor=corridor` @@ -224,7 +224,7 @@ This is rendered with `At most {capacity} people fit this room` -This tagrendering is only visible in the popup if the following condition is met: `room=waiting|room=restaurant|room=office|room=nursery|room=conference|room=auditorium|room=chapel|room=bedroom|room=classroom` +This tagrendering is only visible in the popup if the following condition is met: `room=waiting |room=restaurant |room=office |room=nursery |room=conference |room=auditorium |room=chapel |room=bedroom |room=classroom` @@ -284,7 +284,7 @@ The question is *Are these toilets free to use?* - *Free to use* corresponds with `fee=no` -This tagrendering is only visible in the popup if the following condition is met: `amenity=toilets&access!=no` +This tagrendering is only visible in the popup if the following condition is met: `amenity=toilets &access!=no` This tagrendering has labels `relevant-questions` @@ -302,7 +302,7 @@ This is rendered with `The fee is {charge}` -This tagrendering is only visible in the popup if the following condition is met: `amenity=toilets&fee=yes` +This tagrendering is only visible in the popup if the following condition is met: `amenity=toilets &fee=yes` This tagrendering has labels `relevant-questions` @@ -336,7 +336,7 @@ The question is *Which methods of payment are accepted here?* - Unselecting this answer will add payment:credit_cards=no -This tagrendering is only visible in the popup if the following condition is met: `amenity=toilets&fee=yes` +This tagrendering is only visible in the popup if the following condition is met: `amenity=toilets &fee=yes` This tagrendering has labels `relevant-questions` @@ -359,7 +359,7 @@ This is rendered with `

Opening hours

{opening_hours_table(opening_hours - *24/7 opened (including holidays)* corresponds with `opening_hours=24/7` -This tagrendering is only visible in the popup if the following condition is met: `amenity=toilets&access!=no` +This tagrendering is only visible in the popup if the following condition is met: `amenity=toilets &access!=no` This tagrendering has labels `relevant-questions` @@ -398,7 +398,7 @@ This is rendered with `The door to the wheelchair-accessible toilet is {canonic -This tagrendering is only visible in the popup if the following condition is met: `amenity=toilets&wheelchair=yes|wheelchair=designated` +This tagrendering is only visible in the popup if the following condition is met: `amenity=toilets &wheelchair=yes |wheelchair=designated` This tagrendering has labels `relevant-questions` @@ -466,7 +466,7 @@ This is rendered with `The changing table is located at {changing_table:locatio - *The changing table is in a dedicated room. * corresponds with `changing_table:location=dedicated_room` -This tagrendering is only visible in the popup if the following condition is met: `amenity=toilets&changing_table=yes` +This tagrendering is only visible in the popup if the following condition is met: `amenity=toilets &changing_table=yes` This tagrendering has labels `relevant-questions` @@ -506,7 +506,7 @@ The question is *Does one have to bring their own toilet paper to this toilet?* - *You have to bring your own toilet paper to this toilet* corresponds with `toilets:paper_supplied=no` -This tagrendering is only visible in the popup if the following condition is met: `amenity=toilets&toilets:position!=urinal` +This tagrendering is only visible in the popup if the following condition is met: `amenity=toilets &toilets:position!=urinal` This tagrendering has labels `relevant-questions` @@ -544,7 +544,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/information_board.md b/Docs/Layers/information_board.md index 91a1e483a..ff764277c 100644 --- a/Docs/Layers/information_board.md +++ b/Docs/Layers/information_board.md @@ -5,7 +5,7 @@ - + A layer showing touristical, road side information boards (e.g. giving information about the landscape, a building, a feature, a map, …) @@ -66,7 +66,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -134,7 +134,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/kerbs.md b/Docs/Layers/kerbs.md index b507121f7..48d0eb499 100644 --- a/Docs/Layers/kerbs.md +++ b/Docs/Layers/kerbs.md @@ -5,7 +5,7 @@ - + A layer showing kerbs. @@ -74,7 +74,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -184,7 +184,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/kindergarten_childcare.md b/Docs/Layers/kindergarten_childcare.md index aa512c1a6..a59c17b37 100644 --- a/Docs/Layers/kindergarten_childcare.md +++ b/Docs/Layers/kindergarten_childcare.md @@ -73,7 +73,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -255,7 +255,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/lit_streets.md b/Docs/Layers/lit_streets.md index 77a403938..7bb33b21e 100644 --- a/Docs/Layers/lit_streets.md +++ b/Docs/Layers/lit_streets.md @@ -65,7 +65,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -142,7 +142,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/map.md b/Docs/Layers/map.md index 356ce84e9..e14ea9dc9 100644 --- a/Docs/Layers/map.md +++ b/Docs/Layers/map.md @@ -5,7 +5,7 @@ - + A map, meant for tourists which is permanently installed in the public space @@ -71,7 +71,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -163,7 +163,7 @@ The question is *Is the OpenStreetMap-attribution given?* - This option cannot be chosen as answer -This tagrendering is only visible in the popup if the following condition is met: `map_source~^((O|)pen(S|s)treet(M|m)ap)$|map_source=osm|map_source=OSM` +This tagrendering is only visible in the popup if the following condition is met: `map_source~^((O|)pen(S|s)treet(M|m)ap)$ |map_source=osm |map_source=OSM` This tagrendering has labels `map` @@ -221,7 +221,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/maproulette.md b/Docs/Layers/maproulette.md index 2b0ba2e15..10c6e7b77 100644 --- a/Docs/Layers/maproulette.md +++ b/Docs/Layers/maproulette.md @@ -5,7 +5,7 @@ - + Layer showing all tasks in MapRoulette @@ -56,7 +56,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -150,7 +150,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/maproulette_challenge.md b/Docs/Layers/maproulette_challenge.md index ed3c2e770..ef1819ece 100644 --- a/Docs/Layers/maproulette_challenge.md +++ b/Docs/Layers/maproulette_challenge.md @@ -5,7 +5,7 @@ - + Layer showing tasks of a single MapRoulette challenge. This layer is intended to be reused and extended in themes; refer to [the documentation](https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Integrating_Maproulette.md) on how to do this. @@ -70,7 +70,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -138,7 +138,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/maxspeed.md b/Docs/Layers/maxspeed.md index 9c33d284e..fad4833c1 100644 --- a/Docs/Layers/maxspeed.md +++ b/Docs/Layers/maxspeed.md @@ -68,7 +68,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -133,7 +133,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/medical-shops.md b/Docs/Layers/medical-shops.md index 94a4aaacb..b3d1bf461 100644 --- a/Docs/Layers/medical-shops.md +++ b/Docs/Layers/medical-shops.md @@ -5,7 +5,7 @@ - + A shop @@ -47,7 +47,7 @@ attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ [](https://taginfo.openstreetmap.org/keys/id#values) [id](https://wiki.openstreetmap.org/wiki/Key:id) | Multiple choice | [](https://taginfo.openstreetmap.org/keys/name#values) [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) | -[](https://taginfo.openstreetmap.org/keys/shop#values) [shop](https://wiki.openstreetmap.org/wiki/Key:shop) | [string](../SpecialInputElements.md#string) | [agrarian](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dagrarian) [alcohol](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dalcohol) [anime](https://wiki.openstreetmap.org/wiki/Tag:shop%3Danime) [antiques](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dantiques) [appliance](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dappliance) [art](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dart) [baby_goods](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbaby_goods) [bag](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbag) [bakery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbakery) [bathroom_furnishing](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbathroom_furnishing) [beauty](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbeauty) [bed](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbed) [beverages](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbeverages) [bicycle](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbicycle) [boat](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dboat) [bookmaker](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbookmaker) [books](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbooks) [brewing_supplies](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbrewing_supplies) [butcher](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbutcher) [camera](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcamera) [candles](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcandles) [cannabis](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcannabis) [car](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcar) [car_parts](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcar_parts) [car_repair](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcar_repair) [caravan](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcaravan) [carpet](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcarpet) [catalogue](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcatalogue) [charity](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcharity) [cheese](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcheese) [chemist](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dchemist) [chocolate](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dchocolate) [clothes](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dclothes) [coffee](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcoffee) [collector](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcollector) [computer](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcomputer) [confectionery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dconfectionery) [convenience](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dconvenience) [copyshop](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcopyshop) [cosmetics](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcosmetics) [country_store](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcountry_store) [craft](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcraft) [curtain](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcurtain) [dairy](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddairy) [deli](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddeli) [department_store](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddepartment_store) [doityourself](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddoityourself) [doors](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddoors) [dry_cleaning](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddry_cleaning) [e-cigarette](https://wiki.openstreetmap.org/wiki/Tag:shop%3De-cigarette) [electrical](https://wiki.openstreetmap.org/wiki/Tag:shop%3Delectrical) [electronics](https://wiki.openstreetmap.org/wiki/Tag:shop%3Delectronics) [erotic](https://wiki.openstreetmap.org/wiki/Tag:shop%3Derotic) [fabric](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfabric) [farm](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfarm) [fashion_accessories](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfashion_accessories) [fireplace](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfireplace) [fishing](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfishing) [flooring](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dflooring) [florist](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dflorist) [frame](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dframe) [frozen_food](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfrozen_food) [fuel](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfuel) [funeral_directors](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfuneral_directors) [furniture](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfurniture) [games](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgames) [garden_centre](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgarden_centre) [gas](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgas) [general](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgeneral) [gift](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgift) [greengrocer](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgreengrocer) [hairdresser](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhairdresser) [hairdresser_supply](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhairdresser_supply) [hardware](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhardware) [health_food](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhealth_food) [hearing_aids](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhearing_aids) [herbalist](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dherbalist) [hifi](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhifi) [hobby](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhobby) [household_linen](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhousehold_linen) [houseware](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhouseware) [hunting](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhunting) [interior_decoration](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dinterior_decoration) [jewelry](https://wiki.openstreetmap.org/wiki/Tag:shop%3Djewelry) [kiosk](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dkiosk) [kitchen](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dkitchen) [laundry](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dlaundry) [leather](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dleather) [lighting](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dlighting) [locksmith](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dlocksmith) [lottery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dlottery) [mall](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmall) [massage](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmassage) [medical_supply](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmedical_supply) [military_surplus](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmilitary_surplus) [mobile_phone](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmobile_phone) [model](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmodel) [money_lender](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmoney_lender) [motorcycle](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmotorcycle) [motorcycle_repair](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmotorcycle_repair) [music](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmusic) [musical_instrument](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmusical_instrument) [newsagent](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dnewsagent) [nutrition_supplements](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dnutrition_supplements) [optician](https://wiki.openstreetmap.org/wiki/Tag:shop%3Doptician) [outdoor](https://wiki.openstreetmap.org/wiki/Tag:shop%3Doutdoor) [outpost](https://wiki.openstreetmap.org/wiki/Tag:shop%3Doutpost) [paint](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpaint) [party](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dparty) [pastry](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpastry) [pawnbroker](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpawnbroker) [perfumery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dperfumery) [pet](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpet) [pet_grooming](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpet_grooming) [photo](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dphoto) [pottery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpottery) [printer_ink](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dprinter_ink) [psychic](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpsychic) [pyrotechnics](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpyrotechnics) [radiotechnics](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dradiotechnics) [religion](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dreligion) [rental](https://wiki.openstreetmap.org/wiki/Tag:shop%3Drental) [repair](https://wiki.openstreetmap.org/wiki/Tag:shop%3Drepair) [scuba_diving](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dscuba_diving) [seafood](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dseafood) [second_hand](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dsecond_hand) [sewing](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dsewing) [shoe_repair](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dshoe_repair) [shoes](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dshoes) [spices](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dspices) [sports](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dsports) [stationery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dstationery) [storage_rental](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dstorage_rental) [supermarket](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dsupermarket) [swimming_pool](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dswimming_pool) [tailor](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtailor) [tattoo](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtattoo) [tea](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtea) [telecommunication](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtelecommunication) [ticket](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dticket) [tiles](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtiles) [tobacco](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtobacco) [tool_hire](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtool_hire) [toys](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtoys) [trade](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtrade) [travel_agency](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtravel_agency) [trophy](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtrophy) [tyres](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtyres) [vacuum_cleaner](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dvacuum_cleaner) [variety_store](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dvariety_store) [video](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dvideo) [video_games](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dvideo_games) [watches](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwatches) [water](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwater) [water_sports](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwater_sports) [weapons](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dweapons) [wholesale](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwholesale) [wigs](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwigs) [window_blind](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwindow_blind) [wine](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwine) +[](https://taginfo.openstreetmap.org/keys/shop#values) [shop](https://wiki.openstreetmap.org/wiki/Key:shop) | [string](../SpecialInputElements.md#string) | [vacant](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dvacant) [agrarian](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dagrarian) [alcohol](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dalcohol) [anime](https://wiki.openstreetmap.org/wiki/Tag:shop%3Danime) [antiques](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dantiques) [appliance](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dappliance) [art](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dart) [baby_goods](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbaby_goods) [bag](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbag) [bakery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbakery) [bathroom_furnishing](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbathroom_furnishing) [beauty](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbeauty) [bed](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbed) [beverages](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbeverages) [bicycle](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbicycle) [boat](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dboat) [bookmaker](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbookmaker) [books](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbooks) [brewing_supplies](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbrewing_supplies) [butcher](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbutcher) [camera](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcamera) [candles](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcandles) [cannabis](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcannabis) [car](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcar) [car_parts](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcar_parts) [car_repair](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcar_repair) [caravan](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcaravan) [carpet](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcarpet) [catalogue](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcatalogue) [charity](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcharity) [cheese](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcheese) [chemist](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dchemist) [chocolate](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dchocolate) [clothes](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dclothes) [coffee](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcoffee) [collector](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcollector) [computer](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcomputer) [confectionery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dconfectionery) [convenience](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dconvenience) [copyshop](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcopyshop) [cosmetics](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcosmetics) [country_store](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcountry_store) [craft](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcraft) [curtain](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcurtain) [dairy](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddairy) [deli](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddeli) [department_store](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddepartment_store) [doityourself](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddoityourself) [doors](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddoors) [dry_cleaning](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddry_cleaning) [e-cigarette](https://wiki.openstreetmap.org/wiki/Tag:shop%3De-cigarette) [electrical](https://wiki.openstreetmap.org/wiki/Tag:shop%3Delectrical) [electronics](https://wiki.openstreetmap.org/wiki/Tag:shop%3Delectronics) [erotic](https://wiki.openstreetmap.org/wiki/Tag:shop%3Derotic) [fabric](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfabric) [farm](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfarm) [fashion_accessories](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfashion_accessories) [fireplace](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfireplace) [fishing](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfishing) [flooring](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dflooring) [florist](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dflorist) [frame](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dframe) [frozen_food](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfrozen_food) [fuel](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfuel) [funeral_directors](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfuneral_directors) [furniture](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfurniture) [games](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgames) [garden_centre](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgarden_centre) [gas](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgas) [general](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgeneral) [gift](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgift) [greengrocer](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgreengrocer) [hairdresser](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhairdresser) [hairdresser_supply](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhairdresser_supply) [hardware](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhardware) [health_food](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhealth_food) [hearing_aids](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhearing_aids) [herbalist](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dherbalist) [hifi](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhifi) [honey](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhoney) [household_linen](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhousehold_linen) [houseware](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhouseware) [hunting](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhunting) [interior_decoration](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dinterior_decoration) [jewelry](https://wiki.openstreetmap.org/wiki/Tag:shop%3Djewelry) [kiosk](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dkiosk) [kitchen](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dkitchen) [laundry](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dlaundry) [leather](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dleather) [lighting](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dlighting) [locksmith](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dlocksmith) [lottery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dlottery) [mall](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmall) [massage](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmassage) [medical_supply](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmedical_supply) [military_surplus](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmilitary_surplus) [mobile_phone](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmobile_phone) [model](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmodel) [money_lender](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmoney_lender) [motorcycle](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmotorcycle) [motorcycle_repair](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmotorcycle_repair) [music](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmusic) [musical_instrument](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmusical_instrument) [newsagent](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dnewsagent) [nutrition_supplements](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dnutrition_supplements) [nuts](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dnuts) [optician](https://wiki.openstreetmap.org/wiki/Tag:shop%3Doptician) [outdoor](https://wiki.openstreetmap.org/wiki/Tag:shop%3Doutdoor) [outpost](https://wiki.openstreetmap.org/wiki/Tag:shop%3Doutpost) [paint](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpaint) [party](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dparty) [pasta](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpasta) [pastry](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpastry) [pawnbroker](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpawnbroker) [perfumery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dperfumery) [pet](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpet) [pet_grooming](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpet_grooming) [photo](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dphoto) [pottery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpottery) [printer_ink](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dprinter_ink) [psychic](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpsychic) [pyrotechnics](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpyrotechnics) [radiotechnics](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dradiotechnics) [religion](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dreligion) [rental](https://wiki.openstreetmap.org/wiki/Tag:shop%3Drental) [repair](https://wiki.openstreetmap.org/wiki/Tag:shop%3Drepair) [rice](https://wiki.openstreetmap.org/wiki/Tag:shop%3Drice) [scuba_diving](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dscuba_diving) [seafood](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dseafood) [second_hand](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dsecond_hand) [sewing](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dsewing) [shoe_repair](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dshoe_repair) [shoes](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dshoes) [spices](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dspices) [sports](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dsports) [stationery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dstationery) [storage_rental](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dstorage_rental) [supermarket](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dsupermarket) [swimming_pool](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dswimming_pool) [tailor](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtailor) [tattoo](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtattoo) [tea](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtea) [telecommunication](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtelecommunication) [ticket](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dticket) [tiles](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtiles) [tobacco](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtobacco) [tool_hire](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtool_hire) [toys](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtoys) [trade](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtrade) [travel_agency](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtravel_agency) [trophy](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtrophy) [tyres](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtyres) [vacuum_cleaner](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dvacuum_cleaner) [variety_store](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dvariety_store) [video](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dvideo) [video_games](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dvideo_games) [watches](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwatches) [water](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwater) [water_sports](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwater_sports) [weapons](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dweapons) [wholesale](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwholesale) [wigs](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwigs) [window_blind](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwindow_blind) [wine](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwine) [](https://taginfo.openstreetmap.org/keys/second_hand#values) [second_hand](https://wiki.openstreetmap.org/wiki/Key:second_hand) | Multiple choice | [only](https://wiki.openstreetmap.org/wiki/Tag:second_hand%3Donly) [yes](https://wiki.openstreetmap.org/wiki/Tag:second_hand%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:second_hand%3Dno) [](https://taginfo.openstreetmap.org/keys/opening_hours#values) [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) | [opening_hours](../SpecialInputElements.md#opening_hours) | [](https://taginfo.openstreetmap.org/keys/website#values) [website](https://wiki.openstreetmap.org/wiki/Key:website) | [url](../SpecialInputElements.md#url) | @@ -80,7 +80,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -124,10 +124,11 @@ This is rendered with `This is a {shop}` + - *Vacant Shop* corresponds with `shop=vacant` - *Farm Supply Shop* corresponds with `shop=agrarian` - *Liquor Store* corresponds with `shop=alcohol` - *Anime / Manga Shop* corresponds with `shop=anime` - - *Antiques Shop* corresponds with `shop=antiques` + - *Antique Shop* corresponds with `shop=antiques` - *Appliance Store* corresponds with `shop=appliance` - *Art Store* corresponds with `shop=art` - *Baby Goods Store* corresponds with `shop=baby_goods` @@ -140,7 +141,7 @@ This is rendered with `This is a {shop}` - *Bicycle Shop* corresponds with `shop=bicycle` - *Boat Store* corresponds with `shop=boat` - *Bookmaker* corresponds with `shop=bookmaker` - - *Book Store* corresponds with `shop=books` + - *Bookstore* corresponds with `shop=books` - *Brewing Supply Store* corresponds with `shop=brewing_supplies` - *Butcher* corresponds with `shop=butcher` - *Camera Equipment Store* corresponds with `shop=camera` @@ -164,11 +165,11 @@ This is rendered with `This is a {shop}` - *Convenience Store* corresponds with `shop=convenience` - *Copy Store* corresponds with `shop=copyshop` - *Cosmetics Store* corresponds with `shop=cosmetics` - - *Country Store* corresponds with `shop=country_store` + - *Rural Supplies Store* corresponds with `shop=country_store` - *Arts & Crafts Store* corresponds with `shop=craft` - *Curtain Store* corresponds with `shop=curtain` - *Dairy Store* corresponds with `shop=dairy` - - *Deli* corresponds with `shop=deli` + - *Delicatessen* corresponds with `shop=deli` - *Department Store* corresponds with `shop=department_store` - *DIY Store* corresponds with `shop=doityourself` - *Door Shop* corresponds with `shop=doors` @@ -198,11 +199,11 @@ This is rendered with `This is a {shop}` - *Hairdresser* corresponds with `shop=hairdresser` - *Hairdresser Supply Store* corresponds with `shop=hairdresser_supply` - *Hardware Store* corresponds with `shop=hardware` - - *Health Food Shop* corresponds with `shop=health_food` + - *Health Food Store* corresponds with `shop=health_food` - *Hearing Aids Store* corresponds with `shop=hearing_aids` - *Herbalist* corresponds with `shop=herbalist` - *Hifi Store* corresponds with `shop=hifi` - - *Hobby Shop* corresponds with `shop=hobby` + - *Honey Store* corresponds with `shop=honey` - *Household Linen Shop* corresponds with `shop=household_linen` - *Houseware Store* corresponds with `shop=houseware` - *Hunting Shop* corresponds with `shop=hunting` @@ -226,18 +227,20 @@ This is rendered with `This is a {shop}` - *Motorcycle Repair Shop* corresponds with `shop=motorcycle_repair` - *Music Store* corresponds with `shop=music` - *Musical Instrument Store* corresponds with `shop=musical_instrument` - - *Newspaper/Magazine Shop* corresponds with `shop=newsagent` + - *Newsstand* corresponds with `shop=newsagent` - *Nutrition Supplements Store* corresponds with `shop=nutrition_supplements` + - *Nuts Shop* corresponds with `shop=nuts` - *Optician* corresponds with `shop=optician` - *Outdoors Store* corresponds with `shop=outdoor` - *Online Retailer Outpost* corresponds with `shop=outpost` - *Paint Store* corresponds with `shop=paint` - *Party Supply Store* corresponds with `shop=party` + - *Pasta Store* corresponds with `shop=pasta` - *Pastry Shop* corresponds with `shop=pastry` - - *Pawn Shop* corresponds with `shop=pawnbroker` + - *Pawnshop* corresponds with `shop=pawnbroker` - *Perfume Store* corresponds with `shop=perfumery` - *Pet Store* corresponds with `shop=pet` - - *Pet Grooming Store* corresponds with `shop=pet_grooming` + - *Pet Groomer* corresponds with `shop=pet_grooming` - *Photography Store* corresponds with `shop=photo` - *Pottery Store* corresponds with `shop=pottery` - *Printer Ink Store* corresponds with `shop=printer_ink` @@ -247,9 +250,10 @@ This is rendered with `This is a {shop}` - *Religious Store* corresponds with `shop=religion` - *Rental Shop* corresponds with `shop=rental` - *Repair Shop* corresponds with `shop=repair` + - *Rice Store* corresponds with `shop=rice` - *Scuba Diving Shop* corresponds with `shop=scuba_diving` - *Seafood Shop* corresponds with `shop=seafood` - - *Consignment/Thrift Store* corresponds with `shop=second_hand` + - *Thrift Store* corresponds with `shop=second_hand` - *Sewing Supply Shop* corresponds with `shop=sewing` - *Shoe Repair Shop* corresponds with `shop=shoe_repair` - *Shoe Store* corresponds with `shop=shoes` @@ -273,7 +277,7 @@ This is rendered with `This is a {shop}` - *Trophy Shop* corresponds with `shop=trophy` - *Tire Store* corresponds with `shop=tyres` - *Vacuum Cleaner Store* corresponds with `shop=vacuum_cleaner` - - *Variety Store* corresponds with `shop=variety_store` + - *Discount Store* corresponds with `shop=variety_store` - *Video Store* corresponds with `shop=video` - *Video Game Store* corresponds with `shop=video_games` - *Watches Shop* corresponds with `shop=watches` @@ -303,7 +307,7 @@ The question is *Does this shop sell second-hand items?* - *This shop only sells brand-new items* corresponds with `second_hand=no` -This tagrendering is only visible in the popup if the following condition is met: `shop=clothes|shop=car|shop=books|shop=charity|shop=car_repair|shop=furniture|shop=bicycle|shop=bicycle|shop=mobile_phone|shop=computer|shop=toys` +This tagrendering is only visible in the popup if the following condition is met: `shop=clothes |shop=car |shop=books |shop=charity |shop=car_repair |shop=furniture |shop=bicycle |shop=bicycle |shop=mobile_phone |shop=computer |shop=toys` @@ -470,7 +474,26 @@ The question is *What paper formats does this shop offer?* - Unselecting this answer will add service:print:A0=no -This tagrendering is only visible in the popup if the following condition is met: `shop~^(.*copyshop.*)$|shop~^(.*stationery.*)$|service:print=yes` +This tagrendering is only visible in the popup if the following condition is met: `shop~^(.*copyshop.*)$ |shop~^(.*stationery.*)$ |service:print=yes` + + + +### key_cutter + + + +The question is *Does this shop offer key cutting?* + + + + + + - *This shop is also specialized in key cutting* corresponds with `craft=key_cutter` + - *This shop offers key cutting as a service* corresponds with `service:key_cutting=yes` + - *This shops does not offer key cutting as a service* corresponds with `service:key_cutting=no` + + +This tagrendering is only visible in the popup if the following condition is met: `shop=shoe_repair |service:key_cutting~.+ |craft=key_cutting |shop=diy |shop=doityourself |shop=home_improvement |shop=hardware |shop=locksmith |shop=repair` @@ -509,7 +532,7 @@ The question is *Is there a fee for internet access?* - *Internet access is free at this place, for customers only* corresponds with `internet_access:fee=customers` -This tagrendering is only visible in the popup if the following condition is met: `internet_access!=no&internet_access~.+` +This tagrendering is only visible in the popup if the following condition is met: `internet_access!=no &internet_access~.+` @@ -549,7 +572,7 @@ The question is *Does this shop offer organic products?* - *This shop does not offer organic products* corresponds with `organic=no` -This tagrendering is only visible in the popup if the following condition is met: `shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=clothes|shop=shoes|shop=butcher|shop=cosmetics|shop=deli|shop=bakery|shop=alcohol|shop=seafood|shop=beverages|shop=florist` +This tagrendering is only visible in the popup if the following condition is met: `shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=clothes |shop=shoes |shop=butcher |shop=cosmetics |shop=deli |shop=bakery |shop=alcohol |shop=seafood |shop=beverages |shop=florist` @@ -569,7 +592,9 @@ The question is *Does this shop have a sugar free offering?* - *This shop has no sugar free offering* corresponds with `diet:sugar_free=no` -This tagrendering is only visible in the popup if the following condition is met: `shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream` +This tagrendering is only visible in the popup if the following condition is met: `shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream` + +This tagrendering has labels `diets` @@ -589,7 +614,9 @@ The question is *Does this shop have a gluten free offering?* - *This shop has no gluten free offering* corresponds with `diet:gluten_free=no` -This tagrendering is only visible in the popup if the following condition is met: `shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream` +This tagrendering is only visible in the popup if the following condition is met: `shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream` + +This tagrendering has labels `diets` @@ -609,7 +636,9 @@ The question is *Does {title()} have a lactose-free offering?* - *No lactose free offering* corresponds with `diet:lactose_free=no` -This tagrendering is only visible in the popup if the following condition is met: `shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream` +This tagrendering is only visible in the popup if the following condition is met: `shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream` + +This tagrendering has labels `diets` @@ -679,7 +708,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/memorial.md b/Docs/Layers/memorial.md index 9a0c26614..cea73fe9a 100644 --- a/Docs/Layers/memorial.md +++ b/Docs/Layers/memorial.md @@ -5,7 +5,7 @@ - + Layer showing memorial plaques, based upon a unofficial theme. Can be expanded to have multiple types of memorials later on @@ -56,7 +56,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -126,7 +126,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/nature_reserve.md b/Docs/Layers/nature_reserve.md index a34adf70a..c8b8c9f49 100644 --- a/Docs/Layers/nature_reserve.md +++ b/Docs/Layers/nature_reserve.md @@ -5,7 +5,7 @@ - + A nature reserve is an area where nature can take its course @@ -77,7 +77,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -112,7 +112,7 @@ This is rendered with `Accessin this nature reserve: {access:description}` - *Not accessible as this is a private area* corresponds with `access=private` - *Accessible despite being a privately owned area* corresponds with `access=permissive` - *Only accessible with a guide or during organised activities* corresponds with `access=guided` - - *Accessible with fee* corresponds with `access=yes&fee=yes` + - *Accessible with fee* corresponds with `access=yes &fee=yes` @@ -173,7 +173,7 @@ The question is *Are dogs allowed in this nature reserve?* - *Dogs are allowed to roam freely* corresponds with `dog=yes` -This tagrendering is only visible in the popup if the following condition is met: `access=yes|access=permissive|access=guided` +This tagrendering is only visible in the popup if the following condition is met: `access=yes |access=permissive |access=guided` @@ -335,7 +335,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` @@ -366,7 +366,7 @@ id | question | osmTags ---- | ---------- | --------- dogs.0 | All nature reserves (default) | dogs.1 | Dogs are allowed to roam freely | dog=yes -dogs.2 | Dogs are allowed if they are leashed | dog=yes\|dog=leashed +dogs.2 | Dogs are allowed if they are leashed | dog=yes \|dog=leashed This document is autogenerated from [assets/layers/nature_reserve/nature_reserve.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/layers/nature_reserve/nature_reserve.json) diff --git a/Docs/Layers/note.md b/Docs/Layers/note.md index 50b4f1db6..34b98d4c2 100644 --- a/Docs/Layers/note.md +++ b/Docs/Layers/note.md @@ -5,7 +5,7 @@ - + This layer shows notes on OpenStreetMap. Having this layer in your theme will trigger the 'add new note' functionality in the 'addNewPoint'-popup (or if your theme has no presets, it'll enable adding notes) @@ -67,7 +67,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -165,7 +165,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/observation_tower.md b/Docs/Layers/observation_tower.md index 47dc36453..864a4487c 100644 --- a/Docs/Layers/observation_tower.md +++ b/Docs/Layers/observation_tower.md @@ -5,7 +5,7 @@ - + Towers with a panoramic view @@ -76,7 +76,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -158,7 +158,7 @@ This is rendered with `Visiting this tower costs {charge}` - *Free to visit* corresponds with `fee=no` -This tagrendering is only visible in the popup if the following condition is met: `access=yes|access=guided` +This tagrendering is only visible in the popup if the following condition is met: `access=yes |access=guided` @@ -180,7 +180,7 @@ The question is *Which methods of payment are accepted here?* - Unselecting this answer will add payment:qr_code=no -This tagrendering is only visible in the popup if the following condition is met: `fee=yes|charge~.+` +This tagrendering is only visible in the popup if the following condition is met: `fee=yes |charge~.+` @@ -218,7 +218,7 @@ This is rendered with `This tower has {step_count} steps to reach the top` -This tagrendering is only visible in the popup if the following condition is met: `access=yes|access=guided` +This tagrendering is only visible in the popup if the following condition is met: `access=yes |access=guided` @@ -236,7 +236,7 @@ The question is *Does this tower have an elevator?* - *This tower does not have an elevator* corresponds with `elevator=no` -This tagrendering is only visible in the popup if the following condition is met: `access=yes|access=guided` +This tagrendering is only visible in the popup if the following condition is met: `access=yes |access=guided` @@ -270,7 +270,7 @@ The question is *Is this place accessible with a wheelchair?* - *This place is not reachable with a wheelchair* corresponds with `wheelchair=no` -This tagrendering is only visible in the popup if the following condition is met: `elevator=yes&access=yes|access=guided` +This tagrendering is only visible in the popup if the following condition is met: `elevator=yes &access=yes |access=guided` @@ -340,7 +340,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/osm_community_index.md b/Docs/Layers/osm_community_index.md index 94f7da38d..a2332827c 100644 --- a/Docs/Layers/osm_community_index.md +++ b/Docs/Layers/osm_community_index.md @@ -5,7 +5,7 @@ - + A layer showing the OpenStreetMap Communities @@ -67,7 +67,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -131,7 +131,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/parcel_lockers.md b/Docs/Layers/parcel_lockers.md index d46c6021e..e317cfece 100644 --- a/Docs/Layers/parcel_lockers.md +++ b/Docs/Layers/parcel_lockers.md @@ -5,7 +5,7 @@ - + Layer showing parcel lockers for collecting and sending parcels. @@ -72,7 +72,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -245,7 +245,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/parking.md b/Docs/Layers/parking.md index 6856d586d..bee465dcf 100644 --- a/Docs/Layers/parking.md +++ b/Docs/Layers/parking.md @@ -5,7 +5,7 @@ - + A layer showing car parkings @@ -72,7 +72,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -242,7 +242,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/parking_spaces.md b/Docs/Layers/parking_spaces.md index 23d9cf06f..3e6bc5985 100644 --- a/Docs/Layers/parking_spaces.md +++ b/Docs/Layers/parking_spaces.md @@ -5,7 +5,7 @@ - + Layer showing individual parking spaces. @@ -14,7 +14,7 @@ Layer showing individual parking spaces. - - This layer is shown at zoomlevel **19** and higher + - This layer is shown at zoomlevel **18** and higher @@ -69,7 +69,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -162,7 +162,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/parking_ticket_machine.md b/Docs/Layers/parking_ticket_machine.md index 84760f725..92b1d5819 100644 --- a/Docs/Layers/parking_ticket_machine.md +++ b/Docs/Layers/parking_ticket_machine.md @@ -5,7 +5,7 @@ - + Layer with parking ticket machines to pay for parking. @@ -70,7 +70,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -143,7 +143,7 @@ The question is *What coins can you use to pay here?* - *5 francs coins are accepted* corresponds with `payment:coins:denominations=5 CHF` -This tagrendering is only visible in the popup if the following condition is met: `payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$` +This tagrendering is only visible in the popup if the following condition is met: `payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$` @@ -172,7 +172,7 @@ The question is *what notes can you use to pay here?* - *1000 francs notes are accepted* corresponds with `payment:notes:denominations=1000 CHF` -This tagrendering is only visible in the popup if the following condition is met: `payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$` +This tagrendering is only visible in the popup if the following condition is met: `payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$` @@ -227,7 +227,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/parks_and_forests_without_etymology.md b/Docs/Layers/parks_and_forests_without_etymology.md index 0abbb8ef5..502d5171f 100644 --- a/Docs/Layers/parks_and_forests_without_etymology.md +++ b/Docs/Layers/parks_and_forests_without_etymology.md @@ -5,7 +5,7 @@ - + All objects which have an etymology known @@ -67,7 +67,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -190,7 +190,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/pedestrian_path.md b/Docs/Layers/pedestrian_path.md index 02ff931dc..117ff3dc2 100644 --- a/Docs/Layers/pedestrian_path.md +++ b/Docs/Layers/pedestrian_path.md @@ -5,7 +5,7 @@ - + Pedestrian footpaths, especially used for indoor navigation and snapping entrances to this layer diff --git a/Docs/Layers/pharmacy.md b/Docs/Layers/pharmacy.md index e3232cad2..385d5f17a 100644 --- a/Docs/Layers/pharmacy.md +++ b/Docs/Layers/pharmacy.md @@ -5,7 +5,7 @@ - + A layer showing pharmacies, which (probably) dispense prescription drugs @@ -74,7 +74,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -265,7 +265,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/physiotherapist.md b/Docs/Layers/physiotherapist.md index d8b177c5d..c2dc792b5 100644 --- a/Docs/Layers/physiotherapist.md +++ b/Docs/Layers/physiotherapist.md @@ -5,7 +5,7 @@ - + This layer shows physiotherapists @@ -71,7 +71,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -240,7 +240,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/picnic_table.md b/Docs/Layers/picnic_table.md index 089627951..0f17a2629 100644 --- a/Docs/Layers/picnic_table.md +++ b/Docs/Layers/picnic_table.md @@ -5,7 +5,7 @@ - + The layer showing picnic tables @@ -70,7 +70,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -200,7 +200,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/play_forest.md b/Docs/Layers/play_forest.md index 034da95cd..d1e5da00a 100644 --- a/Docs/Layers/play_forest.md +++ b/Docs/Layers/play_forest.md @@ -5,7 +5,7 @@ - + Een speelbos is een vrij toegankelijke zone in een bos @@ -58,7 +58,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -183,7 +183,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/playground.md b/Docs/Layers/playground.md index f02e65595..6e786aa17 100644 --- a/Docs/Layers/playground.md +++ b/Docs/Layers/playground.md @@ -5,7 +5,7 @@ - + Playgrounds @@ -76,7 +76,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -346,7 +346,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/post_offices_with_atm.md b/Docs/Layers/post_offices_with_atm.md index 623b5615c..160760849 100644 --- a/Docs/Layers/post_offices_with_atm.md +++ b/Docs/Layers/post_offices_with_atm.md @@ -5,7 +5,7 @@ - + A layer showing post offices. @@ -74,7 +74,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -297,7 +297,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/postboxes.md b/Docs/Layers/postboxes.md index 2d6864507..bf9a058fa 100644 --- a/Docs/Layers/postboxes.md +++ b/Docs/Layers/postboxes.md @@ -5,7 +5,7 @@ - + The layer showing postboxes. @@ -66,7 +66,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -122,7 +122,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/postoffices.md b/Docs/Layers/postoffices.md index ae2ee8340..7634e5711 100644 --- a/Docs/Layers/postoffices.md +++ b/Docs/Layers/postoffices.md @@ -5,7 +5,7 @@ - + A layer showing post offices. @@ -76,7 +76,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -299,7 +299,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/public_bookcase.md b/Docs/Layers/public_bookcase.md index 2583464a3..e6bb5f163 100644 --- a/Docs/Layers/public_bookcase.md +++ b/Docs/Layers/public_bookcase.md @@ -5,7 +5,7 @@ - + A streetside cabinet with books, accessible to anyone @@ -76,7 +76,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -316,7 +316,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` @@ -354,7 +354,7 @@ id | question | osmTags ---- | ---------- | --------- inside.0 | Indoor or outdoor (default) | inside.1 | Located indoors | indoor=yes -inside.2 | Located outdoors | indoor=no\| +inside.2 | Located outdoors | indoor=no \| @@ -362,7 +362,7 @@ inside.2 | Located outdoors | indoor=no\| id | question | osmTags ---- | ---------- | --------- has_image.0 | With and without images (default) | -has_image.1 | Has at least one image | image~.+\|image:0~.+\|image:1~.+\|image:2~.+\|image:3~.+\|mapillary~.+ +has_image.1 | Has at least one image | image~.+ \|image:0~.+ \|image:1~.+ \|image:2~.+ \|image:3~.+ \|mapillary~.+ has_image.2 | Probably does not have an image | diff --git a/Docs/Layers/railway_platforms.md b/Docs/Layers/railway_platforms.md index 9e9a075d8..cad6c5144 100644 --- a/Docs/Layers/railway_platforms.md +++ b/Docs/Layers/railway_platforms.md @@ -5,7 +5,7 @@ - + Find every platform in the station, and the train routes that use them. @@ -56,7 +56,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -147,7 +147,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/rainbow_crossing_high_zoom.md b/Docs/Layers/rainbow_crossing_high_zoom.md index 35cb22949..263ff63cc 100644 --- a/Docs/Layers/rainbow_crossing_high_zoom.md +++ b/Docs/Layers/rainbow_crossing_high_zoom.md @@ -5,7 +5,7 @@ - + A layer showing pedestrian crossings with rainbow paintings @@ -66,7 +66,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -132,7 +132,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/rainbow_crossings.md b/Docs/Layers/rainbow_crossings.md index e3c50abd7..d45712543 100644 --- a/Docs/Layers/rainbow_crossings.md +++ b/Docs/Layers/rainbow_crossings.md @@ -5,7 +5,7 @@ - + A layer showing pedestrian crossings with rainbow paintings @@ -67,7 +67,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -133,7 +133,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/reception_desk.md b/Docs/Layers/reception_desk.md index be0164aa8..b086b75fd 100644 --- a/Docs/Layers/reception_desk.md +++ b/Docs/Layers/reception_desk.md @@ -5,7 +5,7 @@ - + A layer showing where the reception desks are and which asks some accessibility information @@ -69,7 +69,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -190,7 +190,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/recycling.md b/Docs/Layers/recycling.md index 4157a5849..72be0f92c 100644 --- a/Docs/Layers/recycling.md +++ b/Docs/Layers/recycling.md @@ -5,7 +5,7 @@ - + A layer with recycling containers and centres @@ -75,7 +75,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -413,7 +413,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` @@ -450,7 +450,7 @@ recyclingType.4 | Recycling of clothes | recycling:clothes=yes recyclingType.5 | Recycling of cooking oil | recycling:cooking_oil=yes recyclingType.6 | Recycling of engine oil | recycling:engine_oil=yes recyclingType.7 | Recycling of fluorescent tubes | recycling:fluorescent_tubes=yes -recyclingType.8 | Recycling of green waste | recycling:green_waste=yes\|recycling:organic=yes +recyclingType.8 | Recycling of green waste | recycling:green_waste=yes \|recycling:organic=yes recyclingType.9 | Recycling of glass bottles | recycling:glass_bottles=yes recyclingType.10 | Recycling of glass | recycling:glass=yes recyclingType.11 | Recycling of light bulbs | recycling:light_bulbs=yes @@ -460,7 +460,7 @@ recyclingType.14 | Recycling of plastic bottles | recycling:plastic_bottles=yes recyclingType.15 | Recycling of plastic packaging | recycling:plastic_packaging=yes recyclingType.16 | Recycling of plastic | recycling:plastic=yes recyclingType.17 | Recycling of scrap metal | recycling:scrap_metal=yes -recyclingType.18 | Recycling of small electrical appliances | recycling:small_appliances=yes\|recycling:small_electrical_appliances=yes +recyclingType.18 | Recycling of small electrical appliances | recycling:small_appliances=yes \|recycling:small_electrical_appliances=yes recyclingType.19 | Recycling of residual waste | recycling:waste=yes recyclingType.20 | Recycling of printer cartridges | recycling:printer_cartridges=yes recyclingType.21 | Recycling of bicycles | recycling:bicycles=yes @@ -470,7 +470,7 @@ recyclingType.21 | Recycling of bicycles | recycling:bicycles=yes id | question | osmTags ---- | ---------- | --------- -public-access.0 | Only public access | access=yes\| +public-access.0 | Only public access | access=yes \| This document is autogenerated from [assets/layers/recycling/recycling.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/layers/recycling/recycling.json) diff --git a/Docs/Layers/route_marker.md b/Docs/Layers/route_marker.md new file mode 100644 index 000000000..6a5578c0c --- /dev/null +++ b/Docs/Layers/route_marker.md @@ -0,0 +1,161 @@ +[//]: # (WARNING: this file is automatically generated. Please find the sources at the bottom and edit those sources) + + route_marker +============== + + + + + +Route markers are small markers often found along official hiking/cycling/riding/skiing routes to indicate the direction of the route. + + + + + + + - This layer is shown at zoomlevel **14** and higher + + +This is a special layer - data is not sourced from OpenStreetMap + + + + Supported attributes +---------------------- + + + +Warning: + +this quick overview is incomplete + + + +attribute | type | values which are supported by this layer +----------- | ------ | ------------------------------------------ +[](https://taginfo.openstreetmap.org/keys/id#values) [id](https://wiki.openstreetmap.org/wiki/Key:id) | Multiple choice | + + + + +### just_created + + + +This element shows a 'thank you' that the contributor has recently created this element + +This tagrendering has no question and is thus read-only + + + + + + - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` + + +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` + + + +### images + + + +This block shows the known images which are linked with the `image`-keys, but also via `mapillary` and `wikidata` and shows the button to upload new images + +This tagrendering has no question and is thus read-only + + + + + +### type + + + +The question is *For what kind of route is this marker?* + + + + + + - *This is a route marker for a bicycle route.* corresponds with `bicycle=yes` + - Unselecting this answer will add + - *This is a route marker for a hiking route.* corresponds with `hiking=yes` + - Unselecting this answer will add + - *This is a route marker for a mountain bike route.* corresponds with `mtb=yes` + - Unselecting this answer will add + - *This is a route marker for a horse riding route.* corresponds with `horse=yes` + - Unselecting this answer will add + - *This is a route marker for a ski route.* corresponds with `ski=yes` + - Unselecting this answer will add + + + + +### leftover-questions + + + +This tagrendering has no question and is thus read-only + + + + + +### minimap + + + +Shows a small map with the feature. Added by default to every popup + +This tagrendering has no question and is thus read-only + + + + + +### move-button + + + +This tagrendering has no question and is thus read-only + + + + + +### delete-button + + + +This tagrendering has no question and is thus read-only + + + + + +### last_edit + + + +Gives some metainfo about the last edit and who did edit it - rendering only + +This tagrendering has no question and is thus read-only + + + +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` + + + +### all-tags + + + +This tagrendering has no question and is thus read-only + + + +This document is autogenerated from [assets/layers/route_marker/route_marker.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/layers/route_marker/route_marker.json) diff --git a/Docs/Layers/school.md b/Docs/Layers/school.md index 69d9c4859..7a5c77aa7 100644 --- a/Docs/Layers/school.md +++ b/Docs/Layers/school.md @@ -5,7 +5,7 @@ - + Schools giving primary and secondary education and post-secondary, non-tertiary education. Note that this level of education does not imply an age of the pupiles @@ -76,7 +76,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -287,7 +287,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/shelter.md b/Docs/Layers/shelter.md index ce3561cf4..a1f7c3d04 100644 --- a/Docs/Layers/shelter.md +++ b/Docs/Layers/shelter.md @@ -5,7 +5,7 @@ - + Layer showing shelter structures @@ -67,7 +67,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -128,7 +128,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/shops.md b/Docs/Layers/shops.md index 3aa4ee6db..dbef6f787 100644 --- a/Docs/Layers/shops.md +++ b/Docs/Layers/shops.md @@ -5,7 +5,7 @@ - + A shop @@ -52,7 +52,7 @@ attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ [](https://taginfo.openstreetmap.org/keys/id#values) [id](https://wiki.openstreetmap.org/wiki/Key:id) | Multiple choice | [](https://taginfo.openstreetmap.org/keys/name#values) [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) | -[](https://taginfo.openstreetmap.org/keys/shop#values) [shop](https://wiki.openstreetmap.org/wiki/Key:shop) | [string](../SpecialInputElements.md#string) | [agrarian](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dagrarian) [alcohol](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dalcohol) [anime](https://wiki.openstreetmap.org/wiki/Tag:shop%3Danime) [antiques](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dantiques) [appliance](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dappliance) [art](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dart) [baby_goods](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbaby_goods) [bag](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbag) [bakery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbakery) [bathroom_furnishing](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbathroom_furnishing) [beauty](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbeauty) [bed](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbed) [beverages](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbeverages) [bicycle](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbicycle) [boat](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dboat) [bookmaker](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbookmaker) [books](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbooks) [brewing_supplies](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbrewing_supplies) [butcher](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbutcher) [camera](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcamera) [candles](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcandles) [cannabis](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcannabis) [car](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcar) [car_parts](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcar_parts) [car_repair](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcar_repair) [caravan](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcaravan) [carpet](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcarpet) [catalogue](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcatalogue) [charity](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcharity) [cheese](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcheese) [chemist](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dchemist) [chocolate](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dchocolate) [clothes](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dclothes) [coffee](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcoffee) [collector](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcollector) [computer](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcomputer) [confectionery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dconfectionery) [convenience](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dconvenience) [copyshop](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcopyshop) [cosmetics](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcosmetics) [country_store](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcountry_store) [craft](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcraft) [curtain](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcurtain) [dairy](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddairy) [deli](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddeli) [department_store](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddepartment_store) [doityourself](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddoityourself) [doors](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddoors) [dry_cleaning](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddry_cleaning) [e-cigarette](https://wiki.openstreetmap.org/wiki/Tag:shop%3De-cigarette) [electrical](https://wiki.openstreetmap.org/wiki/Tag:shop%3Delectrical) [electronics](https://wiki.openstreetmap.org/wiki/Tag:shop%3Delectronics) [erotic](https://wiki.openstreetmap.org/wiki/Tag:shop%3Derotic) [fabric](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfabric) [farm](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfarm) [fashion_accessories](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfashion_accessories) [fireplace](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfireplace) [fishing](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfishing) [flooring](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dflooring) [florist](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dflorist) [frame](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dframe) [frozen_food](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfrozen_food) [fuel](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfuel) [funeral_directors](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfuneral_directors) [furniture](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfurniture) [games](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgames) [garden_centre](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgarden_centre) [gas](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgas) [general](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgeneral) [gift](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgift) [greengrocer](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgreengrocer) [hairdresser](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhairdresser) [hairdresser_supply](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhairdresser_supply) [hardware](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhardware) [health_food](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhealth_food) [hearing_aids](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhearing_aids) [herbalist](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dherbalist) [hifi](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhifi) [hobby](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhobby) [household_linen](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhousehold_linen) [houseware](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhouseware) [hunting](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhunting) [interior_decoration](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dinterior_decoration) [jewelry](https://wiki.openstreetmap.org/wiki/Tag:shop%3Djewelry) [kiosk](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dkiosk) [kitchen](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dkitchen) [laundry](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dlaundry) [leather](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dleather) [lighting](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dlighting) [locksmith](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dlocksmith) [lottery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dlottery) [mall](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmall) [massage](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmassage) [medical_supply](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmedical_supply) [military_surplus](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmilitary_surplus) [mobile_phone](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmobile_phone) [model](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmodel) [money_lender](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmoney_lender) [motorcycle](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmotorcycle) [motorcycle_repair](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmotorcycle_repair) [music](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmusic) [musical_instrument](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmusical_instrument) [newsagent](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dnewsagent) [nutrition_supplements](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dnutrition_supplements) [optician](https://wiki.openstreetmap.org/wiki/Tag:shop%3Doptician) [outdoor](https://wiki.openstreetmap.org/wiki/Tag:shop%3Doutdoor) [outpost](https://wiki.openstreetmap.org/wiki/Tag:shop%3Doutpost) [paint](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpaint) [party](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dparty) [pastry](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpastry) [pawnbroker](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpawnbroker) [perfumery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dperfumery) [pet](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpet) [pet_grooming](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpet_grooming) [photo](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dphoto) [pottery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpottery) [printer_ink](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dprinter_ink) [psychic](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpsychic) [pyrotechnics](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpyrotechnics) [radiotechnics](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dradiotechnics) [religion](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dreligion) [rental](https://wiki.openstreetmap.org/wiki/Tag:shop%3Drental) [repair](https://wiki.openstreetmap.org/wiki/Tag:shop%3Drepair) [scuba_diving](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dscuba_diving) [seafood](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dseafood) [second_hand](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dsecond_hand) [sewing](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dsewing) [shoe_repair](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dshoe_repair) [shoes](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dshoes) [spices](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dspices) [sports](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dsports) [stationery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dstationery) [storage_rental](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dstorage_rental) [supermarket](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dsupermarket) [swimming_pool](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dswimming_pool) [tailor](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtailor) [tattoo](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtattoo) [tea](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtea) [telecommunication](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtelecommunication) [ticket](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dticket) [tiles](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtiles) [tobacco](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtobacco) [tool_hire](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtool_hire) [toys](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtoys) [trade](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtrade) [travel_agency](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtravel_agency) [trophy](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtrophy) [tyres](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtyres) [vacuum_cleaner](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dvacuum_cleaner) [variety_store](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dvariety_store) [video](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dvideo) [video_games](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dvideo_games) [watches](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwatches) [water](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwater) [water_sports](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwater_sports) [weapons](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dweapons) [wholesale](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwholesale) [wigs](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwigs) [window_blind](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwindow_blind) [wine](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwine) +[](https://taginfo.openstreetmap.org/keys/shop#values) [shop](https://wiki.openstreetmap.org/wiki/Key:shop) | [string](../SpecialInputElements.md#string) | [vacant](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dvacant) [agrarian](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dagrarian) [alcohol](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dalcohol) [anime](https://wiki.openstreetmap.org/wiki/Tag:shop%3Danime) [antiques](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dantiques) [appliance](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dappliance) [art](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dart) [baby_goods](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbaby_goods) [bag](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbag) [bakery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbakery) [bathroom_furnishing](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbathroom_furnishing) [beauty](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbeauty) [bed](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbed) [beverages](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbeverages) [bicycle](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbicycle) [boat](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dboat) [bookmaker](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbookmaker) [books](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbooks) [brewing_supplies](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbrewing_supplies) [butcher](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbutcher) [camera](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcamera) [candles](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcandles) [cannabis](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcannabis) [car](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcar) [car_parts](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcar_parts) [car_repair](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcar_repair) [caravan](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcaravan) [carpet](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcarpet) [catalogue](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcatalogue) [charity](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcharity) [cheese](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcheese) [chemist](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dchemist) [chocolate](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dchocolate) [clothes](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dclothes) [coffee](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcoffee) [collector](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcollector) [computer](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcomputer) [confectionery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dconfectionery) [convenience](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dconvenience) [copyshop](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcopyshop) [cosmetics](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcosmetics) [country_store](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcountry_store) [craft](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcraft) [curtain](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcurtain) [dairy](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddairy) [deli](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddeli) [department_store](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddepartment_store) [doityourself](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddoityourself) [doors](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddoors) [dry_cleaning](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddry_cleaning) [e-cigarette](https://wiki.openstreetmap.org/wiki/Tag:shop%3De-cigarette) [electrical](https://wiki.openstreetmap.org/wiki/Tag:shop%3Delectrical) [electronics](https://wiki.openstreetmap.org/wiki/Tag:shop%3Delectronics) [erotic](https://wiki.openstreetmap.org/wiki/Tag:shop%3Derotic) [fabric](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfabric) [farm](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfarm) [fashion_accessories](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfashion_accessories) [fireplace](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfireplace) [fishing](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfishing) [flooring](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dflooring) [florist](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dflorist) [frame](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dframe) [frozen_food](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfrozen_food) [fuel](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfuel) [funeral_directors](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfuneral_directors) [furniture](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfurniture) [games](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgames) [garden_centre](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgarden_centre) [gas](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgas) [general](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgeneral) [gift](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgift) [greengrocer](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgreengrocer) [hairdresser](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhairdresser) [hairdresser_supply](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhairdresser_supply) [hardware](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhardware) [health_food](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhealth_food) [hearing_aids](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhearing_aids) [herbalist](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dherbalist) [hifi](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhifi) [honey](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhoney) [household_linen](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhousehold_linen) [houseware](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhouseware) [hunting](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhunting) [interior_decoration](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dinterior_decoration) [jewelry](https://wiki.openstreetmap.org/wiki/Tag:shop%3Djewelry) [kiosk](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dkiosk) [kitchen](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dkitchen) [laundry](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dlaundry) [leather](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dleather) [lighting](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dlighting) [locksmith](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dlocksmith) [lottery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dlottery) [mall](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmall) [massage](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmassage) [medical_supply](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmedical_supply) [military_surplus](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmilitary_surplus) [mobile_phone](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmobile_phone) [model](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmodel) [money_lender](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmoney_lender) [motorcycle](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmotorcycle) [motorcycle_repair](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmotorcycle_repair) [music](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmusic) [musical_instrument](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmusical_instrument) [newsagent](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dnewsagent) [nutrition_supplements](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dnutrition_supplements) [nuts](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dnuts) [optician](https://wiki.openstreetmap.org/wiki/Tag:shop%3Doptician) [outdoor](https://wiki.openstreetmap.org/wiki/Tag:shop%3Doutdoor) [outpost](https://wiki.openstreetmap.org/wiki/Tag:shop%3Doutpost) [paint](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpaint) [party](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dparty) [pasta](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpasta) [pastry](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpastry) [pawnbroker](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpawnbroker) [perfumery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dperfumery) [pet](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpet) [pet_grooming](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpet_grooming) [photo](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dphoto) [pottery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpottery) [printer_ink](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dprinter_ink) [psychic](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpsychic) [pyrotechnics](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpyrotechnics) [radiotechnics](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dradiotechnics) [religion](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dreligion) [rental](https://wiki.openstreetmap.org/wiki/Tag:shop%3Drental) [repair](https://wiki.openstreetmap.org/wiki/Tag:shop%3Drepair) [rice](https://wiki.openstreetmap.org/wiki/Tag:shop%3Drice) [scuba_diving](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dscuba_diving) [seafood](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dseafood) [second_hand](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dsecond_hand) [sewing](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dsewing) [shoe_repair](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dshoe_repair) [shoes](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dshoes) [spices](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dspices) [sports](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dsports) [stationery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dstationery) [storage_rental](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dstorage_rental) [supermarket](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dsupermarket) [swimming_pool](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dswimming_pool) [tailor](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtailor) [tattoo](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtattoo) [tea](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtea) [telecommunication](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtelecommunication) [ticket](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dticket) [tiles](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtiles) [tobacco](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtobacco) [tool_hire](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtool_hire) [toys](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtoys) [trade](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtrade) [travel_agency](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtravel_agency) [trophy](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtrophy) [tyres](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtyres) [vacuum_cleaner](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dvacuum_cleaner) [variety_store](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dvariety_store) [video](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dvideo) [video_games](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dvideo_games) [watches](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwatches) [water](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwater) [water_sports](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwater_sports) [weapons](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dweapons) [wholesale](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwholesale) [wigs](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwigs) [window_blind](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwindow_blind) [wine](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwine) [](https://taginfo.openstreetmap.org/keys/second_hand#values) [second_hand](https://wiki.openstreetmap.org/wiki/Key:second_hand) | Multiple choice | [only](https://wiki.openstreetmap.org/wiki/Tag:second_hand%3Donly) [yes](https://wiki.openstreetmap.org/wiki/Tag:second_hand%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:second_hand%3Dno) [](https://taginfo.openstreetmap.org/keys/opening_hours#values) [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) | [opening_hours](../SpecialInputElements.md#opening_hours) | [](https://taginfo.openstreetmap.org/keys/website#values) [website](https://wiki.openstreetmap.org/wiki/Key:website) | [url](../SpecialInputElements.md#url) | @@ -85,7 +85,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -129,10 +129,11 @@ This is rendered with `This is a {shop}` + - *Vacant Shop* corresponds with `shop=vacant` - *Farm Supply Shop* corresponds with `shop=agrarian` - *Liquor Store* corresponds with `shop=alcohol` - *Anime / Manga Shop* corresponds with `shop=anime` - - *Antiques Shop* corresponds with `shop=antiques` + - *Antique Shop* corresponds with `shop=antiques` - *Appliance Store* corresponds with `shop=appliance` - *Art Store* corresponds with `shop=art` - *Baby Goods Store* corresponds with `shop=baby_goods` @@ -145,7 +146,7 @@ This is rendered with `This is a {shop}` - *Bicycle Shop* corresponds with `shop=bicycle` - *Boat Store* corresponds with `shop=boat` - *Bookmaker* corresponds with `shop=bookmaker` - - *Book Store* corresponds with `shop=books` + - *Bookstore* corresponds with `shop=books` - *Brewing Supply Store* corresponds with `shop=brewing_supplies` - *Butcher* corresponds with `shop=butcher` - *Camera Equipment Store* corresponds with `shop=camera` @@ -169,11 +170,11 @@ This is rendered with `This is a {shop}` - *Convenience Store* corresponds with `shop=convenience` - *Copy Store* corresponds with `shop=copyshop` - *Cosmetics Store* corresponds with `shop=cosmetics` - - *Country Store* corresponds with `shop=country_store` + - *Rural Supplies Store* corresponds with `shop=country_store` - *Arts & Crafts Store* corresponds with `shop=craft` - *Curtain Store* corresponds with `shop=curtain` - *Dairy Store* corresponds with `shop=dairy` - - *Deli* corresponds with `shop=deli` + - *Delicatessen* corresponds with `shop=deli` - *Department Store* corresponds with `shop=department_store` - *DIY Store* corresponds with `shop=doityourself` - *Door Shop* corresponds with `shop=doors` @@ -203,11 +204,11 @@ This is rendered with `This is a {shop}` - *Hairdresser* corresponds with `shop=hairdresser` - *Hairdresser Supply Store* corresponds with `shop=hairdresser_supply` - *Hardware Store* corresponds with `shop=hardware` - - *Health Food Shop* corresponds with `shop=health_food` + - *Health Food Store* corresponds with `shop=health_food` - *Hearing Aids Store* corresponds with `shop=hearing_aids` - *Herbalist* corresponds with `shop=herbalist` - *Hifi Store* corresponds with `shop=hifi` - - *Hobby Shop* corresponds with `shop=hobby` + - *Honey Store* corresponds with `shop=honey` - *Household Linen Shop* corresponds with `shop=household_linen` - *Houseware Store* corresponds with `shop=houseware` - *Hunting Shop* corresponds with `shop=hunting` @@ -231,18 +232,20 @@ This is rendered with `This is a {shop}` - *Motorcycle Repair Shop* corresponds with `shop=motorcycle_repair` - *Music Store* corresponds with `shop=music` - *Musical Instrument Store* corresponds with `shop=musical_instrument` - - *Newspaper/Magazine Shop* corresponds with `shop=newsagent` + - *Newsstand* corresponds with `shop=newsagent` - *Nutrition Supplements Store* corresponds with `shop=nutrition_supplements` + - *Nuts Shop* corresponds with `shop=nuts` - *Optician* corresponds with `shop=optician` - *Outdoors Store* corresponds with `shop=outdoor` - *Online Retailer Outpost* corresponds with `shop=outpost` - *Paint Store* corresponds with `shop=paint` - *Party Supply Store* corresponds with `shop=party` + - *Pasta Store* corresponds with `shop=pasta` - *Pastry Shop* corresponds with `shop=pastry` - - *Pawn Shop* corresponds with `shop=pawnbroker` + - *Pawnshop* corresponds with `shop=pawnbroker` - *Perfume Store* corresponds with `shop=perfumery` - *Pet Store* corresponds with `shop=pet` - - *Pet Grooming Store* corresponds with `shop=pet_grooming` + - *Pet Groomer* corresponds with `shop=pet_grooming` - *Photography Store* corresponds with `shop=photo` - *Pottery Store* corresponds with `shop=pottery` - *Printer Ink Store* corresponds with `shop=printer_ink` @@ -252,9 +255,10 @@ This is rendered with `This is a {shop}` - *Religious Store* corresponds with `shop=religion` - *Rental Shop* corresponds with `shop=rental` - *Repair Shop* corresponds with `shop=repair` + - *Rice Store* corresponds with `shop=rice` - *Scuba Diving Shop* corresponds with `shop=scuba_diving` - *Seafood Shop* corresponds with `shop=seafood` - - *Consignment/Thrift Store* corresponds with `shop=second_hand` + - *Thrift Store* corresponds with `shop=second_hand` - *Sewing Supply Shop* corresponds with `shop=sewing` - *Shoe Repair Shop* corresponds with `shop=shoe_repair` - *Shoe Store* corresponds with `shop=shoes` @@ -278,7 +282,7 @@ This is rendered with `This is a {shop}` - *Trophy Shop* corresponds with `shop=trophy` - *Tire Store* corresponds with `shop=tyres` - *Vacuum Cleaner Store* corresponds with `shop=vacuum_cleaner` - - *Variety Store* corresponds with `shop=variety_store` + - *Discount Store* corresponds with `shop=variety_store` - *Video Store* corresponds with `shop=video` - *Video Game Store* corresponds with `shop=video_games` - *Watches Shop* corresponds with `shop=watches` @@ -308,7 +312,7 @@ The question is *Does this shop sell second-hand items?* - *This shop only sells brand-new items* corresponds with `second_hand=no` -This tagrendering is only visible in the popup if the following condition is met: `shop=clothes|shop=car|shop=books|shop=charity|shop=car_repair|shop=furniture|shop=bicycle|shop=bicycle|shop=mobile_phone|shop=computer|shop=toys` +This tagrendering is only visible in the popup if the following condition is met: `shop=clothes |shop=car |shop=books |shop=charity |shop=car_repair |shop=furniture |shop=bicycle |shop=bicycle |shop=mobile_phone |shop=computer |shop=toys` @@ -475,7 +479,26 @@ The question is *What paper formats does this shop offer?* - Unselecting this answer will add service:print:A0=no -This tagrendering is only visible in the popup if the following condition is met: `shop~^(.*copyshop.*)$|shop~^(.*stationery.*)$|service:print=yes` +This tagrendering is only visible in the popup if the following condition is met: `shop~^(.*copyshop.*)$ |shop~^(.*stationery.*)$ |service:print=yes` + + + +### key_cutter + + + +The question is *Does this shop offer key cutting?* + + + + + + - *This shop is also specialized in key cutting* corresponds with `craft=key_cutter` + - *This shop offers key cutting as a service* corresponds with `service:key_cutting=yes` + - *This shops does not offer key cutting as a service* corresponds with `service:key_cutting=no` + + +This tagrendering is only visible in the popup if the following condition is met: `shop=shoe_repair |service:key_cutting~.+ |craft=key_cutting |shop=diy |shop=doityourself |shop=home_improvement |shop=hardware |shop=locksmith |shop=repair` @@ -514,7 +537,7 @@ The question is *Is there a fee for internet access?* - *Internet access is free at this place, for customers only* corresponds with `internet_access:fee=customers` -This tagrendering is only visible in the popup if the following condition is met: `internet_access!=no&internet_access~.+` +This tagrendering is only visible in the popup if the following condition is met: `internet_access!=no &internet_access~.+` @@ -554,7 +577,7 @@ The question is *Does this shop offer organic products?* - *This shop does not offer organic products* corresponds with `organic=no` -This tagrendering is only visible in the popup if the following condition is met: `shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=clothes|shop=shoes|shop=butcher|shop=cosmetics|shop=deli|shop=bakery|shop=alcohol|shop=seafood|shop=beverages|shop=florist` +This tagrendering is only visible in the popup if the following condition is met: `shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=clothes |shop=shoes |shop=butcher |shop=cosmetics |shop=deli |shop=bakery |shop=alcohol |shop=seafood |shop=beverages |shop=florist` @@ -574,7 +597,9 @@ The question is *Does this shop have a sugar free offering?* - *This shop has no sugar free offering* corresponds with `diet:sugar_free=no` -This tagrendering is only visible in the popup if the following condition is met: `shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream` +This tagrendering is only visible in the popup if the following condition is met: `shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream` + +This tagrendering has labels `diets` @@ -594,7 +619,9 @@ The question is *Does this shop have a gluten free offering?* - *This shop has no gluten free offering* corresponds with `diet:gluten_free=no` -This tagrendering is only visible in the popup if the following condition is met: `shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream` +This tagrendering is only visible in the popup if the following condition is met: `shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream` + +This tagrendering has labels `diets` @@ -614,7 +641,9 @@ The question is *Does {title()} have a lactose-free offering?* - *No lactose free offering* corresponds with `diet:lactose_free=no` -This tagrendering is only visible in the popup if the following condition is met: `shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream` +This tagrendering is only visible in the popup if the following condition is met: `shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream` + +This tagrendering has labels `diets` @@ -684,7 +713,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` @@ -741,35 +770,35 @@ accepts_cards.0 | Accepts payment cards | payment:cards=yes id | question | osmTags ---- | ---------- | --------- -has_organic.0 | Has organic options | organic=yes\|organic=only +has_organic.0 | Has organic options | organic=yes \|organic=only id | question | osmTags ---- | ---------- | --------- -second_hand.0 | Only show shops selling second-hand items | shop=second_hand\|shop=charity\|second_hand=yes\|second_hand=only +second_hand.0 | Only show shops selling second-hand items | shop=second_hand \|shop=charity \|second_hand=yes \|second_hand=only id | question | osmTags ---- | ---------- | --------- -sugar_free.0 | Has a sugar-free offering | diet:sugar_free=yes\|diet:sugar_free=only\|diet:sugar_free=limited +sugar_free.0 | Has a sugar-free offering | diet:sugar_free=yes \|diet:sugar_free=only \|diet:sugar_free=limited id | question | osmTags ---- | ---------- | --------- -gluten_free.0 | Has a gluten free offering | diet:gluten_free=yes\|diet:gluten_free=only\|diet:gluten_free=limited +gluten_free.0 | Has a gluten free offering | diet:gluten_free=yes \|diet:gluten_free=only \|diet:gluten_free=limited id | question | osmTags ---- | ---------- | --------- -lactose_free.0 | Has a lactose free offering | diet:lactose_free=yes\|diet:lactose_free=only\|diet:lactose_free=limited +lactose_free.0 | Has a lactose free offering | diet:lactose_free=yes \|diet:lactose_free=only \|diet:lactose_free=limited This document is autogenerated from [assets/layers/shops/shops.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/layers/shops/shops.json) diff --git a/Docs/Layers/shops_with_climbing_shoe_repair.md b/Docs/Layers/shops_with_climbing_shoe_repair.md index 0765a4076..967055608 100644 --- a/Docs/Layers/shops_with_climbing_shoe_repair.md +++ b/Docs/Layers/shops_with_climbing_shoe_repair.md @@ -5,7 +5,7 @@ - + A shop @@ -48,7 +48,7 @@ attribute | type | values which are supported by this layer [](https://taginfo.openstreetmap.org/keys/service:climbing_shoes:repair#values) [service:climbing_shoes:repair](https://wiki.openstreetmap.org/wiki/Key:service:climbing_shoes:repair) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:service:climbing_shoes:repair%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:service:climbing_shoes:repair%3Dno) [](https://taginfo.openstreetmap.org/keys/id#values) [id](https://wiki.openstreetmap.org/wiki/Key:id) | Multiple choice | [](https://taginfo.openstreetmap.org/keys/name#values) [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) | -[](https://taginfo.openstreetmap.org/keys/shop#values) [shop](https://wiki.openstreetmap.org/wiki/Key:shop) | [string](../SpecialInputElements.md#string) | [agrarian](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dagrarian) [alcohol](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dalcohol) [anime](https://wiki.openstreetmap.org/wiki/Tag:shop%3Danime) [antiques](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dantiques) [appliance](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dappliance) [art](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dart) [baby_goods](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbaby_goods) [bag](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbag) [bakery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbakery) [bathroom_furnishing](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbathroom_furnishing) [beauty](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbeauty) [bed](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbed) [beverages](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbeverages) [bicycle](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbicycle) [boat](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dboat) [bookmaker](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbookmaker) [books](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbooks) [brewing_supplies](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbrewing_supplies) [butcher](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbutcher) [camera](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcamera) [candles](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcandles) [cannabis](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcannabis) [car](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcar) [car_parts](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcar_parts) [car_repair](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcar_repair) [caravan](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcaravan) [carpet](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcarpet) [catalogue](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcatalogue) [charity](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcharity) [cheese](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcheese) [chemist](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dchemist) [chocolate](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dchocolate) [clothes](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dclothes) [coffee](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcoffee) [collector](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcollector) [computer](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcomputer) [confectionery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dconfectionery) [convenience](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dconvenience) [copyshop](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcopyshop) [cosmetics](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcosmetics) [country_store](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcountry_store) [craft](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcraft) [curtain](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcurtain) [dairy](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddairy) [deli](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddeli) [department_store](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddepartment_store) [doityourself](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddoityourself) [doors](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddoors) [dry_cleaning](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddry_cleaning) [e-cigarette](https://wiki.openstreetmap.org/wiki/Tag:shop%3De-cigarette) [electrical](https://wiki.openstreetmap.org/wiki/Tag:shop%3Delectrical) [electronics](https://wiki.openstreetmap.org/wiki/Tag:shop%3Delectronics) [erotic](https://wiki.openstreetmap.org/wiki/Tag:shop%3Derotic) [fabric](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfabric) [farm](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfarm) [fashion_accessories](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfashion_accessories) [fireplace](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfireplace) [fishing](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfishing) [flooring](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dflooring) [florist](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dflorist) [frame](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dframe) [frozen_food](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfrozen_food) [fuel](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfuel) [funeral_directors](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfuneral_directors) [furniture](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfurniture) [games](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgames) [garden_centre](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgarden_centre) [gas](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgas) [general](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgeneral) [gift](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgift) [greengrocer](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgreengrocer) [hairdresser](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhairdresser) [hairdresser_supply](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhairdresser_supply) [hardware](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhardware) [health_food](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhealth_food) [hearing_aids](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhearing_aids) [herbalist](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dherbalist) [hifi](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhifi) [hobby](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhobby) [household_linen](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhousehold_linen) [houseware](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhouseware) [hunting](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhunting) [interior_decoration](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dinterior_decoration) [jewelry](https://wiki.openstreetmap.org/wiki/Tag:shop%3Djewelry) [kiosk](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dkiosk) [kitchen](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dkitchen) [laundry](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dlaundry) [leather](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dleather) [lighting](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dlighting) [locksmith](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dlocksmith) [lottery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dlottery) [mall](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmall) [massage](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmassage) [medical_supply](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmedical_supply) [military_surplus](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmilitary_surplus) [mobile_phone](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmobile_phone) [model](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmodel) [money_lender](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmoney_lender) [motorcycle](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmotorcycle) [motorcycle_repair](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmotorcycle_repair) [music](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmusic) [musical_instrument](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmusical_instrument) [newsagent](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dnewsagent) [nutrition_supplements](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dnutrition_supplements) [optician](https://wiki.openstreetmap.org/wiki/Tag:shop%3Doptician) [outdoor](https://wiki.openstreetmap.org/wiki/Tag:shop%3Doutdoor) [outpost](https://wiki.openstreetmap.org/wiki/Tag:shop%3Doutpost) [paint](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpaint) [party](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dparty) [pastry](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpastry) [pawnbroker](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpawnbroker) [perfumery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dperfumery) [pet](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpet) [pet_grooming](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpet_grooming) [photo](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dphoto) [pottery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpottery) [printer_ink](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dprinter_ink) [psychic](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpsychic) [pyrotechnics](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpyrotechnics) [radiotechnics](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dradiotechnics) [religion](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dreligion) [rental](https://wiki.openstreetmap.org/wiki/Tag:shop%3Drental) [repair](https://wiki.openstreetmap.org/wiki/Tag:shop%3Drepair) [scuba_diving](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dscuba_diving) [seafood](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dseafood) [second_hand](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dsecond_hand) [sewing](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dsewing) [shoe_repair](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dshoe_repair) [shoes](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dshoes) [spices](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dspices) [sports](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dsports) [stationery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dstationery) [storage_rental](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dstorage_rental) [supermarket](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dsupermarket) [swimming_pool](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dswimming_pool) [tailor](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtailor) [tattoo](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtattoo) [tea](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtea) [telecommunication](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtelecommunication) [ticket](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dticket) [tiles](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtiles) [tobacco](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtobacco) [tool_hire](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtool_hire) [toys](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtoys) [trade](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtrade) [travel_agency](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtravel_agency) [trophy](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtrophy) [tyres](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtyres) [vacuum_cleaner](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dvacuum_cleaner) [variety_store](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dvariety_store) [video](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dvideo) [video_games](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dvideo_games) [watches](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwatches) [water](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwater) [water_sports](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwater_sports) [weapons](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dweapons) [wholesale](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwholesale) [wigs](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwigs) [window_blind](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwindow_blind) [wine](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwine) +[](https://taginfo.openstreetmap.org/keys/shop#values) [shop](https://wiki.openstreetmap.org/wiki/Key:shop) | [string](../SpecialInputElements.md#string) | [vacant](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dvacant) [agrarian](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dagrarian) [alcohol](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dalcohol) [anime](https://wiki.openstreetmap.org/wiki/Tag:shop%3Danime) [antiques](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dantiques) [appliance](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dappliance) [art](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dart) [baby_goods](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbaby_goods) [bag](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbag) [bakery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbakery) [bathroom_furnishing](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbathroom_furnishing) [beauty](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbeauty) [bed](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbed) [beverages](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbeverages) [bicycle](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbicycle) [boat](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dboat) [bookmaker](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbookmaker) [books](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbooks) [brewing_supplies](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbrewing_supplies) [butcher](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbutcher) [camera](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcamera) [candles](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcandles) [cannabis](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcannabis) [car](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcar) [car_parts](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcar_parts) [car_repair](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcar_repair) [caravan](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcaravan) [carpet](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcarpet) [catalogue](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcatalogue) [charity](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcharity) [cheese](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcheese) [chemist](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dchemist) [chocolate](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dchocolate) [clothes](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dclothes) [coffee](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcoffee) [collector](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcollector) [computer](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcomputer) [confectionery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dconfectionery) [convenience](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dconvenience) [copyshop](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcopyshop) [cosmetics](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcosmetics) [country_store](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcountry_store) [craft](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcraft) [curtain](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcurtain) [dairy](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddairy) [deli](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddeli) [department_store](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddepartment_store) [doityourself](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddoityourself) [doors](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddoors) [dry_cleaning](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddry_cleaning) [e-cigarette](https://wiki.openstreetmap.org/wiki/Tag:shop%3De-cigarette) [electrical](https://wiki.openstreetmap.org/wiki/Tag:shop%3Delectrical) [electronics](https://wiki.openstreetmap.org/wiki/Tag:shop%3Delectronics) [erotic](https://wiki.openstreetmap.org/wiki/Tag:shop%3Derotic) [fabric](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfabric) [farm](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfarm) [fashion_accessories](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfashion_accessories) [fireplace](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfireplace) [fishing](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfishing) [flooring](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dflooring) [florist](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dflorist) [frame](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dframe) [frozen_food](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfrozen_food) [fuel](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfuel) [funeral_directors](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfuneral_directors) [furniture](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfurniture) [games](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgames) [garden_centre](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgarden_centre) [gas](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgas) [general](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgeneral) [gift](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgift) [greengrocer](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgreengrocer) [hairdresser](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhairdresser) [hairdresser_supply](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhairdresser_supply) [hardware](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhardware) [health_food](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhealth_food) [hearing_aids](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhearing_aids) [herbalist](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dherbalist) [hifi](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhifi) [honey](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhoney) [household_linen](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhousehold_linen) [houseware](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhouseware) [hunting](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhunting) [interior_decoration](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dinterior_decoration) [jewelry](https://wiki.openstreetmap.org/wiki/Tag:shop%3Djewelry) [kiosk](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dkiosk) [kitchen](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dkitchen) [laundry](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dlaundry) [leather](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dleather) [lighting](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dlighting) [locksmith](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dlocksmith) [lottery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dlottery) [mall](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmall) [massage](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmassage) [medical_supply](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmedical_supply) [military_surplus](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmilitary_surplus) [mobile_phone](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmobile_phone) [model](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmodel) [money_lender](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmoney_lender) [motorcycle](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmotorcycle) [motorcycle_repair](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmotorcycle_repair) [music](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmusic) [musical_instrument](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmusical_instrument) [newsagent](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dnewsagent) [nutrition_supplements](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dnutrition_supplements) [nuts](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dnuts) [optician](https://wiki.openstreetmap.org/wiki/Tag:shop%3Doptician) [outdoor](https://wiki.openstreetmap.org/wiki/Tag:shop%3Doutdoor) [outpost](https://wiki.openstreetmap.org/wiki/Tag:shop%3Doutpost) [paint](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpaint) [party](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dparty) [pasta](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpasta) [pastry](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpastry) [pawnbroker](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpawnbroker) [perfumery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dperfumery) [pet](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpet) [pet_grooming](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpet_grooming) [photo](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dphoto) [pottery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpottery) [printer_ink](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dprinter_ink) [psychic](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpsychic) [pyrotechnics](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpyrotechnics) [radiotechnics](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dradiotechnics) [religion](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dreligion) [rental](https://wiki.openstreetmap.org/wiki/Tag:shop%3Drental) [repair](https://wiki.openstreetmap.org/wiki/Tag:shop%3Drepair) [rice](https://wiki.openstreetmap.org/wiki/Tag:shop%3Drice) [scuba_diving](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dscuba_diving) [seafood](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dseafood) [second_hand](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dsecond_hand) [sewing](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dsewing) [shoe_repair](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dshoe_repair) [shoes](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dshoes) [spices](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dspices) [sports](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dsports) [stationery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dstationery) [storage_rental](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dstorage_rental) [supermarket](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dsupermarket) [swimming_pool](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dswimming_pool) [tailor](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtailor) [tattoo](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtattoo) [tea](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtea) [telecommunication](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtelecommunication) [ticket](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dticket) [tiles](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtiles) [tobacco](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtobacco) [tool_hire](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtool_hire) [toys](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtoys) [trade](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtrade) [travel_agency](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtravel_agency) [trophy](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtrophy) [tyres](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtyres) [vacuum_cleaner](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dvacuum_cleaner) [variety_store](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dvariety_store) [video](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dvideo) [video_games](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dvideo_games) [watches](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwatches) [water](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwater) [water_sports](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwater_sports) [weapons](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dweapons) [wholesale](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwholesale) [wigs](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwigs) [window_blind](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwindow_blind) [wine](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwine) [](https://taginfo.openstreetmap.org/keys/second_hand#values) [second_hand](https://wiki.openstreetmap.org/wiki/Key:second_hand) | Multiple choice | [only](https://wiki.openstreetmap.org/wiki/Tag:second_hand%3Donly) [yes](https://wiki.openstreetmap.org/wiki/Tag:second_hand%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:second_hand%3Dno) [](https://taginfo.openstreetmap.org/keys/opening_hours#values) [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) | [opening_hours](../SpecialInputElements.md#opening_hours) | [](https://taginfo.openstreetmap.org/keys/website#values) [website](https://wiki.openstreetmap.org/wiki/Key:website) | [url](../SpecialInputElements.md#url) | @@ -97,7 +97,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -141,10 +141,11 @@ This is rendered with `This is a {shop}` + - *Vacant Shop* corresponds with `shop=vacant` - *Farm Supply Shop* corresponds with `shop=agrarian` - *Liquor Store* corresponds with `shop=alcohol` - *Anime / Manga Shop* corresponds with `shop=anime` - - *Antiques Shop* corresponds with `shop=antiques` + - *Antique Shop* corresponds with `shop=antiques` - *Appliance Store* corresponds with `shop=appliance` - *Art Store* corresponds with `shop=art` - *Baby Goods Store* corresponds with `shop=baby_goods` @@ -157,7 +158,7 @@ This is rendered with `This is a {shop}` - *Bicycle Shop* corresponds with `shop=bicycle` - *Boat Store* corresponds with `shop=boat` - *Bookmaker* corresponds with `shop=bookmaker` - - *Book Store* corresponds with `shop=books` + - *Bookstore* corresponds with `shop=books` - *Brewing Supply Store* corresponds with `shop=brewing_supplies` - *Butcher* corresponds with `shop=butcher` - *Camera Equipment Store* corresponds with `shop=camera` @@ -181,11 +182,11 @@ This is rendered with `This is a {shop}` - *Convenience Store* corresponds with `shop=convenience` - *Copy Store* corresponds with `shop=copyshop` - *Cosmetics Store* corresponds with `shop=cosmetics` - - *Country Store* corresponds with `shop=country_store` + - *Rural Supplies Store* corresponds with `shop=country_store` - *Arts & Crafts Store* corresponds with `shop=craft` - *Curtain Store* corresponds with `shop=curtain` - *Dairy Store* corresponds with `shop=dairy` - - *Deli* corresponds with `shop=deli` + - *Delicatessen* corresponds with `shop=deli` - *Department Store* corresponds with `shop=department_store` - *DIY Store* corresponds with `shop=doityourself` - *Door Shop* corresponds with `shop=doors` @@ -215,11 +216,11 @@ This is rendered with `This is a {shop}` - *Hairdresser* corresponds with `shop=hairdresser` - *Hairdresser Supply Store* corresponds with `shop=hairdresser_supply` - *Hardware Store* corresponds with `shop=hardware` - - *Health Food Shop* corresponds with `shop=health_food` + - *Health Food Store* corresponds with `shop=health_food` - *Hearing Aids Store* corresponds with `shop=hearing_aids` - *Herbalist* corresponds with `shop=herbalist` - *Hifi Store* corresponds with `shop=hifi` - - *Hobby Shop* corresponds with `shop=hobby` + - *Honey Store* corresponds with `shop=honey` - *Household Linen Shop* corresponds with `shop=household_linen` - *Houseware Store* corresponds with `shop=houseware` - *Hunting Shop* corresponds with `shop=hunting` @@ -243,18 +244,20 @@ This is rendered with `This is a {shop}` - *Motorcycle Repair Shop* corresponds with `shop=motorcycle_repair` - *Music Store* corresponds with `shop=music` - *Musical Instrument Store* corresponds with `shop=musical_instrument` - - *Newspaper/Magazine Shop* corresponds with `shop=newsagent` + - *Newsstand* corresponds with `shop=newsagent` - *Nutrition Supplements Store* corresponds with `shop=nutrition_supplements` + - *Nuts Shop* corresponds with `shop=nuts` - *Optician* corresponds with `shop=optician` - *Outdoors Store* corresponds with `shop=outdoor` - *Online Retailer Outpost* corresponds with `shop=outpost` - *Paint Store* corresponds with `shop=paint` - *Party Supply Store* corresponds with `shop=party` + - *Pasta Store* corresponds with `shop=pasta` - *Pastry Shop* corresponds with `shop=pastry` - - *Pawn Shop* corresponds with `shop=pawnbroker` + - *Pawnshop* corresponds with `shop=pawnbroker` - *Perfume Store* corresponds with `shop=perfumery` - *Pet Store* corresponds with `shop=pet` - - *Pet Grooming Store* corresponds with `shop=pet_grooming` + - *Pet Groomer* corresponds with `shop=pet_grooming` - *Photography Store* corresponds with `shop=photo` - *Pottery Store* corresponds with `shop=pottery` - *Printer Ink Store* corresponds with `shop=printer_ink` @@ -264,9 +267,10 @@ This is rendered with `This is a {shop}` - *Religious Store* corresponds with `shop=religion` - *Rental Shop* corresponds with `shop=rental` - *Repair Shop* corresponds with `shop=repair` + - *Rice Store* corresponds with `shop=rice` - *Scuba Diving Shop* corresponds with `shop=scuba_diving` - *Seafood Shop* corresponds with `shop=seafood` - - *Consignment/Thrift Store* corresponds with `shop=second_hand` + - *Thrift Store* corresponds with `shop=second_hand` - *Sewing Supply Shop* corresponds with `shop=sewing` - *Shoe Repair Shop* corresponds with `shop=shoe_repair` - *Shoe Store* corresponds with `shop=shoes` @@ -290,7 +294,7 @@ This is rendered with `This is a {shop}` - *Trophy Shop* corresponds with `shop=trophy` - *Tire Store* corresponds with `shop=tyres` - *Vacuum Cleaner Store* corresponds with `shop=vacuum_cleaner` - - *Variety Store* corresponds with `shop=variety_store` + - *Discount Store* corresponds with `shop=variety_store` - *Video Store* corresponds with `shop=video` - *Video Game Store* corresponds with `shop=video_games` - *Watches Shop* corresponds with `shop=watches` @@ -320,7 +324,7 @@ The question is *Does this shop sell second-hand items?* - *This shop only sells brand-new items* corresponds with `second_hand=no` -This tagrendering is only visible in the popup if the following condition is met: `shop=clothes|shop=car|shop=books|shop=charity|shop=car_repair|shop=furniture|shop=bicycle|shop=bicycle|shop=mobile_phone|shop=computer|shop=toys` +This tagrendering is only visible in the popup if the following condition is met: `shop=clothes |shop=car |shop=books |shop=charity |shop=car_repair |shop=furniture |shop=bicycle |shop=bicycle |shop=mobile_phone |shop=computer |shop=toys` @@ -487,7 +491,26 @@ The question is *What paper formats does this shop offer?* - Unselecting this answer will add service:print:A0=no -This tagrendering is only visible in the popup if the following condition is met: `shop~^(.*copyshop.*)$|shop~^(.*stationery.*)$|service:print=yes` +This tagrendering is only visible in the popup if the following condition is met: `shop~^(.*copyshop.*)$ |shop~^(.*stationery.*)$ |service:print=yes` + + + +### key_cutter + + + +The question is *Does this shop offer key cutting?* + + + + + + - *This shop is also specialized in key cutting* corresponds with `craft=key_cutter` + - *This shop offers key cutting as a service* corresponds with `service:key_cutting=yes` + - *This shops does not offer key cutting as a service* corresponds with `service:key_cutting=no` + + +This tagrendering is only visible in the popup if the following condition is met: `shop=shoe_repair |service:key_cutting~.+ |craft=key_cutting |shop=diy |shop=doityourself |shop=home_improvement |shop=hardware |shop=locksmith |shop=repair` @@ -526,7 +549,7 @@ The question is *Is there a fee for internet access?* - *Internet access is free at this place, for customers only* corresponds with `internet_access:fee=customers` -This tagrendering is only visible in the popup if the following condition is met: `internet_access!=no&internet_access~.+` +This tagrendering is only visible in the popup if the following condition is met: `internet_access!=no &internet_access~.+` @@ -566,7 +589,7 @@ The question is *Does this shop offer organic products?* - *This shop does not offer organic products* corresponds with `organic=no` -This tagrendering is only visible in the popup if the following condition is met: `shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=clothes|shop=shoes|shop=butcher|shop=cosmetics|shop=deli|shop=bakery|shop=alcohol|shop=seafood|shop=beverages|shop=florist` +This tagrendering is only visible in the popup if the following condition is met: `shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=clothes |shop=shoes |shop=butcher |shop=cosmetics |shop=deli |shop=bakery |shop=alcohol |shop=seafood |shop=beverages |shop=florist` @@ -586,7 +609,9 @@ The question is *Does this shop have a sugar free offering?* - *This shop has no sugar free offering* corresponds with `diet:sugar_free=no` -This tagrendering is only visible in the popup if the following condition is met: `shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream` +This tagrendering is only visible in the popup if the following condition is met: `shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream` + +This tagrendering has labels `diets` @@ -606,7 +631,9 @@ The question is *Does this shop have a gluten free offering?* - *This shop has no gluten free offering* corresponds with `diet:gluten_free=no` -This tagrendering is only visible in the popup if the following condition is met: `shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream` +This tagrendering is only visible in the popup if the following condition is met: `shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream` + +This tagrendering has labels `diets` @@ -626,7 +653,9 @@ The question is *Does {title()} have a lactose-free offering?* - *No lactose free offering* corresponds with `diet:lactose_free=no` -This tagrendering is only visible in the popup if the following condition is met: `shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream` +This tagrendering is only visible in the popup if the following condition is met: `shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream` + +This tagrendering has labels `diets` @@ -696,7 +725,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` @@ -753,35 +782,35 @@ accepts_cards.0 | Accepts payment cards | payment:cards=yes id | question | osmTags ---- | ---------- | --------- -has_organic.0 | Has organic options | organic=yes\|organic=only +has_organic.0 | Has organic options | organic=yes \|organic=only id | question | osmTags ---- | ---------- | --------- -second_hand.0 | Only show shops selling second-hand items | shop=second_hand\|shop=charity\|second_hand=yes\|second_hand=only +second_hand.0 | Only show shops selling second-hand items | shop=second_hand \|shop=charity \|second_hand=yes \|second_hand=only id | question | osmTags ---- | ---------- | --------- -sugar_free.0 | Has a sugar-free offering | diet:sugar_free=yes\|diet:sugar_free=only\|diet:sugar_free=limited +sugar_free.0 | Has a sugar-free offering | diet:sugar_free=yes \|diet:sugar_free=only \|diet:sugar_free=limited id | question | osmTags ---- | ---------- | --------- -gluten_free.0 | Has a gluten free offering | diet:gluten_free=yes\|diet:gluten_free=only\|diet:gluten_free=limited +gluten_free.0 | Has a gluten free offering | diet:gluten_free=yes \|diet:gluten_free=only \|diet:gluten_free=limited id | question | osmTags ---- | ---------- | --------- -lactose_free.0 | Has a lactose free offering | diet:lactose_free=yes\|diet:lactose_free=only\|diet:lactose_free=limited +lactose_free.0 | Has a lactose free offering | diet:lactose_free=yes \|diet:lactose_free=only \|diet:lactose_free=limited This document is autogenerated from [assets/themes/climbing/climbing.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/themes/climbing/climbing.json) diff --git a/Docs/Layers/shower.md b/Docs/Layers/shower.md index 28edf884c..63e97b0a0 100644 --- a/Docs/Layers/shower.md +++ b/Docs/Layers/shower.md @@ -5,7 +5,7 @@ - + A layer showing (public) showers @@ -72,7 +72,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -237,7 +237,7 @@ The question is *Which methods of payment are accepted here?* - Unselecting this answer will add payment:credit_cards=no -This tagrendering is only visible in the popup if the following condition is met: `fee=yes|hot_water=fee` +This tagrendering is only visible in the popup if the following condition is met: `fee=yes |hot_water=fee` @@ -293,7 +293,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` @@ -315,14 +315,14 @@ This tagrendering has no question and is thus read-only id | question | osmTags ---- | ---------- | --------- -free.0 | Free to use | fee=no\|fee=0\|charge=0 +free.0 | Free to use | fee=no \|fee=0 \|charge=0 id | question | osmTags ---- | ---------- | --------- -hot-water.0 | Hot water available | hot_water=yes\|hot_water=fee +hot-water.0 | Hot water available | hot_water=yes \|hot_water=fee diff --git a/Docs/Layers/slow_roads.md b/Docs/Layers/slow_roads.md index 417dbaa24..8f3803c4c 100644 --- a/Docs/Layers/slow_roads.md +++ b/Docs/Layers/slow_roads.md @@ -5,7 +5,7 @@ - + All carfree roads @@ -57,7 +57,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -83,12 +83,12 @@ This tagrendering has no question and is thus read-only - - *
Dit is een woonerf:
  • Voetgangers mogen hier de volledige breedte van de straat gebruiken
  • Gemotoriseerd verkeer mag maximaal 20km/h rijden
* corresponds with `highway=living_street` - - *Dit is een brede, autovrije straat* corresponds with `highway=pedestrian` - - *Dit is een voetpaadje* corresponds with `highway=footway` - - *Dit is een wegeltje of bospad* corresponds with `highway=path` - - *Dit is een ruiterswegel* corresponds with `highway=bridleway` - - *Dit is een tractorspoor of weg om landbouwgrond te bereikken* corresponds with `highway=track` + - *This is a living street* corresponds with `highway=living_street` + - *This is a wide, carfree street* corresponds with `highway=pedestrian` + - *This is a footway* corresponds with `highway=footway` + - *This is a small path* corresponds with `highway=path` + - *This is a bridleway* corresponds with `highway=bridleway` + - *This is a land access road* corresponds with `highway=track` @@ -97,7 +97,7 @@ This tagrendering has no question and is thus read-only -The question is *Wat is de wegverharding van dit pad?* +The question is *What surface does this road have?* This rendering asks information about the property [surface](https://wiki.openstreetmap.org/wiki/Key:surface) @@ -125,14 +125,14 @@ This is rendered with `The surface is {surface}` -The question is *Is deze weg 's nachts verlicht?* +The question is *Is this road lit at night?* - *'s nachts verlicht* corresponds with `lit=yes` - - *Niet verlicht* corresponds with `lit=no` + - *Not lit* corresponds with `lit=no` @@ -169,7 +169,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/speed_camera.md b/Docs/Layers/speed_camera.md index 792ea53be..92b7dbce7 100644 --- a/Docs/Layers/speed_camera.md +++ b/Docs/Layers/speed_camera.md @@ -5,7 +5,7 @@ - + Layer showing speed cameras @@ -68,7 +68,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -130,7 +130,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/speed_display.md b/Docs/Layers/speed_display.md index d710d1a1b..b1e5b1608 100644 --- a/Docs/Layers/speed_display.md +++ b/Docs/Layers/speed_display.md @@ -5,7 +5,7 @@ - + Layer showing speed displays that alert drivers of their speed. @@ -68,7 +68,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -132,7 +132,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/sport_pitch.md b/Docs/Layers/sport_pitch.md index 61bc1a6c7..13e5119ec 100644 --- a/Docs/Layers/sport_pitch.md +++ b/Docs/Layers/sport_pitch.md @@ -5,7 +5,7 @@ - + A sport pitch @@ -75,7 +75,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -294,7 +294,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` @@ -316,7 +316,7 @@ This tagrendering has no question and is thus read-only id | question | osmTags ---- | ---------- | --------- -accessibility.0 | Publicly accessible | access=yes\|access=public\| +accessibility.0 | Publicly accessible | access=yes \|access=public \| diff --git a/Docs/Layers/sport_places_without_etymology.md b/Docs/Layers/sport_places_without_etymology.md index d8243531e..6a0c4facb 100644 --- a/Docs/Layers/sport_places_without_etymology.md +++ b/Docs/Layers/sport_places_without_etymology.md @@ -5,7 +5,7 @@ - + All objects which have an etymology known @@ -67,7 +67,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -190,7 +190,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/sport_shops.md b/Docs/Layers/sport_shops.md index 8ea7f90be..a2c8d751a 100644 --- a/Docs/Layers/sport_shops.md +++ b/Docs/Layers/sport_shops.md @@ -5,7 +5,7 @@ - + A shop @@ -47,7 +47,7 @@ attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ [](https://taginfo.openstreetmap.org/keys/id#values) [id](https://wiki.openstreetmap.org/wiki/Key:id) | Multiple choice | [](https://taginfo.openstreetmap.org/keys/name#values) [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) | -[](https://taginfo.openstreetmap.org/keys/shop#values) [shop](https://wiki.openstreetmap.org/wiki/Key:shop) | [string](../SpecialInputElements.md#string) | [agrarian](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dagrarian) [alcohol](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dalcohol) [anime](https://wiki.openstreetmap.org/wiki/Tag:shop%3Danime) [antiques](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dantiques) [appliance](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dappliance) [art](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dart) [baby_goods](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbaby_goods) [bag](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbag) [bakery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbakery) [bathroom_furnishing](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbathroom_furnishing) [beauty](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbeauty) [bed](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbed) [beverages](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbeverages) [bicycle](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbicycle) [boat](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dboat) [bookmaker](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbookmaker) [books](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbooks) [brewing_supplies](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbrewing_supplies) [butcher](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbutcher) [camera](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcamera) [candles](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcandles) [cannabis](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcannabis) [car](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcar) [car_parts](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcar_parts) [car_repair](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcar_repair) [caravan](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcaravan) [carpet](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcarpet) [catalogue](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcatalogue) [charity](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcharity) [cheese](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcheese) [chemist](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dchemist) [chocolate](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dchocolate) [clothes](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dclothes) [coffee](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcoffee) [collector](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcollector) [computer](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcomputer) [confectionery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dconfectionery) [convenience](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dconvenience) [copyshop](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcopyshop) [cosmetics](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcosmetics) [country_store](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcountry_store) [craft](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcraft) [curtain](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcurtain) [dairy](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddairy) [deli](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddeli) [department_store](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddepartment_store) [doityourself](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddoityourself) [doors](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddoors) [dry_cleaning](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddry_cleaning) [e-cigarette](https://wiki.openstreetmap.org/wiki/Tag:shop%3De-cigarette) [electrical](https://wiki.openstreetmap.org/wiki/Tag:shop%3Delectrical) [electronics](https://wiki.openstreetmap.org/wiki/Tag:shop%3Delectronics) [erotic](https://wiki.openstreetmap.org/wiki/Tag:shop%3Derotic) [fabric](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfabric) [farm](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfarm) [fashion_accessories](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfashion_accessories) [fireplace](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfireplace) [fishing](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfishing) [flooring](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dflooring) [florist](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dflorist) [frame](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dframe) [frozen_food](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfrozen_food) [fuel](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfuel) [funeral_directors](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfuneral_directors) [furniture](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfurniture) [games](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgames) [garden_centre](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgarden_centre) [gas](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgas) [general](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgeneral) [gift](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgift) [greengrocer](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgreengrocer) [hairdresser](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhairdresser) [hairdresser_supply](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhairdresser_supply) [hardware](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhardware) [health_food](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhealth_food) [hearing_aids](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhearing_aids) [herbalist](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dherbalist) [hifi](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhifi) [hobby](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhobby) [household_linen](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhousehold_linen) [houseware](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhouseware) [hunting](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhunting) [interior_decoration](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dinterior_decoration) [jewelry](https://wiki.openstreetmap.org/wiki/Tag:shop%3Djewelry) [kiosk](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dkiosk) [kitchen](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dkitchen) [laundry](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dlaundry) [leather](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dleather) [lighting](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dlighting) [locksmith](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dlocksmith) [lottery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dlottery) [mall](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmall) [massage](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmassage) [medical_supply](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmedical_supply) [military_surplus](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmilitary_surplus) [mobile_phone](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmobile_phone) [model](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmodel) [money_lender](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmoney_lender) [motorcycle](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmotorcycle) [motorcycle_repair](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmotorcycle_repair) [music](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmusic) [musical_instrument](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmusical_instrument) [newsagent](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dnewsagent) [nutrition_supplements](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dnutrition_supplements) [optician](https://wiki.openstreetmap.org/wiki/Tag:shop%3Doptician) [outdoor](https://wiki.openstreetmap.org/wiki/Tag:shop%3Doutdoor) [outpost](https://wiki.openstreetmap.org/wiki/Tag:shop%3Doutpost) [paint](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpaint) [party](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dparty) [pastry](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpastry) [pawnbroker](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpawnbroker) [perfumery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dperfumery) [pet](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpet) [pet_grooming](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpet_grooming) [photo](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dphoto) [pottery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpottery) [printer_ink](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dprinter_ink) [psychic](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpsychic) [pyrotechnics](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpyrotechnics) [radiotechnics](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dradiotechnics) [religion](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dreligion) [rental](https://wiki.openstreetmap.org/wiki/Tag:shop%3Drental) [repair](https://wiki.openstreetmap.org/wiki/Tag:shop%3Drepair) [scuba_diving](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dscuba_diving) [seafood](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dseafood) [second_hand](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dsecond_hand) [sewing](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dsewing) [shoe_repair](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dshoe_repair) [shoes](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dshoes) [spices](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dspices) [sports](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dsports) [stationery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dstationery) [storage_rental](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dstorage_rental) [supermarket](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dsupermarket) [swimming_pool](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dswimming_pool) [tailor](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtailor) [tattoo](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtattoo) [tea](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtea) [telecommunication](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtelecommunication) [ticket](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dticket) [tiles](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtiles) [tobacco](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtobacco) [tool_hire](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtool_hire) [toys](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtoys) [trade](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtrade) [travel_agency](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtravel_agency) [trophy](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtrophy) [tyres](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtyres) [vacuum_cleaner](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dvacuum_cleaner) [variety_store](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dvariety_store) [video](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dvideo) [video_games](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dvideo_games) [watches](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwatches) [water](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwater) [water_sports](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwater_sports) [weapons](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dweapons) [wholesale](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwholesale) [wigs](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwigs) [window_blind](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwindow_blind) [wine](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwine) +[](https://taginfo.openstreetmap.org/keys/shop#values) [shop](https://wiki.openstreetmap.org/wiki/Key:shop) | [string](../SpecialInputElements.md#string) | [vacant](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dvacant) [agrarian](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dagrarian) [alcohol](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dalcohol) [anime](https://wiki.openstreetmap.org/wiki/Tag:shop%3Danime) [antiques](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dantiques) [appliance](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dappliance) [art](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dart) [baby_goods](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbaby_goods) [bag](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbag) [bakery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbakery) [bathroom_furnishing](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbathroom_furnishing) [beauty](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbeauty) [bed](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbed) [beverages](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbeverages) [bicycle](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbicycle) [boat](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dboat) [bookmaker](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbookmaker) [books](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbooks) [brewing_supplies](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbrewing_supplies) [butcher](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbutcher) [camera](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcamera) [candles](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcandles) [cannabis](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcannabis) [car](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcar) [car_parts](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcar_parts) [car_repair](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcar_repair) [caravan](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcaravan) [carpet](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcarpet) [catalogue](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcatalogue) [charity](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcharity) [cheese](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcheese) [chemist](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dchemist) [chocolate](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dchocolate) [clothes](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dclothes) [coffee](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcoffee) [collector](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcollector) [computer](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcomputer) [confectionery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dconfectionery) [convenience](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dconvenience) [copyshop](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcopyshop) [cosmetics](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcosmetics) [country_store](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcountry_store) [craft](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcraft) [curtain](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcurtain) [dairy](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddairy) [deli](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddeli) [department_store](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddepartment_store) [doityourself](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddoityourself) [doors](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddoors) [dry_cleaning](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddry_cleaning) [e-cigarette](https://wiki.openstreetmap.org/wiki/Tag:shop%3De-cigarette) [electrical](https://wiki.openstreetmap.org/wiki/Tag:shop%3Delectrical) [electronics](https://wiki.openstreetmap.org/wiki/Tag:shop%3Delectronics) [erotic](https://wiki.openstreetmap.org/wiki/Tag:shop%3Derotic) [fabric](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfabric) [farm](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfarm) [fashion_accessories](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfashion_accessories) [fireplace](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfireplace) [fishing](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfishing) [flooring](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dflooring) [florist](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dflorist) [frame](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dframe) [frozen_food](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfrozen_food) [fuel](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfuel) [funeral_directors](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfuneral_directors) [furniture](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfurniture) [games](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgames) [garden_centre](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgarden_centre) [gas](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgas) [general](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgeneral) [gift](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgift) [greengrocer](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgreengrocer) [hairdresser](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhairdresser) [hairdresser_supply](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhairdresser_supply) [hardware](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhardware) [health_food](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhealth_food) [hearing_aids](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhearing_aids) [herbalist](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dherbalist) [hifi](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhifi) [honey](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhoney) [household_linen](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhousehold_linen) [houseware](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhouseware) [hunting](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhunting) [interior_decoration](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dinterior_decoration) [jewelry](https://wiki.openstreetmap.org/wiki/Tag:shop%3Djewelry) [kiosk](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dkiosk) [kitchen](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dkitchen) [laundry](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dlaundry) [leather](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dleather) [lighting](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dlighting) [locksmith](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dlocksmith) [lottery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dlottery) [mall](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmall) [massage](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmassage) [medical_supply](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmedical_supply) [military_surplus](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmilitary_surplus) [mobile_phone](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmobile_phone) [model](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmodel) [money_lender](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmoney_lender) [motorcycle](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmotorcycle) [motorcycle_repair](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmotorcycle_repair) [music](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmusic) [musical_instrument](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmusical_instrument) [newsagent](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dnewsagent) [nutrition_supplements](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dnutrition_supplements) [nuts](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dnuts) [optician](https://wiki.openstreetmap.org/wiki/Tag:shop%3Doptician) [outdoor](https://wiki.openstreetmap.org/wiki/Tag:shop%3Doutdoor) [outpost](https://wiki.openstreetmap.org/wiki/Tag:shop%3Doutpost) [paint](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpaint) [party](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dparty) [pasta](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpasta) [pastry](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpastry) [pawnbroker](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpawnbroker) [perfumery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dperfumery) [pet](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpet) [pet_grooming](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpet_grooming) [photo](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dphoto) [pottery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpottery) [printer_ink](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dprinter_ink) [psychic](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpsychic) [pyrotechnics](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpyrotechnics) [radiotechnics](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dradiotechnics) [religion](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dreligion) [rental](https://wiki.openstreetmap.org/wiki/Tag:shop%3Drental) [repair](https://wiki.openstreetmap.org/wiki/Tag:shop%3Drepair) [rice](https://wiki.openstreetmap.org/wiki/Tag:shop%3Drice) [scuba_diving](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dscuba_diving) [seafood](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dseafood) [second_hand](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dsecond_hand) [sewing](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dsewing) [shoe_repair](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dshoe_repair) [shoes](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dshoes) [spices](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dspices) [sports](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dsports) [stationery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dstationery) [storage_rental](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dstorage_rental) [supermarket](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dsupermarket) [swimming_pool](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dswimming_pool) [tailor](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtailor) [tattoo](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtattoo) [tea](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtea) [telecommunication](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtelecommunication) [ticket](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dticket) [tiles](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtiles) [tobacco](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtobacco) [tool_hire](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtool_hire) [toys](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtoys) [trade](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtrade) [travel_agency](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtravel_agency) [trophy](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtrophy) [tyres](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtyres) [vacuum_cleaner](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dvacuum_cleaner) [variety_store](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dvariety_store) [video](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dvideo) [video_games](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dvideo_games) [watches](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwatches) [water](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwater) [water_sports](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwater_sports) [weapons](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dweapons) [wholesale](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwholesale) [wigs](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwigs) [window_blind](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwindow_blind) [wine](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwine) [](https://taginfo.openstreetmap.org/keys/second_hand#values) [second_hand](https://wiki.openstreetmap.org/wiki/Key:second_hand) | Multiple choice | [only](https://wiki.openstreetmap.org/wiki/Tag:second_hand%3Donly) [yes](https://wiki.openstreetmap.org/wiki/Tag:second_hand%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:second_hand%3Dno) [](https://taginfo.openstreetmap.org/keys/opening_hours#values) [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) | [opening_hours](../SpecialInputElements.md#opening_hours) | [](https://taginfo.openstreetmap.org/keys/website#values) [website](https://wiki.openstreetmap.org/wiki/Key:website) | [url](../SpecialInputElements.md#url) | @@ -80,7 +80,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -124,10 +124,11 @@ This is rendered with `This is a {shop}` + - *Vacant Shop* corresponds with `shop=vacant` - *Farm Supply Shop* corresponds with `shop=agrarian` - *Liquor Store* corresponds with `shop=alcohol` - *Anime / Manga Shop* corresponds with `shop=anime` - - *Antiques Shop* corresponds with `shop=antiques` + - *Antique Shop* corresponds with `shop=antiques` - *Appliance Store* corresponds with `shop=appliance` - *Art Store* corresponds with `shop=art` - *Baby Goods Store* corresponds with `shop=baby_goods` @@ -140,7 +141,7 @@ This is rendered with `This is a {shop}` - *Bicycle Shop* corresponds with `shop=bicycle` - *Boat Store* corresponds with `shop=boat` - *Bookmaker* corresponds with `shop=bookmaker` - - *Book Store* corresponds with `shop=books` + - *Bookstore* corresponds with `shop=books` - *Brewing Supply Store* corresponds with `shop=brewing_supplies` - *Butcher* corresponds with `shop=butcher` - *Camera Equipment Store* corresponds with `shop=camera` @@ -164,11 +165,11 @@ This is rendered with `This is a {shop}` - *Convenience Store* corresponds with `shop=convenience` - *Copy Store* corresponds with `shop=copyshop` - *Cosmetics Store* corresponds with `shop=cosmetics` - - *Country Store* corresponds with `shop=country_store` + - *Rural Supplies Store* corresponds with `shop=country_store` - *Arts & Crafts Store* corresponds with `shop=craft` - *Curtain Store* corresponds with `shop=curtain` - *Dairy Store* corresponds with `shop=dairy` - - *Deli* corresponds with `shop=deli` + - *Delicatessen* corresponds with `shop=deli` - *Department Store* corresponds with `shop=department_store` - *DIY Store* corresponds with `shop=doityourself` - *Door Shop* corresponds with `shop=doors` @@ -198,11 +199,11 @@ This is rendered with `This is a {shop}` - *Hairdresser* corresponds with `shop=hairdresser` - *Hairdresser Supply Store* corresponds with `shop=hairdresser_supply` - *Hardware Store* corresponds with `shop=hardware` - - *Health Food Shop* corresponds with `shop=health_food` + - *Health Food Store* corresponds with `shop=health_food` - *Hearing Aids Store* corresponds with `shop=hearing_aids` - *Herbalist* corresponds with `shop=herbalist` - *Hifi Store* corresponds with `shop=hifi` - - *Hobby Shop* corresponds with `shop=hobby` + - *Honey Store* corresponds with `shop=honey` - *Household Linen Shop* corresponds with `shop=household_linen` - *Houseware Store* corresponds with `shop=houseware` - *Hunting Shop* corresponds with `shop=hunting` @@ -226,18 +227,20 @@ This is rendered with `This is a {shop}` - *Motorcycle Repair Shop* corresponds with `shop=motorcycle_repair` - *Music Store* corresponds with `shop=music` - *Musical Instrument Store* corresponds with `shop=musical_instrument` - - *Newspaper/Magazine Shop* corresponds with `shop=newsagent` + - *Newsstand* corresponds with `shop=newsagent` - *Nutrition Supplements Store* corresponds with `shop=nutrition_supplements` + - *Nuts Shop* corresponds with `shop=nuts` - *Optician* corresponds with `shop=optician` - *Outdoors Store* corresponds with `shop=outdoor` - *Online Retailer Outpost* corresponds with `shop=outpost` - *Paint Store* corresponds with `shop=paint` - *Party Supply Store* corresponds with `shop=party` + - *Pasta Store* corresponds with `shop=pasta` - *Pastry Shop* corresponds with `shop=pastry` - - *Pawn Shop* corresponds with `shop=pawnbroker` + - *Pawnshop* corresponds with `shop=pawnbroker` - *Perfume Store* corresponds with `shop=perfumery` - *Pet Store* corresponds with `shop=pet` - - *Pet Grooming Store* corresponds with `shop=pet_grooming` + - *Pet Groomer* corresponds with `shop=pet_grooming` - *Photography Store* corresponds with `shop=photo` - *Pottery Store* corresponds with `shop=pottery` - *Printer Ink Store* corresponds with `shop=printer_ink` @@ -247,9 +250,10 @@ This is rendered with `This is a {shop}` - *Religious Store* corresponds with `shop=religion` - *Rental Shop* corresponds with `shop=rental` - *Repair Shop* corresponds with `shop=repair` + - *Rice Store* corresponds with `shop=rice` - *Scuba Diving Shop* corresponds with `shop=scuba_diving` - *Seafood Shop* corresponds with `shop=seafood` - - *Consignment/Thrift Store* corresponds with `shop=second_hand` + - *Thrift Store* corresponds with `shop=second_hand` - *Sewing Supply Shop* corresponds with `shop=sewing` - *Shoe Repair Shop* corresponds with `shop=shoe_repair` - *Shoe Store* corresponds with `shop=shoes` @@ -273,7 +277,7 @@ This is rendered with `This is a {shop}` - *Trophy Shop* corresponds with `shop=trophy` - *Tire Store* corresponds with `shop=tyres` - *Vacuum Cleaner Store* corresponds with `shop=vacuum_cleaner` - - *Variety Store* corresponds with `shop=variety_store` + - *Discount Store* corresponds with `shop=variety_store` - *Video Store* corresponds with `shop=video` - *Video Game Store* corresponds with `shop=video_games` - *Watches Shop* corresponds with `shop=watches` @@ -303,7 +307,7 @@ The question is *Does this shop sell second-hand items?* - *This shop only sells brand-new items* corresponds with `second_hand=no` -This tagrendering is only visible in the popup if the following condition is met: `shop=clothes|shop=car|shop=books|shop=charity|shop=car_repair|shop=furniture|shop=bicycle|shop=bicycle|shop=mobile_phone|shop=computer|shop=toys` +This tagrendering is only visible in the popup if the following condition is met: `shop=clothes |shop=car |shop=books |shop=charity |shop=car_repair |shop=furniture |shop=bicycle |shop=bicycle |shop=mobile_phone |shop=computer |shop=toys` @@ -470,7 +474,26 @@ The question is *What paper formats does this shop offer?* - Unselecting this answer will add service:print:A0=no -This tagrendering is only visible in the popup if the following condition is met: `shop~^(.*copyshop.*)$|shop~^(.*stationery.*)$|service:print=yes` +This tagrendering is only visible in the popup if the following condition is met: `shop~^(.*copyshop.*)$ |shop~^(.*stationery.*)$ |service:print=yes` + + + +### key_cutter + + + +The question is *Does this shop offer key cutting?* + + + + + + - *This shop is also specialized in key cutting* corresponds with `craft=key_cutter` + - *This shop offers key cutting as a service* corresponds with `service:key_cutting=yes` + - *This shops does not offer key cutting as a service* corresponds with `service:key_cutting=no` + + +This tagrendering is only visible in the popup if the following condition is met: `shop=shoe_repair |service:key_cutting~.+ |craft=key_cutting |shop=diy |shop=doityourself |shop=home_improvement |shop=hardware |shop=locksmith |shop=repair` @@ -509,7 +532,7 @@ The question is *Is there a fee for internet access?* - *Internet access is free at this place, for customers only* corresponds with `internet_access:fee=customers` -This tagrendering is only visible in the popup if the following condition is met: `internet_access!=no&internet_access~.+` +This tagrendering is only visible in the popup if the following condition is met: `internet_access!=no &internet_access~.+` @@ -549,7 +572,7 @@ The question is *Does this shop offer organic products?* - *This shop does not offer organic products* corresponds with `organic=no` -This tagrendering is only visible in the popup if the following condition is met: `shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=clothes|shop=shoes|shop=butcher|shop=cosmetics|shop=deli|shop=bakery|shop=alcohol|shop=seafood|shop=beverages|shop=florist` +This tagrendering is only visible in the popup if the following condition is met: `shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=clothes |shop=shoes |shop=butcher |shop=cosmetics |shop=deli |shop=bakery |shop=alcohol |shop=seafood |shop=beverages |shop=florist` @@ -569,7 +592,9 @@ The question is *Does this shop have a sugar free offering?* - *This shop has no sugar free offering* corresponds with `diet:sugar_free=no` -This tagrendering is only visible in the popup if the following condition is met: `shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream` +This tagrendering is only visible in the popup if the following condition is met: `shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream` + +This tagrendering has labels `diets` @@ -589,7 +614,9 @@ The question is *Does this shop have a gluten free offering?* - *This shop has no gluten free offering* corresponds with `diet:gluten_free=no` -This tagrendering is only visible in the popup if the following condition is met: `shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream` +This tagrendering is only visible in the popup if the following condition is met: `shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream` + +This tagrendering has labels `diets` @@ -609,7 +636,9 @@ The question is *Does {title()} have a lactose-free offering?* - *No lactose free offering* corresponds with `diet:lactose_free=no` -This tagrendering is only visible in the popup if the following condition is met: `shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream` +This tagrendering is only visible in the popup if the following condition is met: `shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream` + +This tagrendering has labels `diets` @@ -679,7 +708,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` @@ -736,35 +765,35 @@ accepts_cards.0 | Accepts payment cards | payment:cards=yes id | question | osmTags ---- | ---------- | --------- -has_organic.0 | Has organic options | organic=yes\|organic=only +has_organic.0 | Has organic options | organic=yes \|organic=only id | question | osmTags ---- | ---------- | --------- -second_hand.0 | Only show shops selling second-hand items | shop=second_hand\|shop=charity\|second_hand=yes\|second_hand=only +second_hand.0 | Only show shops selling second-hand items | shop=second_hand \|shop=charity \|second_hand=yes \|second_hand=only id | question | osmTags ---- | ---------- | --------- -sugar_free.0 | Has a sugar-free offering | diet:sugar_free=yes\|diet:sugar_free=only\|diet:sugar_free=limited +sugar_free.0 | Has a sugar-free offering | diet:sugar_free=yes \|diet:sugar_free=only \|diet:sugar_free=limited id | question | osmTags ---- | ---------- | --------- -gluten_free.0 | Has a gluten free offering | diet:gluten_free=yes\|diet:gluten_free=only\|diet:gluten_free=limited +gluten_free.0 | Has a gluten free offering | diet:gluten_free=yes \|diet:gluten_free=only \|diet:gluten_free=limited id | question | osmTags ---- | ---------- | --------- -lactose_free.0 | Has a lactose free offering | diet:lactose_free=yes\|diet:lactose_free=only\|diet:lactose_free=limited +lactose_free.0 | Has a lactose free offering | diet:lactose_free=yes \|diet:lactose_free=only \|diet:lactose_free=limited This document is autogenerated from [assets/themes/sports/sports.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/themes/sports/sports.json) diff --git a/Docs/Layers/sports_centre.md b/Docs/Layers/sports_centre.md index c77e31cd6..2e47388dc 100644 --- a/Docs/Layers/sports_centre.md +++ b/Docs/Layers/sports_centre.md @@ -5,7 +5,7 @@ - + Indoor and outdoor sports centres can be found on this layer @@ -71,7 +71,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -227,7 +227,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/stairs.md b/Docs/Layers/stairs.md index 4a731f160..b24fb28cc 100644 --- a/Docs/Layers/stairs.md +++ b/Docs/Layers/stairs.md @@ -71,7 +71,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -232,7 +232,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/street_lamps.md b/Docs/Layers/street_lamps.md index b1ebb5f35..d695c6f8e 100644 --- a/Docs/Layers/street_lamps.md +++ b/Docs/Layers/street_lamps.md @@ -5,7 +5,7 @@ - + A layer showing street lights @@ -74,7 +74,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -299,7 +299,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/streets_without_etymology.md b/Docs/Layers/streets_without_etymology.md index 16f888945..8bace5f5e 100644 --- a/Docs/Layers/streets_without_etymology.md +++ b/Docs/Layers/streets_without_etymology.md @@ -5,7 +5,7 @@ - + All objects which have an etymology known @@ -67,7 +67,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -190,7 +190,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/surveillance_camera.md b/Docs/Layers/surveillance_camera.md index d28122081..691336117 100644 --- a/Docs/Layers/surveillance_camera.md +++ b/Docs/Layers/surveillance_camera.md @@ -5,7 +5,7 @@ - + This layer shows surveillance cameras and allows a contributor to update information and add new cameras @@ -77,7 +77,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -209,7 +209,7 @@ This is rendered with `Located on level {level}` -This tagrendering is only visible in the popup if the following condition is met: `indoor=yes|surveillance:type=ye` +This tagrendering is only visible in the popup if the following condition is met: `indoor=yes |surveillance:type=ye` @@ -302,7 +302,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/tertiary_education.md b/Docs/Layers/tertiary_education.md index c23a00117..7f0eabc78 100644 --- a/Docs/Layers/tertiary_education.md +++ b/Docs/Layers/tertiary_education.md @@ -5,7 +5,7 @@ - + Layer with all tertiary education institutes (ISCED:2011 levels 6,7 and 8) @@ -73,7 +73,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -242,7 +242,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/ticket_machine.md b/Docs/Layers/ticket_machine.md index 66f52f04a..f485ae83b 100644 --- a/Docs/Layers/ticket_machine.md +++ b/Docs/Layers/ticket_machine.md @@ -5,7 +5,7 @@ - + Find ticket machines for public transport tickets @@ -70,7 +70,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -203,7 +203,7 @@ The question is *What coins can you use to pay here?* - *5 francs coins are accepted* corresponds with `payment:coins:denominations=5 CHF` -This tagrendering is only visible in the popup if the following condition is met: `payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$` +This tagrendering is only visible in the popup if the following condition is met: `payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$` @@ -232,7 +232,7 @@ The question is *what notes can you use to pay here?* - *1000 francs notes are accepted* corresponds with `payment:notes:denominations=1000 CHF` -This tagrendering is only visible in the popup if the following condition is met: `payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$` +This tagrendering is only visible in the popup if the following condition is met: `payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$` @@ -288,7 +288,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/ticket_validator.md b/Docs/Layers/ticket_validator.md index 2e318d716..1d2dc6d37 100644 --- a/Docs/Layers/ticket_validator.md +++ b/Docs/Layers/ticket_validator.md @@ -5,7 +5,7 @@ - + Find ticket validators to validate public transport tickets @@ -57,7 +57,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -227,7 +227,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/toekomstige_fietsstraat.md b/Docs/Layers/toekomstige_fietsstraat.md index e81537a41..4b813862e 100644 --- a/Docs/Layers/toekomstige_fietsstraat.md +++ b/Docs/Layers/toekomstige_fietsstraat.md @@ -15,6 +15,7 @@ This street will become a cyclestreet soon - This layer is shown at zoomlevel **9** and higher + - Not rendered on the map by default. If you want to rendering this on the map, override `mapRenderings` @@ -62,10 +63,10 @@ The question is *Is the street {name} a cyclestreet?* - - *This street is a cyclestreet (and has a speed limit of 30 km/h)* corresponds with `cyclestreet=yes&maxspeed=30&overtaking:motor_vehicle=no` + - *This street is a cyclestreet (and has a speed limit of 30 km/h)* corresponds with `cyclestreet=yes &maxspeed=30 &overtaking:motor_vehicle=no` - *This street is a bicycle road* corresponds with `bicycle_road=yes` - This option cannot be chosen as answer - - *This street is a bicycle road (has a speed limit of 30 km/h and vehicles are not allowed) (sign will be asked later)* corresponds with `bicycle_road=yes&maxspeed=30&source:maxspeed=DE:bicycle_road&vehicle=no&bicycle=designated` + - *This street is a bicycle road (has a speed limit of 30 km/h and vehicles are not allowed) (sign will be asked later)* corresponds with `bicycle_road=yes &maxspeed=30 &source:maxspeed=DE:bicycle_road &vehicle=no &bicycle=designated` - *This street is a cyclestreet* corresponds with `cyclestreet=yes` - *This street will become a cyclestreet soon* corresponds with `proposed:cyclestreet=yes` - *This street will become a bicycle road soon* corresponds with `proposed:bicycle_road=yes` @@ -91,7 +92,7 @@ The question is *What sign does this bicycle road have?* - *There are no supplementary signs at this bicycle road.* corresponds with `traffic_sign=DE:244.1` -This tagrendering is only visible in the popup if the following condition is met: `bicycle_road=yes&_country=de` +This tagrendering is only visible in the popup if the following condition is met: `bicycle_road=yes &_country=de` @@ -126,7 +127,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -174,7 +175,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/toilet.md b/Docs/Layers/toilet.md index f5a2c5334..e51060567 100644 --- a/Docs/Layers/toilet.md +++ b/Docs/Layers/toilet.md @@ -5,7 +5,7 @@ - + A layer showing (public) toilets @@ -82,7 +82,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -287,7 +287,7 @@ This is rendered with `The door to the wheelchair-accessible toilet is {canonic -This tagrendering is only visible in the popup if the following condition is met: `wheelchair=yes|wheelchair=designated` +This tagrendering is only visible in the popup if the following condition is met: `wheelchair=yes |wheelchair=designated` This tagrendering has labels `relevant-questions` @@ -459,7 +459,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` @@ -481,7 +481,7 @@ This tagrendering has no question and is thus read-only id | question | osmTags ---- | ---------- | --------- -wheelchair.0 | Wheelchair accessible | wheelchair=yes\|wheelchair=designated +wheelchair.0 | Wheelchair accessible | wheelchair=yes \|wheelchair=designated @@ -495,7 +495,7 @@ changing_table.0 | Has a changing table | changing_table=yes id | question | osmTags ---- | ---------- | --------- -free.0 | Free to use | fee=no\|fee=0\|charge=0 +free.0 | Free to use | fee=no \|fee=0 \|charge=0 diff --git a/Docs/Layers/toilet_at_amenity.md b/Docs/Layers/toilet_at_amenity.md index a2d81be2a..67bb12328 100644 --- a/Docs/Layers/toilet_at_amenity.md +++ b/Docs/Layers/toilet_at_amenity.md @@ -5,7 +5,7 @@ - + A layer showing (public) toilets located at different places. @@ -79,7 +79,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -235,7 +235,7 @@ This is rendered with `The door to the wheelchair-accessible toilet is {canonic -This tagrendering is only visible in the popup if the following condition is met: `toilets:wheelchair=yes|toilets:wheelchair=designated` +This tagrendering is only visible in the popup if the following condition is met: `toilets:wheelchair=yes |toilets:wheelchair=designated` @@ -395,7 +395,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` @@ -417,7 +417,7 @@ This tagrendering has no question and is thus read-only id | question | osmTags ---- | ---------- | --------- -wheelchair.0 | Wheelchair accessible | toilets:wheelchair=yes\|toilets:wheelchair=designated +wheelchair.0 | Wheelchair accessible | toilets:wheelchair=yes \|toilets:wheelchair=designated @@ -431,7 +431,7 @@ changing_table.0 | Has a changing table | changing_table=yes id | question | osmTags ---- | ---------- | --------- -free.0 | Free to use | toilets:fee=no\|toilets:fee=0\|toilets:charge=0 +free.0 | Free to use | toilets:fee=no \|toilets:fee=0 \|toilets:charge=0 diff --git a/Docs/Layers/toursistic_places_without_etymology.md b/Docs/Layers/toursistic_places_without_etymology.md index 5dd7db5c3..ba90d4d9e 100644 --- a/Docs/Layers/toursistic_places_without_etymology.md +++ b/Docs/Layers/toursistic_places_without_etymology.md @@ -5,7 +5,7 @@ - + All objects which have an etymology known @@ -67,7 +67,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -190,7 +190,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/trail.md b/Docs/Layers/trail.md index 20e6a5a15..986124855 100644 --- a/Docs/Layers/trail.md +++ b/Docs/Layers/trail.md @@ -5,9 +5,9 @@ - -Aangeduide wandeltochten + +Waymarked trails @@ -59,7 +59,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -89,11 +89,11 @@ This tagrendering has no question and is thus read-only -The question is *Wat is de naam van deze wandeling?* +The question is *What is the name of this trail?* This rendering asks information about the property [name](https://wiki.openstreetmap.org/wiki/Key:name) -This is rendered with `Deze wandeling heet {name}` +This is rendered with `This trail is called {name}` @@ -103,18 +103,18 @@ This is rendered with `Deze wandeling heet {name}` -The question is *Wie beheert deze wandeltocht?* +The question is *Who maintains this trail?* This rendering asks information about the property [operator](https://wiki.openstreetmap.org/wiki/Key:operator) -This is rendered with `Beheer door {operator}` +This is rendered with `This trail is maintained by {operator}` - - *Dit gebied wordt beheerd door Natuurpunt* corresponds with `operator=Natuurpunt` - - *Dit gebied wordt beheerd door {operator}* corresponds with `operator~^((n|N)atuurpunt.*)$` + - *This trail is maintained by Natuurpunt* corresponds with `operator=Natuurpunt` + - *This trail is maintained by {operator}* corresponds with `operator~^((n|N)atuurpunt.*)$` - This option cannot be chosen as answer @@ -124,11 +124,11 @@ This is rendered with `Beheer door {operator}` -The question is *Welke kleur heeft deze wandeling?* +The question is *What is the reference colour of this trail?* This rendering asks information about the property [colour](https://wiki.openstreetmap.org/wiki/Key:colour) -This is rendered with `Deze wandeling heeft kleur {colour}` +This is rendered with `The reference colour is {colour}` @@ -146,14 +146,14 @@ This is rendered with `Deze wandeling heeft kleur {colour}` -The question is *Is deze wandeling toegankelijk met de rolstoel?* +The question is *Is this trail wheelchair accessible?* - - *deze wandeltocht is toegankelijk met de rolstoel* corresponds with `wheelchair=yes` - - *deze wandeltocht is niet toegankelijk met de rolstoel* corresponds with `wheelchair=no` + - *This trail is wheelchair-accessible* corresponds with `wheelchair=yes` + - *This trail is not wheelchair accessible* corresponds with `wheelchair=no` @@ -162,14 +162,14 @@ The question is *Is deze wandeling toegankelijk met de rolstoel?* -The question is *Is deze wandeltocht toegankelijk met de buggy?* +The question is *Is this trail accessible with a pushchair?* - - *deze wandeltocht is toegankelijk met de buggy* corresponds with `pushchair=yes` - - *deze wandeltocht is niet toegankelijk met de buggy* corresponds with `pushchair=no` + - *This trail is accessible with a pushchair* corresponds with `pushchair=yes` + - *This trail is not accessible with a pushchair* corresponds with `pushchair=no` @@ -206,7 +206,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/transit_routes.md b/Docs/Layers/transit_routes.md index 291cfca34..f9d3cdc28 100644 --- a/Docs/Layers/transit_routes.md +++ b/Docs/Layers/transit_routes.md @@ -74,7 +74,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -208,7 +208,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/transit_stops.md b/Docs/Layers/transit_stops.md index da394aa41..364f7fc7b 100644 --- a/Docs/Layers/transit_stops.md +++ b/Docs/Layers/transit_stops.md @@ -5,7 +5,7 @@ - + Layer showing different types of transit stops. @@ -75,7 +75,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -280,7 +280,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` @@ -302,21 +302,21 @@ This tagrendering has no question and is thus read-only id | question | osmTags ---- | ---------- | --------- -shelter.0 | With a shelter | shelter=yes\|shelter=separate +shelter.0 | With a shelter | shelter=yes \|shelter=separate id | question | osmTags ---- | ---------- | --------- -bench.0 | With a bench | bench=yes\|bench=separate +bench.0 | With a bench | bench=yes \|bench=separate id | question | osmTags ---- | ---------- | --------- -bin.0 | With a bin | bin=yes\|bin=separate +bin.0 | With a bin | bin=yes \|bin=separate diff --git a/Docs/Layers/tree_node.md b/Docs/Layers/tree_node.md index bee1fa70e..8cf449710 100644 --- a/Docs/Layers/tree_node.md +++ b/Docs/Layers/tree_node.md @@ -5,7 +5,7 @@ - + A layer showing trees @@ -76,7 +76,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -124,7 +124,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `wikipedia~.+|wikidata~.+` +This tagrendering is only visible in the popup if the following condition is met: `wikipedia~.+ |wikidata~.+` @@ -229,7 +229,7 @@ This is rendered with `Name: {name}` - *The tree does not have a name.* corresponds with `noname=yes` -This tagrendering is only visible in the popup if the following condition is met: `denotation=landmark|denotation=natural_monument|name~.+` +This tagrendering is only visible in the popup if the following condition is met: `denotation=landmark |denotation=natural_monument |name~.+` @@ -243,15 +243,15 @@ The question is *Is this tree registered heritage?* - - *Registered as heritage by Onroerend Erfgoed Flanders* corresponds with `heritage=4&heritage:operator=OnroerendErfgoed` - - *Registered as heritage by Direction du Patrimoine culturel Brussels* corresponds with `heritage=4&heritage:operator=aatl` + - *Registered as heritage by Onroerend Erfgoed Flanders* corresponds with `heritage=4 &heritage:operator=OnroerendErfgoed` + - *Registered as heritage by Direction du Patrimoine culturel Brussels* corresponds with `heritage=4 &heritage:operator=aatl` - *Registered as heritage by a different organisation* corresponds with `heritage=yes` - *Not registered as heritage* corresponds with `heritage=no` - *Registered as heritage by a different organisation* corresponds with `heritage~.+` - This option cannot be chosen as answer -This tagrendering is only visible in the popup if the following condition is met: `denotation=landmark|denotation=natural_monument` +This tagrendering is only visible in the popup if the following condition is met: `denotation=landmark |denotation=natural_monument` @@ -267,7 +267,7 @@ This is rendered with ` + Layer showing vending machines @@ -75,7 +75,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -212,7 +212,7 @@ The question is *What coins can you use to pay here?* - *5 francs coins are accepted* corresponds with `payment:coins:denominations=5 CHF` -This tagrendering is only visible in the popup if the following condition is met: `payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$` +This tagrendering is only visible in the popup if the following condition is met: `payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$` @@ -241,7 +241,7 @@ The question is *what notes can you use to pay here?* - *1000 francs notes are accepted* corresponds with `payment:notes:denominations=1000 CHF` -This tagrendering is only visible in the popup if the following condition is met: `payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$` +This tagrendering is only visible in the popup if the following condition is met: `payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$` @@ -414,7 +414,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/veterinary.md b/Docs/Layers/veterinary.md index 4d76758c1..908fb5b4b 100644 --- a/Docs/Layers/veterinary.md +++ b/Docs/Layers/veterinary.md @@ -5,7 +5,7 @@ - + A layer showing veterinarians @@ -70,7 +70,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -190,7 +190,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/viewpoint.md b/Docs/Layers/viewpoint.md index 1c69a1c99..6a9c6c71a 100644 --- a/Docs/Layers/viewpoint.md +++ b/Docs/Layers/viewpoint.md @@ -5,7 +5,7 @@ - + A nice viewpoint or nice view. Ideal to add an image if no other category fits @@ -55,7 +55,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -117,7 +117,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/village_green.md b/Docs/Layers/village_green.md index efcdef4e8..797d15d50 100644 --- a/Docs/Layers/village_green.md +++ b/Docs/Layers/village_green.md @@ -5,7 +5,7 @@ - + A layer showing village-green (which are communal green areas, but not quite parks) @@ -54,7 +54,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -122,7 +122,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/visitor_information_centre.md b/Docs/Layers/visitor_information_centre.md index 00a30bc2f..8237eaa47 100644 --- a/Docs/Layers/visitor_information_centre.md +++ b/Docs/Layers/visitor_information_centre.md @@ -5,7 +5,7 @@ - + A visitor center offers information about a specific attraction or place of interest where it is located. @@ -54,7 +54,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -90,7 +90,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/walls_and_buildings.md b/Docs/Layers/walls_and_buildings.md index 2457b2bdd..5cf2623a8 100644 --- a/Docs/Layers/walls_and_buildings.md +++ b/Docs/Layers/walls_and_buildings.md @@ -83,7 +83,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -147,7 +147,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/waste_basket.md b/Docs/Layers/waste_basket.md index 479b1e21a..df42194c0 100644 --- a/Docs/Layers/waste_basket.md +++ b/Docs/Layers/waste_basket.md @@ -5,7 +5,7 @@ - + This is a public waste basket, thrash can, where you can throw away your thrash. @@ -70,7 +70,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -179,7 +179,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/waste_disposal.md b/Docs/Layers/waste_disposal.md index 2a9b9697a..735673a37 100644 --- a/Docs/Layers/waste_disposal.md +++ b/Docs/Layers/waste_disposal.md @@ -5,7 +5,7 @@ - + Waste Disposal Bin, medium to large bin for disposal of (household) waste @@ -69,7 +69,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -193,7 +193,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Layers/windturbine.md b/Docs/Layers/windturbine.md index db9bfbb47..2212b2c91 100644 --- a/Docs/Layers/windturbine.md +++ b/Docs/Layers/windturbine.md @@ -5,7 +5,7 @@ - + Modern windmills generating electricity @@ -72,7 +72,7 @@ This tagrendering has no question and is thus read-only - *You just created this element! Thanks for sharing this info with the world and helping people worldwide.* corresponds with `id~.+` -This tagrendering is only visible in the popup if the following condition is met: `_backend~.+&_last_edit:passed_time<300&|_version_number=1` +This tagrendering is only visible in the popup if the following condition is met: `_backend~.+ &_last_edit:passed_time<300 & |_version_number=1` @@ -204,7 +204,7 @@ This tagrendering has no question and is thus read-only -This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+&_last_edit:changeset~.+` +This tagrendering is only visible in the popup if the following condition is met: `_last_edit:contributor~.+ &_last_edit:changeset~.+` diff --git a/Docs/Schemas/AndOrTagConfigJson.schema.json b/Docs/Schemas/AndOrTagConfigJson.schema.json deleted file mode 100644 index a6214c2ea..000000000 --- a/Docs/Schemas/AndOrTagConfigJson.schema.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "$ref": "#/definitions/AndOrTagConfigJson", - "definitions": { - "AndOrTagConfigJson": { - "type": "object", - "properties": { - "and": { - "type": "array", - "items": { - "anyOf": [ - { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - { - "type": "string" - } - ] - } - }, - "or": { - "type": "array", - "items": { - "anyOf": [ - { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - { - "type": "string" - } - ] - } - } - }, - "additionalProperties": false - } - }, - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false -} \ No newline at end of file diff --git a/Docs/Schemas/AndOrTagConfigJsonJSC.ts b/Docs/Schemas/AndOrTagConfigJsonJSC.ts deleted file mode 100644 index 3da8b5b09..000000000 --- a/Docs/Schemas/AndOrTagConfigJsonJSC.ts +++ /dev/null @@ -1,37 +0,0 @@ -export default { - "$ref": "#/definitions/AndOrTagConfigJson", - "definitions": { - "AndOrTagConfigJson": { - "type": "object", - "properties": { - "and": { - "type": "array", - "items": { - "anyOf": [ - { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - { - "type": "string" - } - ] - } - }, - "or": { - "type": "array", - "items": { - "anyOf": [ - { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - { - "type": "string" - } - ] - } - } - } - } - }, - "$schema": "http://json-schema.org/draft-07/schema#" -} \ No newline at end of file diff --git a/Docs/Schemas/AndTagConfigJson.schema.json b/Docs/Schemas/AndTagConfigJson.schema.json deleted file mode 100644 index 9f510d6b2..000000000 --- a/Docs/Schemas/AndTagConfigJson.schema.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", - "definitions": { - "TagConfigJson": { - "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation", - "anyOf": [ - { - "$ref": "#/definitions/AndTagConfigJson" - }, - { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", - "type": "object", - "properties": { - "or": { - "type": "array", - "items": { - "$ref": "#/definitions/TagConfigJson" - } - } - }, - "required": [ - "or" - ] - }, - { - "type": "string" - } - ] - }, - "AndTagConfigJson": { - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", - "type": "object", - "properties": { - "and": { - "type": "array", - "items": { - "$ref": "#/definitions/TagConfigJson" - } - } - }, - "required": [ - "and" - ], - "additionalProperties": false - }, - "OrTagConfigJson": { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", - "type": "object", - "properties": { - "or": { - "type": "array", - "items": { - "$ref": "#/definitions/TagConfigJson" - } - } - }, - "required": [ - "or" - ], - "additionalProperties": false - } - }, - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false -} \ No newline at end of file diff --git a/Docs/Schemas/AndTagConfigJsonJSC.ts b/Docs/Schemas/AndTagConfigJsonJSC.ts deleted file mode 100644 index 2903f36b1..000000000 --- a/Docs/Schemas/AndTagConfigJsonJSC.ts +++ /dev/null @@ -1,63 +0,0 @@ -export default { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", - "definitions": { - "TagConfigJson": { - "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation", - "anyOf": [ - { - "$ref": "#/definitions/AndTagConfigJson" - }, - { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", - "type": "object", - "properties": { - "or": { - "type": "array", - "items": { - "$ref": "#/definitions/TagConfigJson" - } - } - }, - "required": [ - "or" - ] - }, - { - "type": "string" - } - ] - }, - "AndTagConfigJson": { - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", - "type": "object", - "properties": { - "and": { - "type": "array", - "items": { - "$ref": "#/definitions/TagConfigJson" - } - } - }, - "required": [ - "and" - ] - }, - "OrTagConfigJson": { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", - "type": "object", - "properties": { - "or": { - "type": "array", - "items": { - "$ref": "#/definitions/TagConfigJson" - } - } - }, - "required": [ - "or" - ] - } - }, - "$schema": "http://json-schema.org/draft-07/schema#" -} \ No newline at end of file diff --git a/Docs/Schemas/DeleteConfigJson.schema.json b/Docs/Schemas/DeleteConfigJson.schema.json index 398b28767..b7bbec42a 100644 --- a/Docs/Schemas/DeleteConfigJson.schema.json +++ b/Docs/Schemas/DeleteConfigJson.schema.json @@ -1,6 +1,10 @@ { "type": "object", "properties": { + "neededChangesets": { + "description": "*\nBy default, the contributor needs 20 previous changesets to delete points edited by others.\nFor some small features (e.g. bicycle racks) this is too much and this requirement can be lowered or dropped, which can be done here.\n\ntype: nat\nquestion: How many changesets must a contributor have before being allowed to delete a point?", + "type": "number" + }, "extraDeleteReasons": { "description": "*\nBy default, three reasons to delete a point are shown:\n\n- The point does not exist anymore\n- The point was a testing point\n- THe point could not be found\n\nHowever, for some layers, there might be different or more specific reasons for deletion which can be user friendly to set, e.g.:\n\n- the shop has closed\n- the climbing route has been closed of for nature conservation reasons\n- ...\n\nThese reasons can be stated here and will be shown in the list of options the user can choose from", "type": "array", @@ -8,10 +12,10 @@ "type": "object", "properties": { "explanation": { - "description": "The text that will be shown to the user - translatable" + "description": "The text that will be shown to the user as option for why this point does not exist anymore.\nNote that the most common reasons (test point, does not exist anymore, cannot be found) are already offered by default\n\nquestion: For what extra reason might this feature be removed in real-life?" }, "changesetMessage": { - "description": "The text that will be uploaded into the changeset or will be used in the fixme in case of a soft deletion\nShould be a few words, in english", + "description": "The text that will be uploaded into the changeset or will be used in the fixme in case of a soft deletion\nShould be a few words, in english\n\nquestion: What should be added to the changeset as delete reason?", "type": "string" } }, @@ -29,10 +33,10 @@ "properties": { "if": { "$ref": "#/definitions/TagConfigJson", - "description": "The tags that will be given to the object.\nThis must remove tags so that the 'source/osmTags' won't match anymore" + "description": "The tags that will be given to the object.\nThis must remove tags so that the 'source/osmTags' won't match anymore\n\nquestion: What tags should be applied to the object?" }, "then": { - "description": "The human explanation for the options" + "description": "The human explanation for the options\n\nquestion: What text should be shown to the contributor for this reason?" } }, "required": [ @@ -42,39 +46,32 @@ } }, "softDeletionTags": { - "description": "In some cases, the contributor is not allowed to delete the current feature (e.g. because it isn't a point, the point is referenced by a relation or the user isn't experienced enough).\nTo still offer the user a 'delete'-option, the feature is retagged with these tags. This is a soft deletion, as the point isn't actually removed from OSM but rather marked as 'disused'\nIt is important that the feature will be retagged in such a way that it won't be picked up by the layer anymore!\n\nExample (note that \"amenity=\" erases the 'amenity'-key alltogether):\n```\n{\n \"and\": [\"disussed:amenity=public_bookcase\", \"amenity=\"]\n}\n```\n\nor (notice the use of the ':='-tag to copy the old value of 'shop=*' into 'disused:shop='):\n```\n{\n \"and\": [\"disused:shop:={shop}\", \"shop=\"]\n}\n```", + "description": "In some cases, the contributor is not allowed to delete the current feature (e.g. because it isn't a point, the point is referenced by a relation or the user isn't experienced enough).\nTo still offer the user a 'delete'-option, the feature is retagged with these tags. This is a soft deletion, as the point isn't actually removed from OSM but rather marked as 'disused'\nIt is important that the feature will be retagged in such a way that it won't be picked up by the layer anymore!\n\nExample (note that \"amenity=\" erases the 'amenity'-key alltogether):\n\n```\n{\n \"and\": [\"disussed:amenity=public_bookcase\", \"amenity=\"]\n}\n```\n\nor (notice the use of the ':='-tag to copy the old value of 'shop=*' into 'disused:shop='):\n\n```\n{\n \"and\": [\"disused:shop:={shop}\", \"shop=\"]\n}\n```\n\nquestion: If a hard delete is not possible, what tags should be applied to mark this feature as deleted?\ntype: tag", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" } ] }, - "neededChangesets": { - "description": "*\nBy default, the contributor needs 20 previous changesets to delete points edited by others.\nFor some small features (e.g. bicycle racks) this is too much and this requirement can be lowered or dropped, which can be done here.", - "type": "number" - }, "omitDefaultDeleteReasons": { - "description": "Set this flag if the default delete reasons should be omitted from the dialog.\nThis requires at least one extraDeleteReason or nonDeleteMapping", + "description": "Set this flag if the default delete reasons should be omitted from the dialog.\nThis requires at least one extraDeleteReason or nonDeleteMapping\n\nquestion: Should the default delete reasons be hidden?\niftrue: Hide the default delete reasons\niffalse: Show the default delete reasons\nifunset: Show the default delete reasons (default behaviour)", "type": "boolean" } }, "definitions": { "TagConfigJson": { - "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation", + "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation\n\ntype: tag", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", "type": "object", "properties": { "or": { @@ -93,8 +90,7 @@ } ] }, - "AndTagConfigJson": { - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", + "{and:TagConfigJson[];}": { "type": "object", "properties": { "and": { @@ -109,8 +105,7 @@ ], "additionalProperties": false }, - "OrTagConfigJson": { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", + "{or:TagConfigJson[];}": { "type": "object", "properties": { "or": { diff --git a/Docs/Schemas/DeleteConfigJsonJSC.ts b/Docs/Schemas/DeleteConfigJsonJSC.ts index 04e4b6114..afb24d2dd 100644 --- a/Docs/Schemas/DeleteConfigJsonJSC.ts +++ b/Docs/Schemas/DeleteConfigJsonJSC.ts @@ -1,6 +1,10 @@ export default { "type": "object", "properties": { + "neededChangesets": { + "description": "*\nBy default, the contributor needs 20 previous changesets to delete points edited by others.\nFor some small features (e.g. bicycle racks) this is too much and this requirement can be lowered or dropped, which can be done here.\n\ntype: nat\nquestion: How many changesets must a contributor have before being allowed to delete a point?", + "type": "number" + }, "extraDeleteReasons": { "description": "*\nBy default, three reasons to delete a point are shown:\n\n- The point does not exist anymore\n- The point was a testing point\n- THe point could not be found\n\nHowever, for some layers, there might be different or more specific reasons for deletion which can be user friendly to set, e.g.:\n\n- the shop has closed\n- the climbing route has been closed of for nature conservation reasons\n- ...\n\nThese reasons can be stated here and will be shown in the list of options the user can choose from", "type": "array", @@ -8,10 +12,10 @@ export default { "type": "object", "properties": { "explanation": { - "description": "The text that will be shown to the user - translatable" + "description": "The text that will be shown to the user as option for why this point does not exist anymore.\nNote that the most common reasons (test point, does not exist anymore, cannot be found) are already offered by default\n\nquestion: For what extra reason might this feature be removed in real-life?" }, "changesetMessage": { - "description": "The text that will be uploaded into the changeset or will be used in the fixme in case of a soft deletion\nShould be a few words, in english", + "description": "The text that will be uploaded into the changeset or will be used in the fixme in case of a soft deletion\nShould be a few words, in english\n\nquestion: What should be added to the changeset as delete reason?", "type": "string" } }, @@ -29,10 +33,10 @@ export default { "properties": { "if": { "$ref": "#/definitions/TagConfigJson", - "description": "The tags that will be given to the object.\nThis must remove tags so that the 'source/osmTags' won't match anymore" + "description": "The tags that will be given to the object.\nThis must remove tags so that the 'source/osmTags' won't match anymore\n\nquestion: What tags should be applied to the object?" }, "then": { - "description": "The human explanation for the options" + "description": "The human explanation for the options\n\nquestion: What text should be shown to the contributor for this reason?" } }, "required": [ @@ -42,39 +46,32 @@ export default { } }, "softDeletionTags": { - "description": "In some cases, the contributor is not allowed to delete the current feature (e.g. because it isn't a point, the point is referenced by a relation or the user isn't experienced enough).\nTo still offer the user a 'delete'-option, the feature is retagged with these tags. This is a soft deletion, as the point isn't actually removed from OSM but rather marked as 'disused'\nIt is important that the feature will be retagged in such a way that it won't be picked up by the layer anymore!\n\nExample (note that \"amenity=\" erases the 'amenity'-key alltogether):\n```\n{\n \"and\": [\"disussed:amenity=public_bookcase\", \"amenity=\"]\n}\n```\n\nor (notice the use of the ':='-tag to copy the old value of 'shop=*' into 'disused:shop='):\n```\n{\n \"and\": [\"disused:shop:={shop}\", \"shop=\"]\n}\n```", + "description": "In some cases, the contributor is not allowed to delete the current feature (e.g. because it isn't a point, the point is referenced by a relation or the user isn't experienced enough).\nTo still offer the user a 'delete'-option, the feature is retagged with these tags. This is a soft deletion, as the point isn't actually removed from OSM but rather marked as 'disused'\nIt is important that the feature will be retagged in such a way that it won't be picked up by the layer anymore!\n\nExample (note that \"amenity=\" erases the 'amenity'-key alltogether):\n\n```\n{\n \"and\": [\"disussed:amenity=public_bookcase\", \"amenity=\"]\n}\n```\n\nor (notice the use of the ':='-tag to copy the old value of 'shop=*' into 'disused:shop='):\n\n```\n{\n \"and\": [\"disused:shop:={shop}\", \"shop=\"]\n}\n```\n\nquestion: If a hard delete is not possible, what tags should be applied to mark this feature as deleted?\ntype: tag", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" } ] }, - "neededChangesets": { - "description": "*\nBy default, the contributor needs 20 previous changesets to delete points edited by others.\nFor some small features (e.g. bicycle racks) this is too much and this requirement can be lowered or dropped, which can be done here.", - "type": "number" - }, "omitDefaultDeleteReasons": { - "description": "Set this flag if the default delete reasons should be omitted from the dialog.\nThis requires at least one extraDeleteReason or nonDeleteMapping", + "description": "Set this flag if the default delete reasons should be omitted from the dialog.\nThis requires at least one extraDeleteReason or nonDeleteMapping\n\nquestion: Should the default delete reasons be hidden?\niftrue: Hide the default delete reasons\niffalse: Show the default delete reasons\nifunset: Show the default delete reasons (default behaviour)", "type": "boolean" } }, "definitions": { "TagConfigJson": { - "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation", + "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation\n\ntype: tag", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", "type": "object", "properties": { "or": { @@ -93,8 +90,7 @@ export default { } ] }, - "AndTagConfigJson": { - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", + "{and:TagConfigJson[];}": { "type": "object", "properties": { "and": { @@ -108,8 +104,7 @@ export default { "and" ] }, - "OrTagConfigJson": { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", + "{or:TagConfigJson[];}": { "type": "object", "properties": { "or": { diff --git a/Docs/Schemas/DenominationConfigJson.schema.json b/Docs/Schemas/DenominationConfigJson.schema.json index cfde14010..a5086168f 100644 --- a/Docs/Schemas/DenominationConfigJson.schema.json +++ b/Docs/Schemas/DenominationConfigJson.schema.json @@ -2,13 +2,12 @@ "$ref": "#/definitions/DenominationConfigJson", "definitions": { "TagConfigJson": { - "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation", + "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation\n\ntype: tag", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", "type": "object", "properties": { "or": { @@ -27,8 +26,7 @@ } ] }, - "AndTagConfigJson": { - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", + "{and:TagConfigJson[];}": { "type": "object", "properties": { "and": { @@ -43,8 +41,7 @@ ], "additionalProperties": false }, - "OrTagConfigJson": { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", + "{or:TagConfigJson[];}": { "type": "object", "properties": { "or": { diff --git a/Docs/Schemas/DenominationConfigJsonJSC.ts b/Docs/Schemas/DenominationConfigJsonJSC.ts index fd7b2494f..acc2c079f 100644 --- a/Docs/Schemas/DenominationConfigJsonJSC.ts +++ b/Docs/Schemas/DenominationConfigJsonJSC.ts @@ -2,13 +2,12 @@ export default { "$ref": "#/definitions/DenominationConfigJson", "definitions": { "TagConfigJson": { - "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation", + "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation\n\ntype: tag", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", "type": "object", "properties": { "or": { @@ -27,8 +26,7 @@ export default { } ] }, - "AndTagConfigJson": { - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", + "{and:TagConfigJson[];}": { "type": "object", "properties": { "and": { @@ -42,8 +40,7 @@ export default { "and" ] }, - "OrTagConfigJson": { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", + "{or:TagConfigJson[];}": { "type": "object", "properties": { "or": { diff --git a/Docs/Schemas/ExtraLinkConfigJson.schema.json b/Docs/Schemas/ExtraLinkConfigJson.schema.json index 157922a93..4a298f5ba 100644 --- a/Docs/Schemas/ExtraLinkConfigJson.schema.json +++ b/Docs/Schemas/ExtraLinkConfigJson.schema.json @@ -2,16 +2,30 @@ "type": "object", "properties": { "icon": { + "description": "question: What icon should be shown in the link button?\nifunset: do not show an icon\ntype: icon", "type": "string" }, - "text": {}, + "text": { + "description": "question: What text should be shown in the link icon?\n\nNote that {lat},{lon},{zoom}, {language} and {theme} will be replaced\n\nifunset: do not show a text", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] + }, "href": { + "description": "question: if clicked, what webpage should open?\nNote that {lat},{lon},{zoom}, {language} and {theme} will be replaced\n\ntype: url", "type": "string" }, "newTab": { + "description": "question: Should the link open in a new tab?\niftrue: Open in a new tab\niffalse: do not open in a new tab\nifunset: do not open in a new tab", "type": "boolean" }, "requirements": { + "description": "question: When should the extra button be shown?\nsuggestions: return [{if: \"value=iframe\", then: \"When shown in an iframe\"}, {if: \"value=no-iframe\", then: \"When shown as stand-alone webpage\"}, {if: \"value=welcome-message\", then: \"When the welcome messages are enabled\"}, {if: \"value=iframe\", then: \"When the welcome messages are disabled\"}]", "type": "array", "items": { "enum": [ @@ -29,13 +43,12 @@ ], "definitions": { "TagConfigJson": { - "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation", + "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation\n\ntype: tag", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", "type": "object", "properties": { "or": { @@ -54,8 +67,7 @@ } ] }, - "AndTagConfigJson": { - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", + "{and:TagConfigJson[];}": { "type": "object", "properties": { "and": { @@ -70,8 +82,7 @@ ], "additionalProperties": false }, - "OrTagConfigJson": { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", + "{or:TagConfigJson[];}": { "type": "object", "properties": { "or": { @@ -85,6 +96,10 @@ "or" ], "additionalProperties": false + }, + "Record": { + "type": "object", + "additionalProperties": false } }, "$schema": "http://json-schema.org/draft-07/schema#", diff --git a/Docs/Schemas/ExtraLinkConfigJsonJSC.ts b/Docs/Schemas/ExtraLinkConfigJsonJSC.ts index 762e6f4ad..b822d4604 100644 --- a/Docs/Schemas/ExtraLinkConfigJsonJSC.ts +++ b/Docs/Schemas/ExtraLinkConfigJsonJSC.ts @@ -2,16 +2,30 @@ export default { "type": "object", "properties": { "icon": { + "description": "question: What icon should be shown in the link button?\nifunset: do not show an icon\ntype: icon", "type": "string" }, - "text": {}, + "text": { + "description": "question: What text should be shown in the link icon?\n\nNote that {lat},{lon},{zoom}, {language} and {theme} will be replaced\n\nifunset: do not show a text", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] + }, "href": { + "description": "question: if clicked, what webpage should open?\nNote that {lat},{lon},{zoom}, {language} and {theme} will be replaced\n\ntype: url", "type": "string" }, "newTab": { + "description": "question: Should the link open in a new tab?\niftrue: Open in a new tab\niffalse: do not open in a new tab\nifunset: do not open in a new tab", "type": "boolean" }, "requirements": { + "description": "question: When should the extra button be shown?\nsuggestions: return [{if: \"value=iframe\", then: \"When shown in an iframe\"}, {if: \"value=no-iframe\", then: \"When shown as stand-alone webpage\"}, {if: \"value=welcome-message\", then: \"When the welcome messages are enabled\"}, {if: \"value=iframe\", then: \"When the welcome messages are disabled\"}]", "type": "array", "items": { "enum": [ @@ -29,13 +43,12 @@ export default { ], "definitions": { "TagConfigJson": { - "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation", + "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation\n\ntype: tag", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", "type": "object", "properties": { "or": { @@ -54,8 +67,7 @@ export default { } ] }, - "AndTagConfigJson": { - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", + "{and:TagConfigJson[];}": { "type": "object", "properties": { "and": { @@ -69,8 +81,7 @@ export default { "and" ] }, - "OrTagConfigJson": { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", + "{or:TagConfigJson[];}": { "type": "object", "properties": { "or": { @@ -83,6 +94,9 @@ export default { "required": [ "or" ] + }, + "Record": { + "type": "object" } }, "$schema": "http://json-schema.org/draft-07/schema#" diff --git a/Docs/Schemas/FilterConfigJson.schema.json b/Docs/Schemas/FilterConfigJson.schema.json index 3158c033b..2d91892f2 100644 --- a/Docs/Schemas/FilterConfigJson.schema.json +++ b/Docs/Schemas/FilterConfigJson.schema.json @@ -13,15 +13,13 @@ "properties": { "question": {}, "osmTags": { - "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation", + "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation\n\ntype: tag", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -66,13 +64,12 @@ ], "definitions": { "TagConfigJson": { - "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation", + "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation\n\ntype: tag", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", "type": "object", "properties": { "or": { @@ -91,8 +88,7 @@ } ] }, - "AndTagConfigJson": { - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", + "{and:TagConfigJson[];}": { "type": "object", "properties": { "and": { @@ -107,8 +103,7 @@ ], "additionalProperties": false }, - "OrTagConfigJson": { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", + "{or:TagConfigJson[];}": { "type": "object", "properties": { "or": { @@ -122,6 +117,10 @@ "or" ], "additionalProperties": false + }, + "Record": { + "type": "object", + "additionalProperties": false } }, "$schema": "http://json-schema.org/draft-07/schema#", diff --git a/Docs/Schemas/FilterConfigJsonJSC.ts b/Docs/Schemas/FilterConfigJsonJSC.ts index 2f41e9521..62ba6448d 100644 --- a/Docs/Schemas/FilterConfigJsonJSC.ts +++ b/Docs/Schemas/FilterConfigJsonJSC.ts @@ -13,15 +13,13 @@ export default { "properties": { "question": {}, "osmTags": { - "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation", + "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation\n\ntype: tag", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -66,13 +64,12 @@ export default { ], "definitions": { "TagConfigJson": { - "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation", + "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation\n\ntype: tag", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", "type": "object", "properties": { "or": { @@ -91,8 +88,7 @@ export default { } ] }, - "AndTagConfigJson": { - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", + "{and:TagConfigJson[];}": { "type": "object", "properties": { "and": { @@ -106,8 +102,7 @@ export default { "and" ] }, - "OrTagConfigJson": { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", + "{or:TagConfigJson[];}": { "type": "object", "properties": { "or": { @@ -120,6 +115,9 @@ export default { "required": [ "or" ] + }, + "Record": { + "type": "object" } }, "$schema": "http://json-schema.org/draft-07/schema#" diff --git a/Docs/Schemas/IconConfigJson.schema.json b/Docs/Schemas/IconConfigJson.schema.json new file mode 100644 index 000000000..04ab8296f --- /dev/null +++ b/Docs/Schemas/IconConfigJson.schema.json @@ -0,0 +1,219 @@ +{ + "type": "object", + "properties": { + "icon": { + "description": "question: What icon should be used?\ntype: icon\nsuggestions: return [\"pin\",\"square\",\"circle\",\"checkmark\",\"clock\",\"close\",\"crosshair\",\"help\",\"home\",\"invalid\",\"location\",\"location_empty\",\"location_locked\",\"note\",\"resolved\",\"ring\",\"scissors\",\"teardrop\",\"teardrop_with_hole_green\",\"triangle\"].map(i => ({if: \"value=\"+i, then: i, icon: i}))", + "anyOf": [ + { + "$ref": "#/definitions/MinimalTagRenderingConfigJson" + }, + { + "type": "object", + "properties": { + "builtin": { + "type": "string" + }, + "override": {} + }, + "required": [ + "builtin", + "override" + ] + }, + { + "type": "string" + } + ] + }, + "color": { + "description": "question: What colour should the icon be?\nThis will only work for the default icons such as `pin`,`circle`,...\ntype: color", + "anyOf": [ + { + "$ref": "#/definitions/MinimalTagRenderingConfigJson" + }, + { + "type": "object", + "properties": { + "builtin": { + "type": "string" + }, + "override": {} + }, + "required": [ + "builtin", + "override" + ] + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "icon" + ], + "definitions": { + "TagConfigJson": { + "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation\n\ntype: tag", + "anyOf": [ + { + "$ref": "#/definitions/{and:TagConfigJson[];}" + }, + { + "type": "object", + "properties": { + "or": { + "type": "array", + "items": { + "$ref": "#/definitions/TagConfigJson" + } + } + }, + "required": [ + "or" + ] + }, + { + "type": "string" + } + ] + }, + "{and:TagConfigJson[];}": { + "type": "object", + "properties": { + "and": { + "type": "array", + "items": { + "$ref": "#/definitions/TagConfigJson" + } + } + }, + "required": [ + "and" + ], + "additionalProperties": false + }, + "{or:TagConfigJson[];}": { + "type": "object", + "properties": { + "or": { + "type": "array", + "items": { + "$ref": "#/definitions/TagConfigJson" + } + } + }, + "required": [ + "or" + ], + "additionalProperties": false + }, + "Record": { + "type": "object", + "additionalProperties": false + }, + "Record>": { + "type": "object", + "additionalProperties": false + }, + "DenominationConfigJson": { + "type": "object", + "properties": { + "useIfNoUnitGiven": { + "description": "If this evaluates to true and the value to interpret has _no_ unit given, assumes that this unit is meant.\nAlternatively, a list of country codes can be given where this acts as the default interpretation\n\nE.g., a denomination using \"meter\" would probably set this flag to \"true\";\na denomination for \"mp/h\" will use the condition \"_country=gb\" to indicate that it is the default in the UK.\n\nIf none of the units indicate that they are the default, the first denomination will be used instead", + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "boolean" + } + ] + }, + "canonicalDenomination": { + "description": "The canonical value for this denomination which will be added to the value in OSM.\ne.g. \"m\" for meters\nIf the user inputs '42', the canonical value will be added and it'll become '42m'.\n\nImportant: often, _no_ canonical values are expected, e.g. in the case of 'maxspeed' where 'km/h' is the default.\nIn this case, an empty string should be used", + "type": "string" + }, + "canonicalDenominationSingular": { + "description": "The canonical denomination in the case that the unit is precisely '1'.\nUsed for display purposes only.\n\nE.g.: for duration of something in minutes: `2 minutes` but `1 minute`; the `minute` goes here", + "type": "string" + }, + "alternativeDenomination": { + "description": "A list of alternative values which can occur in the OSM database - used for parsing.\nE.g.: while 'm' is canonical, `meter`, `mtrs`, ... can occur as well", + "type": "array", + "items": { + "type": "string" + } + }, + "human": { + "description": "The value for humans in the dropdown. This should not use abbreviations and should be translated, e.g.\n{\n \"en\": \"meter\",\n \"fr\": \"metre\"\n}", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] + }, + "humanSingular": { + "description": "The value for humans in the dropdown. This should not use abbreviations and should be translated, e.g.\n{\n \"en\": \"minute\",\n \"nl\": \"minuut\"\n}", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] + }, + "prefix": { + "description": "If set, then the canonical value will be prefixed instead, e.g. for '€'\nNote that if all values use 'prefix', the dropdown might move to before the text field", + "type": "boolean" + } + }, + "required": [ + "canonicalDenomination" + ], + "additionalProperties": false + }, + "MinimalTagRenderingConfigJson": { + "description": "Mostly used for lineRendering and pointRendering", + "type": "object", + "properties": { + "render": { + "description": "question: What value should be rendered?\n\nThis piece of text will be shown in the infobox.\nNote that \"&LBRACEkey&RBRACE\"-parts are substituted by the corresponding values of the element.\n\nThis value will be used if there is no mapping which matches (or there are no matches)\nNote that this is a HTML-interpreted value, so you can add links as e.g. '<a href='{website}'>{website}</a>' or include images such as `This is of type A <br><img src='typeA-icon.svg' />`", + "type": "string" + }, + "mappings": { + "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", + "type": "array", + "items": { + "type": "object", + "properties": { + "if": { + "$ref": "#/definitions/TagConfigJson", + "description": "question: When should this single mapping match?\n\nIf this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}" + }, + "then": { + "description": "question: What text should be shown?\n\nIf the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option", + "type": "string" + } + }, + "required": [ + "if", + "then" + ] + } + } + }, + "additionalProperties": false + } + }, + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false +} \ No newline at end of file diff --git a/Docs/Schemas/IconConfigJsonJSC.ts b/Docs/Schemas/IconConfigJsonJSC.ts new file mode 100644 index 000000000..e5d116ac1 --- /dev/null +++ b/Docs/Schemas/IconConfigJsonJSC.ts @@ -0,0 +1,212 @@ +export default { + "type": "object", + "properties": { + "icon": { + "description": "question: What icon should be used?\ntype: icon\nsuggestions: return [\"pin\",\"square\",\"circle\",\"checkmark\",\"clock\",\"close\",\"crosshair\",\"help\",\"home\",\"invalid\",\"location\",\"location_empty\",\"location_locked\",\"note\",\"resolved\",\"ring\",\"scissors\",\"teardrop\",\"teardrop_with_hole_green\",\"triangle\"].map(i => ({if: \"value=\"+i, then: i, icon: i}))", + "anyOf": [ + { + "$ref": "#/definitions/MinimalTagRenderingConfigJson" + }, + { + "type": "object", + "properties": { + "builtin": { + "type": "string" + }, + "override": {} + }, + "required": [ + "builtin", + "override" + ] + }, + { + "type": "string" + } + ] + }, + "color": { + "description": "question: What colour should the icon be?\nThis will only work for the default icons such as `pin`,`circle`,...\ntype: color", + "anyOf": [ + { + "$ref": "#/definitions/MinimalTagRenderingConfigJson" + }, + { + "type": "object", + "properties": { + "builtin": { + "type": "string" + }, + "override": {} + }, + "required": [ + "builtin", + "override" + ] + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "icon" + ], + "definitions": { + "TagConfigJson": { + "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation\n\ntype: tag", + "anyOf": [ + { + "$ref": "#/definitions/{and:TagConfigJson[];}" + }, + { + "type": "object", + "properties": { + "or": { + "type": "array", + "items": { + "$ref": "#/definitions/TagConfigJson" + } + } + }, + "required": [ + "or" + ] + }, + { + "type": "string" + } + ] + }, + "{and:TagConfigJson[];}": { + "type": "object", + "properties": { + "and": { + "type": "array", + "items": { + "$ref": "#/definitions/TagConfigJson" + } + } + }, + "required": [ + "and" + ] + }, + "{or:TagConfigJson[];}": { + "type": "object", + "properties": { + "or": { + "type": "array", + "items": { + "$ref": "#/definitions/TagConfigJson" + } + } + }, + "required": [ + "or" + ] + }, + "Record": { + "type": "object" + }, + "Record>": { + "type": "object" + }, + "DenominationConfigJson": { + "type": "object", + "properties": { + "useIfNoUnitGiven": { + "description": "If this evaluates to true and the value to interpret has _no_ unit given, assumes that this unit is meant.\nAlternatively, a list of country codes can be given where this acts as the default interpretation\n\nE.g., a denomination using \"meter\" would probably set this flag to \"true\";\na denomination for \"mp/h\" will use the condition \"_country=gb\" to indicate that it is the default in the UK.\n\nIf none of the units indicate that they are the default, the first denomination will be used instead", + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "boolean" + } + ] + }, + "canonicalDenomination": { + "description": "The canonical value for this denomination which will be added to the value in OSM.\ne.g. \"m\" for meters\nIf the user inputs '42', the canonical value will be added and it'll become '42m'.\n\nImportant: often, _no_ canonical values are expected, e.g. in the case of 'maxspeed' where 'km/h' is the default.\nIn this case, an empty string should be used", + "type": "string" + }, + "canonicalDenominationSingular": { + "description": "The canonical denomination in the case that the unit is precisely '1'.\nUsed for display purposes only.\n\nE.g.: for duration of something in minutes: `2 minutes` but `1 minute`; the `minute` goes here", + "type": "string" + }, + "alternativeDenomination": { + "description": "A list of alternative values which can occur in the OSM database - used for parsing.\nE.g.: while 'm' is canonical, `meter`, `mtrs`, ... can occur as well", + "type": "array", + "items": { + "type": "string" + } + }, + "human": { + "description": "The value for humans in the dropdown. This should not use abbreviations and should be translated, e.g.\n{\n \"en\": \"meter\",\n \"fr\": \"metre\"\n}", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] + }, + "humanSingular": { + "description": "The value for humans in the dropdown. This should not use abbreviations and should be translated, e.g.\n{\n \"en\": \"minute\",\n \"nl\": \"minuut\"\n}", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] + }, + "prefix": { + "description": "If set, then the canonical value will be prefixed instead, e.g. for '€'\nNote that if all values use 'prefix', the dropdown might move to before the text field", + "type": "boolean" + } + }, + "required": [ + "canonicalDenomination" + ] + }, + "MinimalTagRenderingConfigJson": { + "description": "Mostly used for lineRendering and pointRendering", + "type": "object", + "properties": { + "render": { + "description": "question: What value should be rendered?\n\nThis piece of text will be shown in the infobox.\nNote that \"&LBRACEkey&RBRACE\"-parts are substituted by the corresponding values of the element.\n\nThis value will be used if there is no mapping which matches (or there are no matches)\nNote that this is a HTML-interpreted value, so you can add links as e.g. '<a href='{website}'>{website}</a>' or include images such as `This is of type A <br><img src='typeA-icon.svg' />`", + "type": "string" + }, + "mappings": { + "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", + "type": "array", + "items": { + "type": "object", + "properties": { + "if": { + "$ref": "#/definitions/TagConfigJson", + "description": "question: When should this single mapping match?\n\nIf this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}" + }, + "then": { + "description": "question: What text should be shown?\n\nIf the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option", + "type": "string" + } + }, + "required": [ + "if", + "then" + ] + } + } + } + } + }, + "$schema": "http://json-schema.org/draft-07/schema#" +} \ No newline at end of file diff --git a/Docs/Schemas/LayerConfigJson.schema.json b/Docs/Schemas/LayerConfigJson.schema.json index e7eb813fc..26c5fcb03 100644 --- a/Docs/Schemas/LayerConfigJson.schema.json +++ b/Docs/Schemas/LayerConfigJson.schema.json @@ -3,11 +3,11 @@ "type": "object", "properties": { "id": { - "description": "The id of this layer.\nThis should be a simple, lowercase, human readable string that is used to identify the layer.", + "description": "question: What is the identifier of this layer?\n\nThis should be a simple, lowercase, human readable string that is used to identify the layer.\n A good ID is:\n - a noun\n - written in singular\n - describes the object\n - in english\n - only has lowercase letters, numbers or underscores. Do not use a space or a dash\n\ntype: id\ngroup: Basic", "type": "string" }, "name": { - "description": "The name of this layer\nUsed in the layer control panel and the 'Personal theme'.\n\nIf not given, will be hidden (and thus not toggable) in the layer control", + "description": "Used in the layer control panel to toggle a layer on and of.\n\nifunset: This will hide the layer in the layer control, making it not filterable and not toggleable\n\ngroup: Basic\nquestion: What is the name of this layer?", "anyOf": [ { "$ref": "#/definitions/Record" @@ -18,7 +18,7 @@ ] }, "description": { - "description": "A description for this layer.\nShown in the layer selections and in the personel theme", + "description": "A description for the features shown in this layer.\nThis often resembles the introduction of the wiki.osm.org-page for this feature.\n\ngroup: Basic\nquestion: How would you describe the features that are shown on this layer?", "anyOf": [ { "$ref": "#/definitions/Record" @@ -29,17 +29,17 @@ ] }, "source": { - "description": "This determines where the data for the layer is fetched: from OSM or from an external geojson dataset.\n\nIf no 'geojson' is defined, data will be fetched from overpass and the OSM-API.\n\nEvery source _must_ define which tags _must_ be present in order to be picked up.\n\nNote: a source must always be defined. 'special' is only allowed if this is a builtin-layer", + "description": "Question: Where should the data be fetched from?\ntitle: Data Source\n\nThis determines where the data for the layer is fetched: from OSM or from an external geojson dataset.\n\nIf no 'geojson' is defined, data will be fetched from overpass and the OSM-API.\n\nEvery source _must_ define which tags _must_ be present in order to be picked up.\n\nNote: a source must always be defined. 'special' is only allowed if this is a builtin-layer\n\ntypes: Load data with specific tags from OpenStreetMap ; Load data from an external geojson source ;\ntypesdefault: 0\ngroup: Basic", "anyOf": [ { "type": "object", "properties": { "osmTags": { "$ref": "#/definitions/TagConfigJson", - "description": "Every source must set which tags have to be present in order to load the given layer." + "description": "question: Which tags must be present on the feature to show it in this layer?\nEvery source must set which tags have to be present in order to load the given layer." }, "maxCacheAge": { - "description": "The maximum amount of seconds that a tile is allowed to linger in the cache", + "description": "question: How long (in seconds) is the data allowed to remain cached until it must be refreshed?\nThe maximum amount of seconds that a tile is allowed to linger in the cache\n\ntype: nat\ndefault: 30 days\ngroup: expert", "type": "number" } }, @@ -51,23 +51,23 @@ "type": "object", "properties": { "geoJson": { - "description": "The actual source of the data to load, if loaded via geojson.\n\n# A single geojson-file\nsource: {geoJson: \"https://my.source.net/some-geo-data.geojson\"}\n fetches a geojson from a third party source\n\n# A tiled geojson source\nsource: {geoJson: \"https://my.source.net/some-tile-geojson-{layer}-{z}-{x}-{y}.geojson\", geoJsonZoomLevel: 14}\n to use a tiled geojson source. The web server must offer multiple geojsons. {z}, {x} and {y} are substituted by the location; {layer} is substituted with the id of the loaded layer\n\nSome API's use a BBOX instead of a tile, this can be used by specifying {y_min}, {y_max}, {x_min} and {x_max}", + "description": "The actual source of the data to load, if loaded via geojson.\n\n# A single geojson-file\nsource: {geoJson: \"https://my.source.net/some-geo-data.geojson\"}\n fetches a geojson from a third party source\n\n# A tiled geojson source\nsource: {geoJson: \"https://my.source.net/some-tile-geojson-{layer}-{z}-{x}-{y}.geojson\", geoJsonZoomLevel: 14}\n to use a tiled geojson source. The web server must offer multiple geojsons. {z}, {x} and {y} are substituted by the location; {layer} is substituted with the id of the loaded layer\n\nSome API's use a BBOX instead of a tile, this can be used by specifying {y_min}, {y_max}, {x_min} and {x_max}\n\nquestion: What is the URL of the geojson?\ntype: url", "type": "string" }, "geoJsonZoomLevel": { - "description": "To load a tiled geojson layer, set the zoomlevel of the tiles", + "description": "To load a tiled geojson layer, set the zoomlevel of the tiles\n\nquestion: If using a tiled geojson, what is the zoomlevel of the tiles?\nifunset: This is not a tiled geojson", "type": "number" }, "isOsmCache": { - "description": "Indicates that the upstream geojson data is OSM-derived.\nUseful for e.g. merging or for scripts generating this cache", + "description": "Indicates that the upstream geojson data is OSM-derived.\nUseful for e.g. merging or for scripts generating this cache.\nThis also indicates that making changes on this data is possible\n\nquestion: Is this geojson a cache of OpenStreetMap data?\nifunset: This is not an OpenStreetMap cache\niftrue: this is based on OpenStreetMap and can thus be edited\ngroup: expert", "type": "boolean" }, "mercatorCrs": { - "description": "Some API's use a mercator-projection (EPSG:900913) instead of WGS84. Set the flag `mercatorCrs: true` in the source for this", + "description": "Some API's use a mercator-projection (EPSG:900913) instead of WGS84. Set the flag `mercatorCrs: true` in the source for this\n\nquestion: Does this geojson use EPSG:900913 instead of WGS84 as projection?\niftrue: This geojson uses EPSG:900913 instead of WGS84\nifunset: This geojson uses WGS84 just like most geojson (default)", "type": "boolean" }, "idKey": { - "description": "Some API's have an id-field, but give it a different name.\nSetting this key will rename this field into 'id'", + "description": "Some API's have an id-field, but give it a different name.\nSetting this key will rename this field into 'id'\n\nifunset: An id with key `id` will be assigned automatically if no attribute `id` is set\ninline: This geojson uses {value} as attribute to set the id\nquestion: What is the name of the attribute containing the ID of the object?", "type": "string" } }, @@ -85,51 +85,44 @@ ] }, "calculatedTags": { - "description": "A list of extra tags to calculate, specified as \"keyToAssignTo=javascript-expression\".\nThere are a few extra functions available. Refer to Docs/CalculatedTags.md for more information\nThe functions will be run in order, e.g.\n[\n \"_max_overlap_m2=Math.max(...feat.overlapsWith(\"someOtherLayer\").map(o => o.overlap))\n \"_max_overlap_ratio=Number(feat._max_overlap_m2)/feat.area\n]\n\nThe specified tags are evaluated lazily. E.g. if a calculated tag is only used in the popup (e.g. the number of nearby features),\nthe expensive calculation will only be performed then for that feature. This avoids clogging up the contributors PC when all features are loaded.\n\nIf a tag has to be evaluated strictly, use ':=' instead:\n\n[\n\"_some_key:=some_javascript_expression\"\n]", + "description": "A list of extra tags to calculate, specified as \"keyToAssignTo=javascript-expression\".\nThere are a few extra functions available. Refer to Docs/CalculatedTags.md for more information\nThe functions will be run in order, e.g.\n[\nNot found... * \"_max_overlap_m2=Math.max(...feat.overlapsWith(\"someOtherLayer\").map(o => o.overlap))\n \"_max_overlap_ratio=Number(feat._max_overlap_m2)/feat.area\n]\n\nThe specified tags are evaluated lazily. E.g. if a calculated tag is only used in the popup (e.g. the number of nearby features),\nthe expensive calculation will only be performed then for that feature. This avoids clogging up the contributors PC when all features are loaded.\n\nIf a tag has to be evaluated strictly, use ':=' instead:\n\n[\n\"_some_key:=some_javascript_expression\"\n]\n\nSee the full documentation on [https://github.com/pietervdvn/MapComplete/blob/master/Docs/CalculatedTags.md]\n\ngroup: expert\nquestion: What extra attributes should be calculated with javascript?", "type": "array", "items": { "type": "string" } }, - "doNotDownload": { - "description": "If set, this layer will not query overpass; but it'll still match the tags above which are by chance returned by other layers.\nWorks well together with 'passAllFeatures', to add decoration", - "type": "boolean" - }, "isShown": { - "description": "If set, only features matching this extra tag will be shown.\nThis is useful to hide certain features from view.\n\nImportant: hiding features does not work dynamically, but is only calculated when the data is first renders.\nThis implies that it is not possible to hide a feature after a tagging change\n\nThe default value is 'yes'", + "description": "If set, only features matching this extra tag will be shown.\nThis is useful to hide certain features from view based on a calculated tag or if the features are provided by a different layer.\n\nquestion: What other tags should features match for being shown?\ngroup: advanced\nifunset: all features which match the 'source'-specification are shown.", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" } ] }, - "forceLoad": { - "description": "Advanced option - might be set by the theme compiler\n\nIf true, this data will _always_ be loaded, even if the theme is disabled", - "type": "boolean" - }, "minzoom": { - "description": "The minimum needed zoomlevel required before loading of the data start\nDefault: 0", + "description": "The minimum needed zoomlevel required to start loading and displaying the data.\nThis can be used to only show common features (e.g. a bicycle parking) only when the map is zoomed in very much (17).\nThis prevents cluttering the map with thousands of parkings if one is looking to an entire city.\n\nDefault: 0\ngroup: Basic\ntype: nat\nquestion: At what zoom level should features of the layer be shown?\nifunset: Always load this layer, even if the entire world is in view.", "type": "number" }, "shownByDefault": { - "description": "Indicates if this layer is shown by default;\ncan be used to hide a layer from start, or to load the layer but only to show it where appropriate (e.g. for snapping to it)", + "description": "Indicates if this layer is shown by default;\ncan be used to hide a layer from start, or to load the layer but only to show it when appropriate (e.g. for advanced users)\n\nquestion: Should this layer be enabled when opening the map for the first time?\niftrue: the layer is enabled when opening the map\niffalse: the layer is hidden until the contributor enables it. (If the filter-popup is disabled, this might never get enabled nor loaded)\ndefault: true\ngroup: advanced", "type": "boolean" }, "minzoomVisible": { - "description": "The zoom level at which point the data is hidden again\nDefault: 100 (thus: always visible", + "description": "The zoom level at which point the data is hidden again\nDefault: 100 (thus: always visible\n\ngroup: expert", "type": "number" }, "title": { - "description": "The title shown in a popup for elements of this layer.", + "description": "question: What title should be shown on the infobox?\nThe title shown in a popup for elements of this layer.\n\ngroup: title\ntypes: use a fixed translation ; Use a dynamic tagRendering ; hidden\ntypesdefault: 1\ntype: translation\ninline: {translated{value}}", "anyOf": [ + { + "$ref": "#/definitions/Record" + }, { "$ref": "#/definitions/TagRenderingConfigJson" }, @@ -138,8 +131,12 @@ } ] }, + "popupInFloatover": { + "description": "Question: Should the information for this layer be shown in the sidebar or in a splash screen?\n\nIf set, open the selectedElementView in a floatOver instead of on the right.\n\niftrue: show the infobox in the splashscreen floating over the entire UI\niffalse: show the infobox in a sidebar on the right\ngroup: advanced\ndefault: sidebar", + "type": "boolean" + }, "titleIcons": { - "description": "Small icons shown next to the title.\nIf not specified, the OsmLink and wikipedia links will be used by default.\nUse an empty array to hide them.\nNote that \"defaults\" will insert all the default titleIcons (which are added automatically)\n\nType: icon[]", + "description": "Small icons shown next to the title.\nIf not specified, the OsmLink and wikipedia links will be used by default.\nUse an empty array to hide them.\nNote that \"defaults\" will insert all the default titleIcons (which are added automatically)\n\nType: icon[]\ngroup: infobox", "anyOf": [ { "type": "array", @@ -169,42 +166,40 @@ } ] }, - "mapRendering": { - "description": "Visualisation of the items on the map", - "anyOf": [ - { - "type": "array", - "items": { - "anyOf": [ - { - "$ref": "#/definitions/default_4" - }, - { - "$ref": "#/definitions/default_5" - }, - { - "$ref": "#/definitions/default" - } - ] - } - }, - { - "type": "null" - } - ] + "pointRendering": { + "description": "Creates points to render on the map.\nThis can render points for point-objects, lineobjects or areaobjects; use 'location' to indicate where it should be rendered\ngroup: pointrendering", + "type": "array", + "items": { + "$ref": "#/definitions/default_4" + } + }, + "lineRendering": { + "description": "Creates lines and areas to render on the map\ngroup: linerendering", + "type": "array", + "items": { + "$ref": "#/definitions/default_5" + } }, "passAllFeatures": { - "description": "If set, this layer will pass all the features it receives onto the next layer.\nThis is ideal for decoration, e.g. directionss on cameras", + "description": "If set, this layer will pass all the features it receives onto the next layer.\nThis is ideal for decoration, e.g. directions on cameras\niftrue: Make the features from this layer also available to the other layer; might result in this object being rendered by multiple layers\niffalse: normal behaviour: don't pass features allong\nquestion: should this layer pass features to the next layers?\ngroup: expert", + "type": "boolean" + }, + "doNotDownload": { + "description": "If set, this layer will not query overpass; but it'll still match the tags above which are by chance returned by other layers.\nWorks well together with 'passAllFeatures', to add decoration\nThe opposite of `forceLoad`\n\niftrue: Do not attempt to query the data for this layer from overpass/the OSM API\niffalse: download the data as usual\ngroup: expert\nquestion: Should this layer be downloaded or is the data provided by a different layer (which has 'passAllFeatures'-set)?\ndefault: false", + "type": "boolean" + }, + "forceLoad": { + "description": "Advanced option - might be set by the theme compiler\n\nIf true, this data will _always_ be loaded, even if the theme is disabled by a filter or hidden.\nThe opposite of `doNotDownload`\n\nquestion: Should this layer be forcibly loaded?\nifftrue: always download this layer, even if it is disabled\niffalse: only download data for this layer when needed (default)\ndefault: false\ngroup: expert", "type": "boolean" }, "presets": { - "description": "Presets for this layer.\nA preset shows up when clicking the map on a without data (or when right-clicking/long-pressing);\nit will prompt the user to add a new point.\n\nThe most important aspect are the tags, which define which tags the new point will have;\nThe title is shown in the dialog, along with the first sentence of the description.\n\nUpon confirmation, the full description is shown beneath the buttons - perfect to add pictures and examples.\n\nNote: the icon of the preset is determined automatically based on the tags and the icon above. Don't worry about that!\nNB: if no presets are defined, the popup to add new points doesn't show up at all", + "description": "Presets for this layer.\nA preset shows up when clicking the map on a without data (or when right-clicking/long-pressing);\nit will prompt the user to add a new point.\n\nThe most important aspect are the tags, which define which tags the new point will have;\nThe title is shown in the dialog, along with the first sentence of the description.\n\nUpon confirmation, the full description is shown beneath the buttons - perfect to add pictures and examples.\n\nNote: the icon of the preset is determined automatically based on the tags and the icon above. Don't worry about that!\nNB: if no presets are defined, the popup to add new points doesn't show up at all\n\ngroup: presets", "type": "array", "items": { "type": "object", "properties": { "title": { - "description": "The title - shown on the 'add-new'-button.\n\nThis should include the article of the noun, e.g. 'a hydrant', 'a bicycle pump'.\nThis text will be inserted into `Add {category} here`, becoming `Add a hydrant here`.\n\nDo _not_ indicate 'new': 'add a new shop here' is incorrect, as the shop might have existed forever, it could just be unmapped!", + "description": "The title - shown on the 'add-new'-button.\n\nThis should include the article of the noun, e.g. 'a hydrant', 'a bicycle pump'.\nThis text will be inserted into `Add {category} here`, becoming `Add a hydrant here`.\n\nDo _not_ indicate 'new': 'add a new shop here' is incorrect, as the shop might have existed forever, it could just be unmapped!\n\nquestion: What is the word to describe this object?\ninline: Add {translated(value)::font-bold} here", "anyOf": [ { "$ref": "#/definitions/Record" @@ -215,14 +210,14 @@ ] }, "tags": { - "description": "The tags to add. It determines the icon too", + "description": "A single tag (encoded as key=value) out of all the tags to add onto the newly created point.\nNote that the icon in the UI will be chosen automatically based on the tags provided here.\n\nquestion: What tag should be added to the new object?\ntype: simple_tag\ntypeHelper: uploadableOnly", "type": "array", "items": { "type": "string" } }, "description": { - "description": "The _first sentence_ of the description is shown on the button of the `add` menu.\nThe full description is shown in the confirmation dialog.\n\n(The first sentence is until the first '.'-character in the description)", + "description": "An extra explanation of what the feature is, if it is not immediately clear from the title alone.\n\nThe _first sentence_ of the description is shown on the button of the `add` menu.\nThe full description is shown in the confirmation dialog.\n\n(The first sentence is until the first '.'-character in the description)\n\nquestion: How would you describe this feature?\nifunset: No extra description is given. This can be used to further explain the preset", "anyOf": [ { "$ref": "#/definitions/Record" @@ -233,59 +228,22 @@ ] }, "exampleImages": { - "description": "Example images, which show real-life pictures of what such a feature might look like\n\nType: image", + "description": "The URL of an example image which shows a real-life example of what such a feature might look like.\n\nType: image\nquestion: What is the URL of an image showing such a feature?", "type": "array", "items": { "type": "string" } }, - "preciseInput": { - "description": "If set, the user will prompted to confirm the location before actually adding the data.\nThis will be with a 'drag crosshair'-method.\n\nIf 'preferredBackgroundCategory' is set, the element will attempt to pick a background layer of that category.", - "anyOf": [ - { - "type": "object", - "properties": { - "preferredBackground": { - "description": "The type of background picture", - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "string" - } - ] - }, - "snapToLayer": { - "description": "If specified, these layers will be shown to and the new point will be snapped towards it", - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "string" - } - ] - }, - "maxSnapDistance": { - "description": "If specified, a new point will only be snapped if it is within this range.\nDistance in meter\n\nDefault: 10", - "type": "number" - } - } - }, - { - "enum": [ - true - ], - "type": "boolean" - } - ] + "snapToLayer": { + "description": "question: Should the created point be snapped to a line layer?\n\nIf specified, these layers will be shown in the precise location picker and the new point will be snapped towards it.\nFor example, this can be used to snap against `walls_and_buildings` (e.g. to attach a defibrillator, an entrance, an artwork, ... to the wall)\nor to snap an obstacle (such as a bollard) to the `cycleways_and_roads`.\n\nsuggestions: return Array.from(layers.keys()).map(key => ({if: \"value=\"+key, then: key+\" - \"+layers.get(key).description}))", + "type": "array", + "items": { + "type": "string" + } + }, + "maxSnapDistance": { + "description": "question: What is the maximum distance in the location-input that a point can be moved to be snapped to a way?\n\ninline: a point is snapped if the location input is at most {value}m away from an object\n\nIf specified, a new point will only be snapped if it is within this range.\nIf further away, it'll be placed in the center of the location input\nDistance in meter\n\nifunset: Do not snap to a layer", + "type": "number" } }, "required": [ @@ -295,7 +253,7 @@ } }, "tagRenderings": { - "description": "All the tag renderings.\nA tag rendering is a block that either shows the known value or asks a question.\n\nRefer to the class `TagRenderingConfigJson` to see the possibilities.\n\nNote that we can also use a string here - where the string refers to a tag rendering defined in `assets/questions/questions.json`,\nwhere a few very general questions are defined e.g. website, phone number, ...\nFurthermore, _all_ the questions of another layer can be reused with `otherlayer.*`\nIf you need only a single of the tagRenderings, use `otherlayer.tagrenderingId`\nIf one or more questions have a 'group' or 'label' set, select all the entries with the corresponding group or label with `otherlayer.*group`\nRemark: if a tagRendering is 'lent' from another layer, the 'source'-tags are copied and added as condition.\nIf they are not wanted, remove them with an override\n\nA special value is 'questions', which indicates the location of the questions box. If not specified, it'll be appended to the bottom of the featureInfobox.\n\nAt last, one can define a group of renderings where parts of all strings will be replaced by multiple other strings.\nThis is mainly create questions for a 'left' and a 'right' side of the road.\nThese will be grouped and questions will be asked together", + "description": "question: Edit this tagRendering\n\nA tag rendering is a block that either shows the known value or asks a question.\n\nRefer to the class `TagRenderingConfigJson` to see the possibilities.\n\nNote that we can also use a string here - where the string refers to a tag rendering defined in `assets/questions/questions.json`,\nwhere a few very general questions are defined e.g. website, phone number, ...\nFurthermore, _all_ the questions of another layer can be reused with `otherlayer.*`\nIf you need only a single of the tagRenderings, use `otherlayer.tagrenderingId`\nIf one or more questions have a 'group' or 'label' set, select all the entries with the corresponding group or label with `otherlayer.*group`\nRemark: if a tagRendering is 'lent' from another layer, the 'source'-tags are copied and added as condition.\nIf they are not wanted, remove them with an override\n\nA special value is 'questions', which indicates the location of the questions box. If not specified, it'll be appended to the bottom of the featureInfobox.\n\nAt last, one can define a group of renderings where parts of all strings will be replaced by multiple other strings.\nThis is mainly create questions for a 'left' and a 'right' side of the road.\nThese will be grouped and questions will be asked together\n\ntype: tagrendering[]\ngroup: tagrenderings", "type": "array", "items": { "anyOf": [ @@ -355,7 +313,7 @@ } }, "filter": { - "description": "All the extra questions for filtering.\nIf a string is given, mapComplete will search in 'filters.json' for the appropriate filter or will try to parse it as `layername.filterid` and us that one", + "description": "All the extra questions for filtering.\nIf a string is given, mapComplete will search in 'filters.json' for the appropriate filter or will try to parse it as `layername.filterid` and us that one\n\ngroup: filters", "anyOf": [ { "type": "array", @@ -384,7 +342,7 @@ ] }, "deletion": { - "description": "This block defines under what circumstances the delete dialog is shown for objects of this layer.\nIf set, a dialog is shown to the user to (soft) delete the point.\nThe dialog is built to be user friendly and to prevent mistakes.\nIf deletion is not possible, the dialog will hide itself and show the reason of non-deletability instead.\n\nTo configure, the following values are possible:\n\n- false: never ever show the delete button\n- true: show the default delete button\n- undefined: use the mapcomplete default to show deletion or not. Currently, this is the same as 'false' but this will change in the future\n- or: a hash with options (see below)\n\n The delete dialog\n =================\n\n\n\n#### Hard deletion if enough experience\n\nA feature can only be deleted from OpenStreetMap by mapcomplete if:\n\n- It is a node\n- No ways or relations use the node\n- The logged-in user has enough experience OR the user is the only one to have edited the point previously\n- The logged-in user has no unread messages (or has a ton of experience)\n- The user did not select one of the 'non-delete-options' (see below)\n\nIn all other cases, a 'soft deletion' is used.\n\n#### Soft deletion\n\nA 'soft deletion' is when the point isn't deleted from OSM but retagged so that it'll won't how up in the mapcomplete theme anymore.\nThis makes it look like it was deleted, without doing damage. A fixme will be added to the point.\n\nNote that a soft deletion is _only_ possible if these tags are provided by the theme creator, as they'll be different for every theme\n\n#### No-delete options\n\nIn some cases, the contributor might want to delete something for the wrong reason (e.g. someone who wants to have a path removed \"because the path is on their private property\").\nHowever, the path exists in reality and should thus be on OSM - otherwise the next contributor will pass by and notice \"hey, there is a path missing here! Let me redraw it in OSM!)\n\nThe correct approach is to retag the feature in such a way that it is semantically correct *and* that it doesn't show up on the theme anymore.\nA no-delete option is offered as 'reason to delete it', but secretly retags.", + "description": "This block defines under what circumstances the delete dialog is shown for objects of this layer.\nIf set, a dialog is shown to the user to (soft) delete the point.\nThe dialog is built to be user friendly and to prevent mistakes.\nIf deletion is not possible, the dialog will hide itself and show the reason of non-deletability instead.\n\nTo configure, the following values are possible:\n\n- false: never ever show the delete button\n- true: show the default delete button\n- undefined: use the mapcomplete default to show deletion or not. Currently, this is the same as 'false' but this will change in the future\n- or: a hash with options (see below)\n\n### The delete dialog\n\n\n\n#### Hard deletion if enough experience\n\nA feature can only be deleted from OpenStreetMap by mapcomplete if:\n\n- It is a node\n- No ways or relations use the node\n- The logged-in user has enough experience OR the user is the only one to have edited the point previously\n- The logged-in user has no unread messages (or has a ton of experience)\n- The user did not select one of the 'non-delete-options' (see below)\n\nIn all other cases, a 'soft deletion' is used.\n\n#### Soft deletion\n\nA 'soft deletion' is when the point isn't deleted fromOSM but retagged so that it'll won't how up in the mapcomplete theme anymore.\nThis makes it look like it was deleted, without doing damage. A fixme will be added to the point.\n\nNote that a soft deletion is _only_ possible if these tags are provided by the theme creator, as they'll be different for every theme\n\n##### No-delete options\n\nIn some cases, the contributor might want to delete something for the wrong reason (e.g. someone who wants to have a path removed \"because the path is on their private property\").\nHowever, the path exists in reality and should thus be on OSM - otherwise the next contributor will pass by and notice \"hey, there is a path missing here! Let me redraw it in OSM!)\n\nThe correct approach is to retag the feature in such a way that it is semantically correct *and* that it doesn't show up on the theme anymore.\nA no-delete option is offered as 'reason to delete it', but secretly retags.\n\ngroup: editing\ntypes: Use an advanced delete configuration ; boolean\niftrue: Allow deletion\niffalse: Do not allow deletion\nifunset: Do not allow deletion", "anyOf": [ { "$ref": "#/definitions/DeleteConfigJson" @@ -395,7 +353,7 @@ ] }, "allowMove": { - "description": "Indicates if a point can be moved and configures the modalities.\n\nA feature can be moved by MapComplete if:\n\n- It is a point\n- The point is _not_ part of a way or a a relation.\n\nOff by default. Can be enabled by setting this flag or by configuring.", + "description": "Indicates if a point can be moved and why.\n\nA feature can be moved by MapComplete if:\n\n- It is a point\n- The point is _not_ part of a way or a a relation.\n\ntypes: use an advanced move configuration ; boolean\ngroup: editing\nquestion: Is deleting a point allowed?\niftrue: Allow contributors to move a point (for accuracy or a relocation)\niffalse: Don't allow contributors to move points\nifunset: Don't allow contributors to move points (default)", "anyOf": [ { "$ref": "#/definitions/default_3" @@ -406,7 +364,7 @@ ] }, "allowSplit": { - "description": "If set, a 'split this way' button is shown on objects rendered as LineStrings, e.g. highways.\n\nIf the way is part of a relation, MapComplete will attempt to update this relation as well", + "description": "If set, a 'split this way' button is shown on objects rendered as LineStrings, e.g. highways.\n\nIf the way is part of a relation, MapComplete will attempt to update this relation as well\nquestion: Should the contributor be able to split ways using this layer?\niftrue: enable the 'split-roads'-component\niffalse: don't enable the split-roads componenet\nifunset: don't enable the split-roads component\ngroup: editing", "type": "boolean" }, "units": { @@ -416,7 +374,7 @@ } }, "syncSelection": { - "description": "If set, synchronizes whether or not this layer is enabled.\n\nno: Do not sync at all, always revert to default\nlocal: keep selection on local storage\ntheme-only: sync via OSM, but this layer will only be toggled in this theme\nglobal: all layers with this ID will be synced accross all themes", + "description": "If set, synchronizes whether or not this layer is enabled.\n\ngroup: advanced\nquestion: Should enabling/disabling the layer be saved (locally or in the cloud)?\nsuggestions: return [{if: \"value=no\", then: \"Don't save, always revert to the default\"}, {if: \"value=local\", then: \"Save selection in local storage\"}, {if: \"value=theme-only\", then: \"Save the state in the OSM-usersettings, but apply on this theme only (default)\"}, {if: \"value=global\", then: \"Save in OSM-usersettings and toggle on _all_ themes using this layer\"}]", "enum": [ "global", "local", @@ -426,24 +384,27 @@ "type": "string" }, "#": { - "description": "Used for comments and/or to disable some checks\n\nno-question-hint-check: disables a check in MiscTagRenderingChecks which complains about 'div', 'span' or 'class=subtle'-HTML elements in the tagRendering", + "description": "Used for comments and/or to disable some checks\n\nno-question-hint-check: disables a check in MiscTagRenderingChecks which complains about 'div', 'span' or 'class=subtle'-HTML elements in the tagRendering\n\ngroup: hidden", "type": "string" + }, + "fullNodeDatabase": { + "description": "_Set automatically by MapComplete, please ignore_\n\ngroup: hidden", + "type": "boolean" } }, "required": [ "id", - "mapRendering", + "pointRendering", "source" ], "definitions": { "TagConfigJson": { - "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation", + "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation\n\ntype: tag", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", "type": "object", "properties": { "or": { @@ -462,8 +423,7 @@ } ] }, - "AndTagConfigJson": { - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", + "{and:TagConfigJson[];}": { "type": "object", "properties": { "and": { @@ -478,8 +438,7 @@ ], "additionalProperties": false }, - "OrTagConfigJson": { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", + "{or:TagConfigJson[];}": { "type": "object", "properties": { "or": { @@ -566,48 +525,101 @@ ], "additionalProperties": false }, + "MinimalTagRenderingConfigJson": { + "description": "Mostly used for lineRendering and pointRendering", + "type": "object", + "properties": { + "render": { + "description": "question: What value should be rendered?\n\nThis piece of text will be shown in the infobox.\nNote that \"&LBRACEkey&RBRACE\"-parts are substituted by the corresponding values of the element.\n\nThis value will be used if there is no mapping which matches (or there are no matches)\nNote that this is a HTML-interpreted value, so you can add links as e.g. '<a href='{website}'>{website}</a>' or include images such as `This is of type A <br><img src='typeA-icon.svg' />`", + "type": "string" + }, + "mappings": { + "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", + "type": "array", + "items": { + "type": "object", + "properties": { + "if": { + "$ref": "#/definitions/TagConfigJson", + "description": "question: When should this single mapping match?\n\nIf this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}" + }, + "then": { + "description": "question: What text should be shown?\n\nIf the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option", + "type": "string" + } + }, + "required": [ + "if", + "then" + ] + } + } + }, + "additionalProperties": false + }, + "IconConfigJson": { + "type": "object", + "properties": { + "icon": { + "description": "question: What icon should be used?\ntype: icon\nsuggestions: return [\"pin\",\"square\",\"circle\",\"checkmark\",\"clock\",\"close\",\"crosshair\",\"help\",\"home\",\"invalid\",\"location\",\"location_empty\",\"location_locked\",\"note\",\"resolved\",\"ring\",\"scissors\",\"teardrop\",\"teardrop_with_hole_green\",\"triangle\"].map(i => ({if: \"value=\"+i, then: i, icon: i}))", + "anyOf": [ + { + "$ref": "#/definitions/MinimalTagRenderingConfigJson" + }, + { + "type": "object", + "properties": { + "builtin": { + "type": "string" + }, + "override": {} + }, + "required": [ + "builtin", + "override" + ] + }, + { + "type": "string" + } + ] + }, + "color": { + "description": "question: What colour should the icon be?\nThis will only work for the default icons such as `pin`,`circle`,...\ntype: color", + "anyOf": [ + { + "$ref": "#/definitions/MinimalTagRenderingConfigJson" + }, + { + "type": "object", + "properties": { + "builtin": { + "type": "string" + }, + "override": {} + }, + "required": [ + "builtin", + "override" + ] + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "icon" + ], + "additionalProperties": false + }, "TagRenderingConfigJson": { "description": "A TagRenderingConfigJson is a single piece of code which converts one ore more tags into a HTML-snippet.\nFor an _editable_ tagRendering, use 'QuestionableTagRenderingConfigJson' instead, which extends this one", "type": "object", "properties": { - "id": { - "description": "The id of the tagrendering, should be an unique string.\nUsed to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise.\n\nUse 'questions' to trigger the question box of this group (if a group is defined)", - "type": "string" - }, - "labels": { - "description": "A list of labels. These are strings that are used for various purposes, e.g. to filter them away", - "type": "array", - "items": { - "type": "string" - } - }, - "classes": { - "description": "A list of css-classes to apply to the entire tagRendering if the answer is known (not applied on the question).\nThis is only for advanced users", - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "string" - } - ] - }, - "description": { - "description": "A human-readable text explaining what this tagRendering does", - "anyOf": [ - { - "$ref": "#/definitions/Record" - }, - { - "type": "string" - } - ] - }, "render": { - "description": "Renders this value. Note that \"{key}\"-parts are substituted by the corresponding values of the element.\nIf neither 'textFieldQuestion' nor 'mappings' are defined, this text is simply shown as default value.\n\nNote 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
`\ntype: rendered", + "description": "question: What text should be rendered?\n\nThis piece of text will be shown in the infobox.\nIn this text, values within braces (such as {braced(key)}) are replaced by the corresponding `value` in the object.\nFor example, if the object contains tags `amenity=school; name=Windy Hill School`, the render string `This school is named {name}` will be shown to the user as `This school is named Windy Hill School`\n\nThis text will be shown if:\n- there is no mapping which matches (or there are no matches)\n- no question, no mappings and no 'freeform' is set\n\nNote that this is a HTML-interpreted value, so you can add links as e.g. '<a href='{website}'>{website}</a>' or include images such as `This is of type A <br><img src='typeA-icon.svg' />`\ntype: rendered\nifunset: no text is rendered if no predefined options match", "anyOf": [ { "$ref": "#/definitions/Record" @@ -643,16 +655,38 @@ } ] }, - "condition": { - "description": "Only show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", + "icon": { + "description": "question: what icon should be shown next to the 'render' value?\nAn icon shown next to the rendering; typically shown pretty small\nThis is only shown next to the \"render\" value\nType: icon\nifunset: do not show an icon next to the \"render\"-value", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "type": "object", + "properties": { + "path": { + "description": "The path to the icon\nType: icon", + "type": "string" + }, + "class": { + "description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-', so defining your own in combination with a custom CSS is possible (but discouraged)", + "type": "string" + } + }, + "required": [ + "path" + ] }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "type": "string" + } + ] + }, + "condition": { + "description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or ask the question if unkown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", + "anyOf": [ + { + "$ref": "#/definitions/{and:TagConfigJson[];}" + }, + { + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -660,15 +694,13 @@ ] }, "metacondition": { - "description": "If set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", + "description": "question: When should this item be shown (including special conditions)?\ntype: tag\n\nIf set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -676,17 +708,14 @@ ] }, "freeform": { - "description": "Allow freeform text input from the user", + "description": "question: Should a freeform text field be shown?\nAllow freeform text input from the user\nifunset: Do not add a freeform text field", "type": "object", "properties": { "key": { - "description": "If this key is present, then 'render' is used to display the value.\nIf this is undefined, the rendering is _always_ shown", + "description": "What attribute should be filled out\nIf this key is present in the feature, then 'render' is used to display the value.\nIf this is undefined, the rendering is _always_ shown", "type": "string" } - }, - "required": [ - "key" - ] + } }, "mappings": { "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", @@ -696,10 +725,10 @@ "properties": { "if": { "$ref": "#/definitions/TagConfigJson", - "description": "If this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}" + "description": "question: When should this single mapping match?\n\nIf this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}" }, "then": { - "description": "If the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option\nType: rendered", + "description": "question: What text should be shown?\n\nIf the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option\nType: rendered", "anyOf": [ { "$ref": "#/definitions/Record" @@ -710,7 +739,7 @@ ] }, "icon": { - "description": "An icon supporting this mapping; typically shown pretty small\nType: icon", + "description": "question: What icon should be added to this mapping?\nifunset: Do not show an extra icon next to the render value\n\nAn icon supporting this mapping; typically shown pretty small.\nThis can be used to show a 'phone'-icon next to the phone number\ninline: {icon}\nType: icon", "anyOf": [ { "type": "object", @@ -739,6 +768,21 @@ "then" ] } + }, + "description": { + "description": "A human-readable text explaining what this tagRendering does.\nMostly used for the shared tagrenderings", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] + }, + "classes": { + "description": "question: What css-classes should be applied to showing this attribute?\n\nA list of css-classes to apply to the entire tagRendering.\nThese classes are applied in 'answer'-mode, not in question mode\nThis is only for advanced users.\n\nValues are split on ` ` (space)", + "type": "string" } }, "additionalProperties": false @@ -752,13 +796,21 @@ "properties": { "if": { "$ref": "#/definitions/TagConfigJson", - "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation" + "description": "question: What tags should be matched to show this option?\n\nIf in 'question'-mode and the contributor selects this option, these tags will be applied to the object" }, "then": { - "description": "Shown if the 'if is fulfilled\nType: rendered" + "description": "Question: What corresponding text should be shown?\nShown if the `if` is fulfilled\nType: rendered", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] }, "icon": { - "description": "An extra icon supporting the choice\nType: icon", + "description": "question: What icon should be shown next to this mapping?\n\nThis icon will only be shown if the value is known, it is not displayed in the options (but might be in the future)\n\nifunset: Show no icon\nType: icon", "anyOf": [ { "type": "object", @@ -782,15 +834,13 @@ ] }, "hideInAnswer": { - "description": "In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n\n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}", + "description": "question: Under what circumstances should this mapping be hidden from the possibilities a contributor can pick?\niftrue: Never show this mapping as option to pick\nifunset: Always show this mapping as option to pick\ntype: tag\n\nIn some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n\n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": [ @@ -801,15 +851,13 @@ ] }, "ifnot": { - "description": "Only applicable if 'multiAnswer' is set.\nThis is for situations such as:\n`accepts:coins=no` where one can select all the possible payment methods. However, we want to make explicit that some options _were not_ selected.\nThis can be done with `ifnot`\nNote that we can not explicitly render this negative case to the user, we cannot show `does _not_ accept coins`.\nIf this is important to your usecase, consider using multiple radiobutton-fields without `multiAnswer`", + "description": "question: What tags should be applied if this mapping is _not_ chosen?\n\nOnly applicable if 'multiAnswer' is set.\nThis is for situations such as:\n`accepts:coins=no` where one can select all the possible payment methods. However, we want to make explicit that some options _were not_ selected.\nThis can be done with `ifnot`\nNote that we can not explicitly render this negative case to the user, we cannot show `does _not_ accept coins`.\nIf this is important to your usecase, consider using multiple radiobutton-fields without `multiAnswer`\n\nifunset: Do not apply a tag if a different mapping is chosen.", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -817,26 +865,24 @@ ] }, "addExtraTags": { - "description": "If chosen as answer, these tags will be applied as well onto the object.\nNot compatible with multiAnswer.\n\nThis can be used e.g. to erase other keys which indicate the 'not' value:\n```json\n{\n \"if\": \"crossing:marking=rainbow\",\n \"then\": \"This is a rainbow crossing\",\n \"addExtraTags\": \"not:crossing:marking=\"\n}\n```", + "description": "question: What extra tags should be added to the object if this object is chosen?\ntype: simple_tag\n\nIf chosen as answer, these tags will be applied onto the object, together with the tags from the `if`\nNot compatible with multiAnswer.\n\nThis can be used e.g. to erase other keys which indicate the 'not' value:\n```json\n{\n \"if\": \"crossing:marking=rainbow\",\n \"then\": \"This is a rainbow crossing\",\n \"addExtraTags\": [\"not:crossing:marking=\"]\n}\n```", "type": "array", "items": { "type": "string" } }, "searchTerms": { - "description": "If there are many options, the mappings-radiobuttons will be replaced by an element with a searchfunction\n\nSearchterms (per language) allow to easily find an option if there are many options", + "description": "question: If there are many options, what search terms match too?\nIf there are many options, the mappings-radiobuttons will be replaced by an element with a searchfunction\n\nSearchterms (per language) allow to easily find an option if there are many options\ngroup: hidden", "$ref": "#/definitions/Record" }, "priorityIf": { - "description": "If the searchable selector is picked, mappings with this item will have priority and show up even if the others are hidden\nUse this sparingly", + "description": "If the searchable selector is picked, mappings with this item will have priority and show up even if the others are hidden\nUse this sparingly\ngroup: hidden", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -844,7 +890,7 @@ ] }, "#": { - "description": "Used for comments or to disable a validation\n\nignore-image-in-then: normally, a `then`-clause is not allowed to have an `img`-html-element as icons are preferred. In some cases (most notably title-icons), this is allowed", + "description": "Used for comments or to disable a validation\n\ngroup: hidden\nignore-image-in-then: normally, a `then`-clause is not allowed to have an `img`-html-element as icons are preferred. In some cases (most notably title-icons), this is allowed", "type": "string" } }, @@ -863,38 +909,34 @@ "type": "object", "properties": { "location": { - "description": "All the locations that this point should be rendered at.\nPossible values are:\n- `point`: only renders points at their location\n- `centroid`: show a symbol at the centerpoint of a (multi)Linestring and (multi)polygon. Points will _not_ be rendered with this\n- `projected_centerpoint`: Only on (multi)linestrings: calculate the centerpoint and snap it to the way\n- `start` and `end`: only on linestrings: add a point to the first/last coordinate of the LineString", + "description": "question: At what location should this icon be shown?\nmultianswer: true\nsuggestions: return [{if: \"value=point\",then: \"Show an icon for point (node) objects\"},{if: \"value=centroid\",then: \"Show an icon for line or polygon (way) objects at their centroid location\"}, {if: \"value=start\",then: \"Show an icon for line (way) objects at the start\"},{if: \"value=end\",then: \"Show an icon for line (way) object at the end\"},{if: \"value=projected_centerpoint\",then: \"Show an icon for line (way) object near the centroid location, but moved onto the line\"}]", "type": "array", "items": { "type": "string" } }, - "icon": { - "description": "The icon for an element.\nNote that this also doubles as the icon for this layer (rendered with the overpass-tags) ánd the icon in the presets.\n\nThe result of the icon is rendered as follows:\nthe resulting string is interpreted as a _list_ of items, separated by \";\". The bottommost layer is the first layer.\nAs a result, on could use a generic pin, then overlay it with a specific icon.\nTo make things even more practical, one can use all SVG's from the folder \"assets/svg\" and _substitute the color_ in it.\nE.g. to draw a red pin, use \"pin:#f00\", to have a green circle with your icon on top, use `circle:#0f0;`\n\nType: icon", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] + "marker": { + "description": "The marker for an element.\nNote that this also defines the icon for this layer (rendered with the overpass-tags) and the icon in the presets.\n\nThe result of the icon is rendered as follows:\n- The first icon is rendered on the map\n- The second entry is overlayed on top of it\n- ...\n\nAs a result, on could use a generic icon (`pin`, `circle`, `square`) with a color, then overlay it with a specific icon.", + "type": "array", + "items": { + "$ref": "#/definitions/IconConfigJson" + } }, "iconBadges": { - "description": "A list of extra badges to show next to the icon as small badge\nThey will be added as a 25% height icon at the bottom right of the icon, with all the badges in a flex layout.\n\nNote: strings are interpreted as icons, so layering and substituting is supported. You can use `circle:white;./my_icon.svg` to add a background circle", + "description": "A list of extra badges to show next to the icon as small badge\nThey will be added as a 25% height icon at the bottom right of the icon, with all the badges in a flex layout.\n\nNote: strings are interpreted as icons, so layering and substituting is supported. You can use `circle:white;./my_icon.svg` to add a background circle\ngroup: hidden", "type": "array", "items": { "type": "object", "properties": { "if": { "$ref": "#/definitions/TagConfigJson", - "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation" + "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation\n\ntype: tag" }, "then": { "description": "Badge to show\nType: icon", "anyOf": [ { - "$ref": "#/definitions/TagRenderingConfigJson" + "$ref": "#/definitions/MinimalTagRenderingConfigJson" }, { "type": "string" @@ -909,7 +951,18 @@ } }, "iconSize": { - "description": "A string containing \"width,height\" or \"width,height,anchorpoint\" where anchorpoint is any of 'center', 'top', 'bottom', 'left', 'right', 'bottomleft','topright', ...\nDefault is '40,40,center'", + "description": "question: What size should the marker be on the map?\nA string containing \",\" in pixels\nifunset: Use the default size (40,40 px)", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "anchor": { + "description": "question: What is the anchorpoint of the icon?\n\nThis matches the geographical point with a location on the icon.\n\nifunset: Use MapComplete-default (center)\nsuggestions: return [{if: \"value=center\", then: \"Place the center of the icon on the geographical location\"},{if: \"value=top\", then: \"Place the top of the icon on the geographical location\"},{if: \"value=bottom\", then: \"Place the bottom of the icon on the geographical location\"},{if: \"value=left\", then: \"Place the left of the icon on the geographical location\"},{if: \"value=right\", then: \"Place the right of the icon on the geographical location\"}]", "anyOf": [ { "$ref": "#/definitions/TagRenderingConfigJson" @@ -920,7 +973,7 @@ ] }, "rotation": { - "description": "The rotation of an icon, useful for e.g. directions.\nUsage: 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)``", + "description": "question: What rotation should be applied on the icon?\nThis is mostly useful for items that face a specific direction, such as surveillance cameras\nThis is interpreted as css property for 'rotate', thus has to end with 'deg', e.g. `90deg`, `{direction}deg`, `calc(90deg - {camera:direction}deg)``\nifunset: Do not rotate", "anyOf": [ { "$ref": "#/definitions/TagRenderingConfigJson" @@ -931,29 +984,7 @@ ] }, "label": { - "description": "A HTML-fragment that is shown below the icon, for example:\n
{name}
\n\nIf the icon is undefined, then the label is shown in the center of the feature.\nNote that, if the wayhandling hides the icon then no label is shown as well.", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - }, - "css": { - "description": "A snippet of css code which is applied onto the container of the entire marker", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - }, - "cssClasses": { - "description": "A snippet of css-classes which are applied onto the container of the entire marker. They can be space-separated", + "description": "question: What label should be shown beneath the marker?\nFor example: `<div style=\"background: white\">{name}</div>`\n\nIf the icon is undefined, then the label is shown in the center of the feature.\ntypes: Dynamic value based on the attributes ; string\ninline: Always show label {value} beneath the marker\nifunset: Do not show a label beneath the marker", "anyOf": [ { "$ref": "#/definitions/TagRenderingConfigJson" @@ -964,7 +995,7 @@ ] }, "labelCss": { - "description": "Css that is applied onto the label", + "description": "question: What CSS should be applied to the label?\nYou can set the css-properties here, e.g. `background: red; font-size: 12px; `\ninline: Apply CSS-style {value} to the label\ntypes: Dynamic value ; string\nifunset: Do not apply extra CSS-labels to the label\ngroup: expert", "anyOf": [ { "$ref": "#/definitions/TagRenderingConfigJson" @@ -975,7 +1006,29 @@ ] }, "labelCssClasses": { - "description": "Css classes that are applied onto the label; can be space-separated", + "description": "question: Which CSS-classes should be applied to the label?\n\nThe classes should be separated by a space (` `)\nYou can use most Tailwind-css classes, see https://tailwindcss.com/ for more information\nFor example: `center bg-gray-500 mx-2 my-1 rounded-full`\ninline: Apply CSS-classes {value} to the label\ntypes: Dynamic value ; string\nifunset: Do not apply extra CSS-classes to the label\nsuggestions: return [{if: \"value=bg-white rounded px-2\", then: \"Draw on a white background\"}]", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "css": { + "description": "question: What CSS should be applied to the entire marker?\nYou can set the css-properties here, e.g. `background: red; font-size: 12px; `\nThis will be applied to the _container_ containing both the marker and the label\ninline: Apply CSS-style {value} to the _entire marker_\ntypes: Dynamic value ; string\nifunset: Do not apply extra CSS element to the entire marker\ngroup: expert", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "cssClasses": { + "description": "question: Which CSS-classes should be applied to the entire marker?\nThis will be applied to the _container_ containing both the marker and the label\n\nThe classes should be separated by a space (` `)\nYou can use most Tailwind-css classes, see https://tailwindcss.com/ for more information\nFor example: `center bg-gray-500 mx-2 my-1 rounded-full`\ninline: Apply CSS-classes {value} to the entire container\nifunset: Do not apply extra CSS-classes to the label\ntypes: Dynamic value ; string\nifunset: Do not apply extra CSS-classes to the entire marker\ngroup: expert", "anyOf": [ { "$ref": "#/definitions/TagRenderingConfigJson" @@ -986,7 +1039,7 @@ ] }, "pitchAlignment": { - "description": "If the map is pitched, the marker will stay parallel to the screen.\nSet to 'map' if you want to put it flattened on the map", + "description": "question: If the map is pitched, should the icon stay parallel to the screen or to the groundplane?\nsuggestions: return [{if: \"value=canvas\", then: \"The icon will stay upward and not be transformed as if it sticks to the screen\"}, {if: \"value=map\", then: \"The icon will be transformed as if it were painted onto the ground. (Automatically sets rotationAlignment)\"}]\ngroup: expert", "anyOf": [ { "$ref": "#/definitions/TagRenderingConfigJson" @@ -1001,7 +1054,7 @@ ] }, "rotationAlignment": { - "description": "If the map is rotated, the icon will still point to the north if no rotation was applied", + "description": "question: Should the icon be rotated if the map is rotated?\nifunset: Do not rotate or tilt icons. Always keep the icons straight\nsuggestions: return [{if: \"value=canvas\", then: \"Never rotate the icon\"}, {if: \"value=map\", then: \"If the map is rotated, rotate the icon as well. This gives the impression of an icon that floats perpendicular above the ground.\"}]\ngroup: expert", "anyOf": [ { "$ref": "#/definitions/TagRenderingConfigJson" @@ -1026,10 +1079,10 @@ "type": "object", "properties": { "color": { - "description": "The color for way-elements and SVG-elements.\nIf the value starts with \"--\", the style of the body element will be queried for the corresponding variable instead", + "description": "question: What color should lines be drawn in?\n\nFor an area, this will be the colour of the outside line.\nIf the value starts with \"--\", the style of the body element will be queried for the corresponding variable instead\n\ntypes: dynamic value ; string\ntitle: Line Colour\ninline: The line colour always is {value}\ntype: color", "anyOf": [ { - "$ref": "#/definitions/TagRenderingConfigJson" + "$ref": "#/definitions/MinimalTagRenderingConfigJson" }, { "type": "string" @@ -1037,10 +1090,10 @@ ] }, "width": { - "description": "The stroke-width for way-elements", + "description": "question: How wide should the line be?\nThe stroke-width for way-elements\n\ntypes: dynamic value ; string\ntitle: Line width\ninline: The line width is {value} pixels\ntype: pnat\nifunset: Use the default-linewidth of 7 pixels", "anyOf": [ { - "$ref": "#/definitions/TagRenderingConfigJson" + "$ref": "#/definitions/MinimalTagRenderingConfigJson" }, { "type": [ @@ -1051,47 +1104,25 @@ ] }, "dashArray": { - "description": "A dasharray, e.g. \"5 6\"\nThe dasharray defines 'pixels of line, pixels of gap, pixels of line, pixels of gap',\nDefault value: \"\" (empty string == full line)", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] + "description": "question: Should a dasharray be used to render the lines?\nThe dasharray defines 'pixels of line, pixels of gap, pixels of line, pixels of gap, ...'. For example, `5 6` will be 5 pixels of line followed by a 6 pixel gap.\nCannot be a dynamic property due to a mapbox limitation\nifunset: Ways are rendered with a full line", + "type": "string" }, "lineCap": { - "description": "The form at the end of a line", + "description": "question: What form should the line-ending have?\nsuggestions: return [{if:\"value=round\",then:\"Round endings\"}, {if: \"value=square\", then: \"square endings\"}, {if: \"value=butt\", then: \"no ending (square ending at the end, without padding)\"}]\ntypes: dynamic value ; string\ntitle: Line Cap\nifunset: Use the default value (round ending)", "anyOf": [ { - "$ref": "#/definitions/TagRenderingConfigJson" + "$ref": "#/definitions/MinimalTagRenderingConfigJson" }, { "type": "string" } ] }, - "fill": { - "description": "Whether or not to fill polygons", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "enum": [ - "no", - "yes" - ], - "type": "string" - } - ] - }, "fillColor": { - "description": "The color to fill a polygon with.\nIf undefined, this will be slightly more opaque version of the stroke line", + "description": "question: What colour should be used as fill colour for polygons?\nifunset: The polygon fill colour will be a more transparent version of the stroke colour\nsuggestions: return [{if: \"value=#00000000\", then: \"Use a transparent fill (only render the outline)\"}]\ninline: The fill colour is {value}\ntypes: dynamic value ; string\ntype: color", "anyOf": [ { - "$ref": "#/definitions/TagRenderingConfigJson" + "$ref": "#/definitions/MinimalTagRenderingConfigJson" }, { "type": "string" @@ -1099,10 +1130,10 @@ ] }, "offset": { - "description": "The number of pixels this line should be moved.\nUse a positive numbe to move to the right, a negative to move to the left (left/right as defined by the drawing direction of the line).\n\nIMPORTANT: MapComplete will already normalize 'key:both:property' and 'key:both' into the corresponding 'key:left' and 'key:right' tagging (same for 'sidewalk=left/right/both' which is rewritten to 'sidewalk:left' and 'sidewalk:right')\nThis simplifies programming. Refer to the CalculatedTags.md-documentation for more details", + "description": "question: Should the lines be moved (offsetted) with a number of pixels against the geographical lines?\nThe number of pixels this line should be moved.\nUse a positive number to move to the right in the drawing direction or a negative to move to the left (left/right as defined by the drawing direction of the line).\n\nIMPORTANT: MapComplete will already normalize 'key:both:property' and 'key:both' into the corresponding 'key:left' and 'key:right' tagging (same for 'sidewalk=left/right/both' which is rewritten to 'sidewalk:left' and 'sidewalk:right')\nThis simplifies programming. Refer to the CalculatedTags.md-documentation for more details\nifunset: don't offset lines on the map\ninline: Pixel offset by {value} pixels\ntypes: dynamic value ; number\ntype: int", "anyOf": [ { - "$ref": "#/definitions/TagRenderingConfigJson" + "$ref": "#/definitions/MinimalTagRenderingConfigJson" }, { "type": "number" @@ -1112,67 +1143,85 @@ }, "additionalProperties": false }, - "default": { - "description": "Rewrites and multiplies the given renderings of type T.\n\nThis can be used for introducing many similar questions automatically,\nwhich also makes translations easier.\n\n(Note that the key does _not_ need to be wrapped in {}.\nHowever, we recommend to use them if the key is used in a translation, as missing keys will be picked up and warned for by the translation scripts)\n\nFor example:\n\n```\n{\n rewrite: {\n sourceString: [\"key\", \"a|b|c\"],\n into: [\n [\"X\", 0]\n [\"Y\", 1],\n [\"Z\", 2]\n ],\n renderings: [{\n \"key\":\"a|b|c\"\n }]\n }\n}\n```\nwill result in _three_ copies (as the values to rewrite into have three values, namely:\n\n[\n {\n # The first pair: key --> X, a|b|c --> 0\n \"X\": 0\n },\n {\n \"Y\": 1\n },\n {\n \"Z\": 2\n }\n\n]", + "QuestionableTagRenderingConfigJson": { + "description": "A QuestionableTagRenderingConfigJson is a single piece of code which converts one ore more tags into a HTML-snippet.\nIf the desired tags are missing and a question is defined, a question will be shown instead.", "type": "object", "properties": { - "rewrite": { + "id": { + "type": "string" + }, + "mappings": { + "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes\n\nquestion: What are common options?", + "type": "array", + "items": { + "$ref": "#/definitions/MappingConfigJson" + } + }, + "multiAnswer": { + "description": "If true, use checkboxes instead of radio buttons when asking the question\n\nquestion: Should a contributor be allowed to select multiple mappings?\n\niftrue: allow to select multiple mappings\niffalse: only allow to select a single mapping\nifunset: only allow to select a single mapping", + "type": "boolean" + }, + "freeform": { + "description": "Allow freeform text input from the user", "type": "object", "properties": { - "sourceString": { + "key": { + "description": "question: What is the name of the attribute that should be written to?\nThis is the OpenStreetMap-key that that value will be written to\nifunset: do not offer a freeform textfield as answer option", + "type": "string" + }, + "type": { + "description": "question: What is the input type?\nThe type of the text-field, e.g. 'string', 'nat', 'float', 'date',...\nSee Docs/SpecialInputElements.md and UI/Input/ValidatedTextField.ts for supported values\nifunset: use an unconstrained string as input (default)\nsuggestions: return validators.AllValidators.filter(type => !type.isMeta).map((type) => ({if: \"value=\"+type.name, then: \"\"+type.name+\" \"+type.explanation.split(\"\\n\")[0]}))", + "type": "string" + }, + "placeholder": { + "description": "question: What placeholder text should be shown in the input-element if there is no input?\nA (translated) text that is shown (as gray text) within the textfield\ntype: translation\ngroup: expert", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] + }, + "helperArgs": { + "description": "Extra parameters to initialize the input helper arguments.\nFor semantics, see the 'SpecialInputElements.md'\ngroup: expert", + "type": "array", + "items": {} + }, + "addExtraTags": { + "description": "If a value is added with the textfield, these extra tag is addded.\nUseful to add a 'fixme=freeform textfield used - to be checked'\ngroup: expert", "type": "array", "items": { "type": "string" } }, - "into": { - "type": "array", - "items": { - "type": "array", - "items": {} - } + "inline": { + "description": "question: Show the freeform as box within the question?\nInstead of showing a full-width text field, the text field will be shown within the rendering of the question.\n\nThis combines badly with special input elements, as it'll distort the layout.\nifunset: show the freeform input field full-width\niftrue: show the freeform input field as a small field within the question\ngroup: expert", + "type": "boolean" + }, + "default": { + "description": "question: What value should be entered in the text field if no value is set?\nThis can help people to quickly enter the most common option\nifunset: do not prefill the textfield\ngroup: expert", + "type": "string" + }, + "invalidValues": { + "description": "question: What values of the freeform key should be interpreted as 'unknown'?\nFor example, if a feature has `shop=yes`, the question 'what type of shop is this?' should still asked\nifunset: The question will be considered answered if any value is set for the key\ngroup: expert", + "anyOf": [ + { + "$ref": "#/definitions/{and:TagConfigJson[];}" + }, + { + "$ref": "#/definitions/{or:TagConfigJson[];}" + }, + { + "type": "string" + } + ] } - }, - "required": [ - "into", - "sourceString" - ] + } }, - "renderings": { - "anyOf": [ - { - "$ref": "#/definitions/default_4" - }, - { - "$ref": "#/definitions/default_5" - }, - { - "type": "array", - "items": { - "$ref": "#/definitions/default_5" - } - }, - { - "type": "array", - "items": { - "$ref": "#/definitions/default_4" - } - } - ] - } - }, - "required": [ - "renderings", - "rewrite" - ], - "additionalProperties": false - }, - "QuestionableTagRenderingConfigJson": { - "description": "A QuestionableTagRenderingConfigJson is a single piece of code which converts one ore more tags into a HTML-snippet.\nIf the desired tags are missing and a question is defined, a question will be shown instead.", - "type": "object", - "properties": { "question": { - "description": "If it turns out that this tagRendering doesn't match _any_ value, then we show this question.\nIf undefined, the question is never asked and this tagrendering is read-only", + "description": "question: What question should be shown to the contributor?\n\nA question is presented ot the user if no mapping matches and the 'freeform' key is not set as well.\n\nifunset: This tagrendering will be shown if it is known, but cannot be edited by the contributor, effectively resutling in a read-only rendering", "anyOf": [ { "$ref": "#/definitions/Record" @@ -1183,7 +1232,7 @@ ] }, "questionHint": { - "description": "A hint which is shown in subtle text under the question.\nThis can give some extra information on what the answer should ook like", + "description": "question: Should some extra information be shown to the contributor, alongside the question?\nThis hint is shown in subtle text under the question.\nThis can give some extra information on what the answer should ook like\nifunset: No extra hint is given", "anyOf": [ { "$ref": "#/definitions/Record" @@ -1193,94 +1242,15 @@ } ] }, - "freeform": { - "description": "Allow freeform text input from the user", - "type": "object", - "properties": { - "key": { - "type": "string" - }, - "type": { - "description": "The type of the text-field, e.g. 'string', 'nat', 'float', 'date',...\nSee Docs/SpecialInputElements.md and UI/Input/ValidatedTextField.ts for supported values", - "type": "string" - }, - "placeholder": { - "description": "A (translated) text that is shown (as gray text) within the textfield" - }, - "helperArgs": { - "description": "Extra parameters to initialize the input helper arguments.\nFor semantics, see the 'SpecialInputElements.md'", - "type": "array", - "items": {} - }, - "addExtraTags": { - "description": "If a value is added with the textfield, these extra tag is addded.\nUseful to add a 'fixme=freeform textfield used - to be checked'", - "type": "array", - "items": { - "type": "string" - } - }, - "inline": { - "description": "When set, influences the way a question is asked.\nInstead of showing a full-width text field, the text field will be shown within the rendering of the question.\n\nThis combines badly with special input elements, as it'll distort the layout.\nNote that this will be set automatically if no special elements are present.", - "type": "boolean" - }, - "default": { - "description": "default value to enter if no previous tagging is present.\nNormally undefined (aka do not enter anything)", - "type": "string" - } - }, - "required": [ - "key" - ] - }, - "multiAnswer": { - "description": "If true, use checkboxes instead of radio buttons when asking the question", - "type": "boolean" - }, - "mappings": { - "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", - "type": "array", - "items": { - "$ref": "#/definitions/MappingConfigJson" - } - }, - "id": { - "description": "The id of the tagrendering, should be an unique string.\nUsed to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise.\n\nUse 'questions' to trigger the question box of this group (if a group is defined)", - "type": "string" - }, "labels": { - "description": "A list of labels. These are strings that are used for various purposes, e.g. to filter them away", + "description": "A list of labels. These are strings that are used for various purposes, e.g. to only include a subset of the tagRenderings when reusing a layer", "type": "array", "items": { "type": "string" } }, - "classes": { - "description": "A list of css-classes to apply to the entire tagRendering if the answer is known (not applied on the question).\nThis is only for advanced users", - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "string" - } - ] - }, - "description": { - "description": "A human-readable text explaining what this tagRendering does", - "anyOf": [ - { - "$ref": "#/definitions/Record" - }, - { - "type": "string" - } - ] - }, "render": { - "description": "Renders this value. Note that \"{key}\"-parts are substituted by the corresponding values of the element.\nIf neither 'textFieldQuestion' nor 'mappings' are defined, this text is simply shown as default value.\n\nNote 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
`\ntype: rendered", + "description": "question: What text should be rendered?\n\nThis piece of text will be shown in the infobox.\nIn this text, values within braces (such as {braced(key)}) are replaced by the corresponding `value` in the object.\nFor example, if the object contains tags `amenity=school; name=Windy Hill School`, the render string `This school is named {name}` will be shown to the user as `This school is named Windy Hill School`\n\nThis text will be shown if:\n- there is no mapping which matches (or there are no matches)\n- no question, no mappings and no 'freeform' is set\n\nNote that this is a HTML-interpreted value, so you can add links as e.g. '<a href='{website}'>{website}</a>' or include images such as `This is of type A <br><img src='typeA-icon.svg' />`\ntype: rendered\nifunset: no text is rendered if no predefined options match", "anyOf": [ { "$ref": "#/definitions/Record" @@ -1316,16 +1286,38 @@ } ] }, - "condition": { - "description": "Only show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", + "icon": { + "description": "question: what icon should be shown next to the 'render' value?\nAn icon shown next to the rendering; typically shown pretty small\nThis is only shown next to the \"render\" value\nType: icon\nifunset: do not show an icon next to the \"render\"-value", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "type": "object", + "properties": { + "path": { + "description": "The path to the icon\nType: icon", + "type": "string" + }, + "class": { + "description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-', so defining your own in combination with a custom CSS is possible (but discouraged)", + "type": "string" + } + }, + "required": [ + "path" + ] }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "type": "string" + } + ] + }, + "condition": { + "description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or ask the question if unkown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", + "anyOf": [ + { + "$ref": "#/definitions/{and:TagConfigJson[];}" + }, + { + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -1333,29 +1325,118 @@ ] }, "metacondition": { - "description": "If set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", + "description": "question: When should this item be shown (including special conditions)?\ntype: tag\n\nIf set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" } ] + }, + "description": { + "description": "A human-readable text explaining what this tagRendering does.\nMostly used for the shared tagrenderings", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] + }, + "classes": { + "description": "question: What css-classes should be applied to showing this attribute?\n\nA list of css-classes to apply to the entire tagRendering.\nThese classes are applied in 'answer'-mode, not in question mode\nThis is only for advanced users.\n\nValues are split on ` ` (space)", + "type": "string" } }, + "required": [ + "id" + ], "additionalProperties": false }, "Partial": { "type": "object", "properties": { + "id": { + "type": "string" + }, + "mappings": { + "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes\n\nquestion: What are common options?", + "type": "array", + "items": { + "$ref": "#/definitions/MappingConfigJson" + } + }, + "multiAnswer": { + "description": "If true, use checkboxes instead of radio buttons when asking the question\n\nquestion: Should a contributor be allowed to select multiple mappings?\n\niftrue: allow to select multiple mappings\niffalse: only allow to select a single mapping\nifunset: only allow to select a single mapping", + "type": "boolean" + }, + "freeform": { + "description": "Allow freeform text input from the user", + "type": "object", + "properties": { + "key": { + "description": "question: What is the name of the attribute that should be written to?\nThis is the OpenStreetMap-key that that value will be written to\nifunset: do not offer a freeform textfield as answer option", + "type": "string" + }, + "type": { + "description": "question: What is the input type?\nThe type of the text-field, e.g. 'string', 'nat', 'float', 'date',...\nSee Docs/SpecialInputElements.md and UI/Input/ValidatedTextField.ts for supported values\nifunset: use an unconstrained string as input (default)\nsuggestions: return validators.AllValidators.filter(type => !type.isMeta).map((type) => ({if: \"value=\"+type.name, then: \"\"+type.name+\" \"+type.explanation.split(\"\\n\")[0]}))", + "type": "string" + }, + "placeholder": { + "description": "question: What placeholder text should be shown in the input-element if there is no input?\nA (translated) text that is shown (as gray text) within the textfield\ntype: translation\ngroup: expert", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] + }, + "helperArgs": { + "description": "Extra parameters to initialize the input helper arguments.\nFor semantics, see the 'SpecialInputElements.md'\ngroup: expert", + "type": "array", + "items": {} + }, + "addExtraTags": { + "description": "If a value is added with the textfield, these extra tag is addded.\nUseful to add a 'fixme=freeform textfield used - to be checked'\ngroup: expert", + "type": "array", + "items": { + "type": "string" + } + }, + "inline": { + "description": "question: Show the freeform as box within the question?\nInstead of showing a full-width text field, the text field will be shown within the rendering of the question.\n\nThis combines badly with special input elements, as it'll distort the layout.\nifunset: show the freeform input field full-width\niftrue: show the freeform input field as a small field within the question\ngroup: expert", + "type": "boolean" + }, + "default": { + "description": "question: What value should be entered in the text field if no value is set?\nThis can help people to quickly enter the most common option\nifunset: do not prefill the textfield\ngroup: expert", + "type": "string" + }, + "invalidValues": { + "description": "question: What values of the freeform key should be interpreted as 'unknown'?\nFor example, if a feature has `shop=yes`, the question 'what type of shop is this?' should still asked\nifunset: The question will be considered answered if any value is set for the key\ngroup: expert", + "anyOf": [ + { + "$ref": "#/definitions/{and:TagConfigJson[];}" + }, + { + "$ref": "#/definitions/{or:TagConfigJson[];}" + }, + { + "type": "string" + } + ] + } + } + }, "question": { - "description": "If it turns out that this tagRendering doesn't match _any_ value, then we show this question.\nIf undefined, the question is never asked and this tagrendering is read-only", + "description": "question: What question should be shown to the contributor?\n\nA question is presented ot the user if no mapping matches and the 'freeform' key is not set as well.\n\nifunset: This tagrendering will be shown if it is known, but cannot be edited by the contributor, effectively resutling in a read-only rendering", "anyOf": [ { "$ref": "#/definitions/Record" @@ -1366,7 +1447,7 @@ ] }, "questionHint": { - "description": "A hint which is shown in subtle text under the question.\nThis can give some extra information on what the answer should ook like", + "description": "question: Should some extra information be shown to the contributor, alongside the question?\nThis hint is shown in subtle text under the question.\nThis can give some extra information on what the answer should ook like\nifunset: No extra hint is given", "anyOf": [ { "$ref": "#/definitions/Record" @@ -1376,94 +1457,15 @@ } ] }, - "freeform": { - "description": "Allow freeform text input from the user", - "type": "object", - "properties": { - "key": { - "type": "string" - }, - "type": { - "description": "The type of the text-field, e.g. 'string', 'nat', 'float', 'date',...\nSee Docs/SpecialInputElements.md and UI/Input/ValidatedTextField.ts for supported values", - "type": "string" - }, - "placeholder": { - "description": "A (translated) text that is shown (as gray text) within the textfield" - }, - "helperArgs": { - "description": "Extra parameters to initialize the input helper arguments.\nFor semantics, see the 'SpecialInputElements.md'", - "type": "array", - "items": {} - }, - "addExtraTags": { - "description": "If a value is added with the textfield, these extra tag is addded.\nUseful to add a 'fixme=freeform textfield used - to be checked'", - "type": "array", - "items": { - "type": "string" - } - }, - "inline": { - "description": "When set, influences the way a question is asked.\nInstead of showing a full-width text field, the text field will be shown within the rendering of the question.\n\nThis combines badly with special input elements, as it'll distort the layout.\nNote that this will be set automatically if no special elements are present.", - "type": "boolean" - }, - "default": { - "description": "default value to enter if no previous tagging is present.\nNormally undefined (aka do not enter anything)", - "type": "string" - } - }, - "required": [ - "key" - ] - }, - "multiAnswer": { - "description": "If true, use checkboxes instead of radio buttons when asking the question", - "type": "boolean" - }, - "mappings": { - "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", - "type": "array", - "items": { - "$ref": "#/definitions/MappingConfigJson" - } - }, - "id": { - "description": "The id of the tagrendering, should be an unique string.\nUsed to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise.\n\nUse 'questions' to trigger the question box of this group (if a group is defined)", - "type": "string" - }, "labels": { - "description": "A list of labels. These are strings that are used for various purposes, e.g. to filter them away", + "description": "A list of labels. These are strings that are used for various purposes, e.g. to only include a subset of the tagRenderings when reusing a layer", "type": "array", "items": { "type": "string" } }, - "classes": { - "description": "A list of css-classes to apply to the entire tagRendering if the answer is known (not applied on the question).\nThis is only for advanced users", - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "string" - } - ] - }, - "description": { - "description": "A human-readable text explaining what this tagRendering does", - "anyOf": [ - { - "$ref": "#/definitions/Record" - }, - { - "type": "string" - } - ] - }, "render": { - "description": "Renders this value. Note that \"{key}\"-parts are substituted by the corresponding values of the element.\nIf neither 'textFieldQuestion' nor 'mappings' are defined, this text is simply shown as default value.\n\nNote 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
`\ntype: rendered", + "description": "question: What text should be rendered?\n\nThis piece of text will be shown in the infobox.\nIn this text, values within braces (such as {braced(key)}) are replaced by the corresponding `value` in the object.\nFor example, if the object contains tags `amenity=school; name=Windy Hill School`, the render string `This school is named {name}` will be shown to the user as `This school is named Windy Hill School`\n\nThis text will be shown if:\n- there is no mapping which matches (or there are no matches)\n- no question, no mappings and no 'freeform' is set\n\nNote that this is a HTML-interpreted value, so you can add links as e.g. '<a href='{website}'>{website}</a>' or include images such as `This is of type A <br><img src='typeA-icon.svg' />`\ntype: rendered\nifunset: no text is rendered if no predefined options match", "anyOf": [ { "$ref": "#/definitions/Record" @@ -1499,16 +1501,38 @@ } ] }, - "condition": { - "description": "Only show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", + "icon": { + "description": "question: what icon should be shown next to the 'render' value?\nAn icon shown next to the rendering; typically shown pretty small\nThis is only shown next to the \"render\" value\nType: icon\nifunset: do not show an icon next to the \"render\"-value", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "type": "object", + "properties": { + "path": { + "description": "The path to the icon\nType: icon", + "type": "string" + }, + "class": { + "description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-', so defining your own in combination with a custom CSS is possible (but discouraged)", + "type": "string" + } + }, + "required": [ + "path" + ] }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "type": "string" + } + ] + }, + "condition": { + "description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or ask the question if unkown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", + "anyOf": [ + { + "$ref": "#/definitions/{and:TagConfigJson[];}" + }, + { + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -1516,20 +1540,33 @@ ] }, "metacondition": { - "description": "If set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", + "description": "question: When should this item be shown (including special conditions)?\ntype: tag\n\nIf set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" } ] + }, + "description": { + "description": "A human-readable text explaining what this tagRendering does.\nMostly used for the shared tagrenderings", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] + }, + "classes": { + "description": "question: What css-classes should be applied to showing this attribute?\n\nA list of css-classes to apply to the entire tagRendering.\nThese classes are applied in 'answer'-mode, not in question mode\nThis is only for advanced users.\n\nValues are split on ` ` (space)", + "type": "string" } }, "additionalProperties": false @@ -1610,15 +1647,13 @@ "properties": { "question": {}, "osmTags": { - "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation", + "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation\n\ntype: tag", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -1666,6 +1701,10 @@ "DeleteConfigJson": { "type": "object", "properties": { + "neededChangesets": { + "description": "*\nBy default, the contributor needs 20 previous changesets to delete points edited by others.\nFor some small features (e.g. bicycle racks) this is too much and this requirement can be lowered or dropped, which can be done here.\n\ntype: nat\nquestion: How many changesets must a contributor have before being allowed to delete a point?", + "type": "number" + }, "extraDeleteReasons": { "description": "*\nBy default, three reasons to delete a point are shown:\n\n- The point does not exist anymore\n- The point was a testing point\n- THe point could not be found\n\nHowever, for some layers, there might be different or more specific reasons for deletion which can be user friendly to set, e.g.:\n\n- the shop has closed\n- the climbing route has been closed of for nature conservation reasons\n- ...\n\nThese reasons can be stated here and will be shown in the list of options the user can choose from", "type": "array", @@ -1673,10 +1712,10 @@ "type": "object", "properties": { "explanation": { - "description": "The text that will be shown to the user - translatable" + "description": "The text that will be shown to the user as option for why this point does not exist anymore.\nNote that the most common reasons (test point, does not exist anymore, cannot be found) are already offered by default\n\nquestion: For what extra reason might this feature be removed in real-life?" }, "changesetMessage": { - "description": "The text that will be uploaded into the changeset or will be used in the fixme in case of a soft deletion\nShould be a few words, in english", + "description": "The text that will be uploaded into the changeset or will be used in the fixme in case of a soft deletion\nShould be a few words, in english\n\nquestion: What should be added to the changeset as delete reason?", "type": "string" } }, @@ -1694,10 +1733,10 @@ "properties": { "if": { "$ref": "#/definitions/TagConfigJson", - "description": "The tags that will be given to the object.\nThis must remove tags so that the 'source/osmTags' won't match anymore" + "description": "The tags that will be given to the object.\nThis must remove tags so that the 'source/osmTags' won't match anymore\n\nquestion: What tags should be applied to the object?" }, "then": { - "description": "The human explanation for the options" + "description": "The human explanation for the options\n\nquestion: What text should be shown to the contributor for this reason?" } }, "required": [ @@ -1707,27 +1746,21 @@ } }, "softDeletionTags": { - "description": "In some cases, the contributor is not allowed to delete the current feature (e.g. because it isn't a point, the point is referenced by a relation or the user isn't experienced enough).\nTo still offer the user a 'delete'-option, the feature is retagged with these tags. This is a soft deletion, as the point isn't actually removed from OSM but rather marked as 'disused'\nIt is important that the feature will be retagged in such a way that it won't be picked up by the layer anymore!\n\nExample (note that \"amenity=\" erases the 'amenity'-key alltogether):\n```\n{\n \"and\": [\"disussed:amenity=public_bookcase\", \"amenity=\"]\n}\n```\n\nor (notice the use of the ':='-tag to copy the old value of 'shop=*' into 'disused:shop='):\n```\n{\n \"and\": [\"disused:shop:={shop}\", \"shop=\"]\n}\n```", + "description": "In some cases, the contributor is not allowed to delete the current feature (e.g. because it isn't a point, the point is referenced by a relation or the user isn't experienced enough).\nTo still offer the user a 'delete'-option, the feature is retagged with these tags. This is a soft deletion, as the point isn't actually removed from OSM but rather marked as 'disused'\nIt is important that the feature will be retagged in such a way that it won't be picked up by the layer anymore!\n\nExample (note that \"amenity=\" erases the 'amenity'-key alltogether):\n\n```\n{\n \"and\": [\"disussed:amenity=public_bookcase\", \"amenity=\"]\n}\n```\n\nor (notice the use of the ':='-tag to copy the old value of 'shop=*' into 'disused:shop='):\n\n```\n{\n \"and\": [\"disused:shop:={shop}\", \"shop=\"]\n}\n```\n\nquestion: If a hard delete is not possible, what tags should be applied to mark this feature as deleted?\ntype: tag", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" } ] }, - "neededChangesets": { - "description": "*\nBy default, the contributor needs 20 previous changesets to delete points edited by others.\nFor some small features (e.g. bicycle racks) this is too much and this requirement can be lowered or dropped, which can be done here.", - "type": "number" - }, "omitDefaultDeleteReasons": { - "description": "Set this flag if the default delete reasons should be omitted from the dialog.\nThis requires at least one extraDeleteReason or nonDeleteMapping", + "description": "Set this flag if the default delete reasons should be omitted from the dialog.\nThis requires at least one extraDeleteReason or nonDeleteMapping\n\nquestion: Should the default delete reasons be hidden?\niftrue: Hide the default delete reasons\niffalse: Show the default delete reasons\nifunset: Show the default delete reasons (default behaviour)", "type": "boolean" } }, @@ -1737,11 +1770,11 @@ "type": "object", "properties": { "enableImproveAccuracy": { - "description": "One default reason to move a point is to improve accuracy.\nSet to false to disable this reason", + "description": "question: Should moving this type of point to improve the accuracy be allowed?\niftrue: This point can be moved to improve the accuracy\nifunset: (default) This point can be moved to improve the accuracy\niffalse: This point cannot be moved to improve the accuracy", "type": "boolean" }, "enableRelocation": { - "description": "One default reason to move a point is because it has relocated\nSet to false to disable this reason", + "description": "question: Should moving this type of point due to a relocation be allowed?\n\nThis will erase the attributes `addr:street`, `addr:housenumber`, `addr:city` and `addr:postcode`\n\niftrue: This type of point can be moved due to a relocation (and will remove address information when this is done)\nifunset: (default) This type of point can be moved due to a relocation (and will remove address information when this is done)\niffalse: This type of point cannot be moved due to a relocation", "type": "boolean" } }, @@ -1752,7 +1785,7 @@ "type": "object", "properties": { "appliesToKey": { - "description": "Every key from this list will be normalized.\n\nTo render a united value properly, use", + "description": "Every key from this list will be normalized.\n\nTo render the value properly (with a human readable denomination), use `{canonical()}`", "type": "array", "items": { "type": "string" diff --git a/Docs/Schemas/LayerConfigJsonJSC.ts b/Docs/Schemas/LayerConfigJsonJSC.ts index 4eaf333ef..85c892e05 100644 --- a/Docs/Schemas/LayerConfigJsonJSC.ts +++ b/Docs/Schemas/LayerConfigJsonJSC.ts @@ -3,11 +3,11 @@ export default { "type": "object", "properties": { "id": { - "description": "The id of this layer.\nThis should be a simple, lowercase, human readable string that is used to identify the layer.", + "description": "question: What is the identifier of this layer?\n\nThis should be a simple, lowercase, human readable string that is used to identify the layer.\n A good ID is:\n - a noun\n - written in singular\n - describes the object\n - in english\n - only has lowercase letters, numbers or underscores. Do not use a space or a dash\n\ntype: id\ngroup: Basic", "type": "string" }, "name": { - "description": "The name of this layer\nUsed in the layer control panel and the 'Personal theme'.\n\nIf not given, will be hidden (and thus not toggable) in the layer control", + "description": "Used in the layer control panel to toggle a layer on and of.\n\nifunset: This will hide the layer in the layer control, making it not filterable and not toggleable\n\ngroup: Basic\nquestion: What is the name of this layer?", "anyOf": [ { "$ref": "#/definitions/Record" @@ -18,7 +18,7 @@ export default { ] }, "description": { - "description": "A description for this layer.\nShown in the layer selections and in the personel theme", + "description": "A description for the features shown in this layer.\nThis often resembles the introduction of the wiki.osm.org-page for this feature.\n\ngroup: Basic\nquestion: How would you describe the features that are shown on this layer?", "anyOf": [ { "$ref": "#/definitions/Record" @@ -29,17 +29,17 @@ export default { ] }, "source": { - "description": "This determines where the data for the layer is fetched: from OSM or from an external geojson dataset.\n\nIf no 'geojson' is defined, data will be fetched from overpass and the OSM-API.\n\nEvery source _must_ define which tags _must_ be present in order to be picked up.\n\nNote: a source must always be defined. 'special' is only allowed if this is a builtin-layer", + "description": "Question: Where should the data be fetched from?\ntitle: Data Source\n\nThis determines where the data for the layer is fetched: from OSM or from an external geojson dataset.\n\nIf no 'geojson' is defined, data will be fetched from overpass and the OSM-API.\n\nEvery source _must_ define which tags _must_ be present in order to be picked up.\n\nNote: a source must always be defined. 'special' is only allowed if this is a builtin-layer\n\ntypes: Load data with specific tags from OpenStreetMap ; Load data from an external geojson source ;\ntypesdefault: 0\ngroup: Basic", "anyOf": [ { "type": "object", "properties": { "osmTags": { "$ref": "#/definitions/TagConfigJson", - "description": "Every source must set which tags have to be present in order to load the given layer." + "description": "question: Which tags must be present on the feature to show it in this layer?\nEvery source must set which tags have to be present in order to load the given layer." }, "maxCacheAge": { - "description": "The maximum amount of seconds that a tile is allowed to linger in the cache", + "description": "question: How long (in seconds) is the data allowed to remain cached until it must be refreshed?\nThe maximum amount of seconds that a tile is allowed to linger in the cache\n\ntype: nat\ndefault: 30 days\ngroup: expert", "type": "number" } }, @@ -51,23 +51,23 @@ export default { "type": "object", "properties": { "geoJson": { - "description": "The actual source of the data to load, if loaded via geojson.\n\n# A single geojson-file\nsource: {geoJson: \"https://my.source.net/some-geo-data.geojson\"}\n fetches a geojson from a third party source\n\n# A tiled geojson source\nsource: {geoJson: \"https://my.source.net/some-tile-geojson-{layer}-{z}-{x}-{y}.geojson\", geoJsonZoomLevel: 14}\n to use a tiled geojson source. The web server must offer multiple geojsons. {z}, {x} and {y} are substituted by the location; {layer} is substituted with the id of the loaded layer\n\nSome API's use a BBOX instead of a tile, this can be used by specifying {y_min}, {y_max}, {x_min} and {x_max}", + "description": "The actual source of the data to load, if loaded via geojson.\n\n# A single geojson-file\nsource: {geoJson: \"https://my.source.net/some-geo-data.geojson\"}\n fetches a geojson from a third party source\n\n# A tiled geojson source\nsource: {geoJson: \"https://my.source.net/some-tile-geojson-{layer}-{z}-{x}-{y}.geojson\", geoJsonZoomLevel: 14}\n to use a tiled geojson source. The web server must offer multiple geojsons. {z}, {x} and {y} are substituted by the location; {layer} is substituted with the id of the loaded layer\n\nSome API's use a BBOX instead of a tile, this can be used by specifying {y_min}, {y_max}, {x_min} and {x_max}\n\nquestion: What is the URL of the geojson?\ntype: url", "type": "string" }, "geoJsonZoomLevel": { - "description": "To load a tiled geojson layer, set the zoomlevel of the tiles", + "description": "To load a tiled geojson layer, set the zoomlevel of the tiles\n\nquestion: If using a tiled geojson, what is the zoomlevel of the tiles?\nifunset: This is not a tiled geojson", "type": "number" }, "isOsmCache": { - "description": "Indicates that the upstream geojson data is OSM-derived.\nUseful for e.g. merging or for scripts generating this cache", + "description": "Indicates that the upstream geojson data is OSM-derived.\nUseful for e.g. merging or for scripts generating this cache.\nThis also indicates that making changes on this data is possible\n\nquestion: Is this geojson a cache of OpenStreetMap data?\nifunset: This is not an OpenStreetMap cache\niftrue: this is based on OpenStreetMap and can thus be edited\ngroup: expert", "type": "boolean" }, "mercatorCrs": { - "description": "Some API's use a mercator-projection (EPSG:900913) instead of WGS84. Set the flag `mercatorCrs: true` in the source for this", + "description": "Some API's use a mercator-projection (EPSG:900913) instead of WGS84. Set the flag `mercatorCrs: true` in the source for this\n\nquestion: Does this geojson use EPSG:900913 instead of WGS84 as projection?\niftrue: This geojson uses EPSG:900913 instead of WGS84\nifunset: This geojson uses WGS84 just like most geojson (default)", "type": "boolean" }, "idKey": { - "description": "Some API's have an id-field, but give it a different name.\nSetting this key will rename this field into 'id'", + "description": "Some API's have an id-field, but give it a different name.\nSetting this key will rename this field into 'id'\n\nifunset: An id with key `id` will be assigned automatically if no attribute `id` is set\ninline: This geojson uses {value} as attribute to set the id\nquestion: What is the name of the attribute containing the ID of the object?", "type": "string" } }, @@ -85,51 +85,44 @@ export default { ] }, "calculatedTags": { - "description": "A list of extra tags to calculate, specified as \"keyToAssignTo=javascript-expression\".\nThere are a few extra functions available. Refer to Docs/CalculatedTags.md for more information\nThe functions will be run in order, e.g.\n[\n \"_max_overlap_m2=Math.max(...feat.overlapsWith(\"someOtherLayer\").map(o => o.overlap))\n \"_max_overlap_ratio=Number(feat._max_overlap_m2)/feat.area\n]\n\nThe specified tags are evaluated lazily. E.g. if a calculated tag is only used in the popup (e.g. the number of nearby features),\nthe expensive calculation will only be performed then for that feature. This avoids clogging up the contributors PC when all features are loaded.\n\nIf a tag has to be evaluated strictly, use ':=' instead:\n\n[\n\"_some_key:=some_javascript_expression\"\n]", + "description": "A list of extra tags to calculate, specified as \"keyToAssignTo=javascript-expression\".\nThere are a few extra functions available. Refer to Docs/CalculatedTags.md for more information\nThe functions will be run in order, e.g.\n[\nNot found... * \"_max_overlap_m2=Math.max(...feat.overlapsWith(\"someOtherLayer\").map(o => o.overlap))\n \"_max_overlap_ratio=Number(feat._max_overlap_m2)/feat.area\n]\n\nThe specified tags are evaluated lazily. E.g. if a calculated tag is only used in the popup (e.g. the number of nearby features),\nthe expensive calculation will only be performed then for that feature. This avoids clogging up the contributors PC when all features are loaded.\n\nIf a tag has to be evaluated strictly, use ':=' instead:\n\n[\n\"_some_key:=some_javascript_expression\"\n]\n\nSee the full documentation on [https://github.com/pietervdvn/MapComplete/blob/master/Docs/CalculatedTags.md]\n\ngroup: expert\nquestion: What extra attributes should be calculated with javascript?", "type": "array", "items": { "type": "string" } }, - "doNotDownload": { - "description": "If set, this layer will not query overpass; but it'll still match the tags above which are by chance returned by other layers.\nWorks well together with 'passAllFeatures', to add decoration", - "type": "boolean" - }, "isShown": { - "description": "If set, only features matching this extra tag will be shown.\nThis is useful to hide certain features from view.\n\nImportant: hiding features does not work dynamically, but is only calculated when the data is first renders.\nThis implies that it is not possible to hide a feature after a tagging change\n\nThe default value is 'yes'", + "description": "If set, only features matching this extra tag will be shown.\nThis is useful to hide certain features from view based on a calculated tag or if the features are provided by a different layer.\n\nquestion: What other tags should features match for being shown?\ngroup: advanced\nifunset: all features which match the 'source'-specification are shown.", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" } ] }, - "forceLoad": { - "description": "Advanced option - might be set by the theme compiler\n\nIf true, this data will _always_ be loaded, even if the theme is disabled", - "type": "boolean" - }, "minzoom": { - "description": "The minimum needed zoomlevel required before loading of the data start\nDefault: 0", + "description": "The minimum needed zoomlevel required to start loading and displaying the data.\nThis can be used to only show common features (e.g. a bicycle parking) only when the map is zoomed in very much (17).\nThis prevents cluttering the map with thousands of parkings if one is looking to an entire city.\n\nDefault: 0\ngroup: Basic\ntype: nat\nquestion: At what zoom level should features of the layer be shown?\nifunset: Always load this layer, even if the entire world is in view.", "type": "number" }, "shownByDefault": { - "description": "Indicates if this layer is shown by default;\ncan be used to hide a layer from start, or to load the layer but only to show it where appropriate (e.g. for snapping to it)", + "description": "Indicates if this layer is shown by default;\ncan be used to hide a layer from start, or to load the layer but only to show it when appropriate (e.g. for advanced users)\n\nquestion: Should this layer be enabled when opening the map for the first time?\niftrue: the layer is enabled when opening the map\niffalse: the layer is hidden until the contributor enables it. (If the filter-popup is disabled, this might never get enabled nor loaded)\ndefault: true\ngroup: advanced", "type": "boolean" }, "minzoomVisible": { - "description": "The zoom level at which point the data is hidden again\nDefault: 100 (thus: always visible", + "description": "The zoom level at which point the data is hidden again\nDefault: 100 (thus: always visible\n\ngroup: expert", "type": "number" }, "title": { - "description": "The title shown in a popup for elements of this layer.", + "description": "question: What title should be shown on the infobox?\nThe title shown in a popup for elements of this layer.\n\ngroup: title\ntypes: use a fixed translation ; Use a dynamic tagRendering ; hidden\ntypesdefault: 1\ntype: translation\ninline: {translated{value}}", "anyOf": [ + { + "$ref": "#/definitions/Record" + }, { "$ref": "#/definitions/TagRenderingConfigJson" }, @@ -138,8 +131,12 @@ export default { } ] }, + "popupInFloatover": { + "description": "Question: Should the information for this layer be shown in the sidebar or in a splash screen?\n\nIf set, open the selectedElementView in a floatOver instead of on the right.\n\niftrue: show the infobox in the splashscreen floating over the entire UI\niffalse: show the infobox in a sidebar on the right\ngroup: advanced\ndefault: sidebar", + "type": "boolean" + }, "titleIcons": { - "description": "Small icons shown next to the title.\nIf not specified, the OsmLink and wikipedia links will be used by default.\nUse an empty array to hide them.\nNote that \"defaults\" will insert all the default titleIcons (which are added automatically)\n\nType: icon[]", + "description": "Small icons shown next to the title.\nIf not specified, the OsmLink and wikipedia links will be used by default.\nUse an empty array to hide them.\nNote that \"defaults\" will insert all the default titleIcons (which are added automatically)\n\nType: icon[]\ngroup: infobox", "anyOf": [ { "type": "array", @@ -169,42 +166,40 @@ export default { } ] }, - "mapRendering": { - "description": "Visualisation of the items on the map", - "anyOf": [ - { - "type": "array", - "items": { - "anyOf": [ - { - "$ref": "#/definitions/default_4" - }, - { - "$ref": "#/definitions/default_5" - }, - { - "$ref": "#/definitions/default" - } - ] - } - }, - { - "type": "null" - } - ] + "pointRendering": { + "description": "Creates points to render on the map.\nThis can render points for point-objects, lineobjects or areaobjects; use 'location' to indicate where it should be rendered\ngroup: pointrendering", + "type": "array", + "items": { + "$ref": "#/definitions/default_4" + } + }, + "lineRendering": { + "description": "Creates lines and areas to render on the map\ngroup: linerendering", + "type": "array", + "items": { + "$ref": "#/definitions/default_5" + } }, "passAllFeatures": { - "description": "If set, this layer will pass all the features it receives onto the next layer.\nThis is ideal for decoration, e.g. directionss on cameras", + "description": "If set, this layer will pass all the features it receives onto the next layer.\nThis is ideal for decoration, e.g. directions on cameras\niftrue: Make the features from this layer also available to the other layer; might result in this object being rendered by multiple layers\niffalse: normal behaviour: don't pass features allong\nquestion: should this layer pass features to the next layers?\ngroup: expert", + "type": "boolean" + }, + "doNotDownload": { + "description": "If set, this layer will not query overpass; but it'll still match the tags above which are by chance returned by other layers.\nWorks well together with 'passAllFeatures', to add decoration\nThe opposite of `forceLoad`\n\niftrue: Do not attempt to query the data for this layer from overpass/the OSM API\niffalse: download the data as usual\ngroup: expert\nquestion: Should this layer be downloaded or is the data provided by a different layer (which has 'passAllFeatures'-set)?\ndefault: false", + "type": "boolean" + }, + "forceLoad": { + "description": "Advanced option - might be set by the theme compiler\n\nIf true, this data will _always_ be loaded, even if the theme is disabled by a filter or hidden.\nThe opposite of `doNotDownload`\n\nquestion: Should this layer be forcibly loaded?\nifftrue: always download this layer, even if it is disabled\niffalse: only download data for this layer when needed (default)\ndefault: false\ngroup: expert", "type": "boolean" }, "presets": { - "description": "Presets for this layer.\nA preset shows up when clicking the map on a without data (or when right-clicking/long-pressing);\nit will prompt the user to add a new point.\n\nThe most important aspect are the tags, which define which tags the new point will have;\nThe title is shown in the dialog, along with the first sentence of the description.\n\nUpon confirmation, the full description is shown beneath the buttons - perfect to add pictures and examples.\n\nNote: the icon of the preset is determined automatically based on the tags and the icon above. Don't worry about that!\nNB: if no presets are defined, the popup to add new points doesn't show up at all", + "description": "Presets for this layer.\nA preset shows up when clicking the map on a without data (or when right-clicking/long-pressing);\nit will prompt the user to add a new point.\n\nThe most important aspect are the tags, which define which tags the new point will have;\nThe title is shown in the dialog, along with the first sentence of the description.\n\nUpon confirmation, the full description is shown beneath the buttons - perfect to add pictures and examples.\n\nNote: the icon of the preset is determined automatically based on the tags and the icon above. Don't worry about that!\nNB: if no presets are defined, the popup to add new points doesn't show up at all\n\ngroup: presets", "type": "array", "items": { "type": "object", "properties": { "title": { - "description": "The title - shown on the 'add-new'-button.\n\nThis should include the article of the noun, e.g. 'a hydrant', 'a bicycle pump'.\nThis text will be inserted into `Add {category} here`, becoming `Add a hydrant here`.\n\nDo _not_ indicate 'new': 'add a new shop here' is incorrect, as the shop might have existed forever, it could just be unmapped!", + "description": "The title - shown on the 'add-new'-button.\n\nThis should include the article of the noun, e.g. 'a hydrant', 'a bicycle pump'.\nThis text will be inserted into `Add {category} here`, becoming `Add a hydrant here`.\n\nDo _not_ indicate 'new': 'add a new shop here' is incorrect, as the shop might have existed forever, it could just be unmapped!\n\nquestion: What is the word to describe this object?\ninline: Add {translated(value)::font-bold} here", "anyOf": [ { "$ref": "#/definitions/Record" @@ -215,14 +210,14 @@ export default { ] }, "tags": { - "description": "The tags to add. It determines the icon too", + "description": "A single tag (encoded as key=value) out of all the tags to add onto the newly created point.\nNote that the icon in the UI will be chosen automatically based on the tags provided here.\n\nquestion: What tag should be added to the new object?\ntype: simple_tag\ntypeHelper: uploadableOnly", "type": "array", "items": { "type": "string" } }, "description": { - "description": "The _first sentence_ of the description is shown on the button of the `add` menu.\nThe full description is shown in the confirmation dialog.\n\n(The first sentence is until the first '.'-character in the description)", + "description": "An extra explanation of what the feature is, if it is not immediately clear from the title alone.\n\nThe _first sentence_ of the description is shown on the button of the `add` menu.\nThe full description is shown in the confirmation dialog.\n\n(The first sentence is until the first '.'-character in the description)\n\nquestion: How would you describe this feature?\nifunset: No extra description is given. This can be used to further explain the preset", "anyOf": [ { "$ref": "#/definitions/Record" @@ -233,59 +228,22 @@ export default { ] }, "exampleImages": { - "description": "Example images, which show real-life pictures of what such a feature might look like\n\nType: image", + "description": "The URL of an example image which shows a real-life example of what such a feature might look like.\n\nType: image\nquestion: What is the URL of an image showing such a feature?", "type": "array", "items": { "type": "string" } }, - "preciseInput": { - "description": "If set, the user will prompted to confirm the location before actually adding the data.\nThis will be with a 'drag crosshair'-method.\n\nIf 'preferredBackgroundCategory' is set, the element will attempt to pick a background layer of that category.", - "anyOf": [ - { - "type": "object", - "properties": { - "preferredBackground": { - "description": "The type of background picture", - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "string" - } - ] - }, - "snapToLayer": { - "description": "If specified, these layers will be shown to and the new point will be snapped towards it", - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "string" - } - ] - }, - "maxSnapDistance": { - "description": "If specified, a new point will only be snapped if it is within this range.\nDistance in meter\n\nDefault: 10", - "type": "number" - } - } - }, - { - "enum": [ - true - ], - "type": "boolean" - } - ] + "snapToLayer": { + "description": "question: Should the created point be snapped to a line layer?\n\nIf specified, these layers will be shown in the precise location picker and the new point will be snapped towards it.\nFor example, this can be used to snap against `walls_and_buildings` (e.g. to attach a defibrillator, an entrance, an artwork, ... to the wall)\nor to snap an obstacle (such as a bollard) to the `cycleways_and_roads`.\n\nsuggestions: return Array.from(layers.keys()).map(key => ({if: \"value=\"+key, then: key+\" - \"+layers.get(key).description}))", + "type": "array", + "items": { + "type": "string" + } + }, + "maxSnapDistance": { + "description": "question: What is the maximum distance in the location-input that a point can be moved to be snapped to a way?\n\ninline: a point is snapped if the location input is at most {value}m away from an object\n\nIf specified, a new point will only be snapped if it is within this range.\nIf further away, it'll be placed in the center of the location input\nDistance in meter\n\nifunset: Do not snap to a layer", + "type": "number" } }, "required": [ @@ -295,7 +253,7 @@ export default { } }, "tagRenderings": { - "description": "All the tag renderings.\nA tag rendering is a block that either shows the known value or asks a question.\n\nRefer to the class `TagRenderingConfigJson` to see the possibilities.\n\nNote that we can also use a string here - where the string refers to a tag rendering defined in `assets/questions/questions.json`,\nwhere a few very general questions are defined e.g. website, phone number, ...\nFurthermore, _all_ the questions of another layer can be reused with `otherlayer.*`\nIf you need only a single of the tagRenderings, use `otherlayer.tagrenderingId`\nIf one or more questions have a 'group' or 'label' set, select all the entries with the corresponding group or label with `otherlayer.*group`\nRemark: if a tagRendering is 'lent' from another layer, the 'source'-tags are copied and added as condition.\nIf they are not wanted, remove them with an override\n\nA special value is 'questions', which indicates the location of the questions box. If not specified, it'll be appended to the bottom of the featureInfobox.\n\nAt last, one can define a group of renderings where parts of all strings will be replaced by multiple other strings.\nThis is mainly create questions for a 'left' and a 'right' side of the road.\nThese will be grouped and questions will be asked together", + "description": "question: Edit this tagRendering\n\nA tag rendering is a block that either shows the known value or asks a question.\n\nRefer to the class `TagRenderingConfigJson` to see the possibilities.\n\nNote that we can also use a string here - where the string refers to a tag rendering defined in `assets/questions/questions.json`,\nwhere a few very general questions are defined e.g. website, phone number, ...\nFurthermore, _all_ the questions of another layer can be reused with `otherlayer.*`\nIf you need only a single of the tagRenderings, use `otherlayer.tagrenderingId`\nIf one or more questions have a 'group' or 'label' set, select all the entries with the corresponding group or label with `otherlayer.*group`\nRemark: if a tagRendering is 'lent' from another layer, the 'source'-tags are copied and added as condition.\nIf they are not wanted, remove them with an override\n\nA special value is 'questions', which indicates the location of the questions box. If not specified, it'll be appended to the bottom of the featureInfobox.\n\nAt last, one can define a group of renderings where parts of all strings will be replaced by multiple other strings.\nThis is mainly create questions for a 'left' and a 'right' side of the road.\nThese will be grouped and questions will be asked together\n\ntype: tagrendering[]\ngroup: tagrenderings", "type": "array", "items": { "anyOf": [ @@ -355,7 +313,7 @@ export default { } }, "filter": { - "description": "All the extra questions for filtering.\nIf a string is given, mapComplete will search in 'filters.json' for the appropriate filter or will try to parse it as `layername.filterid` and us that one", + "description": "All the extra questions for filtering.\nIf a string is given, mapComplete will search in 'filters.json' for the appropriate filter or will try to parse it as `layername.filterid` and us that one\n\ngroup: filters", "anyOf": [ { "type": "array", @@ -384,7 +342,7 @@ export default { ] }, "deletion": { - "description": "This block defines under what circumstances the delete dialog is shown for objects of this layer.\nIf set, a dialog is shown to the user to (soft) delete the point.\nThe dialog is built to be user friendly and to prevent mistakes.\nIf deletion is not possible, the dialog will hide itself and show the reason of non-deletability instead.\n\nTo configure, the following values are possible:\n\n- false: never ever show the delete button\n- true: show the default delete button\n- undefined: use the mapcomplete default to show deletion or not. Currently, this is the same as 'false' but this will change in the future\n- or: a hash with options (see below)\n\n The delete dialog\n =================\n\n\n\n#### Hard deletion if enough experience\n\nA feature can only be deleted from OpenStreetMap by mapcomplete if:\n\n- It is a node\n- No ways or relations use the node\n- The logged-in user has enough experience OR the user is the only one to have edited the point previously\n- The logged-in user has no unread messages (or has a ton of experience)\n- The user did not select one of the 'non-delete-options' (see below)\n\nIn all other cases, a 'soft deletion' is used.\n\n#### Soft deletion\n\nA 'soft deletion' is when the point isn't deleted from OSM but retagged so that it'll won't how up in the mapcomplete theme anymore.\nThis makes it look like it was deleted, without doing damage. A fixme will be added to the point.\n\nNote that a soft deletion is _only_ possible if these tags are provided by the theme creator, as they'll be different for every theme\n\n#### No-delete options\n\nIn some cases, the contributor might want to delete something for the wrong reason (e.g. someone who wants to have a path removed \"because the path is on their private property\").\nHowever, the path exists in reality and should thus be on OSM - otherwise the next contributor will pass by and notice \"hey, there is a path missing here! Let me redraw it in OSM!)\n\nThe correct approach is to retag the feature in such a way that it is semantically correct *and* that it doesn't show up on the theme anymore.\nA no-delete option is offered as 'reason to delete it', but secretly retags.", + "description": "This block defines under what circumstances the delete dialog is shown for objects of this layer.\nIf set, a dialog is shown to the user to (soft) delete the point.\nThe dialog is built to be user friendly and to prevent mistakes.\nIf deletion is not possible, the dialog will hide itself and show the reason of non-deletability instead.\n\nTo configure, the following values are possible:\n\n- false: never ever show the delete button\n- true: show the default delete button\n- undefined: use the mapcomplete default to show deletion or not. Currently, this is the same as 'false' but this will change in the future\n- or: a hash with options (see below)\n\n### The delete dialog\n\n\n\n#### Hard deletion if enough experience\n\nA feature can only be deleted from OpenStreetMap by mapcomplete if:\n\n- It is a node\n- No ways or relations use the node\n- The logged-in user has enough experience OR the user is the only one to have edited the point previously\n- The logged-in user has no unread messages (or has a ton of experience)\n- The user did not select one of the 'non-delete-options' (see below)\n\nIn all other cases, a 'soft deletion' is used.\n\n#### Soft deletion\n\nA 'soft deletion' is when the point isn't deleted fromOSM but retagged so that it'll won't how up in the mapcomplete theme anymore.\nThis makes it look like it was deleted, without doing damage. A fixme will be added to the point.\n\nNote that a soft deletion is _only_ possible if these tags are provided by the theme creator, as they'll be different for every theme\n\n##### No-delete options\n\nIn some cases, the contributor might want to delete something for the wrong reason (e.g. someone who wants to have a path removed \"because the path is on their private property\").\nHowever, the path exists in reality and should thus be on OSM - otherwise the next contributor will pass by and notice \"hey, there is a path missing here! Let me redraw it in OSM!)\n\nThe correct approach is to retag the feature in such a way that it is semantically correct *and* that it doesn't show up on the theme anymore.\nA no-delete option is offered as 'reason to delete it', but secretly retags.\n\ngroup: editing\ntypes: Use an advanced delete configuration ; boolean\niftrue: Allow deletion\niffalse: Do not allow deletion\nifunset: Do not allow deletion", "anyOf": [ { "$ref": "#/definitions/DeleteConfigJson" @@ -395,7 +353,7 @@ export default { ] }, "allowMove": { - "description": "Indicates if a point can be moved and configures the modalities.\n\nA feature can be moved by MapComplete if:\n\n- It is a point\n- The point is _not_ part of a way or a a relation.\n\nOff by default. Can be enabled by setting this flag or by configuring.", + "description": "Indicates if a point can be moved and why.\n\nA feature can be moved by MapComplete if:\n\n- It is a point\n- The point is _not_ part of a way or a a relation.\n\ntypes: use an advanced move configuration ; boolean\ngroup: editing\nquestion: Is deleting a point allowed?\niftrue: Allow contributors to move a point (for accuracy or a relocation)\niffalse: Don't allow contributors to move points\nifunset: Don't allow contributors to move points (default)", "anyOf": [ { "$ref": "#/definitions/default_3" @@ -406,7 +364,7 @@ export default { ] }, "allowSplit": { - "description": "If set, a 'split this way' button is shown on objects rendered as LineStrings, e.g. highways.\n\nIf the way is part of a relation, MapComplete will attempt to update this relation as well", + "description": "If set, a 'split this way' button is shown on objects rendered as LineStrings, e.g. highways.\n\nIf the way is part of a relation, MapComplete will attempt to update this relation as well\nquestion: Should the contributor be able to split ways using this layer?\niftrue: enable the 'split-roads'-component\niffalse: don't enable the split-roads componenet\nifunset: don't enable the split-roads component\ngroup: editing", "type": "boolean" }, "units": { @@ -416,7 +374,7 @@ export default { } }, "syncSelection": { - "description": "If set, synchronizes whether or not this layer is enabled.\n\nno: Do not sync at all, always revert to default\nlocal: keep selection on local storage\ntheme-only: sync via OSM, but this layer will only be toggled in this theme\nglobal: all layers with this ID will be synced accross all themes", + "description": "If set, synchronizes whether or not this layer is enabled.\n\ngroup: advanced\nquestion: Should enabling/disabling the layer be saved (locally or in the cloud)?\nsuggestions: return [{if: \"value=no\", then: \"Don't save, always revert to the default\"}, {if: \"value=local\", then: \"Save selection in local storage\"}, {if: \"value=theme-only\", then: \"Save the state in the OSM-usersettings, but apply on this theme only (default)\"}, {if: \"value=global\", then: \"Save in OSM-usersettings and toggle on _all_ themes using this layer\"}]", "enum": [ "global", "local", @@ -426,24 +384,27 @@ export default { "type": "string" }, "#": { - "description": "Used for comments and/or to disable some checks\n\nno-question-hint-check: disables a check in MiscTagRenderingChecks which complains about 'div', 'span' or 'class=subtle'-HTML elements in the tagRendering", + "description": "Used for comments and/or to disable some checks\n\nno-question-hint-check: disables a check in MiscTagRenderingChecks which complains about 'div', 'span' or 'class=subtle'-HTML elements in the tagRendering\n\ngroup: hidden", "type": "string" + }, + "fullNodeDatabase": { + "description": "_Set automatically by MapComplete, please ignore_\n\ngroup: hidden", + "type": "boolean" } }, "required": [ "id", - "mapRendering", + "pointRendering", "source" ], "definitions": { "TagConfigJson": { - "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation", + "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation\n\ntype: tag", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", "type": "object", "properties": { "or": { @@ -462,8 +423,7 @@ export default { } ] }, - "AndTagConfigJson": { - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", + "{and:TagConfigJson[];}": { "type": "object", "properties": { "and": { @@ -477,8 +437,7 @@ export default { "and" ] }, - "OrTagConfigJson": { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", + "{or:TagConfigJson[];}": { "type": "object", "properties": { "or": { @@ -561,48 +520,99 @@ export default { "canonicalDenomination" ] }, + "MinimalTagRenderingConfigJson": { + "description": "Mostly used for lineRendering and pointRendering", + "type": "object", + "properties": { + "render": { + "description": "question: What value should be rendered?\n\nThis piece of text will be shown in the infobox.\nNote that \"&LBRACEkey&RBRACE\"-parts are substituted by the corresponding values of the element.\n\nThis value will be used if there is no mapping which matches (or there are no matches)\nNote that this is a HTML-interpreted value, so you can add links as e.g. '<a href='{website}'>{website}</a>' or include images such as `This is of type A <br><img src='typeA-icon.svg' />`", + "type": "string" + }, + "mappings": { + "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", + "type": "array", + "items": { + "type": "object", + "properties": { + "if": { + "$ref": "#/definitions/TagConfigJson", + "description": "question: When should this single mapping match?\n\nIf this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}" + }, + "then": { + "description": "question: What text should be shown?\n\nIf the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option", + "type": "string" + } + }, + "required": [ + "if", + "then" + ] + } + } + } + }, + "IconConfigJson": { + "type": "object", + "properties": { + "icon": { + "description": "question: What icon should be used?\ntype: icon\nsuggestions: return [\"pin\",\"square\",\"circle\",\"checkmark\",\"clock\",\"close\",\"crosshair\",\"help\",\"home\",\"invalid\",\"location\",\"location_empty\",\"location_locked\",\"note\",\"resolved\",\"ring\",\"scissors\",\"teardrop\",\"teardrop_with_hole_green\",\"triangle\"].map(i => ({if: \"value=\"+i, then: i, icon: i}))", + "anyOf": [ + { + "$ref": "#/definitions/MinimalTagRenderingConfigJson" + }, + { + "type": "object", + "properties": { + "builtin": { + "type": "string" + }, + "override": {} + }, + "required": [ + "builtin", + "override" + ] + }, + { + "type": "string" + } + ] + }, + "color": { + "description": "question: What colour should the icon be?\nThis will only work for the default icons such as `pin`,`circle`,...\ntype: color", + "anyOf": [ + { + "$ref": "#/definitions/MinimalTagRenderingConfigJson" + }, + { + "type": "object", + "properties": { + "builtin": { + "type": "string" + }, + "override": {} + }, + "required": [ + "builtin", + "override" + ] + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "icon" + ] + }, "TagRenderingConfigJson": { "description": "A TagRenderingConfigJson is a single piece of code which converts one ore more tags into a HTML-snippet.\nFor an _editable_ tagRendering, use 'QuestionableTagRenderingConfigJson' instead, which extends this one", "type": "object", "properties": { - "id": { - "description": "The id of the tagrendering, should be an unique string.\nUsed to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise.\n\nUse 'questions' to trigger the question box of this group (if a group is defined)", - "type": "string" - }, - "labels": { - "description": "A list of labels. These are strings that are used for various purposes, e.g. to filter them away", - "type": "array", - "items": { - "type": "string" - } - }, - "classes": { - "description": "A list of css-classes to apply to the entire tagRendering if the answer is known (not applied on the question).\nThis is only for advanced users", - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "string" - } - ] - }, - "description": { - "description": "A human-readable text explaining what this tagRendering does", - "anyOf": [ - { - "$ref": "#/definitions/Record" - }, - { - "type": "string" - } - ] - }, "render": { - "description": "Renders this value. Note that \"{key}\"-parts are substituted by the corresponding values of the element.\nIf neither 'textFieldQuestion' nor 'mappings' are defined, this text is simply shown as default value.\n\nNote 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
`\ntype: rendered", + "description": "question: What text should be rendered?\n\nThis piece of text will be shown in the infobox.\nIn this text, values within braces (such as {braced(key)}) are replaced by the corresponding `value` in the object.\nFor example, if the object contains tags `amenity=school; name=Windy Hill School`, the render string `This school is named {name}` will be shown to the user as `This school is named Windy Hill School`\n\nThis text will be shown if:\n- there is no mapping which matches (or there are no matches)\n- no question, no mappings and no 'freeform' is set\n\nNote that this is a HTML-interpreted value, so you can add links as e.g. '<a href='{website}'>{website}</a>' or include images such as `This is of type A <br><img src='typeA-icon.svg' />`\ntype: rendered\nifunset: no text is rendered if no predefined options match", "anyOf": [ { "$ref": "#/definitions/Record" @@ -638,16 +648,38 @@ export default { } ] }, - "condition": { - "description": "Only show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", + "icon": { + "description": "question: what icon should be shown next to the 'render' value?\nAn icon shown next to the rendering; typically shown pretty small\nThis is only shown next to the \"render\" value\nType: icon\nifunset: do not show an icon next to the \"render\"-value", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "type": "object", + "properties": { + "path": { + "description": "The path to the icon\nType: icon", + "type": "string" + }, + "class": { + "description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-', so defining your own in combination with a custom CSS is possible (but discouraged)", + "type": "string" + } + }, + "required": [ + "path" + ] }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "type": "string" + } + ] + }, + "condition": { + "description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or ask the question if unkown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", + "anyOf": [ + { + "$ref": "#/definitions/{and:TagConfigJson[];}" + }, + { + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -655,15 +687,13 @@ export default { ] }, "metacondition": { - "description": "If set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", + "description": "question: When should this item be shown (including special conditions)?\ntype: tag\n\nIf set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -671,17 +701,14 @@ export default { ] }, "freeform": { - "description": "Allow freeform text input from the user", + "description": "question: Should a freeform text field be shown?\nAllow freeform text input from the user\nifunset: Do not add a freeform text field", "type": "object", "properties": { "key": { - "description": "If this key is present, then 'render' is used to display the value.\nIf this is undefined, the rendering is _always_ shown", + "description": "What attribute should be filled out\nIf this key is present in the feature, then 'render' is used to display the value.\nIf this is undefined, the rendering is _always_ shown", "type": "string" } - }, - "required": [ - "key" - ] + } }, "mappings": { "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", @@ -691,10 +718,10 @@ export default { "properties": { "if": { "$ref": "#/definitions/TagConfigJson", - "description": "If this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}" + "description": "question: When should this single mapping match?\n\nIf this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}" }, "then": { - "description": "If the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option\nType: rendered", + "description": "question: What text should be shown?\n\nIf the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option\nType: rendered", "anyOf": [ { "$ref": "#/definitions/Record" @@ -705,7 +732,7 @@ export default { ] }, "icon": { - "description": "An icon supporting this mapping; typically shown pretty small\nType: icon", + "description": "question: What icon should be added to this mapping?\nifunset: Do not show an extra icon next to the render value\n\nAn icon supporting this mapping; typically shown pretty small.\nThis can be used to show a 'phone'-icon next to the phone number\ninline: {icon}\nType: icon", "anyOf": [ { "type": "object", @@ -734,6 +761,21 @@ export default { "then" ] } + }, + "description": { + "description": "A human-readable text explaining what this tagRendering does.\nMostly used for the shared tagrenderings", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] + }, + "classes": { + "description": "question: What css-classes should be applied to showing this attribute?\n\nA list of css-classes to apply to the entire tagRendering.\nThese classes are applied in 'answer'-mode, not in question mode\nThis is only for advanced users.\n\nValues are split on ` ` (space)", + "type": "string" } } }, @@ -745,13 +787,21 @@ export default { "properties": { "if": { "$ref": "#/definitions/TagConfigJson", - "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation" + "description": "question: What tags should be matched to show this option?\n\nIf in 'question'-mode and the contributor selects this option, these tags will be applied to the object" }, "then": { - "description": "Shown if the 'if is fulfilled\nType: rendered" + "description": "Question: What corresponding text should be shown?\nShown if the `if` is fulfilled\nType: rendered", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] }, "icon": { - "description": "An extra icon supporting the choice\nType: icon", + "description": "question: What icon should be shown next to this mapping?\n\nThis icon will only be shown if the value is known, it is not displayed in the options (but might be in the future)\n\nifunset: Show no icon\nType: icon", "anyOf": [ { "type": "object", @@ -775,15 +825,13 @@ export default { ] }, "hideInAnswer": { - "description": "In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n\n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}", + "description": "question: Under what circumstances should this mapping be hidden from the possibilities a contributor can pick?\niftrue: Never show this mapping as option to pick\nifunset: Always show this mapping as option to pick\ntype: tag\n\nIn some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n\n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": [ @@ -794,15 +842,13 @@ export default { ] }, "ifnot": { - "description": "Only applicable if 'multiAnswer' is set.\nThis is for situations such as:\n`accepts:coins=no` where one can select all the possible payment methods. However, we want to make explicit that some options _were not_ selected.\nThis can be done with `ifnot`\nNote that we can not explicitly render this negative case to the user, we cannot show `does _not_ accept coins`.\nIf this is important to your usecase, consider using multiple radiobutton-fields without `multiAnswer`", + "description": "question: What tags should be applied if this mapping is _not_ chosen?\n\nOnly applicable if 'multiAnswer' is set.\nThis is for situations such as:\n`accepts:coins=no` where one can select all the possible payment methods. However, we want to make explicit that some options _were not_ selected.\nThis can be done with `ifnot`\nNote that we can not explicitly render this negative case to the user, we cannot show `does _not_ accept coins`.\nIf this is important to your usecase, consider using multiple radiobutton-fields without `multiAnswer`\n\nifunset: Do not apply a tag if a different mapping is chosen.", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -810,26 +856,24 @@ export default { ] }, "addExtraTags": { - "description": "If chosen as answer, these tags will be applied as well onto the object.\nNot compatible with multiAnswer.\n\nThis can be used e.g. to erase other keys which indicate the 'not' value:\n```json\n{\n \"if\": \"crossing:marking=rainbow\",\n \"then\": \"This is a rainbow crossing\",\n \"addExtraTags\": \"not:crossing:marking=\"\n}\n```", + "description": "question: What extra tags should be added to the object if this object is chosen?\ntype: simple_tag\n\nIf chosen as answer, these tags will be applied onto the object, together with the tags from the `if`\nNot compatible with multiAnswer.\n\nThis can be used e.g. to erase other keys which indicate the 'not' value:\n```json\n{\n \"if\": \"crossing:marking=rainbow\",\n \"then\": \"This is a rainbow crossing\",\n \"addExtraTags\": [\"not:crossing:marking=\"]\n}\n```", "type": "array", "items": { "type": "string" } }, "searchTerms": { - "description": "If there are many options, the mappings-radiobuttons will be replaced by an element with a searchfunction\n\nSearchterms (per language) allow to easily find an option if there are many options", + "description": "question: If there are many options, what search terms match too?\nIf there are many options, the mappings-radiobuttons will be replaced by an element with a searchfunction\n\nSearchterms (per language) allow to easily find an option if there are many options\ngroup: hidden", "$ref": "#/definitions/Record" }, "priorityIf": { - "description": "If the searchable selector is picked, mappings with this item will have priority and show up even if the others are hidden\nUse this sparingly", + "description": "If the searchable selector is picked, mappings with this item will have priority and show up even if the others are hidden\nUse this sparingly\ngroup: hidden", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -837,7 +881,7 @@ export default { ] }, "#": { - "description": "Used for comments or to disable a validation\n\nignore-image-in-then: normally, a `then`-clause is not allowed to have an `img`-html-element as icons are preferred. In some cases (most notably title-icons), this is allowed", + "description": "Used for comments or to disable a validation\n\ngroup: hidden\nignore-image-in-then: normally, a `then`-clause is not allowed to have an `img`-html-element as icons are preferred. In some cases (most notably title-icons), this is allowed", "type": "string" } }, @@ -854,38 +898,34 @@ export default { "type": "object", "properties": { "location": { - "description": "All the locations that this point should be rendered at.\nPossible values are:\n- `point`: only renders points at their location\n- `centroid`: show a symbol at the centerpoint of a (multi)Linestring and (multi)polygon. Points will _not_ be rendered with this\n- `projected_centerpoint`: Only on (multi)linestrings: calculate the centerpoint and snap it to the way\n- `start` and `end`: only on linestrings: add a point to the first/last coordinate of the LineString", + "description": "question: At what location should this icon be shown?\nmultianswer: true\nsuggestions: return [{if: \"value=point\",then: \"Show an icon for point (node) objects\"},{if: \"value=centroid\",then: \"Show an icon for line or polygon (way) objects at their centroid location\"}, {if: \"value=start\",then: \"Show an icon for line (way) objects at the start\"},{if: \"value=end\",then: \"Show an icon for line (way) object at the end\"},{if: \"value=projected_centerpoint\",then: \"Show an icon for line (way) object near the centroid location, but moved onto the line\"}]", "type": "array", "items": { "type": "string" } }, - "icon": { - "description": "The icon for an element.\nNote that this also doubles as the icon for this layer (rendered with the overpass-tags) ánd the icon in the presets.\n\nThe result of the icon is rendered as follows:\nthe resulting string is interpreted as a _list_ of items, separated by \";\". The bottommost layer is the first layer.\nAs a result, on could use a generic pin, then overlay it with a specific icon.\nTo make things even more practical, one can use all SVG's from the folder \"assets/svg\" and _substitute the color_ in it.\nE.g. to draw a red pin, use \"pin:#f00\", to have a green circle with your icon on top, use `circle:#0f0;`\n\nType: icon", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] + "marker": { + "description": "The marker for an element.\nNote that this also defines the icon for this layer (rendered with the overpass-tags) and the icon in the presets.\n\nThe result of the icon is rendered as follows:\n- The first icon is rendered on the map\n- The second entry is overlayed on top of it\n- ...\n\nAs a result, on could use a generic icon (`pin`, `circle`, `square`) with a color, then overlay it with a specific icon.", + "type": "array", + "items": { + "$ref": "#/definitions/IconConfigJson" + } }, "iconBadges": { - "description": "A list of extra badges to show next to the icon as small badge\nThey will be added as a 25% height icon at the bottom right of the icon, with all the badges in a flex layout.\n\nNote: strings are interpreted as icons, so layering and substituting is supported. You can use `circle:white;./my_icon.svg` to add a background circle", + "description": "A list of extra badges to show next to the icon as small badge\nThey will be added as a 25% height icon at the bottom right of the icon, with all the badges in a flex layout.\n\nNote: strings are interpreted as icons, so layering and substituting is supported. You can use `circle:white;./my_icon.svg` to add a background circle\ngroup: hidden", "type": "array", "items": { "type": "object", "properties": { "if": { "$ref": "#/definitions/TagConfigJson", - "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation" + "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation\n\ntype: tag" }, "then": { "description": "Badge to show\nType: icon", "anyOf": [ { - "$ref": "#/definitions/TagRenderingConfigJson" + "$ref": "#/definitions/MinimalTagRenderingConfigJson" }, { "type": "string" @@ -900,7 +940,18 @@ export default { } }, "iconSize": { - "description": "A string containing \"width,height\" or \"width,height,anchorpoint\" where anchorpoint is any of 'center', 'top', 'bottom', 'left', 'right', 'bottomleft','topright', ...\nDefault is '40,40,center'", + "description": "question: What size should the marker be on the map?\nA string containing \",\" in pixels\nifunset: Use the default size (40,40 px)", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "anchor": { + "description": "question: What is the anchorpoint of the icon?\n\nThis matches the geographical point with a location on the icon.\n\nifunset: Use MapComplete-default (center)\nsuggestions: return [{if: \"value=center\", then: \"Place the center of the icon on the geographical location\"},{if: \"value=top\", then: \"Place the top of the icon on the geographical location\"},{if: \"value=bottom\", then: \"Place the bottom of the icon on the geographical location\"},{if: \"value=left\", then: \"Place the left of the icon on the geographical location\"},{if: \"value=right\", then: \"Place the right of the icon on the geographical location\"}]", "anyOf": [ { "$ref": "#/definitions/TagRenderingConfigJson" @@ -911,7 +962,7 @@ export default { ] }, "rotation": { - "description": "The rotation of an icon, useful for e.g. directions.\nUsage: 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)``", + "description": "question: What rotation should be applied on the icon?\nThis is mostly useful for items that face a specific direction, such as surveillance cameras\nThis is interpreted as css property for 'rotate', thus has to end with 'deg', e.g. `90deg`, `{direction}deg`, `calc(90deg - {camera:direction}deg)``\nifunset: Do not rotate", "anyOf": [ { "$ref": "#/definitions/TagRenderingConfigJson" @@ -922,29 +973,7 @@ export default { ] }, "label": { - "description": "A HTML-fragment that is shown below the icon, for example:\n
{name}
\n\nIf the icon is undefined, then the label is shown in the center of the feature.\nNote that, if the wayhandling hides the icon then no label is shown as well.", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - }, - "css": { - "description": "A snippet of css code which is applied onto the container of the entire marker", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - }, - "cssClasses": { - "description": "A snippet of css-classes which are applied onto the container of the entire marker. They can be space-separated", + "description": "question: What label should be shown beneath the marker?\nFor example: `<div style=\"background: white\">{name}</div>`\n\nIf the icon is undefined, then the label is shown in the center of the feature.\ntypes: Dynamic value based on the attributes ; string\ninline: Always show label {value} beneath the marker\nifunset: Do not show a label beneath the marker", "anyOf": [ { "$ref": "#/definitions/TagRenderingConfigJson" @@ -955,7 +984,7 @@ export default { ] }, "labelCss": { - "description": "Css that is applied onto the label", + "description": "question: What CSS should be applied to the label?\nYou can set the css-properties here, e.g. `background: red; font-size: 12px; `\ninline: Apply CSS-style {value} to the label\ntypes: Dynamic value ; string\nifunset: Do not apply extra CSS-labels to the label\ngroup: expert", "anyOf": [ { "$ref": "#/definitions/TagRenderingConfigJson" @@ -966,7 +995,29 @@ export default { ] }, "labelCssClasses": { - "description": "Css classes that are applied onto the label; can be space-separated", + "description": "question: Which CSS-classes should be applied to the label?\n\nThe classes should be separated by a space (` `)\nYou can use most Tailwind-css classes, see https://tailwindcss.com/ for more information\nFor example: `center bg-gray-500 mx-2 my-1 rounded-full`\ninline: Apply CSS-classes {value} to the label\ntypes: Dynamic value ; string\nifunset: Do not apply extra CSS-classes to the label\nsuggestions: return [{if: \"value=bg-white rounded px-2\", then: \"Draw on a white background\"}]", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "css": { + "description": "question: What CSS should be applied to the entire marker?\nYou can set the css-properties here, e.g. `background: red; font-size: 12px; `\nThis will be applied to the _container_ containing both the marker and the label\ninline: Apply CSS-style {value} to the _entire marker_\ntypes: Dynamic value ; string\nifunset: Do not apply extra CSS element to the entire marker\ngroup: expert", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "cssClasses": { + "description": "question: Which CSS-classes should be applied to the entire marker?\nThis will be applied to the _container_ containing both the marker and the label\n\nThe classes should be separated by a space (` `)\nYou can use most Tailwind-css classes, see https://tailwindcss.com/ for more information\nFor example: `center bg-gray-500 mx-2 my-1 rounded-full`\ninline: Apply CSS-classes {value} to the entire container\nifunset: Do not apply extra CSS-classes to the label\ntypes: Dynamic value ; string\nifunset: Do not apply extra CSS-classes to the entire marker\ngroup: expert", "anyOf": [ { "$ref": "#/definitions/TagRenderingConfigJson" @@ -977,7 +1028,7 @@ export default { ] }, "pitchAlignment": { - "description": "If the map is pitched, the marker will stay parallel to the screen.\nSet to 'map' if you want to put it flattened on the map", + "description": "question: If the map is pitched, should the icon stay parallel to the screen or to the groundplane?\nsuggestions: return [{if: \"value=canvas\", then: \"The icon will stay upward and not be transformed as if it sticks to the screen\"}, {if: \"value=map\", then: \"The icon will be transformed as if it were painted onto the ground. (Automatically sets rotationAlignment)\"}]\ngroup: expert", "anyOf": [ { "$ref": "#/definitions/TagRenderingConfigJson" @@ -992,7 +1043,7 @@ export default { ] }, "rotationAlignment": { - "description": "If the map is rotated, the icon will still point to the north if no rotation was applied", + "description": "question: Should the icon be rotated if the map is rotated?\nifunset: Do not rotate or tilt icons. Always keep the icons straight\nsuggestions: return [{if: \"value=canvas\", then: \"Never rotate the icon\"}, {if: \"value=map\", then: \"If the map is rotated, rotate the icon as well. This gives the impression of an icon that floats perpendicular above the ground.\"}]\ngroup: expert", "anyOf": [ { "$ref": "#/definitions/TagRenderingConfigJson" @@ -1016,10 +1067,10 @@ export default { "type": "object", "properties": { "color": { - "description": "The color for way-elements and SVG-elements.\nIf the value starts with \"--\", the style of the body element will be queried for the corresponding variable instead", + "description": "question: What color should lines be drawn in?\n\nFor an area, this will be the colour of the outside line.\nIf the value starts with \"--\", the style of the body element will be queried for the corresponding variable instead\n\ntypes: dynamic value ; string\ntitle: Line Colour\ninline: The line colour always is {value}\ntype: color", "anyOf": [ { - "$ref": "#/definitions/TagRenderingConfigJson" + "$ref": "#/definitions/MinimalTagRenderingConfigJson" }, { "type": "string" @@ -1027,10 +1078,10 @@ export default { ] }, "width": { - "description": "The stroke-width for way-elements", + "description": "question: How wide should the line be?\nThe stroke-width for way-elements\n\ntypes: dynamic value ; string\ntitle: Line width\ninline: The line width is {value} pixels\ntype: pnat\nifunset: Use the default-linewidth of 7 pixels", "anyOf": [ { - "$ref": "#/definitions/TagRenderingConfigJson" + "$ref": "#/definitions/MinimalTagRenderingConfigJson" }, { "type": [ @@ -1041,47 +1092,25 @@ export default { ] }, "dashArray": { - "description": "A dasharray, e.g. \"5 6\"\nThe dasharray defines 'pixels of line, pixels of gap, pixels of line, pixels of gap',\nDefault value: \"\" (empty string == full line)", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] + "description": "question: Should a dasharray be used to render the lines?\nThe dasharray defines 'pixels of line, pixels of gap, pixels of line, pixels of gap, ...'. For example, `5 6` will be 5 pixels of line followed by a 6 pixel gap.\nCannot be a dynamic property due to a mapbox limitation\nifunset: Ways are rendered with a full line", + "type": "string" }, "lineCap": { - "description": "The form at the end of a line", + "description": "question: What form should the line-ending have?\nsuggestions: return [{if:\"value=round\",then:\"Round endings\"}, {if: \"value=square\", then: \"square endings\"}, {if: \"value=butt\", then: \"no ending (square ending at the end, without padding)\"}]\ntypes: dynamic value ; string\ntitle: Line Cap\nifunset: Use the default value (round ending)", "anyOf": [ { - "$ref": "#/definitions/TagRenderingConfigJson" + "$ref": "#/definitions/MinimalTagRenderingConfigJson" }, { "type": "string" } ] }, - "fill": { - "description": "Whether or not to fill polygons", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "enum": [ - "no", - "yes" - ], - "type": "string" - } - ] - }, "fillColor": { - "description": "The color to fill a polygon with.\nIf undefined, this will be slightly more opaque version of the stroke line", + "description": "question: What colour should be used as fill colour for polygons?\nifunset: The polygon fill colour will be a more transparent version of the stroke colour\nsuggestions: return [{if: \"value=#00000000\", then: \"Use a transparent fill (only render the outline)\"}]\ninline: The fill colour is {value}\ntypes: dynamic value ; string\ntype: color", "anyOf": [ { - "$ref": "#/definitions/TagRenderingConfigJson" + "$ref": "#/definitions/MinimalTagRenderingConfigJson" }, { "type": "string" @@ -1089,10 +1118,10 @@ export default { ] }, "offset": { - "description": "The number of pixels this line should be moved.\nUse a positive numbe to move to the right, a negative to move to the left (left/right as defined by the drawing direction of the line).\n\nIMPORTANT: MapComplete will already normalize 'key:both:property' and 'key:both' into the corresponding 'key:left' and 'key:right' tagging (same for 'sidewalk=left/right/both' which is rewritten to 'sidewalk:left' and 'sidewalk:right')\nThis simplifies programming. Refer to the CalculatedTags.md-documentation for more details", + "description": "question: Should the lines be moved (offsetted) with a number of pixels against the geographical lines?\nThe number of pixels this line should be moved.\nUse a positive number to move to the right in the drawing direction or a negative to move to the left (left/right as defined by the drawing direction of the line).\n\nIMPORTANT: MapComplete will already normalize 'key:both:property' and 'key:both' into the corresponding 'key:left' and 'key:right' tagging (same for 'sidewalk=left/right/both' which is rewritten to 'sidewalk:left' and 'sidewalk:right')\nThis simplifies programming. Refer to the CalculatedTags.md-documentation for more details\nifunset: don't offset lines on the map\ninline: Pixel offset by {value} pixels\ntypes: dynamic value ; number\ntype: int", "anyOf": [ { - "$ref": "#/definitions/TagRenderingConfigJson" + "$ref": "#/definitions/MinimalTagRenderingConfigJson" }, { "type": "number" @@ -1101,66 +1130,85 @@ export default { } } }, - "default": { - "description": "Rewrites and multiplies the given renderings of type T.\n\nThis can be used for introducing many similar questions automatically,\nwhich also makes translations easier.\n\n(Note that the key does _not_ need to be wrapped in {}.\nHowever, we recommend to use them if the key is used in a translation, as missing keys will be picked up and warned for by the translation scripts)\n\nFor example:\n\n```\n{\n rewrite: {\n sourceString: [\"key\", \"a|b|c\"],\n into: [\n [\"X\", 0]\n [\"Y\", 1],\n [\"Z\", 2]\n ],\n renderings: [{\n \"key\":\"a|b|c\"\n }]\n }\n}\n```\nwill result in _three_ copies (as the values to rewrite into have three values, namely:\n\n[\n {\n # The first pair: key --> X, a|b|c --> 0\n \"X\": 0\n },\n {\n \"Y\": 1\n },\n {\n \"Z\": 2\n }\n\n]", - "type": "object", - "properties": { - "rewrite": { - "type": "object", - "properties": { - "sourceString": { - "type": "array", - "items": { - "type": "string" - } - }, - "into": { - "type": "array", - "items": { - "type": "array", - "items": {} - } - } - }, - "required": [ - "into", - "sourceString" - ] - }, - "renderings": { - "anyOf": [ - { - "$ref": "#/definitions/default_4" - }, - { - "$ref": "#/definitions/default_5" - }, - { - "type": "array", - "items": { - "$ref": "#/definitions/default_5" - } - }, - { - "type": "array", - "items": { - "$ref": "#/definitions/default_4" - } - } - ] - } - }, - "required": [ - "renderings", - "rewrite" - ] - }, "QuestionableTagRenderingConfigJson": { "description": "A QuestionableTagRenderingConfigJson is a single piece of code which converts one ore more tags into a HTML-snippet.\nIf the desired tags are missing and a question is defined, a question will be shown instead.", "type": "object", "properties": { + "id": { + "type": "string" + }, + "mappings": { + "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes\n\nquestion: What are common options?", + "type": "array", + "items": { + "$ref": "#/definitions/MappingConfigJson" + } + }, + "multiAnswer": { + "description": "If true, use checkboxes instead of radio buttons when asking the question\n\nquestion: Should a contributor be allowed to select multiple mappings?\n\niftrue: allow to select multiple mappings\niffalse: only allow to select a single mapping\nifunset: only allow to select a single mapping", + "type": "boolean" + }, + "freeform": { + "description": "Allow freeform text input from the user", + "type": "object", + "properties": { + "key": { + "description": "question: What is the name of the attribute that should be written to?\nThis is the OpenStreetMap-key that that value will be written to\nifunset: do not offer a freeform textfield as answer option", + "type": "string" + }, + "type": { + "description": "question: What is the input type?\nThe type of the text-field, e.g. 'string', 'nat', 'float', 'date',...\nSee Docs/SpecialInputElements.md and UI/Input/ValidatedTextField.ts for supported values\nifunset: use an unconstrained string as input (default)\nsuggestions: return validators.AllValidators.filter(type => !type.isMeta).map((type) => ({if: \"value=\"+type.name, then: \"\"+type.name+\" \"+type.explanation.split(\"\\n\")[0]}))", + "type": "string" + }, + "placeholder": { + "description": "question: What placeholder text should be shown in the input-element if there is no input?\nA (translated) text that is shown (as gray text) within the textfield\ntype: translation\ngroup: expert", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] + }, + "helperArgs": { + "description": "Extra parameters to initialize the input helper arguments.\nFor semantics, see the 'SpecialInputElements.md'\ngroup: expert", + "type": "array", + "items": {} + }, + "addExtraTags": { + "description": "If a value is added with the textfield, these extra tag is addded.\nUseful to add a 'fixme=freeform textfield used - to be checked'\ngroup: expert", + "type": "array", + "items": { + "type": "string" + } + }, + "inline": { + "description": "question: Show the freeform as box within the question?\nInstead of showing a full-width text field, the text field will be shown within the rendering of the question.\n\nThis combines badly with special input elements, as it'll distort the layout.\nifunset: show the freeform input field full-width\niftrue: show the freeform input field as a small field within the question\ngroup: expert", + "type": "boolean" + }, + "default": { + "description": "question: What value should be entered in the text field if no value is set?\nThis can help people to quickly enter the most common option\nifunset: do not prefill the textfield\ngroup: expert", + "type": "string" + }, + "invalidValues": { + "description": "question: What values of the freeform key should be interpreted as 'unknown'?\nFor example, if a feature has `shop=yes`, the question 'what type of shop is this?' should still asked\nifunset: The question will be considered answered if any value is set for the key\ngroup: expert", + "anyOf": [ + { + "$ref": "#/definitions/{and:TagConfigJson[];}" + }, + { + "$ref": "#/definitions/{or:TagConfigJson[];}" + }, + { + "type": "string" + } + ] + } + } + }, "question": { - "description": "If it turns out that this tagRendering doesn't match _any_ value, then we show this question.\nIf undefined, the question is never asked and this tagrendering is read-only", + "description": "question: What question should be shown to the contributor?\n\nA question is presented ot the user if no mapping matches and the 'freeform' key is not set as well.\n\nifunset: This tagrendering will be shown if it is known, but cannot be edited by the contributor, effectively resutling in a read-only rendering", "anyOf": [ { "$ref": "#/definitions/Record" @@ -1171,7 +1219,7 @@ export default { ] }, "questionHint": { - "description": "A hint which is shown in subtle text under the question.\nThis can give some extra information on what the answer should ook like", + "description": "question: Should some extra information be shown to the contributor, alongside the question?\nThis hint is shown in subtle text under the question.\nThis can give some extra information on what the answer should ook like\nifunset: No extra hint is given", "anyOf": [ { "$ref": "#/definitions/Record" @@ -1181,94 +1229,15 @@ export default { } ] }, - "freeform": { - "description": "Allow freeform text input from the user", - "type": "object", - "properties": { - "key": { - "type": "string" - }, - "type": { - "description": "The type of the text-field, e.g. 'string', 'nat', 'float', 'date',...\nSee Docs/SpecialInputElements.md and UI/Input/ValidatedTextField.ts for supported values", - "type": "string" - }, - "placeholder": { - "description": "A (translated) text that is shown (as gray text) within the textfield" - }, - "helperArgs": { - "description": "Extra parameters to initialize the input helper arguments.\nFor semantics, see the 'SpecialInputElements.md'", - "type": "array", - "items": {} - }, - "addExtraTags": { - "description": "If a value is added with the textfield, these extra tag is addded.\nUseful to add a 'fixme=freeform textfield used - to be checked'", - "type": "array", - "items": { - "type": "string" - } - }, - "inline": { - "description": "When set, influences the way a question is asked.\nInstead of showing a full-width text field, the text field will be shown within the rendering of the question.\n\nThis combines badly with special input elements, as it'll distort the layout.\nNote that this will be set automatically if no special elements are present.", - "type": "boolean" - }, - "default": { - "description": "default value to enter if no previous tagging is present.\nNormally undefined (aka do not enter anything)", - "type": "string" - } - }, - "required": [ - "key" - ] - }, - "multiAnswer": { - "description": "If true, use checkboxes instead of radio buttons when asking the question", - "type": "boolean" - }, - "mappings": { - "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", - "type": "array", - "items": { - "$ref": "#/definitions/MappingConfigJson" - } - }, - "id": { - "description": "The id of the tagrendering, should be an unique string.\nUsed to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise.\n\nUse 'questions' to trigger the question box of this group (if a group is defined)", - "type": "string" - }, "labels": { - "description": "A list of labels. These are strings that are used for various purposes, e.g. to filter them away", + "description": "A list of labels. These are strings that are used for various purposes, e.g. to only include a subset of the tagRenderings when reusing a layer", "type": "array", "items": { "type": "string" } }, - "classes": { - "description": "A list of css-classes to apply to the entire tagRendering if the answer is known (not applied on the question).\nThis is only for advanced users", - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "string" - } - ] - }, - "description": { - "description": "A human-readable text explaining what this tagRendering does", - "anyOf": [ - { - "$ref": "#/definitions/Record" - }, - { - "type": "string" - } - ] - }, "render": { - "description": "Renders this value. Note that \"{key}\"-parts are substituted by the corresponding values of the element.\nIf neither 'textFieldQuestion' nor 'mappings' are defined, this text is simply shown as default value.\n\nNote 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
`\ntype: rendered", + "description": "question: What text should be rendered?\n\nThis piece of text will be shown in the infobox.\nIn this text, values within braces (such as {braced(key)}) are replaced by the corresponding `value` in the object.\nFor example, if the object contains tags `amenity=school; name=Windy Hill School`, the render string `This school is named {name}` will be shown to the user as `This school is named Windy Hill School`\n\nThis text will be shown if:\n- there is no mapping which matches (or there are no matches)\n- no question, no mappings and no 'freeform' is set\n\nNote that this is a HTML-interpreted value, so you can add links as e.g. '<a href='{website}'>{website}</a>' or include images such as `This is of type A <br><img src='typeA-icon.svg' />`\ntype: rendered\nifunset: no text is rendered if no predefined options match", "anyOf": [ { "$ref": "#/definitions/Record" @@ -1304,16 +1273,38 @@ export default { } ] }, - "condition": { - "description": "Only show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", + "icon": { + "description": "question: what icon should be shown next to the 'render' value?\nAn icon shown next to the rendering; typically shown pretty small\nThis is only shown next to the \"render\" value\nType: icon\nifunset: do not show an icon next to the \"render\"-value", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "type": "object", + "properties": { + "path": { + "description": "The path to the icon\nType: icon", + "type": "string" + }, + "class": { + "description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-', so defining your own in combination with a custom CSS is possible (but discouraged)", + "type": "string" + } + }, + "required": [ + "path" + ] }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "type": "string" + } + ] + }, + "condition": { + "description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or ask the question if unkown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", + "anyOf": [ + { + "$ref": "#/definitions/{and:TagConfigJson[];}" + }, + { + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -1321,28 +1312,117 @@ export default { ] }, "metacondition": { - "description": "If set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", + "description": "question: When should this item be shown (including special conditions)?\ntype: tag\n\nIf set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" } ] + }, + "description": { + "description": "A human-readable text explaining what this tagRendering does.\nMostly used for the shared tagrenderings", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] + }, + "classes": { + "description": "question: What css-classes should be applied to showing this attribute?\n\nA list of css-classes to apply to the entire tagRendering.\nThese classes are applied in 'answer'-mode, not in question mode\nThis is only for advanced users.\n\nValues are split on ` ` (space)", + "type": "string" } - } + }, + "required": [ + "id" + ] }, "Partial": { "type": "object", "properties": { + "id": { + "type": "string" + }, + "mappings": { + "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes\n\nquestion: What are common options?", + "type": "array", + "items": { + "$ref": "#/definitions/MappingConfigJson" + } + }, + "multiAnswer": { + "description": "If true, use checkboxes instead of radio buttons when asking the question\n\nquestion: Should a contributor be allowed to select multiple mappings?\n\niftrue: allow to select multiple mappings\niffalse: only allow to select a single mapping\nifunset: only allow to select a single mapping", + "type": "boolean" + }, + "freeform": { + "description": "Allow freeform text input from the user", + "type": "object", + "properties": { + "key": { + "description": "question: What is the name of the attribute that should be written to?\nThis is the OpenStreetMap-key that that value will be written to\nifunset: do not offer a freeform textfield as answer option", + "type": "string" + }, + "type": { + "description": "question: What is the input type?\nThe type of the text-field, e.g. 'string', 'nat', 'float', 'date',...\nSee Docs/SpecialInputElements.md and UI/Input/ValidatedTextField.ts for supported values\nifunset: use an unconstrained string as input (default)\nsuggestions: return validators.AllValidators.filter(type => !type.isMeta).map((type) => ({if: \"value=\"+type.name, then: \"\"+type.name+\" \"+type.explanation.split(\"\\n\")[0]}))", + "type": "string" + }, + "placeholder": { + "description": "question: What placeholder text should be shown in the input-element if there is no input?\nA (translated) text that is shown (as gray text) within the textfield\ntype: translation\ngroup: expert", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] + }, + "helperArgs": { + "description": "Extra parameters to initialize the input helper arguments.\nFor semantics, see the 'SpecialInputElements.md'\ngroup: expert", + "type": "array", + "items": {} + }, + "addExtraTags": { + "description": "If a value is added with the textfield, these extra tag is addded.\nUseful to add a 'fixme=freeform textfield used - to be checked'\ngroup: expert", + "type": "array", + "items": { + "type": "string" + } + }, + "inline": { + "description": "question: Show the freeform as box within the question?\nInstead of showing a full-width text field, the text field will be shown within the rendering of the question.\n\nThis combines badly with special input elements, as it'll distort the layout.\nifunset: show the freeform input field full-width\niftrue: show the freeform input field as a small field within the question\ngroup: expert", + "type": "boolean" + }, + "default": { + "description": "question: What value should be entered in the text field if no value is set?\nThis can help people to quickly enter the most common option\nifunset: do not prefill the textfield\ngroup: expert", + "type": "string" + }, + "invalidValues": { + "description": "question: What values of the freeform key should be interpreted as 'unknown'?\nFor example, if a feature has `shop=yes`, the question 'what type of shop is this?' should still asked\nifunset: The question will be considered answered if any value is set for the key\ngroup: expert", + "anyOf": [ + { + "$ref": "#/definitions/{and:TagConfigJson[];}" + }, + { + "$ref": "#/definitions/{or:TagConfigJson[];}" + }, + { + "type": "string" + } + ] + } + } + }, "question": { - "description": "If it turns out that this tagRendering doesn't match _any_ value, then we show this question.\nIf undefined, the question is never asked and this tagrendering is read-only", + "description": "question: What question should be shown to the contributor?\n\nA question is presented ot the user if no mapping matches and the 'freeform' key is not set as well.\n\nifunset: This tagrendering will be shown if it is known, but cannot be edited by the contributor, effectively resutling in a read-only rendering", "anyOf": [ { "$ref": "#/definitions/Record" @@ -1353,7 +1433,7 @@ export default { ] }, "questionHint": { - "description": "A hint which is shown in subtle text under the question.\nThis can give some extra information on what the answer should ook like", + "description": "question: Should some extra information be shown to the contributor, alongside the question?\nThis hint is shown in subtle text under the question.\nThis can give some extra information on what the answer should ook like\nifunset: No extra hint is given", "anyOf": [ { "$ref": "#/definitions/Record" @@ -1363,94 +1443,15 @@ export default { } ] }, - "freeform": { - "description": "Allow freeform text input from the user", - "type": "object", - "properties": { - "key": { - "type": "string" - }, - "type": { - "description": "The type of the text-field, e.g. 'string', 'nat', 'float', 'date',...\nSee Docs/SpecialInputElements.md and UI/Input/ValidatedTextField.ts for supported values", - "type": "string" - }, - "placeholder": { - "description": "A (translated) text that is shown (as gray text) within the textfield" - }, - "helperArgs": { - "description": "Extra parameters to initialize the input helper arguments.\nFor semantics, see the 'SpecialInputElements.md'", - "type": "array", - "items": {} - }, - "addExtraTags": { - "description": "If a value is added with the textfield, these extra tag is addded.\nUseful to add a 'fixme=freeform textfield used - to be checked'", - "type": "array", - "items": { - "type": "string" - } - }, - "inline": { - "description": "When set, influences the way a question is asked.\nInstead of showing a full-width text field, the text field will be shown within the rendering of the question.\n\nThis combines badly with special input elements, as it'll distort the layout.\nNote that this will be set automatically if no special elements are present.", - "type": "boolean" - }, - "default": { - "description": "default value to enter if no previous tagging is present.\nNormally undefined (aka do not enter anything)", - "type": "string" - } - }, - "required": [ - "key" - ] - }, - "multiAnswer": { - "description": "If true, use checkboxes instead of radio buttons when asking the question", - "type": "boolean" - }, - "mappings": { - "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", - "type": "array", - "items": { - "$ref": "#/definitions/MappingConfigJson" - } - }, - "id": { - "description": "The id of the tagrendering, should be an unique string.\nUsed to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise.\n\nUse 'questions' to trigger the question box of this group (if a group is defined)", - "type": "string" - }, "labels": { - "description": "A list of labels. These are strings that are used for various purposes, e.g. to filter them away", + "description": "A list of labels. These are strings that are used for various purposes, e.g. to only include a subset of the tagRenderings when reusing a layer", "type": "array", "items": { "type": "string" } }, - "classes": { - "description": "A list of css-classes to apply to the entire tagRendering if the answer is known (not applied on the question).\nThis is only for advanced users", - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "string" - } - ] - }, - "description": { - "description": "A human-readable text explaining what this tagRendering does", - "anyOf": [ - { - "$ref": "#/definitions/Record" - }, - { - "type": "string" - } - ] - }, "render": { - "description": "Renders this value. Note that \"{key}\"-parts are substituted by the corresponding values of the element.\nIf neither 'textFieldQuestion' nor 'mappings' are defined, this text is simply shown as default value.\n\nNote 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
`\ntype: rendered", + "description": "question: What text should be rendered?\n\nThis piece of text will be shown in the infobox.\nIn this text, values within braces (such as {braced(key)}) are replaced by the corresponding `value` in the object.\nFor example, if the object contains tags `amenity=school; name=Windy Hill School`, the render string `This school is named {name}` will be shown to the user as `This school is named Windy Hill School`\n\nThis text will be shown if:\n- there is no mapping which matches (or there are no matches)\n- no question, no mappings and no 'freeform' is set\n\nNote that this is a HTML-interpreted value, so you can add links as e.g. '<a href='{website}'>{website}</a>' or include images such as `This is of type A <br><img src='typeA-icon.svg' />`\ntype: rendered\nifunset: no text is rendered if no predefined options match", "anyOf": [ { "$ref": "#/definitions/Record" @@ -1486,16 +1487,38 @@ export default { } ] }, - "condition": { - "description": "Only show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", + "icon": { + "description": "question: what icon should be shown next to the 'render' value?\nAn icon shown next to the rendering; typically shown pretty small\nThis is only shown next to the \"render\" value\nType: icon\nifunset: do not show an icon next to the \"render\"-value", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "type": "object", + "properties": { + "path": { + "description": "The path to the icon\nType: icon", + "type": "string" + }, + "class": { + "description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-', so defining your own in combination with a custom CSS is possible (but discouraged)", + "type": "string" + } + }, + "required": [ + "path" + ] }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "type": "string" + } + ] + }, + "condition": { + "description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or ask the question if unkown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", + "anyOf": [ + { + "$ref": "#/definitions/{and:TagConfigJson[];}" + }, + { + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -1503,20 +1526,33 @@ export default { ] }, "metacondition": { - "description": "If set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", + "description": "question: When should this item be shown (including special conditions)?\ntype: tag\n\nIf set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" } ] + }, + "description": { + "description": "A human-readable text explaining what this tagRendering does.\nMostly used for the shared tagrenderings", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] + }, + "classes": { + "description": "question: What css-classes should be applied to showing this attribute?\n\nA list of css-classes to apply to the entire tagRendering.\nThese classes are applied in 'answer'-mode, not in question mode\nThis is only for advanced users.\n\nValues are split on ` ` (space)", + "type": "string" } } }, @@ -1595,15 +1631,13 @@ export default { "properties": { "question": {}, "osmTags": { - "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation", + "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation\n\ntype: tag", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -1650,6 +1684,10 @@ export default { "DeleteConfigJson": { "type": "object", "properties": { + "neededChangesets": { + "description": "*\nBy default, the contributor needs 20 previous changesets to delete points edited by others.\nFor some small features (e.g. bicycle racks) this is too much and this requirement can be lowered or dropped, which can be done here.\n\ntype: nat\nquestion: How many changesets must a contributor have before being allowed to delete a point?", + "type": "number" + }, "extraDeleteReasons": { "description": "*\nBy default, three reasons to delete a point are shown:\n\n- The point does not exist anymore\n- The point was a testing point\n- THe point could not be found\n\nHowever, for some layers, there might be different or more specific reasons for deletion which can be user friendly to set, e.g.:\n\n- the shop has closed\n- the climbing route has been closed of for nature conservation reasons\n- ...\n\nThese reasons can be stated here and will be shown in the list of options the user can choose from", "type": "array", @@ -1657,10 +1695,10 @@ export default { "type": "object", "properties": { "explanation": { - "description": "The text that will be shown to the user - translatable" + "description": "The text that will be shown to the user as option for why this point does not exist anymore.\nNote that the most common reasons (test point, does not exist anymore, cannot be found) are already offered by default\n\nquestion: For what extra reason might this feature be removed in real-life?" }, "changesetMessage": { - "description": "The text that will be uploaded into the changeset or will be used in the fixme in case of a soft deletion\nShould be a few words, in english", + "description": "The text that will be uploaded into the changeset or will be used in the fixme in case of a soft deletion\nShould be a few words, in english\n\nquestion: What should be added to the changeset as delete reason?", "type": "string" } }, @@ -1678,10 +1716,10 @@ export default { "properties": { "if": { "$ref": "#/definitions/TagConfigJson", - "description": "The tags that will be given to the object.\nThis must remove tags so that the 'source/osmTags' won't match anymore" + "description": "The tags that will be given to the object.\nThis must remove tags so that the 'source/osmTags' won't match anymore\n\nquestion: What tags should be applied to the object?" }, "then": { - "description": "The human explanation for the options" + "description": "The human explanation for the options\n\nquestion: What text should be shown to the contributor for this reason?" } }, "required": [ @@ -1691,27 +1729,21 @@ export default { } }, "softDeletionTags": { - "description": "In some cases, the contributor is not allowed to delete the current feature (e.g. because it isn't a point, the point is referenced by a relation or the user isn't experienced enough).\nTo still offer the user a 'delete'-option, the feature is retagged with these tags. This is a soft deletion, as the point isn't actually removed from OSM but rather marked as 'disused'\nIt is important that the feature will be retagged in such a way that it won't be picked up by the layer anymore!\n\nExample (note that \"amenity=\" erases the 'amenity'-key alltogether):\n```\n{\n \"and\": [\"disussed:amenity=public_bookcase\", \"amenity=\"]\n}\n```\n\nor (notice the use of the ':='-tag to copy the old value of 'shop=*' into 'disused:shop='):\n```\n{\n \"and\": [\"disused:shop:={shop}\", \"shop=\"]\n}\n```", + "description": "In some cases, the contributor is not allowed to delete the current feature (e.g. because it isn't a point, the point is referenced by a relation or the user isn't experienced enough).\nTo still offer the user a 'delete'-option, the feature is retagged with these tags. This is a soft deletion, as the point isn't actually removed from OSM but rather marked as 'disused'\nIt is important that the feature will be retagged in such a way that it won't be picked up by the layer anymore!\n\nExample (note that \"amenity=\" erases the 'amenity'-key alltogether):\n\n```\n{\n \"and\": [\"disussed:amenity=public_bookcase\", \"amenity=\"]\n}\n```\n\nor (notice the use of the ':='-tag to copy the old value of 'shop=*' into 'disused:shop='):\n\n```\n{\n \"and\": [\"disused:shop:={shop}\", \"shop=\"]\n}\n```\n\nquestion: If a hard delete is not possible, what tags should be applied to mark this feature as deleted?\ntype: tag", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" } ] }, - "neededChangesets": { - "description": "*\nBy default, the contributor needs 20 previous changesets to delete points edited by others.\nFor some small features (e.g. bicycle racks) this is too much and this requirement can be lowered or dropped, which can be done here.", - "type": "number" - }, "omitDefaultDeleteReasons": { - "description": "Set this flag if the default delete reasons should be omitted from the dialog.\nThis requires at least one extraDeleteReason or nonDeleteMapping", + "description": "Set this flag if the default delete reasons should be omitted from the dialog.\nThis requires at least one extraDeleteReason or nonDeleteMapping\n\nquestion: Should the default delete reasons be hidden?\niftrue: Hide the default delete reasons\niffalse: Show the default delete reasons\nifunset: Show the default delete reasons (default behaviour)", "type": "boolean" } } @@ -1720,11 +1752,11 @@ export default { "type": "object", "properties": { "enableImproveAccuracy": { - "description": "One default reason to move a point is to improve accuracy.\nSet to false to disable this reason", + "description": "question: Should moving this type of point to improve the accuracy be allowed?\niftrue: This point can be moved to improve the accuracy\nifunset: (default) This point can be moved to improve the accuracy\niffalse: This point cannot be moved to improve the accuracy", "type": "boolean" }, "enableRelocation": { - "description": "One default reason to move a point is because it has relocated\nSet to false to disable this reason", + "description": "question: Should moving this type of point due to a relocation be allowed?\n\nThis will erase the attributes `addr:street`, `addr:housenumber`, `addr:city` and `addr:postcode`\n\niftrue: This type of point can be moved due to a relocation (and will remove address information when this is done)\nifunset: (default) This type of point can be moved due to a relocation (and will remove address information when this is done)\niffalse: This type of point cannot be moved due to a relocation", "type": "boolean" } } @@ -1734,7 +1766,7 @@ export default { "type": "object", "properties": { "appliesToKey": { - "description": "Every key from this list will be normalized.\n\nTo render a united value properly, use", + "description": "Every key from this list will be normalized.\n\nTo render the value properly (with a human readable denomination), use `{canonical()}`", "type": "array", "items": { "type": "string" diff --git a/Docs/Schemas/LayoutConfigJson.schema.json b/Docs/Schemas/LayoutConfigJson.schema.json index dc188a78b..d41d2e07d 100644 --- a/Docs/Schemas/LayoutConfigJson.schema.json +++ b/Docs/Schemas/LayoutConfigJson.schema.json @@ -3,12 +3,19 @@ "type": "object", "properties": { "id": { - "description": "The id of this layout.\n\nThis is used as hashtag in the changeset message, which will read something like \"Adding data with #mapcomplete for theme #\"\nMake sure it is something decent and descriptive, it should be a simple, lowercase string.\n\nOn official themes, it'll become the name of the page, e.g.\n'cyclestreets' which become 'cyclestreets.html'", + "description": "question: What is the id of this layout?\n\nThe id is a unique string to identify the theme\n\nIt should be\n- in english\n- describe the theme in a single word (or a few words)\n- all lowercase and with only [a-z] or underscores (_)\n\nThis is used as hashtag in the changeset message, which will read something like \"Adding data with #mapcomplete for theme #\"\n\nOn official themes, it'll become the name of the page, e.g.\n'cyclestreets' which become 'cyclestreets.html'\n\ntype: id\ngroup: basic", "type": "string" }, - "credits": { - "description": "Who helped to create this theme and should be attributed?", - "type": "string" + "title": { + "description": "question: What is the title of this theme?\n\nThe human-readable title, as shown in the welcome message and the index page\ngroup: basic", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] }, "mustHaveLanguage": { "description": "Only used in 'generateLayerOverview': if present, every translation will be checked to make sure it is fully translated.\n\nThis must be a list of two-letter, lowercase codes which identifies the language, e.g. \"en\", \"nl\", ...", @@ -17,8 +24,8 @@ "type": "string" } }, - "title": { - "description": "The title, as shown in the welcome message and the more-screen.", + "description": { + "description": "question: How would you describe this theme?\nThe description, as shown in the welcome message and the more-screen\ngroup: basic", "anyOf": [ { "$ref": "#/definitions/Record" @@ -29,18 +36,7 @@ ] }, "shortDescription": { - "description": "A short description, showed as social description and in the 'more theme'-buttons.\nNote that if this one is not defined, the first sentence of 'description' is used", - "anyOf": [ - { - "$ref": "#/definitions/Record" - }, - { - "type": "string" - } - ] - }, - "description": { - "description": "The description, as shown in the welcome message and the more-screen", + "description": "A short description, showed as social description and in the 'more theme'-buttons.\nNote that if this one is not defined, the first sentence of 'description' is used\ngroup: hidden", "anyOf": [ { "$ref": "#/definitions/Record" @@ -51,7 +47,7 @@ ] }, "descriptionTail": { - "description": "A part of the description, shown under the login-button.", + "description": "A part of the description, shown under the login-button.\ngroup: hidden", "anyOf": [ { "$ref": "#/definitions/Record" @@ -62,64 +58,53 @@ ] }, "icon": { - "description": "The icon representing this theme.\nUsed as logo in the more-screen and (for official themes) as favicon, webmanifest logo, ...\nEither a URL or a base64 encoded value (which should include 'data:image/svg+xml;base64)\n\nType: icon", + "description": "question: What icon should be used to represent this theme?\n\nUsed as logo in the more-screen and (for official themes) as favicon, webmanifest logo, ...\n\nEither a URL or a base64 encoded value (which should include 'data:image/svg+xml;base64)\n\nType: icon\ngroup: basic", "type": "string" }, "socialImage": { - "description": "Link to a 'social image' which is included as og:image-tag on official themes.\nUseful to share the theme on social media.\nSee https://www.h3xed.com/web-and-internet/how-to-use-og-image-meta-tag-facebook-reddit for more information$\n\nType: image", + "description": "question: What image should be used as social image preview?\nThis is included as og:image-tag on official themes.\n\nSee https://www.h3xed.com/web-and-internet/how-to-use-og-image-meta-tag-facebook-reddit for more information\nifunset: use the default social image of mapcomplete (or generate one based on the icon)\nType: image\ngroup: basic", "type": "string" }, + "extraLink": { + "description": "question: should an extra help button be shown in certain circumstances?\nAdds an additional button on the top-left of the application.\nThis can link to an arbitrary location.\n\nFor example {icon: \"./assets/svg/pop-out.svg\", href: 'https://mapcomplete.org/{theme}.html?lat={lat}&lon={lon}&z={zoom}, requirements: [\"iframe\",\"no-welcome-message]},\n\ngroup: advanced\nifunset: show a link to open MapComplete full screen if used in an iframe", + "$ref": "#/definitions/default" + }, "startZoom": { - "description": "Default location and zoom to start.\nNote that this is barely used. Once the user has visited mapcomplete at least once, the previous location of the user will be used", + "description": "question: At what zoomlevel should this theme open?\nDefault location and zoom to start.\nNote that this is barely used. Once the user has visited mapcomplete at least once, the previous location of the user will be used\nifunset: Use the default startzoom (0)\ntype: float\ngroup: start_location", "type": "number" }, "startLat": { + "description": "question: At what start latitude should this theme open?\nDefault location and zoom to start.\nNote that this is barely used. Once the user has visited mapcomplete at least once, the previous location of the user will be used\nifunset: Use 0 as start latitude\ntype: float\ngroup: start_location", "type": "number" }, "startLon": { + "description": "question: At what start longitude should this theme open?\nDefault location and zoom to start.\nNote that this is barely used. Once the user has visited mapcomplete at least once, the previous location of the user will be used\nifunset: Use 0 as start longitude\ntype: float\ngroup: start_location", "type": "number" }, - "widenFactor": { - "description": "When a query is run, the data within bounds of the visible map is loaded.\nHowever, users tend to pan and zoom a lot. It is pretty annoying if every single pan means a reloading of the data.\nFor this, the bounds are widened in order to make a small pan still within bounds of the loaded data.\n\nIF widenfactor is 1, this feature is disabled. A recommended value is between 1 and 3", - "type": "number" - }, - "overpassMaxZoom": { - "description": "At low zoom levels, overpass is used to query features.\nAt high zoom level, the OSM api is used to fetch one or more BBOX aligning with a slippy tile.\nThe overpassMaxZoom controls the flipoverpoint: if the zoom is this or lower, overpass is used.", - "type": "number" - }, - "osmApiTileSize": { - "description": "When the OSM-api is used to fetch features, it does so in a tiled fashion.\nThese tiles are using a ceratin zoom level, that can be controlled here\nDefault: overpassMaxZoom + 1", - "type": "number" - }, - "overrideAll": { - "description": "An override applied on all layers of the theme.\n\nE.g.: if there are two layers defined:\n```\n\"layers\":[\n {\"title\": ..., \"tagRenderings\": [...], \"osmSource\":{\"tags\": ...}},\n {\"title\", ..., \"tagRenderings\", [...], \"osmSource\":{\"tags\" ...}}\n]\n```\n\nand overrideAll is specified:\n```\n\"overrideAll\": {\n \"osmSource\":{\"geoJsonSource\":\"xyz\"}\n}\nthen the result will be that all the layers will have these properties applied and result in:\n\"layers\":[\n {\"title\": ..., \"tagRenderings\": [...], \"osmSource\":{\"tags\": ..., \"geoJsonSource\":\"xyz\"}},\n {\"title\", ..., \"tagRenderings\", [...], \"osmSource\":{\"tags\" ..., \"geoJsonSource\":\"xyz\"}}\n]\n```\n\nIf the overrideAll contains a list where the keys starts with a plus, the values will be appended (instead of discarding the old list), for example\n\n\"overrideAll\": {\n \"+tagRenderings\": [ { ... some tagrendering ... }]\n}\n\nIn the above scenario, `sometagrendering` will be added at the beginning of the tagrenderings of every layer", - "$ref": "#/definitions/Partial" - }, "defaultBackgroundId": { "description": "The id of the default background. BY default: vanilla OSM", "type": "string" }, - "tileLayerSources": { - "description": "Define some (overlay) slippy map tilesources", - "type": "array", - "items": { - "allOf": [ - { - "$ref": "#/definitions/RasterLayerProperties" - }, - { - "type": "object", - "properties": { - "defaultState": { - "type": "boolean" - } - } + "credits": { + "description": "Who helped to create this theme and should be attributed?", + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" } - ] - } + }, + { + "type": "string" + } + ] + }, + "hideFromOverview": { + "description": "If set to true, this layout will not be shown in the overview with more themes", + "type": "boolean" }, "layers": { - "description": "The layers to display.\n\nEvery layer contains a description of which feature to display - the overpassTags which are queried.\nInstead of running one query for every layer, the query is fused.\n\nAfterwards, every layer is given the list of features.\nEvery layer takes away the features that match with them*, and give the leftovers to the next layers.\n\nThis implies that the _order_ of the layers is important in the case of features with the same tags;\nas the later layers might never receive their feature.\n\n*layers can also remove 'leftover'-features if the leftovers overlap with a feature in the layer itself\n\nNote that builtin layers can be reused. Either put in the name of the layer to reuse, or use {builtin: \"layername\", override: ...}\n\nThe 'override'-object will be copied over the original values of the layer, which allows to change certain aspects of the layer\n\nFor example: If you would like to use layer nature reserves, but only from a specific operator (eg. Natuurpunt) you would use the following in your theme:\n\n```\n\"layer\": {\n \"builtin\": \"nature_reserve\",\n \"override\": {\"source\":\n {\"osmTags\": {\n \"+and\":[\"operator=Natuurpunt\"]\n }\n }\n }\n}\n```\n\nIt's also possible to load multiple layers at once, for example, if you would like for both drinking water and benches to start at the zoomlevel at 12, you would use the following:\n\n```\n\"layer\": {\n \"builtin\": [\"benches\", \"drinking_water\"],\n \"override\": {\"minzoom\": 12}\n}\n```", + "description": "question: What layers should this map show?\ntype: layer[]\ntypes: hidden | layer | hidden\ngroup: layers\nsuggestions: return Array.from(layers.keys()).map(key => ({if: \"value=\"+key, then: key+\" - \"+layers.get(key).description}))\nEvery layer contains a description of which feature to display - the overpassTags which are queried.\nInstead of running one query for every layer, the query is fused.\n\nAfterwards, every layer is given the list of features.\nEvery layer takes away the features that match with them*, and give the leftovers to the next layers.\n\nThis implies that the _order_ of the layers is important in the case of features with the same tags;\nas the later layers might never receive their feature.\n\n*layers can also remove 'leftover'-features if the leftovers overlap with a feature in the layer itself\n\nNote that builtin layers can be reused. Either put in the name of the layer to reuse, or use {builtin: \"layername\", override: ...}\n\nThe 'override'-object will be copied over the original values of the layer, which allows to change certain aspects of the layer\n\nFor example: If you would like to use layer nature reserves, but only from a specific operator (eg. Natuurpunt) you would use the following in your theme:\n\n```\n\"layer\": {\n \"builtin\": \"nature_reserve\",\n \"override\": {\"source\":\n {\"osmTags\": {\n \"+and\":[\"operator=Natuurpunt\"]\n }\n }\n }\n}\n```\n\nIt's also possible to load multiple layers at once, for example, if you would like for both drinking water and benches to start at the zoomlevel at 12, you would use the following:\n\n```\n\"layer\": {\n \"builtin\": [\"benches\", \"drinking_water\"],\n \"override\": {\"minzoom\": 12}\n}\n```", "type": "array", "items": { "anyOf": [ @@ -164,13 +149,32 @@ ] } }, - "customCss": { - "description": "The URL of a custom CSS stylesheet to modify the layout", - "type": "string" + "overrideAll": { + "description": "An override applied on all layers of the theme.\n\nE.g.: if there are two layers defined:\n```\n\"layers\":[\n {\"title\": ..., \"tagRenderings\": [...], \"osmSource\":{\"tags\": ...}},\n {\"title\", ..., \"tagRenderings\", [...], \"osmSource\":{\"tags\" ...}}\n]\n```\n\nand overrideAll is specified:\n```\n\"overrideAll\": {\n \"osmSource\":{\"geoJsonSource\":\"xyz\"}\n}\nthen the result will be that all the layers will have these properties applied and result in:\n\"layers\":[\n {\"title\": ..., \"tagRenderings\": [...], \"osmSource\":{\"tags\": ..., \"geoJsonSource\":\"xyz\"}},\n {\"title\", ..., \"tagRenderings\", [...], \"osmSource\":{\"tags\" ..., \"geoJsonSource\":\"xyz\"}}\n]\n```\n\nIf the overrideAll contains a list where the keys starts with a plus, the values will be appended (instead of discarding the old list), for example\n\n\"overrideAll\": {\n \"+tagRenderings\": [ { ... some tagrendering ... }]\n}\n\nIn the above scenario, `sometagrendering` will be added at the beginning of the tagrenderings of every layer", + "$ref": "#/definitions/Partial" }, - "hideFromOverview": { - "description": "If set to true, this layout will not be shown in the overview with more themes", - "type": "boolean" + "tileLayerSources": { + "description": "Define some (overlay) slippy map tilesources", + "type": "array", + "items": { + "allOf": [ + { + "$ref": "#/definitions/RasterLayerProperties" + }, + { + "type": "object", + "properties": { + "defaultState": { + "type": "boolean" + } + } + } + ] + } + }, + "customCss": { + "description": "The URL of a custom CSS stylesheet to modify the layout\ngroup: advanced", + "type": "string" }, "lockLocation": { "description": "If set to true, the basemap will not scroll outside of the area visible on initial zoom.\nIf set to [[lon, lat], [lon, lat]], the map will not scroll outside of those bounds.\nOff by default, which will enable panning to the entire world", @@ -219,78 +223,79 @@ } ] }, - "extraLink": { - "description": "Adds an additional button on the top-left of the application.\nThis can link to an arbitrary location.\n\nNote that {lat},{lon},{zoom}, {language} and {theme} will be replaced\n\nDefault: {icon: \"./assets/svg/pop-out.svg\", href: 'https://mapcomplete.org/{theme}.html?lat={lat}&lon={lon}&z={zoom}, requirements: [\"iframe\",\"no-welcome-message]},", - "$ref": "#/definitions/default" - }, "enableUserBadge": { - "description": "If set to false, disables logging in.\nThe userbadge will be hidden, all login-buttons will be hidden and editing will be disabled", + "description": "question: Should a user be able to login with OpenStreetMap?\n\nIf not logged in, will not show the login buttons and hide all the editable elements.\nAs such, MapComplete will become read-only and a purely visualisation tool.\n\nifunset: Enable the possiblity to login with OpenStreetMap (default)\niffalse: Do not enable to login with OpenStreetMap, have a read-only view of MapComplete.\niftrue: Enable the possiblity to login with OpenStreetMap\ngroup: feature_switches", "type": "boolean" }, "enableShareScreen": { - "description": "If false, hides the tab 'share'-tab in the welcomeMessage", + "description": "question: Should the tab with options to share the current screen be enabled?\n\nOn can get the iFrame embed code here\n\nifunset: Enable the sharescreen (default)\niffalse: Do not enable the share screen\niftrue: Enable the share screen\ngroup: feature_switches", "type": "boolean" }, "enableMoreQuests": { - "description": "Hides the tab with more themes in the welcomeMessage", + "description": "question: Should the user be able to switch to different themes?\n\nTypically enabled in iframes and/or on commisioned themes\n\niftrue: enable to go back to the index page showing all themes\niffalse: do not enable to go back to the index page showing all themes; hide the 'more themes' buttons\nifunset: mapcomplete default: enable to go back to the index page showing all themes\ngroup: feature_switches", "type": "boolean" }, "enableLayers": { - "description": "If false, the layer selection/filter view will be hidden\nThe corresponding URL-parameter is 'fs-filters' instead of 'fs-layers'", + "description": "question: Should the user be able to enable/disable layers and to filter the layers?\n\nThe corresponding URL-parameter is 'fs-filters' instead of 'fs-layers'\niftrue: enable the filters/layers pane\niffalse: do not enable to filter or to disable layers; hide the 'filter' tab from the overview and the button at the bottom-left\nifunset: mapcomplete default: enable to filter or to enable/disable layers\ngroup: feature_switches", "type": "boolean" }, "enableSearch": { - "description": "If set to false, hides the search bar", + "description": "question: Should the user be able to search for locations?\n\nifunset: MapComplete default: allow to search\niftrue: Allow to search\niffalse: Do not allow to search; hide the search-bar\ngroup: feature_switches", "type": "boolean" }, "enableAddNewPoints": { - "description": "If set to false, the ability to add new points or nodes will be disabled.\nEditing already existing features will still be possible", + "description": "question: Should the user be able to add new points?\n\nAdding new points is only possible if the loaded layers have presets set.\nSome layers do not have presets. If the theme only has layers without presets, then adding new points will not be possible.\n\nifunset: MapComplete default: allow to create new points\niftrue: Allow to create new points\niffalse: Do not allow to create new points, even if the layers in this theme support creating new points\ngroup: feature_switches", "type": "boolean" }, "enableGeolocation": { - "description": "If set to false, the 'geolocation'-button will be hidden.", + "description": "question: Should the user be able to use their GPS to geolocate themselfes on the map?\nifunset: MapComplete default: allow to use the GPS\niftrue: Allow to use the GPS\niffalse: Do not allow to use the GPS, hide the geolocation-buttons\ngroup: feature_switches", "type": "boolean" }, "enableBackgroundLayerSelection": { - "description": "Enable switching the backgroundlayer.\nIf false, the quickswitch-buttons are removed (bottom left) and the dropdown in the layer selection is removed as well", + "description": "Enable switching the backgroundlayer.\nIf false, the quickswitch-buttons are removed (bottom left) and the dropdown in the layer selection is removed as well\n\nquestion: Should the user be able to switch the background layer?\n\niftrue: Allow to switch the background layer\niffalse: Do not allow to switch the background layer\nifunset: MapComplete default: Allow to switch the background layer\ngroup: feature_switches", "type": "boolean" }, "enableShowAllQuestions": { - "description": "If set to true, will show _all_ unanswered questions in a popup instead of just the next one", + "description": "question: Should the questions about a feature be presented one by one or all at once?\niftrue: Show all unanswered questions at the same time\niffalse: Show unanswered questions one by one\nifunset: MapComplete default: Use the preference of the user to show questions at the same time or one by one\ngroup: feature_switches", "type": "boolean" }, "enableDownload": { - "description": "If set to true, download button for the data will be shown (offers downloading as geojson and csv)", + "description": "question: Should the 'download as CSV'- and 'download as Geojson'-buttons be enabled?\niftrue: Enable the option to download the map as CSV and GeoJson\niffalse: Enable the option to download the map as CSV and GeoJson\nifunset: MapComplete default: Enable the option to download the map as CSV and GeoJson\ngroup: feature_switches", "type": "boolean" }, "enablePdfDownload": { - "description": "If set to true, exporting a pdf is enabled", + "description": "question: Should the 'download as PDF'-button be enabled?\niftrue: Enable the option to download the map as PDF\niffalse: Enable the option to download the map as PDF\nifunset: MapComplete default: Enable the option to download the map as PDF\ngroup: feature_switches", "type": "boolean" }, "enableNoteImports": { - "description": "If true, notes will be loaded and parsed. If a note is an import (as created by the import_helper.html-tool from mapcomplete),\nthese notes will be shown if a relevant layer is present.\n\nDefault is true for official layers and false for unofficial (sideloaded) layers", + "description": "question: Should the 'notes' from OpenStreetMap be loaded and parsed for import helper notes?\nIf true, notes will be loaded and parsed. If a note is an import (as created by the import_helper.html-tool from mapcomplete),\nthese notes will be shown if a relevant layer is present.\n\nifunset: MapComplete default: do not load import notes for sideloaded themes but do load them for official themes\niftrue: Load notes and show import notes\niffalse: Do not load import notes\ngroup: advanced", "type": "boolean" }, "overpassUrl": { - "description": "Set one or more overpass URLs to use for this theme..", - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "string" - } - ] + "description": "question: What overpass-api instance should be used for this layout?\n\nifunset: Use the default, builtin collection of overpass instances\ngroup: advanced", + "type": "array", + "items": { + "type": "string" + } }, "overpassTimeout": { - "description": "Set a different timeout for overpass queries - in seconds. Default: 30s", + "description": "question: After how much seconds should the overpass-query stop?\nIf a query takes too long, the overpass-server will abort.\nOnce can set the amount of time before overpass gives up here.\nifunset: use the default amount of 30 seconds as timeout\ntype: pnat\ngroup: advanced", + "type": "number" + }, + "widenFactor": { + "description": "When a query is run, the data within bounds of the visible map is loaded.\nHowever, users tend to pan and zoom a lot. It is pretty annoying if every single pan means a reloading of the data.\nFor this, the bounds are widened in order to make a small pan still within bounds of the loaded data.\n\nIF widenfactor is 1, this feature is disabled. A recommended value is between 1 and 3", + "type": "number" + }, + "overpassMaxZoom": { + "description": "At low zoom levels, overpass is used to query features.\nAt high zoom level, the OSM api is used to fetch one or more BBOX aligning with a slippy tile.\nThe overpassMaxZoom controls the flipoverpoint: if the zoom is this or lower, overpass is used.", + "type": "number" + }, + "osmApiTileSize": { + "description": "When the OSM-api is used to fetch features, it does so in a tiled fashion.\nThese tiles are using a ceratin zoom level, that can be controlled here\nDefault: overpassMaxZoom + 1", "type": "number" }, "enableNodeDatabase": { - "description": "Enables tracking of all nodes when data is loaded.\nThis is useful for the 'ImportWay' and 'ConflateWay'-buttons who need this database.\n\nNote: this flag will be automatically set.", + "description": "Enables tracking of all nodes when data is loaded.\nThis is useful for the 'ImportWay' and 'ConflateWay'-buttons who need this database.\n\nNote: this flag will be automatically set and can thus be ignored.\ngroup: hidden", "type": "boolean" } }, @@ -299,20 +304,16 @@ "icon", "id", "layers", - "startLat", - "startLon", - "startZoom", "title" ], "definitions": { "TagConfigJson": { - "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation", + "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation\n\ntype: tag", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", "type": "object", "properties": { "or": { @@ -331,8 +332,7 @@ } ] }, - "AndTagConfigJson": { - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", + "{and:TagConfigJson[];}": { "type": "object", "properties": { "and": { @@ -347,8 +347,7 @@ ], "additionalProperties": false }, - "OrTagConfigJson": { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", + "{or:TagConfigJson[];}": { "type": "object", "properties": { "or": { @@ -435,48 +434,101 @@ ], "additionalProperties": false }, + "MinimalTagRenderingConfigJson": { + "description": "Mostly used for lineRendering and pointRendering", + "type": "object", + "properties": { + "render": { + "description": "question: What value should be rendered?\n\nThis piece of text will be shown in the infobox.\nNote that \"&LBRACEkey&RBRACE\"-parts are substituted by the corresponding values of the element.\n\nThis value will be used if there is no mapping which matches (or there are no matches)\nNote that this is a HTML-interpreted value, so you can add links as e.g. '<a href='{website}'>{website}</a>' or include images such as `This is of type A <br><img src='typeA-icon.svg' />`", + "type": "string" + }, + "mappings": { + "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", + "type": "array", + "items": { + "type": "object", + "properties": { + "if": { + "$ref": "#/definitions/TagConfigJson", + "description": "question: When should this single mapping match?\n\nIf this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}" + }, + "then": { + "description": "question: What text should be shown?\n\nIf the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option", + "type": "string" + } + }, + "required": [ + "if", + "then" + ] + } + } + }, + "additionalProperties": false + }, + "IconConfigJson": { + "type": "object", + "properties": { + "icon": { + "description": "question: What icon should be used?\ntype: icon\nsuggestions: return [\"pin\",\"square\",\"circle\",\"checkmark\",\"clock\",\"close\",\"crosshair\",\"help\",\"home\",\"invalid\",\"location\",\"location_empty\",\"location_locked\",\"note\",\"resolved\",\"ring\",\"scissors\",\"teardrop\",\"teardrop_with_hole_green\",\"triangle\"].map(i => ({if: \"value=\"+i, then: i, icon: i}))", + "anyOf": [ + { + "$ref": "#/definitions/MinimalTagRenderingConfigJson" + }, + { + "type": "object", + "properties": { + "builtin": { + "type": "string" + }, + "override": {} + }, + "required": [ + "builtin", + "override" + ] + }, + { + "type": "string" + } + ] + }, + "color": { + "description": "question: What colour should the icon be?\nThis will only work for the default icons such as `pin`,`circle`,...\ntype: color", + "anyOf": [ + { + "$ref": "#/definitions/MinimalTagRenderingConfigJson" + }, + { + "type": "object", + "properties": { + "builtin": { + "type": "string" + }, + "override": {} + }, + "required": [ + "builtin", + "override" + ] + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "icon" + ], + "additionalProperties": false + }, "TagRenderingConfigJson": { "description": "A TagRenderingConfigJson is a single piece of code which converts one ore more tags into a HTML-snippet.\nFor an _editable_ tagRendering, use 'QuestionableTagRenderingConfigJson' instead, which extends this one", "type": "object", "properties": { - "id": { - "description": "The id of the tagrendering, should be an unique string.\nUsed to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise.\n\nUse 'questions' to trigger the question box of this group (if a group is defined)", - "type": "string" - }, - "labels": { - "description": "A list of labels. These are strings that are used for various purposes, e.g. to filter them away", - "type": "array", - "items": { - "type": "string" - } - }, - "classes": { - "description": "A list of css-classes to apply to the entire tagRendering if the answer is known (not applied on the question).\nThis is only for advanced users", - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "string" - } - ] - }, - "description": { - "description": "A human-readable text explaining what this tagRendering does", - "anyOf": [ - { - "$ref": "#/definitions/Record" - }, - { - "type": "string" - } - ] - }, "render": { - "description": "Renders this value. Note that \"{key}\"-parts are substituted by the corresponding values of the element.\nIf neither 'textFieldQuestion' nor 'mappings' are defined, this text is simply shown as default value.\n\nNote 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
`\ntype: rendered", + "description": "question: What text should be rendered?\n\nThis piece of text will be shown in the infobox.\nIn this text, values within braces (such as {braced(key)}) are replaced by the corresponding `value` in the object.\nFor example, if the object contains tags `amenity=school; name=Windy Hill School`, the render string `This school is named {name}` will be shown to the user as `This school is named Windy Hill School`\n\nThis text will be shown if:\n- there is no mapping which matches (or there are no matches)\n- no question, no mappings and no 'freeform' is set\n\nNote that this is a HTML-interpreted value, so you can add links as e.g. '<a href='{website}'>{website}</a>' or include images such as `This is of type A <br><img src='typeA-icon.svg' />`\ntype: rendered\nifunset: no text is rendered if no predefined options match", "anyOf": [ { "$ref": "#/definitions/Record" @@ -512,16 +564,38 @@ } ] }, - "condition": { - "description": "Only show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", + "icon": { + "description": "question: what icon should be shown next to the 'render' value?\nAn icon shown next to the rendering; typically shown pretty small\nThis is only shown next to the \"render\" value\nType: icon\nifunset: do not show an icon next to the \"render\"-value", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "type": "object", + "properties": { + "path": { + "description": "The path to the icon\nType: icon", + "type": "string" + }, + "class": { + "description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-', so defining your own in combination with a custom CSS is possible (but discouraged)", + "type": "string" + } + }, + "required": [ + "path" + ] }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "type": "string" + } + ] + }, + "condition": { + "description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or ask the question if unkown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", + "anyOf": [ + { + "$ref": "#/definitions/{and:TagConfigJson[];}" + }, + { + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -529,15 +603,13 @@ ] }, "metacondition": { - "description": "If set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", + "description": "question: When should this item be shown (including special conditions)?\ntype: tag\n\nIf set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -545,17 +617,14 @@ ] }, "freeform": { - "description": "Allow freeform text input from the user", + "description": "question: Should a freeform text field be shown?\nAllow freeform text input from the user\nifunset: Do not add a freeform text field", "type": "object", "properties": { "key": { - "description": "If this key is present, then 'render' is used to display the value.\nIf this is undefined, the rendering is _always_ shown", + "description": "What attribute should be filled out\nIf this key is present in the feature, then 'render' is used to display the value.\nIf this is undefined, the rendering is _always_ shown", "type": "string" } - }, - "required": [ - "key" - ] + } }, "mappings": { "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", @@ -565,10 +634,10 @@ "properties": { "if": { "$ref": "#/definitions/TagConfigJson", - "description": "If this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}" + "description": "question: When should this single mapping match?\n\nIf this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}" }, "then": { - "description": "If the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option\nType: rendered", + "description": "question: What text should be shown?\n\nIf the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option\nType: rendered", "anyOf": [ { "$ref": "#/definitions/Record" @@ -579,7 +648,7 @@ ] }, "icon": { - "description": "An icon supporting this mapping; typically shown pretty small\nType: icon", + "description": "question: What icon should be added to this mapping?\nifunset: Do not show an extra icon next to the render value\n\nAn icon supporting this mapping; typically shown pretty small.\nThis can be used to show a 'phone'-icon next to the phone number\ninline: {icon}\nType: icon", "anyOf": [ { "type": "object", @@ -608,6 +677,21 @@ "then" ] } + }, + "description": { + "description": "A human-readable text explaining what this tagRendering does.\nMostly used for the shared tagrenderings", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] + }, + "classes": { + "description": "question: What css-classes should be applied to showing this attribute?\n\nA list of css-classes to apply to the entire tagRendering.\nThese classes are applied in 'answer'-mode, not in question mode\nThis is only for advanced users.\n\nValues are split on ` ` (space)", + "type": "string" } }, "additionalProperties": false @@ -621,13 +705,21 @@ "properties": { "if": { "$ref": "#/definitions/TagConfigJson", - "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation" + "description": "question: What tags should be matched to show this option?\n\nIf in 'question'-mode and the contributor selects this option, these tags will be applied to the object" }, "then": { - "description": "Shown if the 'if is fulfilled\nType: rendered" + "description": "Question: What corresponding text should be shown?\nShown if the `if` is fulfilled\nType: rendered", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] }, "icon": { - "description": "An extra icon supporting the choice\nType: icon", + "description": "question: What icon should be shown next to this mapping?\n\nThis icon will only be shown if the value is known, it is not displayed in the options (but might be in the future)\n\nifunset: Show no icon\nType: icon", "anyOf": [ { "type": "object", @@ -651,15 +743,13 @@ ] }, "hideInAnswer": { - "description": "In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n\n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}", + "description": "question: Under what circumstances should this mapping be hidden from the possibilities a contributor can pick?\niftrue: Never show this mapping as option to pick\nifunset: Always show this mapping as option to pick\ntype: tag\n\nIn some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n\n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": [ @@ -670,15 +760,13 @@ ] }, "ifnot": { - "description": "Only applicable if 'multiAnswer' is set.\nThis is for situations such as:\n`accepts:coins=no` where one can select all the possible payment methods. However, we want to make explicit that some options _were not_ selected.\nThis can be done with `ifnot`\nNote that we can not explicitly render this negative case to the user, we cannot show `does _not_ accept coins`.\nIf this is important to your usecase, consider using multiple radiobutton-fields without `multiAnswer`", + "description": "question: What tags should be applied if this mapping is _not_ chosen?\n\nOnly applicable if 'multiAnswer' is set.\nThis is for situations such as:\n`accepts:coins=no` where one can select all the possible payment methods. However, we want to make explicit that some options _were not_ selected.\nThis can be done with `ifnot`\nNote that we can not explicitly render this negative case to the user, we cannot show `does _not_ accept coins`.\nIf this is important to your usecase, consider using multiple radiobutton-fields without `multiAnswer`\n\nifunset: Do not apply a tag if a different mapping is chosen.", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -686,26 +774,24 @@ ] }, "addExtraTags": { - "description": "If chosen as answer, these tags will be applied as well onto the object.\nNot compatible with multiAnswer.\n\nThis can be used e.g. to erase other keys which indicate the 'not' value:\n```json\n{\n \"if\": \"crossing:marking=rainbow\",\n \"then\": \"This is a rainbow crossing\",\n \"addExtraTags\": \"not:crossing:marking=\"\n}\n```", + "description": "question: What extra tags should be added to the object if this object is chosen?\ntype: simple_tag\n\nIf chosen as answer, these tags will be applied onto the object, together with the tags from the `if`\nNot compatible with multiAnswer.\n\nThis can be used e.g. to erase other keys which indicate the 'not' value:\n```json\n{\n \"if\": \"crossing:marking=rainbow\",\n \"then\": \"This is a rainbow crossing\",\n \"addExtraTags\": [\"not:crossing:marking=\"]\n}\n```", "type": "array", "items": { "type": "string" } }, "searchTerms": { - "description": "If there are many options, the mappings-radiobuttons will be replaced by an element with a searchfunction\n\nSearchterms (per language) allow to easily find an option if there are many options", + "description": "question: If there are many options, what search terms match too?\nIf there are many options, the mappings-radiobuttons will be replaced by an element with a searchfunction\n\nSearchterms (per language) allow to easily find an option if there are many options\ngroup: hidden", "$ref": "#/definitions/Record" }, "priorityIf": { - "description": "If the searchable selector is picked, mappings with this item will have priority and show up even if the others are hidden\nUse this sparingly", + "description": "If the searchable selector is picked, mappings with this item will have priority and show up even if the others are hidden\nUse this sparingly\ngroup: hidden", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -713,7 +799,7 @@ ] }, "#": { - "description": "Used for comments or to disable a validation\n\nignore-image-in-then: normally, a `then`-clause is not allowed to have an `img`-html-element as icons are preferred. In some cases (most notably title-icons), this is allowed", + "description": "Used for comments or to disable a validation\n\ngroup: hidden\nignore-image-in-then: normally, a `then`-clause is not allowed to have an `img`-html-element as icons are preferred. In some cases (most notably title-icons), this is allowed", "type": "string" } }, @@ -732,38 +818,34 @@ "type": "object", "properties": { "location": { - "description": "All the locations that this point should be rendered at.\nPossible values are:\n- `point`: only renders points at their location\n- `centroid`: show a symbol at the centerpoint of a (multi)Linestring and (multi)polygon. Points will _not_ be rendered with this\n- `projected_centerpoint`: Only on (multi)linestrings: calculate the centerpoint and snap it to the way\n- `start` and `end`: only on linestrings: add a point to the first/last coordinate of the LineString", + "description": "question: At what location should this icon be shown?\nmultianswer: true\nsuggestions: return [{if: \"value=point\",then: \"Show an icon for point (node) objects\"},{if: \"value=centroid\",then: \"Show an icon for line or polygon (way) objects at their centroid location\"}, {if: \"value=start\",then: \"Show an icon for line (way) objects at the start\"},{if: \"value=end\",then: \"Show an icon for line (way) object at the end\"},{if: \"value=projected_centerpoint\",then: \"Show an icon for line (way) object near the centroid location, but moved onto the line\"}]", "type": "array", "items": { "type": "string" } }, - "icon": { - "description": "The icon for an element.\nNote that this also doubles as the icon for this layer (rendered with the overpass-tags) ánd the icon in the presets.\n\nThe result of the icon is rendered as follows:\nthe resulting string is interpreted as a _list_ of items, separated by \";\". The bottommost layer is the first layer.\nAs a result, on could use a generic pin, then overlay it with a specific icon.\nTo make things even more practical, one can use all SVG's from the folder \"assets/svg\" and _substitute the color_ in it.\nE.g. to draw a red pin, use \"pin:#f00\", to have a green circle with your icon on top, use `circle:#0f0;`\n\nType: icon", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] + "marker": { + "description": "The marker for an element.\nNote that this also defines the icon for this layer (rendered with the overpass-tags) and the icon in the presets.\n\nThe result of the icon is rendered as follows:\n- The first icon is rendered on the map\n- The second entry is overlayed on top of it\n- ...\n\nAs a result, on could use a generic icon (`pin`, `circle`, `square`) with a color, then overlay it with a specific icon.", + "type": "array", + "items": { + "$ref": "#/definitions/IconConfigJson" + } }, "iconBadges": { - "description": "A list of extra badges to show next to the icon as small badge\nThey will be added as a 25% height icon at the bottom right of the icon, with all the badges in a flex layout.\n\nNote: strings are interpreted as icons, so layering and substituting is supported. You can use `circle:white;./my_icon.svg` to add a background circle", + "description": "A list of extra badges to show next to the icon as small badge\nThey will be added as a 25% height icon at the bottom right of the icon, with all the badges in a flex layout.\n\nNote: strings are interpreted as icons, so layering and substituting is supported. You can use `circle:white;./my_icon.svg` to add a background circle\ngroup: hidden", "type": "array", "items": { "type": "object", "properties": { "if": { "$ref": "#/definitions/TagConfigJson", - "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation" + "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation\n\ntype: tag" }, "then": { "description": "Badge to show\nType: icon", "anyOf": [ { - "$ref": "#/definitions/TagRenderingConfigJson" + "$ref": "#/definitions/MinimalTagRenderingConfigJson" }, { "type": "string" @@ -778,7 +860,18 @@ } }, "iconSize": { - "description": "A string containing \"width,height\" or \"width,height,anchorpoint\" where anchorpoint is any of 'center', 'top', 'bottom', 'left', 'right', 'bottomleft','topright', ...\nDefault is '40,40,center'", + "description": "question: What size should the marker be on the map?\nA string containing \",\" in pixels\nifunset: Use the default size (40,40 px)", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "anchor": { + "description": "question: What is the anchorpoint of the icon?\n\nThis matches the geographical point with a location on the icon.\n\nifunset: Use MapComplete-default (center)\nsuggestions: return [{if: \"value=center\", then: \"Place the center of the icon on the geographical location\"},{if: \"value=top\", then: \"Place the top of the icon on the geographical location\"},{if: \"value=bottom\", then: \"Place the bottom of the icon on the geographical location\"},{if: \"value=left\", then: \"Place the left of the icon on the geographical location\"},{if: \"value=right\", then: \"Place the right of the icon on the geographical location\"}]", "anyOf": [ { "$ref": "#/definitions/TagRenderingConfigJson" @@ -789,7 +882,7 @@ ] }, "rotation": { - "description": "The rotation of an icon, useful for e.g. directions.\nUsage: 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)``", + "description": "question: What rotation should be applied on the icon?\nThis is mostly useful for items that face a specific direction, such as surveillance cameras\nThis is interpreted as css property for 'rotate', thus has to end with 'deg', e.g. `90deg`, `{direction}deg`, `calc(90deg - {camera:direction}deg)``\nifunset: Do not rotate", "anyOf": [ { "$ref": "#/definitions/TagRenderingConfigJson" @@ -800,29 +893,7 @@ ] }, "label": { - "description": "A HTML-fragment that is shown below the icon, for example:\n
{name}
\n\nIf the icon is undefined, then the label is shown in the center of the feature.\nNote that, if the wayhandling hides the icon then no label is shown as well.", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - }, - "css": { - "description": "A snippet of css code which is applied onto the container of the entire marker", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - }, - "cssClasses": { - "description": "A snippet of css-classes which are applied onto the container of the entire marker. They can be space-separated", + "description": "question: What label should be shown beneath the marker?\nFor example: `<div style=\"background: white\">{name}</div>`\n\nIf the icon is undefined, then the label is shown in the center of the feature.\ntypes: Dynamic value based on the attributes ; string\ninline: Always show label {value} beneath the marker\nifunset: Do not show a label beneath the marker", "anyOf": [ { "$ref": "#/definitions/TagRenderingConfigJson" @@ -833,7 +904,7 @@ ] }, "labelCss": { - "description": "Css that is applied onto the label", + "description": "question: What CSS should be applied to the label?\nYou can set the css-properties here, e.g. `background: red; font-size: 12px; `\ninline: Apply CSS-style {value} to the label\ntypes: Dynamic value ; string\nifunset: Do not apply extra CSS-labels to the label\ngroup: expert", "anyOf": [ { "$ref": "#/definitions/TagRenderingConfigJson" @@ -844,7 +915,29 @@ ] }, "labelCssClasses": { - "description": "Css classes that are applied onto the label; can be space-separated", + "description": "question: Which CSS-classes should be applied to the label?\n\nThe classes should be separated by a space (` `)\nYou can use most Tailwind-css classes, see https://tailwindcss.com/ for more information\nFor example: `center bg-gray-500 mx-2 my-1 rounded-full`\ninline: Apply CSS-classes {value} to the label\ntypes: Dynamic value ; string\nifunset: Do not apply extra CSS-classes to the label\nsuggestions: return [{if: \"value=bg-white rounded px-2\", then: \"Draw on a white background\"}]", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "css": { + "description": "question: What CSS should be applied to the entire marker?\nYou can set the css-properties here, e.g. `background: red; font-size: 12px; `\nThis will be applied to the _container_ containing both the marker and the label\ninline: Apply CSS-style {value} to the _entire marker_\ntypes: Dynamic value ; string\nifunset: Do not apply extra CSS element to the entire marker\ngroup: expert", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "cssClasses": { + "description": "question: Which CSS-classes should be applied to the entire marker?\nThis will be applied to the _container_ containing both the marker and the label\n\nThe classes should be separated by a space (` `)\nYou can use most Tailwind-css classes, see https://tailwindcss.com/ for more information\nFor example: `center bg-gray-500 mx-2 my-1 rounded-full`\ninline: Apply CSS-classes {value} to the entire container\nifunset: Do not apply extra CSS-classes to the label\ntypes: Dynamic value ; string\nifunset: Do not apply extra CSS-classes to the entire marker\ngroup: expert", "anyOf": [ { "$ref": "#/definitions/TagRenderingConfigJson" @@ -855,7 +948,7 @@ ] }, "pitchAlignment": { - "description": "If the map is pitched, the marker will stay parallel to the screen.\nSet to 'map' if you want to put it flattened on the map", + "description": "question: If the map is pitched, should the icon stay parallel to the screen or to the groundplane?\nsuggestions: return [{if: \"value=canvas\", then: \"The icon will stay upward and not be transformed as if it sticks to the screen\"}, {if: \"value=map\", then: \"The icon will be transformed as if it were painted onto the ground. (Automatically sets rotationAlignment)\"}]\ngroup: expert", "anyOf": [ { "$ref": "#/definitions/TagRenderingConfigJson" @@ -870,7 +963,7 @@ ] }, "rotationAlignment": { - "description": "If the map is rotated, the icon will still point to the north if no rotation was applied", + "description": "question: Should the icon be rotated if the map is rotated?\nifunset: Do not rotate or tilt icons. Always keep the icons straight\nsuggestions: return [{if: \"value=canvas\", then: \"Never rotate the icon\"}, {if: \"value=map\", then: \"If the map is rotated, rotate the icon as well. This gives the impression of an icon that floats perpendicular above the ground.\"}]\ngroup: expert", "anyOf": [ { "$ref": "#/definitions/TagRenderingConfigJson" @@ -895,10 +988,10 @@ "type": "object", "properties": { "color": { - "description": "The color for way-elements and SVG-elements.\nIf the value starts with \"--\", the style of the body element will be queried for the corresponding variable instead", + "description": "question: What color should lines be drawn in?\n\nFor an area, this will be the colour of the outside line.\nIf the value starts with \"--\", the style of the body element will be queried for the corresponding variable instead\n\ntypes: dynamic value ; string\ntitle: Line Colour\ninline: The line colour always is {value}\ntype: color", "anyOf": [ { - "$ref": "#/definitions/TagRenderingConfigJson" + "$ref": "#/definitions/MinimalTagRenderingConfigJson" }, { "type": "string" @@ -906,10 +999,10 @@ ] }, "width": { - "description": "The stroke-width for way-elements", + "description": "question: How wide should the line be?\nThe stroke-width for way-elements\n\ntypes: dynamic value ; string\ntitle: Line width\ninline: The line width is {value} pixels\ntype: pnat\nifunset: Use the default-linewidth of 7 pixels", "anyOf": [ { - "$ref": "#/definitions/TagRenderingConfigJson" + "$ref": "#/definitions/MinimalTagRenderingConfigJson" }, { "type": [ @@ -920,47 +1013,25 @@ ] }, "dashArray": { - "description": "A dasharray, e.g. \"5 6\"\nThe dasharray defines 'pixels of line, pixels of gap, pixels of line, pixels of gap',\nDefault value: \"\" (empty string == full line)", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] + "description": "question: Should a dasharray be used to render the lines?\nThe dasharray defines 'pixels of line, pixels of gap, pixels of line, pixels of gap, ...'. For example, `5 6` will be 5 pixels of line followed by a 6 pixel gap.\nCannot be a dynamic property due to a mapbox limitation\nifunset: Ways are rendered with a full line", + "type": "string" }, "lineCap": { - "description": "The form at the end of a line", + "description": "question: What form should the line-ending have?\nsuggestions: return [{if:\"value=round\",then:\"Round endings\"}, {if: \"value=square\", then: \"square endings\"}, {if: \"value=butt\", then: \"no ending (square ending at the end, without padding)\"}]\ntypes: dynamic value ; string\ntitle: Line Cap\nifunset: Use the default value (round ending)", "anyOf": [ { - "$ref": "#/definitions/TagRenderingConfigJson" + "$ref": "#/definitions/MinimalTagRenderingConfigJson" }, { "type": "string" } ] }, - "fill": { - "description": "Whether or not to fill polygons", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "enum": [ - "no", - "yes" - ], - "type": "string" - } - ] - }, "fillColor": { - "description": "The color to fill a polygon with.\nIf undefined, this will be slightly more opaque version of the stroke line", + "description": "question: What colour should be used as fill colour for polygons?\nifunset: The polygon fill colour will be a more transparent version of the stroke colour\nsuggestions: return [{if: \"value=#00000000\", then: \"Use a transparent fill (only render the outline)\"}]\ninline: The fill colour is {value}\ntypes: dynamic value ; string\ntype: color", "anyOf": [ { - "$ref": "#/definitions/TagRenderingConfigJson" + "$ref": "#/definitions/MinimalTagRenderingConfigJson" }, { "type": "string" @@ -968,10 +1039,10 @@ ] }, "offset": { - "description": "The number of pixels this line should be moved.\nUse a positive numbe to move to the right, a negative to move to the left (left/right as defined by the drawing direction of the line).\n\nIMPORTANT: MapComplete will already normalize 'key:both:property' and 'key:both' into the corresponding 'key:left' and 'key:right' tagging (same for 'sidewalk=left/right/both' which is rewritten to 'sidewalk:left' and 'sidewalk:right')\nThis simplifies programming. Refer to the CalculatedTags.md-documentation for more details", + "description": "question: Should the lines be moved (offsetted) with a number of pixels against the geographical lines?\nThe number of pixels this line should be moved.\nUse a positive number to move to the right in the drawing direction or a negative to move to the left (left/right as defined by the drawing direction of the line).\n\nIMPORTANT: MapComplete will already normalize 'key:both:property' and 'key:both' into the corresponding 'key:left' and 'key:right' tagging (same for 'sidewalk=left/right/both' which is rewritten to 'sidewalk:left' and 'sidewalk:right')\nThis simplifies programming. Refer to the CalculatedTags.md-documentation for more details\nifunset: don't offset lines on the map\ninline: Pixel offset by {value} pixels\ntypes: dynamic value ; number\ntype: int", "anyOf": [ { - "$ref": "#/definitions/TagRenderingConfigJson" + "$ref": "#/definitions/MinimalTagRenderingConfigJson" }, { "type": "number" @@ -981,67 +1052,85 @@ }, "additionalProperties": false }, - "default": { - "description": "Rewrites and multiplies the given renderings of type T.\n\nThis can be used for introducing many similar questions automatically,\nwhich also makes translations easier.\n\n(Note that the key does _not_ need to be wrapped in {}.\nHowever, we recommend to use them if the key is used in a translation, as missing keys will be picked up and warned for by the translation scripts)\n\nFor example:\n\n```\n{\n rewrite: {\n sourceString: [\"key\", \"a|b|c\"],\n into: [\n [\"X\", 0]\n [\"Y\", 1],\n [\"Z\", 2]\n ],\n renderings: [{\n \"key\":\"a|b|c\"\n }]\n }\n}\n```\nwill result in _three_ copies (as the values to rewrite into have three values, namely:\n\n[\n {\n # The first pair: key --> X, a|b|c --> 0\n \"X\": 0\n },\n {\n \"Y\": 1\n },\n {\n \"Z\": 2\n }\n\n]", + "QuestionableTagRenderingConfigJson": { + "description": "A QuestionableTagRenderingConfigJson is a single piece of code which converts one ore more tags into a HTML-snippet.\nIf the desired tags are missing and a question is defined, a question will be shown instead.", "type": "object", "properties": { - "rewrite": { + "id": { + "type": "string" + }, + "mappings": { + "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes\n\nquestion: What are common options?", + "type": "array", + "items": { + "$ref": "#/definitions/MappingConfigJson" + } + }, + "multiAnswer": { + "description": "If true, use checkboxes instead of radio buttons when asking the question\n\nquestion: Should a contributor be allowed to select multiple mappings?\n\niftrue: allow to select multiple mappings\niffalse: only allow to select a single mapping\nifunset: only allow to select a single mapping", + "type": "boolean" + }, + "freeform": { + "description": "Allow freeform text input from the user", "type": "object", "properties": { - "sourceString": { + "key": { + "description": "question: What is the name of the attribute that should be written to?\nThis is the OpenStreetMap-key that that value will be written to\nifunset: do not offer a freeform textfield as answer option", + "type": "string" + }, + "type": { + "description": "question: What is the input type?\nThe type of the text-field, e.g. 'string', 'nat', 'float', 'date',...\nSee Docs/SpecialInputElements.md and UI/Input/ValidatedTextField.ts for supported values\nifunset: use an unconstrained string as input (default)\nsuggestions: return validators.AllValidators.filter(type => !type.isMeta).map((type) => ({if: \"value=\"+type.name, then: \"\"+type.name+\" \"+type.explanation.split(\"\\n\")[0]}))", + "type": "string" + }, + "placeholder": { + "description": "question: What placeholder text should be shown in the input-element if there is no input?\nA (translated) text that is shown (as gray text) within the textfield\ntype: translation\ngroup: expert", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] + }, + "helperArgs": { + "description": "Extra parameters to initialize the input helper arguments.\nFor semantics, see the 'SpecialInputElements.md'\ngroup: expert", + "type": "array", + "items": {} + }, + "addExtraTags": { + "description": "If a value is added with the textfield, these extra tag is addded.\nUseful to add a 'fixme=freeform textfield used - to be checked'\ngroup: expert", "type": "array", "items": { "type": "string" } }, - "into": { - "type": "array", - "items": { - "type": "array", - "items": {} - } + "inline": { + "description": "question: Show the freeform as box within the question?\nInstead of showing a full-width text field, the text field will be shown within the rendering of the question.\n\nThis combines badly with special input elements, as it'll distort the layout.\nifunset: show the freeform input field full-width\niftrue: show the freeform input field as a small field within the question\ngroup: expert", + "type": "boolean" + }, + "default": { + "description": "question: What value should be entered in the text field if no value is set?\nThis can help people to quickly enter the most common option\nifunset: do not prefill the textfield\ngroup: expert", + "type": "string" + }, + "invalidValues": { + "description": "question: What values of the freeform key should be interpreted as 'unknown'?\nFor example, if a feature has `shop=yes`, the question 'what type of shop is this?' should still asked\nifunset: The question will be considered answered if any value is set for the key\ngroup: expert", + "anyOf": [ + { + "$ref": "#/definitions/{and:TagConfigJson[];}" + }, + { + "$ref": "#/definitions/{or:TagConfigJson[];}" + }, + { + "type": "string" + } + ] } - }, - "required": [ - "into", - "sourceString" - ] + } }, - "renderings": { - "anyOf": [ - { - "$ref": "#/definitions/default_4" - }, - { - "$ref": "#/definitions/default_5" - }, - { - "type": "array", - "items": { - "$ref": "#/definitions/default_5" - } - }, - { - "type": "array", - "items": { - "$ref": "#/definitions/default_4" - } - } - ] - } - }, - "required": [ - "renderings", - "rewrite" - ], - "additionalProperties": false - }, - "QuestionableTagRenderingConfigJson": { - "description": "A QuestionableTagRenderingConfigJson is a single piece of code which converts one ore more tags into a HTML-snippet.\nIf the desired tags are missing and a question is defined, a question will be shown instead.", - "type": "object", - "properties": { "question": { - "description": "If it turns out that this tagRendering doesn't match _any_ value, then we show this question.\nIf undefined, the question is never asked and this tagrendering is read-only", + "description": "question: What question should be shown to the contributor?\n\nA question is presented ot the user if no mapping matches and the 'freeform' key is not set as well.\n\nifunset: This tagrendering will be shown if it is known, but cannot be edited by the contributor, effectively resutling in a read-only rendering", "anyOf": [ { "$ref": "#/definitions/Record" @@ -1052,7 +1141,7 @@ ] }, "questionHint": { - "description": "A hint which is shown in subtle text under the question.\nThis can give some extra information on what the answer should ook like", + "description": "question: Should some extra information be shown to the contributor, alongside the question?\nThis hint is shown in subtle text under the question.\nThis can give some extra information on what the answer should ook like\nifunset: No extra hint is given", "anyOf": [ { "$ref": "#/definitions/Record" @@ -1062,94 +1151,15 @@ } ] }, - "freeform": { - "description": "Allow freeform text input from the user", - "type": "object", - "properties": { - "key": { - "type": "string" - }, - "type": { - "description": "The type of the text-field, e.g. 'string', 'nat', 'float', 'date',...\nSee Docs/SpecialInputElements.md and UI/Input/ValidatedTextField.ts for supported values", - "type": "string" - }, - "placeholder": { - "description": "A (translated) text that is shown (as gray text) within the textfield" - }, - "helperArgs": { - "description": "Extra parameters to initialize the input helper arguments.\nFor semantics, see the 'SpecialInputElements.md'", - "type": "array", - "items": {} - }, - "addExtraTags": { - "description": "If a value is added with the textfield, these extra tag is addded.\nUseful to add a 'fixme=freeform textfield used - to be checked'", - "type": "array", - "items": { - "type": "string" - } - }, - "inline": { - "description": "When set, influences the way a question is asked.\nInstead of showing a full-width text field, the text field will be shown within the rendering of the question.\n\nThis combines badly with special input elements, as it'll distort the layout.\nNote that this will be set automatically if no special elements are present.", - "type": "boolean" - }, - "default": { - "description": "default value to enter if no previous tagging is present.\nNormally undefined (aka do not enter anything)", - "type": "string" - } - }, - "required": [ - "key" - ] - }, - "multiAnswer": { - "description": "If true, use checkboxes instead of radio buttons when asking the question", - "type": "boolean" - }, - "mappings": { - "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", - "type": "array", - "items": { - "$ref": "#/definitions/MappingConfigJson" - } - }, - "id": { - "description": "The id of the tagrendering, should be an unique string.\nUsed to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise.\n\nUse 'questions' to trigger the question box of this group (if a group is defined)", - "type": "string" - }, "labels": { - "description": "A list of labels. These are strings that are used for various purposes, e.g. to filter them away", + "description": "A list of labels. These are strings that are used for various purposes, e.g. to only include a subset of the tagRenderings when reusing a layer", "type": "array", "items": { "type": "string" } }, - "classes": { - "description": "A list of css-classes to apply to the entire tagRendering if the answer is known (not applied on the question).\nThis is only for advanced users", - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "string" - } - ] - }, - "description": { - "description": "A human-readable text explaining what this tagRendering does", - "anyOf": [ - { - "$ref": "#/definitions/Record" - }, - { - "type": "string" - } - ] - }, "render": { - "description": "Renders this value. Note that \"{key}\"-parts are substituted by the corresponding values of the element.\nIf neither 'textFieldQuestion' nor 'mappings' are defined, this text is simply shown as default value.\n\nNote 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
`\ntype: rendered", + "description": "question: What text should be rendered?\n\nThis piece of text will be shown in the infobox.\nIn this text, values within braces (such as {braced(key)}) are replaced by the corresponding `value` in the object.\nFor example, if the object contains tags `amenity=school; name=Windy Hill School`, the render string `This school is named {name}` will be shown to the user as `This school is named Windy Hill School`\n\nThis text will be shown if:\n- there is no mapping which matches (or there are no matches)\n- no question, no mappings and no 'freeform' is set\n\nNote that this is a HTML-interpreted value, so you can add links as e.g. '<a href='{website}'>{website}</a>' or include images such as `This is of type A <br><img src='typeA-icon.svg' />`\ntype: rendered\nifunset: no text is rendered if no predefined options match", "anyOf": [ { "$ref": "#/definitions/Record" @@ -1185,16 +1195,38 @@ } ] }, - "condition": { - "description": "Only show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", + "icon": { + "description": "question: what icon should be shown next to the 'render' value?\nAn icon shown next to the rendering; typically shown pretty small\nThis is only shown next to the \"render\" value\nType: icon\nifunset: do not show an icon next to the \"render\"-value", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "type": "object", + "properties": { + "path": { + "description": "The path to the icon\nType: icon", + "type": "string" + }, + "class": { + "description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-', so defining your own in combination with a custom CSS is possible (but discouraged)", + "type": "string" + } + }, + "required": [ + "path" + ] }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "type": "string" + } + ] + }, + "condition": { + "description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or ask the question if unkown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", + "anyOf": [ + { + "$ref": "#/definitions/{and:TagConfigJson[];}" + }, + { + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -1202,29 +1234,118 @@ ] }, "metacondition": { - "description": "If set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", + "description": "question: When should this item be shown (including special conditions)?\ntype: tag\n\nIf set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" } ] + }, + "description": { + "description": "A human-readable text explaining what this tagRendering does.\nMostly used for the shared tagrenderings", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] + }, + "classes": { + "description": "question: What css-classes should be applied to showing this attribute?\n\nA list of css-classes to apply to the entire tagRendering.\nThese classes are applied in 'answer'-mode, not in question mode\nThis is only for advanced users.\n\nValues are split on ` ` (space)", + "type": "string" } }, + "required": [ + "id" + ], "additionalProperties": false }, "Partial": { "type": "object", "properties": { + "id": { + "type": "string" + }, + "mappings": { + "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes\n\nquestion: What are common options?", + "type": "array", + "items": { + "$ref": "#/definitions/MappingConfigJson" + } + }, + "multiAnswer": { + "description": "If true, use checkboxes instead of radio buttons when asking the question\n\nquestion: Should a contributor be allowed to select multiple mappings?\n\niftrue: allow to select multiple mappings\niffalse: only allow to select a single mapping\nifunset: only allow to select a single mapping", + "type": "boolean" + }, + "freeform": { + "description": "Allow freeform text input from the user", + "type": "object", + "properties": { + "key": { + "description": "question: What is the name of the attribute that should be written to?\nThis is the OpenStreetMap-key that that value will be written to\nifunset: do not offer a freeform textfield as answer option", + "type": "string" + }, + "type": { + "description": "question: What is the input type?\nThe type of the text-field, e.g. 'string', 'nat', 'float', 'date',...\nSee Docs/SpecialInputElements.md and UI/Input/ValidatedTextField.ts for supported values\nifunset: use an unconstrained string as input (default)\nsuggestions: return validators.AllValidators.filter(type => !type.isMeta).map((type) => ({if: \"value=\"+type.name, then: \"\"+type.name+\" \"+type.explanation.split(\"\\n\")[0]}))", + "type": "string" + }, + "placeholder": { + "description": "question: What placeholder text should be shown in the input-element if there is no input?\nA (translated) text that is shown (as gray text) within the textfield\ntype: translation\ngroup: expert", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] + }, + "helperArgs": { + "description": "Extra parameters to initialize the input helper arguments.\nFor semantics, see the 'SpecialInputElements.md'\ngroup: expert", + "type": "array", + "items": {} + }, + "addExtraTags": { + "description": "If a value is added with the textfield, these extra tag is addded.\nUseful to add a 'fixme=freeform textfield used - to be checked'\ngroup: expert", + "type": "array", + "items": { + "type": "string" + } + }, + "inline": { + "description": "question: Show the freeform as box within the question?\nInstead of showing a full-width text field, the text field will be shown within the rendering of the question.\n\nThis combines badly with special input elements, as it'll distort the layout.\nifunset: show the freeform input field full-width\niftrue: show the freeform input field as a small field within the question\ngroup: expert", + "type": "boolean" + }, + "default": { + "description": "question: What value should be entered in the text field if no value is set?\nThis can help people to quickly enter the most common option\nifunset: do not prefill the textfield\ngroup: expert", + "type": "string" + }, + "invalidValues": { + "description": "question: What values of the freeform key should be interpreted as 'unknown'?\nFor example, if a feature has `shop=yes`, the question 'what type of shop is this?' should still asked\nifunset: The question will be considered answered if any value is set for the key\ngroup: expert", + "anyOf": [ + { + "$ref": "#/definitions/{and:TagConfigJson[];}" + }, + { + "$ref": "#/definitions/{or:TagConfigJson[];}" + }, + { + "type": "string" + } + ] + } + } + }, "question": { - "description": "If it turns out that this tagRendering doesn't match _any_ value, then we show this question.\nIf undefined, the question is never asked and this tagrendering is read-only", + "description": "question: What question should be shown to the contributor?\n\nA question is presented ot the user if no mapping matches and the 'freeform' key is not set as well.\n\nifunset: This tagrendering will be shown if it is known, but cannot be edited by the contributor, effectively resutling in a read-only rendering", "anyOf": [ { "$ref": "#/definitions/Record" @@ -1235,7 +1356,7 @@ ] }, "questionHint": { - "description": "A hint which is shown in subtle text under the question.\nThis can give some extra information on what the answer should ook like", + "description": "question: Should some extra information be shown to the contributor, alongside the question?\nThis hint is shown in subtle text under the question.\nThis can give some extra information on what the answer should ook like\nifunset: No extra hint is given", "anyOf": [ { "$ref": "#/definitions/Record" @@ -1245,94 +1366,15 @@ } ] }, - "freeform": { - "description": "Allow freeform text input from the user", - "type": "object", - "properties": { - "key": { - "type": "string" - }, - "type": { - "description": "The type of the text-field, e.g. 'string', 'nat', 'float', 'date',...\nSee Docs/SpecialInputElements.md and UI/Input/ValidatedTextField.ts for supported values", - "type": "string" - }, - "placeholder": { - "description": "A (translated) text that is shown (as gray text) within the textfield" - }, - "helperArgs": { - "description": "Extra parameters to initialize the input helper arguments.\nFor semantics, see the 'SpecialInputElements.md'", - "type": "array", - "items": {} - }, - "addExtraTags": { - "description": "If a value is added with the textfield, these extra tag is addded.\nUseful to add a 'fixme=freeform textfield used - to be checked'", - "type": "array", - "items": { - "type": "string" - } - }, - "inline": { - "description": "When set, influences the way a question is asked.\nInstead of showing a full-width text field, the text field will be shown within the rendering of the question.\n\nThis combines badly with special input elements, as it'll distort the layout.\nNote that this will be set automatically if no special elements are present.", - "type": "boolean" - }, - "default": { - "description": "default value to enter if no previous tagging is present.\nNormally undefined (aka do not enter anything)", - "type": "string" - } - }, - "required": [ - "key" - ] - }, - "multiAnswer": { - "description": "If true, use checkboxes instead of radio buttons when asking the question", - "type": "boolean" - }, - "mappings": { - "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", - "type": "array", - "items": { - "$ref": "#/definitions/MappingConfigJson" - } - }, - "id": { - "description": "The id of the tagrendering, should be an unique string.\nUsed to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise.\n\nUse 'questions' to trigger the question box of this group (if a group is defined)", - "type": "string" - }, "labels": { - "description": "A list of labels. These are strings that are used for various purposes, e.g. to filter them away", + "description": "A list of labels. These are strings that are used for various purposes, e.g. to only include a subset of the tagRenderings when reusing a layer", "type": "array", "items": { "type": "string" } }, - "classes": { - "description": "A list of css-classes to apply to the entire tagRendering if the answer is known (not applied on the question).\nThis is only for advanced users", - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "string" - } - ] - }, - "description": { - "description": "A human-readable text explaining what this tagRendering does", - "anyOf": [ - { - "$ref": "#/definitions/Record" - }, - { - "type": "string" - } - ] - }, "render": { - "description": "Renders this value. Note that \"{key}\"-parts are substituted by the corresponding values of the element.\nIf neither 'textFieldQuestion' nor 'mappings' are defined, this text is simply shown as default value.\n\nNote 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
`\ntype: rendered", + "description": "question: What text should be rendered?\n\nThis piece of text will be shown in the infobox.\nIn this text, values within braces (such as {braced(key)}) are replaced by the corresponding `value` in the object.\nFor example, if the object contains tags `amenity=school; name=Windy Hill School`, the render string `This school is named {name}` will be shown to the user as `This school is named Windy Hill School`\n\nThis text will be shown if:\n- there is no mapping which matches (or there are no matches)\n- no question, no mappings and no 'freeform' is set\n\nNote that this is a HTML-interpreted value, so you can add links as e.g. '<a href='{website}'>{website}</a>' or include images such as `This is of type A <br><img src='typeA-icon.svg' />`\ntype: rendered\nifunset: no text is rendered if no predefined options match", "anyOf": [ { "$ref": "#/definitions/Record" @@ -1368,16 +1410,38 @@ } ] }, - "condition": { - "description": "Only show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", + "icon": { + "description": "question: what icon should be shown next to the 'render' value?\nAn icon shown next to the rendering; typically shown pretty small\nThis is only shown next to the \"render\" value\nType: icon\nifunset: do not show an icon next to the \"render\"-value", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "type": "object", + "properties": { + "path": { + "description": "The path to the icon\nType: icon", + "type": "string" + }, + "class": { + "description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-', so defining your own in combination with a custom CSS is possible (but discouraged)", + "type": "string" + } + }, + "required": [ + "path" + ] }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "type": "string" + } + ] + }, + "condition": { + "description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or ask the question if unkown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", + "anyOf": [ + { + "$ref": "#/definitions/{and:TagConfigJson[];}" + }, + { + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -1385,20 +1449,33 @@ ] }, "metacondition": { - "description": "If set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", + "description": "question: When should this item be shown (including special conditions)?\ntype: tag\n\nIf set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" } ] + }, + "description": { + "description": "A human-readable text explaining what this tagRendering does.\nMostly used for the shared tagrenderings", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] + }, + "classes": { + "description": "question: What css-classes should be applied to showing this attribute?\n\nA list of css-classes to apply to the entire tagRendering.\nThese classes are applied in 'answer'-mode, not in question mode\nThis is only for advanced users.\n\nValues are split on ` ` (space)", + "type": "string" } }, "additionalProperties": false @@ -1479,15 +1556,13 @@ "properties": { "question": {}, "osmTags": { - "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation", + "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation\n\ntype: tag", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -1535,6 +1610,10 @@ "DeleteConfigJson": { "type": "object", "properties": { + "neededChangesets": { + "description": "*\nBy default, the contributor needs 20 previous changesets to delete points edited by others.\nFor some small features (e.g. bicycle racks) this is too much and this requirement can be lowered or dropped, which can be done here.\n\ntype: nat\nquestion: How many changesets must a contributor have before being allowed to delete a point?", + "type": "number" + }, "extraDeleteReasons": { "description": "*\nBy default, three reasons to delete a point are shown:\n\n- The point does not exist anymore\n- The point was a testing point\n- THe point could not be found\n\nHowever, for some layers, there might be different or more specific reasons for deletion which can be user friendly to set, e.g.:\n\n- the shop has closed\n- the climbing route has been closed of for nature conservation reasons\n- ...\n\nThese reasons can be stated here and will be shown in the list of options the user can choose from", "type": "array", @@ -1542,10 +1621,10 @@ "type": "object", "properties": { "explanation": { - "description": "The text that will be shown to the user - translatable" + "description": "The text that will be shown to the user as option for why this point does not exist anymore.\nNote that the most common reasons (test point, does not exist anymore, cannot be found) are already offered by default\n\nquestion: For what extra reason might this feature be removed in real-life?" }, "changesetMessage": { - "description": "The text that will be uploaded into the changeset or will be used in the fixme in case of a soft deletion\nShould be a few words, in english", + "description": "The text that will be uploaded into the changeset or will be used in the fixme in case of a soft deletion\nShould be a few words, in english\n\nquestion: What should be added to the changeset as delete reason?", "type": "string" } }, @@ -1563,10 +1642,10 @@ "properties": { "if": { "$ref": "#/definitions/TagConfigJson", - "description": "The tags that will be given to the object.\nThis must remove tags so that the 'source/osmTags' won't match anymore" + "description": "The tags that will be given to the object.\nThis must remove tags so that the 'source/osmTags' won't match anymore\n\nquestion: What tags should be applied to the object?" }, "then": { - "description": "The human explanation for the options" + "description": "The human explanation for the options\n\nquestion: What text should be shown to the contributor for this reason?" } }, "required": [ @@ -1576,27 +1655,21 @@ } }, "softDeletionTags": { - "description": "In some cases, the contributor is not allowed to delete the current feature (e.g. because it isn't a point, the point is referenced by a relation or the user isn't experienced enough).\nTo still offer the user a 'delete'-option, the feature is retagged with these tags. This is a soft deletion, as the point isn't actually removed from OSM but rather marked as 'disused'\nIt is important that the feature will be retagged in such a way that it won't be picked up by the layer anymore!\n\nExample (note that \"amenity=\" erases the 'amenity'-key alltogether):\n```\n{\n \"and\": [\"disussed:amenity=public_bookcase\", \"amenity=\"]\n}\n```\n\nor (notice the use of the ':='-tag to copy the old value of 'shop=*' into 'disused:shop='):\n```\n{\n \"and\": [\"disused:shop:={shop}\", \"shop=\"]\n}\n```", + "description": "In some cases, the contributor is not allowed to delete the current feature (e.g. because it isn't a point, the point is referenced by a relation or the user isn't experienced enough).\nTo still offer the user a 'delete'-option, the feature is retagged with these tags. This is a soft deletion, as the point isn't actually removed from OSM but rather marked as 'disused'\nIt is important that the feature will be retagged in such a way that it won't be picked up by the layer anymore!\n\nExample (note that \"amenity=\" erases the 'amenity'-key alltogether):\n\n```\n{\n \"and\": [\"disussed:amenity=public_bookcase\", \"amenity=\"]\n}\n```\n\nor (notice the use of the ':='-tag to copy the old value of 'shop=*' into 'disused:shop='):\n\n```\n{\n \"and\": [\"disused:shop:={shop}\", \"shop=\"]\n}\n```\n\nquestion: If a hard delete is not possible, what tags should be applied to mark this feature as deleted?\ntype: tag", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" } ] }, - "neededChangesets": { - "description": "*\nBy default, the contributor needs 20 previous changesets to delete points edited by others.\nFor some small features (e.g. bicycle racks) this is too much and this requirement can be lowered or dropped, which can be done here.", - "type": "number" - }, "omitDefaultDeleteReasons": { - "description": "Set this flag if the default delete reasons should be omitted from the dialog.\nThis requires at least one extraDeleteReason or nonDeleteMapping", + "description": "Set this flag if the default delete reasons should be omitted from the dialog.\nThis requires at least one extraDeleteReason or nonDeleteMapping\n\nquestion: Should the default delete reasons be hidden?\niftrue: Hide the default delete reasons\niffalse: Show the default delete reasons\nifunset: Show the default delete reasons (default behaviour)", "type": "boolean" } }, @@ -1606,11 +1679,11 @@ "type": "object", "properties": { "enableImproveAccuracy": { - "description": "One default reason to move a point is to improve accuracy.\nSet to false to disable this reason", + "description": "question: Should moving this type of point to improve the accuracy be allowed?\niftrue: This point can be moved to improve the accuracy\nifunset: (default) This point can be moved to improve the accuracy\niffalse: This point cannot be moved to improve the accuracy", "type": "boolean" }, "enableRelocation": { - "description": "One default reason to move a point is because it has relocated\nSet to false to disable this reason", + "description": "question: Should moving this type of point due to a relocation be allowed?\n\nThis will erase the attributes `addr:street`, `addr:housenumber`, `addr:city` and `addr:postcode`\n\niftrue: This type of point can be moved due to a relocation (and will remove address information when this is done)\nifunset: (default) This type of point can be moved due to a relocation (and will remove address information when this is done)\niffalse: This type of point cannot be moved due to a relocation", "type": "boolean" } }, @@ -1621,7 +1694,7 @@ "type": "object", "properties": { "appliesToKey": { - "description": "Every key from this list will be normalized.\n\nTo render a united value properly, use", + "description": "Every key from this list will be normalized.\n\nTo render the value properly (with a human readable denomination), use `{canonical()}`", "type": "array", "items": { "type": "string" @@ -1649,6 +1722,847 @@ ], "additionalProperties": false }, + "default": { + "type": "object", + "properties": { + "icon": { + "description": "question: What icon should be shown in the link button?\nifunset: do not show an icon\ntype: icon", + "type": "string" + }, + "text": { + "description": "question: What text should be shown in the link icon?\n\nNote that {lat},{lon},{zoom}, {language} and {theme} will be replaced\n\nifunset: do not show a text", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] + }, + "href": { + "description": "question: if clicked, what webpage should open?\nNote that {lat},{lon},{zoom}, {language} and {theme} will be replaced\n\ntype: url", + "type": "string" + }, + "newTab": { + "description": "question: Should the link open in a new tab?\niftrue: Open in a new tab\niffalse: do not open in a new tab\nifunset: do not open in a new tab", + "type": "boolean" + }, + "requirements": { + "description": "question: When should the extra button be shown?\nsuggestions: return [{if: \"value=iframe\", then: \"When shown in an iframe\"}, {if: \"value=no-iframe\", then: \"When shown as stand-alone webpage\"}, {if: \"value=welcome-message\", then: \"When the welcome messages are enabled\"}, {if: \"value=iframe\", then: \"When the welcome messages are disabled\"}]", + "type": "array", + "items": { + "enum": [ + "iframe", + "no-iframe", + "no-welcome-message", + "welcome-message" + ], + "type": "string" + } + } + }, + "required": [ + "href" + ], + "additionalProperties": false + }, + "LayerConfigJson": { + "description": "Configuration for a single layer", + "type": "object", + "properties": { + "id": { + "description": "question: What is the identifier of this layer?\n\nThis should be a simple, lowercase, human readable string that is used to identify the layer.\n A good ID is:\n - a noun\n - written in singular\n - describes the object\n - in english\n - only has lowercase letters, numbers or underscores. Do not use a space or a dash\n\ntype: id\ngroup: Basic", + "type": "string" + }, + "name": { + "description": "Used in the layer control panel to toggle a layer on and of.\n\nifunset: This will hide the layer in the layer control, making it not filterable and not toggleable\n\ngroup: Basic\nquestion: What is the name of this layer?", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] + }, + "description": { + "description": "A description for the features shown in this layer.\nThis often resembles the introduction of the wiki.osm.org-page for this feature.\n\ngroup: Basic\nquestion: How would you describe the features that are shown on this layer?", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] + }, + "source": { + "description": "Question: Where should the data be fetched from?\ntitle: Data Source\n\nThis determines where the data for the layer is fetched: from OSM or from an external geojson dataset.\n\nIf no 'geojson' is defined, data will be fetched from overpass and the OSM-API.\n\nEvery source _must_ define which tags _must_ be present in order to be picked up.\n\nNote: a source must always be defined. 'special' is only allowed if this is a builtin-layer\n\ntypes: Load data with specific tags from OpenStreetMap ; Load data from an external geojson source ;\ntypesdefault: 0\ngroup: Basic", + "anyOf": [ + { + "type": "object", + "properties": { + "osmTags": { + "$ref": "#/definitions/TagConfigJson", + "description": "question: Which tags must be present on the feature to show it in this layer?\nEvery source must set which tags have to be present in order to load the given layer." + }, + "maxCacheAge": { + "description": "question: How long (in seconds) is the data allowed to remain cached until it must be refreshed?\nThe maximum amount of seconds that a tile is allowed to linger in the cache\n\ntype: nat\ndefault: 30 days\ngroup: expert", + "type": "number" + } + }, + "required": [ + "osmTags" + ] + }, + { + "type": "object", + "properties": { + "geoJson": { + "description": "The actual source of the data to load, if loaded via geojson.\n\n# A single geojson-file\nsource: {geoJson: \"https://my.source.net/some-geo-data.geojson\"}\n fetches a geojson from a third party source\n\n# A tiled geojson source\nsource: {geoJson: \"https://my.source.net/some-tile-geojson-{layer}-{z}-{x}-{y}.geojson\", geoJsonZoomLevel: 14}\n to use a tiled geojson source. The web server must offer multiple geojsons. {z}, {x} and {y} are substituted by the location; {layer} is substituted with the id of the loaded layer\n\nSome API's use a BBOX instead of a tile, this can be used by specifying {y_min}, {y_max}, {x_min} and {x_max}\n\nquestion: What is the URL of the geojson?\ntype: url", + "type": "string" + }, + "geoJsonZoomLevel": { + "description": "To load a tiled geojson layer, set the zoomlevel of the tiles\n\nquestion: If using a tiled geojson, what is the zoomlevel of the tiles?\nifunset: This is not a tiled geojson", + "type": "number" + }, + "isOsmCache": { + "description": "Indicates that the upstream geojson data is OSM-derived.\nUseful for e.g. merging or for scripts generating this cache.\nThis also indicates that making changes on this data is possible\n\nquestion: Is this geojson a cache of OpenStreetMap data?\nifunset: This is not an OpenStreetMap cache\niftrue: this is based on OpenStreetMap and can thus be edited\ngroup: expert", + "type": "boolean" + }, + "mercatorCrs": { + "description": "Some API's use a mercator-projection (EPSG:900913) instead of WGS84. Set the flag `mercatorCrs: true` in the source for this\n\nquestion: Does this geojson use EPSG:900913 instead of WGS84 as projection?\niftrue: This geojson uses EPSG:900913 instead of WGS84\nifunset: This geojson uses WGS84 just like most geojson (default)", + "type": "boolean" + }, + "idKey": { + "description": "Some API's have an id-field, but give it a different name.\nSetting this key will rename this field into 'id'\n\nifunset: An id with key `id` will be assigned automatically if no attribute `id` is set\ninline: This geojson uses {value} as attribute to set the id\nquestion: What is the name of the attribute containing the ID of the object?", + "type": "string" + } + }, + "required": [ + "geoJson" + ] + }, + { + "enum": [ + "special", + "special:library" + ], + "type": "string" + } + ] + }, + "calculatedTags": { + "description": "A list of extra tags to calculate, specified as \"keyToAssignTo=javascript-expression\".\nThere are a few extra functions available. Refer to Docs/CalculatedTags.md for more information\nThe functions will be run in order, e.g.\n[\nNot found... * \"_max_overlap_m2=Math.max(...feat.overlapsWith(\"someOtherLayer\").map(o => o.overlap))\n \"_max_overlap_ratio=Number(feat._max_overlap_m2)/feat.area\n]\n\nThe specified tags are evaluated lazily. E.g. if a calculated tag is only used in the popup (e.g. the number of nearby features),\nthe expensive calculation will only be performed then for that feature. This avoids clogging up the contributors PC when all features are loaded.\n\nIf a tag has to be evaluated strictly, use ':=' instead:\n\n[\n\"_some_key:=some_javascript_expression\"\n]\n\nSee the full documentation on [https://github.com/pietervdvn/MapComplete/blob/master/Docs/CalculatedTags.md]\n\ngroup: expert\nquestion: What extra attributes should be calculated with javascript?", + "type": "array", + "items": { + "type": "string" + } + }, + "isShown": { + "description": "If set, only features matching this extra tag will be shown.\nThis is useful to hide certain features from view based on a calculated tag or if the features are provided by a different layer.\n\nquestion: What other tags should features match for being shown?\ngroup: advanced\nifunset: all features which match the 'source'-specification are shown.", + "anyOf": [ + { + "$ref": "#/definitions/{and:TagConfigJson[];}" + }, + { + "$ref": "#/definitions/{or:TagConfigJson[];}" + }, + { + "type": "string" + } + ] + }, + "minzoom": { + "description": "The minimum needed zoomlevel required to start loading and displaying the data.\nThis can be used to only show common features (e.g. a bicycle parking) only when the map is zoomed in very much (17).\nThis prevents cluttering the map with thousands of parkings if one is looking to an entire city.\n\nDefault: 0\ngroup: Basic\ntype: nat\nquestion: At what zoom level should features of the layer be shown?\nifunset: Always load this layer, even if the entire world is in view.", + "type": "number" + }, + "shownByDefault": { + "description": "Indicates if this layer is shown by default;\ncan be used to hide a layer from start, or to load the layer but only to show it when appropriate (e.g. for advanced users)\n\nquestion: Should this layer be enabled when opening the map for the first time?\niftrue: the layer is enabled when opening the map\niffalse: the layer is hidden until the contributor enables it. (If the filter-popup is disabled, this might never get enabled nor loaded)\ndefault: true\ngroup: advanced", + "type": "boolean" + }, + "minzoomVisible": { + "description": "The zoom level at which point the data is hidden again\nDefault: 100 (thus: always visible\n\ngroup: expert", + "type": "number" + }, + "title": { + "description": "question: What title should be shown on the infobox?\nThe title shown in a popup for elements of this layer.\n\ngroup: title\ntypes: use a fixed translation ; Use a dynamic tagRendering ; hidden\ntypesdefault: 1\ntype: translation\ninline: {translated{value}}", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "popupInFloatover": { + "description": "Question: Should the information for this layer be shown in the sidebar or in a splash screen?\n\nIf set, open the selectedElementView in a floatOver instead of on the right.\n\niftrue: show the infobox in the splashscreen floating over the entire UI\niffalse: show the infobox in a sidebar on the right\ngroup: advanced\ndefault: sidebar", + "type": "boolean" + }, + "titleIcons": { + "description": "Small icons shown next to the title.\nIf not specified, the OsmLink and wikipedia links will be used by default.\nUse an empty array to hide them.\nNote that \"defaults\" will insert all the default titleIcons (which are added automatically)\n\nType: icon[]\ngroup: infobox", + "anyOf": [ + { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + } + }, + { + "type": "array", + "items": [ + { + "type": "string", + "enum": [ + "defaults" + ] + } + ], + "minItems": 1, + "maxItems": 1 + } + ] + }, + "pointRendering": { + "description": "Creates points to render on the map.\nThis can render points for point-objects, lineobjects or areaobjects; use 'location' to indicate where it should be rendered\ngroup: pointrendering", + "type": "array", + "items": { + "$ref": "#/definitions/default_4" + } + }, + "lineRendering": { + "description": "Creates lines and areas to render on the map\ngroup: linerendering", + "type": "array", + "items": { + "$ref": "#/definitions/default_5" + } + }, + "passAllFeatures": { + "description": "If set, this layer will pass all the features it receives onto the next layer.\nThis is ideal for decoration, e.g. directions on cameras\niftrue: Make the features from this layer also available to the other layer; might result in this object being rendered by multiple layers\niffalse: normal behaviour: don't pass features allong\nquestion: should this layer pass features to the next layers?\ngroup: expert", + "type": "boolean" + }, + "doNotDownload": { + "description": "If set, this layer will not query overpass; but it'll still match the tags above which are by chance returned by other layers.\nWorks well together with 'passAllFeatures', to add decoration\nThe opposite of `forceLoad`\n\niftrue: Do not attempt to query the data for this layer from overpass/the OSM API\niffalse: download the data as usual\ngroup: expert\nquestion: Should this layer be downloaded or is the data provided by a different layer (which has 'passAllFeatures'-set)?\ndefault: false", + "type": "boolean" + }, + "forceLoad": { + "description": "Advanced option - might be set by the theme compiler\n\nIf true, this data will _always_ be loaded, even if the theme is disabled by a filter or hidden.\nThe opposite of `doNotDownload`\n\nquestion: Should this layer be forcibly loaded?\nifftrue: always download this layer, even if it is disabled\niffalse: only download data for this layer when needed (default)\ndefault: false\ngroup: expert", + "type": "boolean" + }, + "presets": { + "description": "Presets for this layer.\nA preset shows up when clicking the map on a without data (or when right-clicking/long-pressing);\nit will prompt the user to add a new point.\n\nThe most important aspect are the tags, which define which tags the new point will have;\nThe title is shown in the dialog, along with the first sentence of the description.\n\nUpon confirmation, the full description is shown beneath the buttons - perfect to add pictures and examples.\n\nNote: the icon of the preset is determined automatically based on the tags and the icon above. Don't worry about that!\nNB: if no presets are defined, the popup to add new points doesn't show up at all\n\ngroup: presets", + "type": "array", + "items": { + "type": "object", + "properties": { + "title": { + "description": "The title - shown on the 'add-new'-button.\n\nThis should include the article of the noun, e.g. 'a hydrant', 'a bicycle pump'.\nThis text will be inserted into `Add {category} here`, becoming `Add a hydrant here`.\n\nDo _not_ indicate 'new': 'add a new shop here' is incorrect, as the shop might have existed forever, it could just be unmapped!\n\nquestion: What is the word to describe this object?\ninline: Add {translated(value)::font-bold} here", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] + }, + "tags": { + "description": "A single tag (encoded as key=value) out of all the tags to add onto the newly created point.\nNote that the icon in the UI will be chosen automatically based on the tags provided here.\n\nquestion: What tag should be added to the new object?\ntype: simple_tag\ntypeHelper: uploadableOnly", + "type": "array", + "items": { + "type": "string" + } + }, + "description": { + "description": "An extra explanation of what the feature is, if it is not immediately clear from the title alone.\n\nThe _first sentence_ of the description is shown on the button of the `add` menu.\nThe full description is shown in the confirmation dialog.\n\n(The first sentence is until the first '.'-character in the description)\n\nquestion: How would you describe this feature?\nifunset: No extra description is given. This can be used to further explain the preset", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] + }, + "exampleImages": { + "description": "The URL of an example image which shows a real-life example of what such a feature might look like.\n\nType: image\nquestion: What is the URL of an image showing such a feature?", + "type": "array", + "items": { + "type": "string" + } + }, + "snapToLayer": { + "description": "question: Should the created point be snapped to a line layer?\n\nIf specified, these layers will be shown in the precise location picker and the new point will be snapped towards it.\nFor example, this can be used to snap against `walls_and_buildings` (e.g. to attach a defibrillator, an entrance, an artwork, ... to the wall)\nor to snap an obstacle (such as a bollard) to the `cycleways_and_roads`.\n\nsuggestions: return Array.from(layers.keys()).map(key => ({if: \"value=\"+key, then: key+\" - \"+layers.get(key).description}))", + "type": "array", + "items": { + "type": "string" + } + }, + "maxSnapDistance": { + "description": "question: What is the maximum distance in the location-input that a point can be moved to be snapped to a way?\n\ninline: a point is snapped if the location input is at most {value}m away from an object\n\nIf specified, a new point will only be snapped if it is within this range.\nIf further away, it'll be placed in the center of the location input\nDistance in meter\n\nifunset: Do not snap to a layer", + "type": "number" + } + }, + "required": [ + "tags", + "title" + ] + } + }, + "tagRenderings": { + "description": "question: Edit this tagRendering\n\nA tag rendering is a block that either shows the known value or asks a question.\n\nRefer to the class `TagRenderingConfigJson` to see the possibilities.\n\nNote that we can also use a string here - where the string refers to a tag rendering defined in `assets/questions/questions.json`,\nwhere a few very general questions are defined e.g. website, phone number, ...\nFurthermore, _all_ the questions of another layer can be reused with `otherlayer.*`\nIf you need only a single of the tagRenderings, use `otherlayer.tagrenderingId`\nIf one or more questions have a 'group' or 'label' set, select all the entries with the corresponding group or label with `otherlayer.*group`\nRemark: if a tagRendering is 'lent' from another layer, the 'source'-tags are copied and added as condition.\nIf they are not wanted, remove them with an override\n\nA special value is 'questions', which indicates the location of the questions box. If not specified, it'll be appended to the bottom of the featureInfobox.\n\nAt last, one can define a group of renderings where parts of all strings will be replaced by multiple other strings.\nThis is mainly create questions for a 'left' and a 'right' side of the road.\nThese will be grouped and questions will be asked together\n\ntype: tagrendering[]\ngroup: tagrenderings", + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/QuestionableTagRenderingConfigJson" + }, + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "builtin": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "override": { + "$ref": "#/definitions/Partial" + } + }, + "required": [ + "builtin", + "override" + ] + }, + { + "allOf": [ + { + "$ref": "#/definitions/default<(string|QuestionableTagRenderingConfigJson|{builtin:string;override:Partial;})[]>" + }, + { + "type": "object", + "properties": { + "id": { + "type": "string" + } + }, + "required": [ + "id" + ] + } + ] + }, + { + "type": "string" + } + ] + } + }, + "filter": { + "description": "All the extra questions for filtering.\nIf a string is given, mapComplete will search in 'filters.json' for the appropriate filter or will try to parse it as `layername.filterid` and us that one\n\ngroup: filters", + "anyOf": [ + { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/default_1" + }, + { + "type": "string" + } + ] + } + }, + { + "type": "object", + "properties": { + "sameAs": { + "type": "string" + } + }, + "required": [ + "sameAs" + ] + } + ] + }, + "deletion": { + "description": "This block defines under what circumstances the delete dialog is shown for objects of this layer.\nIf set, a dialog is shown to the user to (soft) delete the point.\nThe dialog is built to be user friendly and to prevent mistakes.\nIf deletion is not possible, the dialog will hide itself and show the reason of non-deletability instead.\n\nTo configure, the following values are possible:\n\n- false: never ever show the delete button\n- true: show the default delete button\n- undefined: use the mapcomplete default to show deletion or not. Currently, this is the same as 'false' but this will change in the future\n- or: a hash with options (see below)\n\n### The delete dialog\n\n\n\n#### Hard deletion if enough experience\n\nA feature can only be deleted from OpenStreetMap by mapcomplete if:\n\n- It is a node\n- No ways or relations use the node\n- The logged-in user has enough experience OR the user is the only one to have edited the point previously\n- The logged-in user has no unread messages (or has a ton of experience)\n- The user did not select one of the 'non-delete-options' (see below)\n\nIn all other cases, a 'soft deletion' is used.\n\n#### Soft deletion\n\nA 'soft deletion' is when the point isn't deleted fromOSM but retagged so that it'll won't how up in the mapcomplete theme anymore.\nThis makes it look like it was deleted, without doing damage. A fixme will be added to the point.\n\nNote that a soft deletion is _only_ possible if these tags are provided by the theme creator, as they'll be different for every theme\n\n##### No-delete options\n\nIn some cases, the contributor might want to delete something for the wrong reason (e.g. someone who wants to have a path removed \"because the path is on their private property\").\nHowever, the path exists in reality and should thus be on OSM - otherwise the next contributor will pass by and notice \"hey, there is a path missing here! Let me redraw it in OSM!)\n\nThe correct approach is to retag the feature in such a way that it is semantically correct *and* that it doesn't show up on the theme anymore.\nA no-delete option is offered as 'reason to delete it', but secretly retags.\n\ngroup: editing\ntypes: Use an advanced delete configuration ; boolean\niftrue: Allow deletion\niffalse: Do not allow deletion\nifunset: Do not allow deletion", + "anyOf": [ + { + "$ref": "#/definitions/DeleteConfigJson" + }, + { + "type": "boolean" + } + ] + }, + "allowMove": { + "description": "Indicates if a point can be moved and why.\n\nA feature can be moved by MapComplete if:\n\n- It is a point\n- The point is _not_ part of a way or a a relation.\n\ntypes: use an advanced move configuration ; boolean\ngroup: editing\nquestion: Is deleting a point allowed?\niftrue: Allow contributors to move a point (for accuracy or a relocation)\niffalse: Don't allow contributors to move points\nifunset: Don't allow contributors to move points (default)", + "anyOf": [ + { + "$ref": "#/definitions/default_3" + }, + { + "type": "boolean" + } + ] + }, + "allowSplit": { + "description": "If set, a 'split this way' button is shown on objects rendered as LineStrings, e.g. highways.\n\nIf the way is part of a relation, MapComplete will attempt to update this relation as well\nquestion: Should the contributor be able to split ways using this layer?\niftrue: enable the 'split-roads'-component\niffalse: don't enable the split-roads componenet\nifunset: don't enable the split-roads component\ngroup: editing", + "type": "boolean" + }, + "units": { + "type": "array", + "items": { + "$ref": "#/definitions/default_2" + } + }, + "syncSelection": { + "description": "If set, synchronizes whether or not this layer is enabled.\n\ngroup: advanced\nquestion: Should enabling/disabling the layer be saved (locally or in the cloud)?\nsuggestions: return [{if: \"value=no\", then: \"Don't save, always revert to the default\"}, {if: \"value=local\", then: \"Save selection in local storage\"}, {if: \"value=theme-only\", then: \"Save the state in the OSM-usersettings, but apply on this theme only (default)\"}, {if: \"value=global\", then: \"Save in OSM-usersettings and toggle on _all_ themes using this layer\"}]", + "enum": [ + "global", + "local", + "no", + "theme-only" + ], + "type": "string" + }, + "#": { + "description": "Used for comments and/or to disable some checks\n\nno-question-hint-check: disables a check in MiscTagRenderingChecks which complains about 'div', 'span' or 'class=subtle'-HTML elements in the tagRendering\n\ngroup: hidden", + "type": "string" + }, + "fullNodeDatabase": { + "description": "_Set automatically by MapComplete, please ignore_\n\ngroup: hidden", + "type": "boolean" + } + }, + "required": [ + "id", + "pointRendering", + "source" + ], + "additionalProperties": false + }, + "Partial": { + "type": "object", + "properties": { + "id": { + "description": "question: What is the identifier of this layer?\n\nThis should be a simple, lowercase, human readable string that is used to identify the layer.\n A good ID is:\n - a noun\n - written in singular\n - describes the object\n - in english\n - only has lowercase letters, numbers or underscores. Do not use a space or a dash\n\ntype: id\ngroup: Basic", + "type": "string" + }, + "name": { + "description": "Used in the layer control panel to toggle a layer on and of.\n\nifunset: This will hide the layer in the layer control, making it not filterable and not toggleable\n\ngroup: Basic\nquestion: What is the name of this layer?", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] + }, + "description": { + "description": "A description for the features shown in this layer.\nThis often resembles the introduction of the wiki.osm.org-page for this feature.\n\ngroup: Basic\nquestion: How would you describe the features that are shown on this layer?", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] + }, + "source": { + "description": "Question: Where should the data be fetched from?\ntitle: Data Source\n\nThis determines where the data for the layer is fetched: from OSM or from an external geojson dataset.\n\nIf no 'geojson' is defined, data will be fetched from overpass and the OSM-API.\n\nEvery source _must_ define which tags _must_ be present in order to be picked up.\n\nNote: a source must always be defined. 'special' is only allowed if this is a builtin-layer\n\ntypes: Load data with specific tags from OpenStreetMap ; Load data from an external geojson source ;\ntypesdefault: 0\ngroup: Basic", + "anyOf": [ + { + "type": "object", + "properties": { + "osmTags": { + "$ref": "#/definitions/TagConfigJson", + "description": "question: Which tags must be present on the feature to show it in this layer?\nEvery source must set which tags have to be present in order to load the given layer." + }, + "maxCacheAge": { + "description": "question: How long (in seconds) is the data allowed to remain cached until it must be refreshed?\nThe maximum amount of seconds that a tile is allowed to linger in the cache\n\ntype: nat\ndefault: 30 days\ngroup: expert", + "type": "number" + } + }, + "required": [ + "osmTags" + ] + }, + { + "type": "object", + "properties": { + "geoJson": { + "description": "The actual source of the data to load, if loaded via geojson.\n\n# A single geojson-file\nsource: {geoJson: \"https://my.source.net/some-geo-data.geojson\"}\n fetches a geojson from a third party source\n\n# A tiled geojson source\nsource: {geoJson: \"https://my.source.net/some-tile-geojson-{layer}-{z}-{x}-{y}.geojson\", geoJsonZoomLevel: 14}\n to use a tiled geojson source. The web server must offer multiple geojsons. {z}, {x} and {y} are substituted by the location; {layer} is substituted with the id of the loaded layer\n\nSome API's use a BBOX instead of a tile, this can be used by specifying {y_min}, {y_max}, {x_min} and {x_max}\n\nquestion: What is the URL of the geojson?\ntype: url", + "type": "string" + }, + "geoJsonZoomLevel": { + "description": "To load a tiled geojson layer, set the zoomlevel of the tiles\n\nquestion: If using a tiled geojson, what is the zoomlevel of the tiles?\nifunset: This is not a tiled geojson", + "type": "number" + }, + "isOsmCache": { + "description": "Indicates that the upstream geojson data is OSM-derived.\nUseful for e.g. merging or for scripts generating this cache.\nThis also indicates that making changes on this data is possible\n\nquestion: Is this geojson a cache of OpenStreetMap data?\nifunset: This is not an OpenStreetMap cache\niftrue: this is based on OpenStreetMap and can thus be edited\ngroup: expert", + "type": "boolean" + }, + "mercatorCrs": { + "description": "Some API's use a mercator-projection (EPSG:900913) instead of WGS84. Set the flag `mercatorCrs: true` in the source for this\n\nquestion: Does this geojson use EPSG:900913 instead of WGS84 as projection?\niftrue: This geojson uses EPSG:900913 instead of WGS84\nifunset: This geojson uses WGS84 just like most geojson (default)", + "type": "boolean" + }, + "idKey": { + "description": "Some API's have an id-field, but give it a different name.\nSetting this key will rename this field into 'id'\n\nifunset: An id with key `id` will be assigned automatically if no attribute `id` is set\ninline: This geojson uses {value} as attribute to set the id\nquestion: What is the name of the attribute containing the ID of the object?", + "type": "string" + } + }, + "required": [ + "geoJson" + ] + }, + { + "enum": [ + "special", + "special:library" + ], + "type": "string" + } + ] + }, + "calculatedTags": { + "description": "A list of extra tags to calculate, specified as \"keyToAssignTo=javascript-expression\".\nThere are a few extra functions available. Refer to Docs/CalculatedTags.md for more information\nThe functions will be run in order, e.g.\n[\nNot found... * \"_max_overlap_m2=Math.max(...feat.overlapsWith(\"someOtherLayer\").map(o => o.overlap))\n \"_max_overlap_ratio=Number(feat._max_overlap_m2)/feat.area\n]\n\nThe specified tags are evaluated lazily. E.g. if a calculated tag is only used in the popup (e.g. the number of nearby features),\nthe expensive calculation will only be performed then for that feature. This avoids clogging up the contributors PC when all features are loaded.\n\nIf a tag has to be evaluated strictly, use ':=' instead:\n\n[\n\"_some_key:=some_javascript_expression\"\n]\n\nSee the full documentation on [https://github.com/pietervdvn/MapComplete/blob/master/Docs/CalculatedTags.md]\n\ngroup: expert\nquestion: What extra attributes should be calculated with javascript?", + "type": "array", + "items": { + "type": "string" + } + }, + "isShown": { + "description": "If set, only features matching this extra tag will be shown.\nThis is useful to hide certain features from view based on a calculated tag or if the features are provided by a different layer.\n\nquestion: What other tags should features match for being shown?\ngroup: advanced\nifunset: all features which match the 'source'-specification are shown.", + "anyOf": [ + { + "$ref": "#/definitions/{and:TagConfigJson[];}" + }, + { + "$ref": "#/definitions/{or:TagConfigJson[];}" + }, + { + "type": "string" + } + ] + }, + "minzoom": { + "description": "The minimum needed zoomlevel required to start loading and displaying the data.\nThis can be used to only show common features (e.g. a bicycle parking) only when the map is zoomed in very much (17).\nThis prevents cluttering the map with thousands of parkings if one is looking to an entire city.\n\nDefault: 0\ngroup: Basic\ntype: nat\nquestion: At what zoom level should features of the layer be shown?\nifunset: Always load this layer, even if the entire world is in view.", + "type": "number" + }, + "shownByDefault": { + "description": "Indicates if this layer is shown by default;\ncan be used to hide a layer from start, or to load the layer but only to show it when appropriate (e.g. for advanced users)\n\nquestion: Should this layer be enabled when opening the map for the first time?\niftrue: the layer is enabled when opening the map\niffalse: the layer is hidden until the contributor enables it. (If the filter-popup is disabled, this might never get enabled nor loaded)\ndefault: true\ngroup: advanced", + "type": "boolean" + }, + "minzoomVisible": { + "description": "The zoom level at which point the data is hidden again\nDefault: 100 (thus: always visible\n\ngroup: expert", + "type": "number" + }, + "title": { + "description": "question: What title should be shown on the infobox?\nThe title shown in a popup for elements of this layer.\n\ngroup: title\ntypes: use a fixed translation ; Use a dynamic tagRendering ; hidden\ntypesdefault: 1\ntype: translation\ninline: {translated{value}}", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "popupInFloatover": { + "description": "Question: Should the information for this layer be shown in the sidebar or in a splash screen?\n\nIf set, open the selectedElementView in a floatOver instead of on the right.\n\niftrue: show the infobox in the splashscreen floating over the entire UI\niffalse: show the infobox in a sidebar on the right\ngroup: advanced\ndefault: sidebar", + "type": "boolean" + }, + "titleIcons": { + "description": "Small icons shown next to the title.\nIf not specified, the OsmLink and wikipedia links will be used by default.\nUse an empty array to hide them.\nNote that \"defaults\" will insert all the default titleIcons (which are added automatically)\n\nType: icon[]\ngroup: infobox", + "anyOf": [ + { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + } + }, + { + "type": "array", + "items": [ + { + "type": "string", + "enum": [ + "defaults" + ] + } + ], + "minItems": 1, + "maxItems": 1 + } + ] + }, + "pointRendering": { + "description": "Creates points to render on the map.\nThis can render points for point-objects, lineobjects or areaobjects; use 'location' to indicate where it should be rendered\ngroup: pointrendering", + "type": "array", + "items": { + "$ref": "#/definitions/default_4" + } + }, + "lineRendering": { + "description": "Creates lines and areas to render on the map\ngroup: linerendering", + "type": "array", + "items": { + "$ref": "#/definitions/default_5" + } + }, + "passAllFeatures": { + "description": "If set, this layer will pass all the features it receives onto the next layer.\nThis is ideal for decoration, e.g. directions on cameras\niftrue: Make the features from this layer also available to the other layer; might result in this object being rendered by multiple layers\niffalse: normal behaviour: don't pass features allong\nquestion: should this layer pass features to the next layers?\ngroup: expert", + "type": "boolean" + }, + "doNotDownload": { + "description": "If set, this layer will not query overpass; but it'll still match the tags above which are by chance returned by other layers.\nWorks well together with 'passAllFeatures', to add decoration\nThe opposite of `forceLoad`\n\niftrue: Do not attempt to query the data for this layer from overpass/the OSM API\niffalse: download the data as usual\ngroup: expert\nquestion: Should this layer be downloaded or is the data provided by a different layer (which has 'passAllFeatures'-set)?\ndefault: false", + "type": "boolean" + }, + "forceLoad": { + "description": "Advanced option - might be set by the theme compiler\n\nIf true, this data will _always_ be loaded, even if the theme is disabled by a filter or hidden.\nThe opposite of `doNotDownload`\n\nquestion: Should this layer be forcibly loaded?\nifftrue: always download this layer, even if it is disabled\niffalse: only download data for this layer when needed (default)\ndefault: false\ngroup: expert", + "type": "boolean" + }, + "presets": { + "description": "Presets for this layer.\nA preset shows up when clicking the map on a without data (or when right-clicking/long-pressing);\nit will prompt the user to add a new point.\n\nThe most important aspect are the tags, which define which tags the new point will have;\nThe title is shown in the dialog, along with the first sentence of the description.\n\nUpon confirmation, the full description is shown beneath the buttons - perfect to add pictures and examples.\n\nNote: the icon of the preset is determined automatically based on the tags and the icon above. Don't worry about that!\nNB: if no presets are defined, the popup to add new points doesn't show up at all\n\ngroup: presets", + "type": "array", + "items": { + "type": "object", + "properties": { + "title": { + "description": "The title - shown on the 'add-new'-button.\n\nThis should include the article of the noun, e.g. 'a hydrant', 'a bicycle pump'.\nThis text will be inserted into `Add {category} here`, becoming `Add a hydrant here`.\n\nDo _not_ indicate 'new': 'add a new shop here' is incorrect, as the shop might have existed forever, it could just be unmapped!\n\nquestion: What is the word to describe this object?\ninline: Add {translated(value)::font-bold} here", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] + }, + "tags": { + "description": "A single tag (encoded as key=value) out of all the tags to add onto the newly created point.\nNote that the icon in the UI will be chosen automatically based on the tags provided here.\n\nquestion: What tag should be added to the new object?\ntype: simple_tag\ntypeHelper: uploadableOnly", + "type": "array", + "items": { + "type": "string" + } + }, + "description": { + "description": "An extra explanation of what the feature is, if it is not immediately clear from the title alone.\n\nThe _first sentence_ of the description is shown on the button of the `add` menu.\nThe full description is shown in the confirmation dialog.\n\n(The first sentence is until the first '.'-character in the description)\n\nquestion: How would you describe this feature?\nifunset: No extra description is given. This can be used to further explain the preset", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] + }, + "exampleImages": { + "description": "The URL of an example image which shows a real-life example of what such a feature might look like.\n\nType: image\nquestion: What is the URL of an image showing such a feature?", + "type": "array", + "items": { + "type": "string" + } + }, + "snapToLayer": { + "description": "question: Should the created point be snapped to a line layer?\n\nIf specified, these layers will be shown in the precise location picker and the new point will be snapped towards it.\nFor example, this can be used to snap against `walls_and_buildings` (e.g. to attach a defibrillator, an entrance, an artwork, ... to the wall)\nor to snap an obstacle (such as a bollard) to the `cycleways_and_roads`.\n\nsuggestions: return Array.from(layers.keys()).map(key => ({if: \"value=\"+key, then: key+\" - \"+layers.get(key).description}))", + "type": "array", + "items": { + "type": "string" + } + }, + "maxSnapDistance": { + "description": "question: What is the maximum distance in the location-input that a point can be moved to be snapped to a way?\n\ninline: a point is snapped if the location input is at most {value}m away from an object\n\nIf specified, a new point will only be snapped if it is within this range.\nIf further away, it'll be placed in the center of the location input\nDistance in meter\n\nifunset: Do not snap to a layer", + "type": "number" + } + }, + "required": [ + "tags", + "title" + ] + } + }, + "tagRenderings": { + "description": "question: Edit this tagRendering\n\nA tag rendering is a block that either shows the known value or asks a question.\n\nRefer to the class `TagRenderingConfigJson` to see the possibilities.\n\nNote that we can also use a string here - where the string refers to a tag rendering defined in `assets/questions/questions.json`,\nwhere a few very general questions are defined e.g. website, phone number, ...\nFurthermore, _all_ the questions of another layer can be reused with `otherlayer.*`\nIf you need only a single of the tagRenderings, use `otherlayer.tagrenderingId`\nIf one or more questions have a 'group' or 'label' set, select all the entries with the corresponding group or label with `otherlayer.*group`\nRemark: if a tagRendering is 'lent' from another layer, the 'source'-tags are copied and added as condition.\nIf they are not wanted, remove them with an override\n\nA special value is 'questions', which indicates the location of the questions box. If not specified, it'll be appended to the bottom of the featureInfobox.\n\nAt last, one can define a group of renderings where parts of all strings will be replaced by multiple other strings.\nThis is mainly create questions for a 'left' and a 'right' side of the road.\nThese will be grouped and questions will be asked together\n\ntype: tagrendering[]\ngroup: tagrenderings", + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/QuestionableTagRenderingConfigJson" + }, + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "builtin": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "override": { + "$ref": "#/definitions/Partial" + } + }, + "required": [ + "builtin", + "override" + ] + }, + { + "allOf": [ + { + "$ref": "#/definitions/default<(string|QuestionableTagRenderingConfigJson|{builtin:string;override:Partial;})[]>" + }, + { + "type": "object", + "properties": { + "id": { + "type": "string" + } + }, + "required": [ + "id" + ] + } + ] + }, + { + "type": "string" + } + ] + } + }, + "filter": { + "description": "All the extra questions for filtering.\nIf a string is given, mapComplete will search in 'filters.json' for the appropriate filter or will try to parse it as `layername.filterid` and us that one\n\ngroup: filters", + "anyOf": [ + { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/default_1" + }, + { + "type": "string" + } + ] + } + }, + { + "type": "object", + "properties": { + "sameAs": { + "type": "string" + } + }, + "required": [ + "sameAs" + ] + } + ] + }, + "deletion": { + "description": "This block defines under what circumstances the delete dialog is shown for objects of this layer.\nIf set, a dialog is shown to the user to (soft) delete the point.\nThe dialog is built to be user friendly and to prevent mistakes.\nIf deletion is not possible, the dialog will hide itself and show the reason of non-deletability instead.\n\nTo configure, the following values are possible:\n\n- false: never ever show the delete button\n- true: show the default delete button\n- undefined: use the mapcomplete default to show deletion or not. Currently, this is the same as 'false' but this will change in the future\n- or: a hash with options (see below)\n\n### The delete dialog\n\n\n\n#### Hard deletion if enough experience\n\nA feature can only be deleted from OpenStreetMap by mapcomplete if:\n\n- It is a node\n- No ways or relations use the node\n- The logged-in user has enough experience OR the user is the only one to have edited the point previously\n- The logged-in user has no unread messages (or has a ton of experience)\n- The user did not select one of the 'non-delete-options' (see below)\n\nIn all other cases, a 'soft deletion' is used.\n\n#### Soft deletion\n\nA 'soft deletion' is when the point isn't deleted fromOSM but retagged so that it'll won't how up in the mapcomplete theme anymore.\nThis makes it look like it was deleted, without doing damage. A fixme will be added to the point.\n\nNote that a soft deletion is _only_ possible if these tags are provided by the theme creator, as they'll be different for every theme\n\n##### No-delete options\n\nIn some cases, the contributor might want to delete something for the wrong reason (e.g. someone who wants to have a path removed \"because the path is on their private property\").\nHowever, the path exists in reality and should thus be on OSM - otherwise the next contributor will pass by and notice \"hey, there is a path missing here! Let me redraw it in OSM!)\n\nThe correct approach is to retag the feature in such a way that it is semantically correct *and* that it doesn't show up on the theme anymore.\nA no-delete option is offered as 'reason to delete it', but secretly retags.\n\ngroup: editing\ntypes: Use an advanced delete configuration ; boolean\niftrue: Allow deletion\niffalse: Do not allow deletion\nifunset: Do not allow deletion", + "anyOf": [ + { + "$ref": "#/definitions/DeleteConfigJson" + }, + { + "type": "boolean" + } + ] + }, + "allowMove": { + "description": "Indicates if a point can be moved and why.\n\nA feature can be moved by MapComplete if:\n\n- It is a point\n- The point is _not_ part of a way or a a relation.\n\ntypes: use an advanced move configuration ; boolean\ngroup: editing\nquestion: Is deleting a point allowed?\niftrue: Allow contributors to move a point (for accuracy or a relocation)\niffalse: Don't allow contributors to move points\nifunset: Don't allow contributors to move points (default)", + "anyOf": [ + { + "$ref": "#/definitions/default_3" + }, + { + "type": "boolean" + } + ] + }, + "allowSplit": { + "description": "If set, a 'split this way' button is shown on objects rendered as LineStrings, e.g. highways.\n\nIf the way is part of a relation, MapComplete will attempt to update this relation as well\nquestion: Should the contributor be able to split ways using this layer?\niftrue: enable the 'split-roads'-component\niffalse: don't enable the split-roads componenet\nifunset: don't enable the split-roads component\ngroup: editing", + "type": "boolean" + }, + "units": { + "type": "array", + "items": { + "$ref": "#/definitions/default_2" + } + }, + "syncSelection": { + "description": "If set, synchronizes whether or not this layer is enabled.\n\ngroup: advanced\nquestion: Should enabling/disabling the layer be saved (locally or in the cloud)?\nsuggestions: return [{if: \"value=no\", then: \"Don't save, always revert to the default\"}, {if: \"value=local\", then: \"Save selection in local storage\"}, {if: \"value=theme-only\", then: \"Save the state in the OSM-usersettings, but apply on this theme only (default)\"}, {if: \"value=global\", then: \"Save in OSM-usersettings and toggle on _all_ themes using this layer\"}]", + "enum": [ + "global", + "local", + "no", + "theme-only" + ], + "type": "string" + }, + "#": { + "description": "Used for comments and/or to disable some checks\n\nno-question-hint-check: disables a check in MiscTagRenderingChecks which complains about 'div', 'span' or 'class=subtle'-HTML elements in the tagRendering\n\ngroup: hidden", + "type": "string" + }, + "fullNodeDatabase": { + "description": "_Set automatically by MapComplete, please ignore_\n\ngroup: hidden", + "type": "boolean" + } + }, + "additionalProperties": false + }, "Partial": { "type": "object", "additionalProperties": false @@ -1679,6 +2593,9 @@ "category": { "type": "string" }, + "type": { + "type": "string" + }, "attribution": { "type": "object", "properties": { @@ -1712,911 +2629,8 @@ "url" ], "additionalProperties": false - }, - "LayerConfigJson": { - "description": "Configuration for a single layer", - "type": "object", - "properties": { - "id": { - "description": "The id of this layer.\nThis should be a simple, lowercase, human readable string that is used to identify the layer.", - "type": "string" - }, - "name": { - "description": "The name of this layer\nUsed in the layer control panel and the 'Personal theme'.\n\nIf not given, will be hidden (and thus not toggable) in the layer control", - "anyOf": [ - { - "$ref": "#/definitions/Record" - }, - { - "type": "string" - } - ] - }, - "description": { - "description": "A description for this layer.\nShown in the layer selections and in the personel theme", - "anyOf": [ - { - "$ref": "#/definitions/Record" - }, - { - "type": "string" - } - ] - }, - "source": { - "description": "This determines where the data for the layer is fetched: from OSM or from an external geojson dataset.\n\nIf no 'geojson' is defined, data will be fetched from overpass and the OSM-API.\n\nEvery source _must_ define which tags _must_ be present in order to be picked up.\n\nNote: a source must always be defined. 'special' is only allowed if this is a builtin-layer", - "anyOf": [ - { - "type": "object", - "properties": { - "osmTags": { - "$ref": "#/definitions/TagConfigJson", - "description": "Every source must set which tags have to be present in order to load the given layer." - }, - "maxCacheAge": { - "description": "The maximum amount of seconds that a tile is allowed to linger in the cache", - "type": "number" - } - }, - "required": [ - "osmTags" - ] - }, - { - "type": "object", - "properties": { - "geoJson": { - "description": "The actual source of the data to load, if loaded via geojson.\n\n# A single geojson-file\nsource: {geoJson: \"https://my.source.net/some-geo-data.geojson\"}\n fetches a geojson from a third party source\n\n# A tiled geojson source\nsource: {geoJson: \"https://my.source.net/some-tile-geojson-{layer}-{z}-{x}-{y}.geojson\", geoJsonZoomLevel: 14}\n to use a tiled geojson source. The web server must offer multiple geojsons. {z}, {x} and {y} are substituted by the location; {layer} is substituted with the id of the loaded layer\n\nSome API's use a BBOX instead of a tile, this can be used by specifying {y_min}, {y_max}, {x_min} and {x_max}", - "type": "string" - }, - "geoJsonZoomLevel": { - "description": "To load a tiled geojson layer, set the zoomlevel of the tiles", - "type": "number" - }, - "isOsmCache": { - "description": "Indicates that the upstream geojson data is OSM-derived.\nUseful for e.g. merging or for scripts generating this cache", - "type": "boolean" - }, - "mercatorCrs": { - "description": "Some API's use a mercator-projection (EPSG:900913) instead of WGS84. Set the flag `mercatorCrs: true` in the source for this", - "type": "boolean" - }, - "idKey": { - "description": "Some API's have an id-field, but give it a different name.\nSetting this key will rename this field into 'id'", - "type": "string" - } - }, - "required": [ - "geoJson" - ] - }, - { - "enum": [ - "special", - "special:library" - ], - "type": "string" - } - ] - }, - "calculatedTags": { - "description": "A list of extra tags to calculate, specified as \"keyToAssignTo=javascript-expression\".\nThere are a few extra functions available. Refer to Docs/CalculatedTags.md for more information\nThe functions will be run in order, e.g.\n[\n \"_max_overlap_m2=Math.max(...feat.overlapsWith(\"someOtherLayer\").map(o => o.overlap))\n \"_max_overlap_ratio=Number(feat._max_overlap_m2)/feat.area\n]\n\nThe specified tags are evaluated lazily. E.g. if a calculated tag is only used in the popup (e.g. the number of nearby features),\nthe expensive calculation will only be performed then for that feature. This avoids clogging up the contributors PC when all features are loaded.\n\nIf a tag has to be evaluated strictly, use ':=' instead:\n\n[\n\"_some_key:=some_javascript_expression\"\n]", - "type": "array", - "items": { - "type": "string" - } - }, - "doNotDownload": { - "description": "If set, this layer will not query overpass; but it'll still match the tags above which are by chance returned by other layers.\nWorks well together with 'passAllFeatures', to add decoration", - "type": "boolean" - }, - "isShown": { - "description": "If set, only features matching this extra tag will be shown.\nThis is useful to hide certain features from view.\n\nImportant: hiding features does not work dynamically, but is only calculated when the data is first renders.\nThis implies that it is not possible to hide a feature after a tagging change\n\nThe default value is 'yes'", - "anyOf": [ - { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" - }, - { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" - }, - { - "type": "string" - } - ] - }, - "forceLoad": { - "description": "Advanced option - might be set by the theme compiler\n\nIf true, this data will _always_ be loaded, even if the theme is disabled", - "type": "boolean" - }, - "minzoom": { - "description": "The minimum needed zoomlevel required before loading of the data start\nDefault: 0", - "type": "number" - }, - "shownByDefault": { - "description": "Indicates if this layer is shown by default;\ncan be used to hide a layer from start, or to load the layer but only to show it where appropriate (e.g. for snapping to it)", - "type": "boolean" - }, - "minzoomVisible": { - "description": "The zoom level at which point the data is hidden again\nDefault: 100 (thus: always visible", - "type": "number" - }, - "title": { - "description": "The title shown in a popup for elements of this layer.", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - }, - "titleIcons": { - "description": "Small icons shown next to the title.\nIf not specified, the OsmLink and wikipedia links will be used by default.\nUse an empty array to hide them.\nNote that \"defaults\" will insert all the default titleIcons (which are added automatically)\n\nType: icon[]", - "anyOf": [ - { - "type": "array", - "items": { - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - } - }, - { - "type": "array", - "items": [ - { - "type": "string", - "enum": [ - "defaults" - ] - } - ], - "minItems": 1, - "maxItems": 1 - } - ] - }, - "mapRendering": { - "description": "Visualisation of the items on the map", - "anyOf": [ - { - "type": "array", - "items": { - "anyOf": [ - { - "$ref": "#/definitions/default_4" - }, - { - "$ref": "#/definitions/default_5" - }, - { - "$ref": "#/definitions/default" - } - ] - } - }, - { - "type": "null" - } - ] - }, - "passAllFeatures": { - "description": "If set, this layer will pass all the features it receives onto the next layer.\nThis is ideal for decoration, e.g. directionss on cameras", - "type": "boolean" - }, - "presets": { - "description": "Presets for this layer.\nA preset shows up when clicking the map on a without data (or when right-clicking/long-pressing);\nit will prompt the user to add a new point.\n\nThe most important aspect are the tags, which define which tags the new point will have;\nThe title is shown in the dialog, along with the first sentence of the description.\n\nUpon confirmation, the full description is shown beneath the buttons - perfect to add pictures and examples.\n\nNote: the icon of the preset is determined automatically based on the tags and the icon above. Don't worry about that!\nNB: if no presets are defined, the popup to add new points doesn't show up at all", - "type": "array", - "items": { - "type": "object", - "properties": { - "title": { - "description": "The title - shown on the 'add-new'-button.\n\nThis should include the article of the noun, e.g. 'a hydrant', 'a bicycle pump'.\nThis text will be inserted into `Add {category} here`, becoming `Add a hydrant here`.\n\nDo _not_ indicate 'new': 'add a new shop here' is incorrect, as the shop might have existed forever, it could just be unmapped!", - "anyOf": [ - { - "$ref": "#/definitions/Record" - }, - { - "type": "string" - } - ] - }, - "tags": { - "description": "The tags to add. It determines the icon too", - "type": "array", - "items": { - "type": "string" - } - }, - "description": { - "description": "The _first sentence_ of the description is shown on the button of the `add` menu.\nThe full description is shown in the confirmation dialog.\n\n(The first sentence is until the first '.'-character in the description)", - "anyOf": [ - { - "$ref": "#/definitions/Record" - }, - { - "type": "string" - } - ] - }, - "exampleImages": { - "description": "Example images, which show real-life pictures of what such a feature might look like\n\nType: image", - "type": "array", - "items": { - "type": "string" - } - }, - "preciseInput": { - "description": "If set, the user will prompted to confirm the location before actually adding the data.\nThis will be with a 'drag crosshair'-method.\n\nIf 'preferredBackgroundCategory' is set, the element will attempt to pick a background layer of that category.", - "anyOf": [ - { - "type": "object", - "properties": { - "preferredBackground": { - "description": "The type of background picture", - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "string" - } - ] - }, - "snapToLayer": { - "description": "If specified, these layers will be shown to and the new point will be snapped towards it", - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "string" - } - ] - }, - "maxSnapDistance": { - "description": "If specified, a new point will only be snapped if it is within this range.\nDistance in meter\n\nDefault: 10", - "type": "number" - } - } - }, - { - "enum": [ - true - ], - "type": "boolean" - } - ] - } - }, - "required": [ - "tags", - "title" - ] - } - }, - "tagRenderings": { - "description": "All the tag renderings.\nA tag rendering is a block that either shows the known value or asks a question.\n\nRefer to the class `TagRenderingConfigJson` to see the possibilities.\n\nNote that we can also use a string here - where the string refers to a tag rendering defined in `assets/questions/questions.json`,\nwhere a few very general questions are defined e.g. website, phone number, ...\nFurthermore, _all_ the questions of another layer can be reused with `otherlayer.*`\nIf you need only a single of the tagRenderings, use `otherlayer.tagrenderingId`\nIf one or more questions have a 'group' or 'label' set, select all the entries with the corresponding group or label with `otherlayer.*group`\nRemark: if a tagRendering is 'lent' from another layer, the 'source'-tags are copied and added as condition.\nIf they are not wanted, remove them with an override\n\nA special value is 'questions', which indicates the location of the questions box. If not specified, it'll be appended to the bottom of the featureInfobox.\n\nAt last, one can define a group of renderings where parts of all strings will be replaced by multiple other strings.\nThis is mainly create questions for a 'left' and a 'right' side of the road.\nThese will be grouped and questions will be asked together", - "type": "array", - "items": { - "anyOf": [ - { - "$ref": "#/definitions/QuestionableTagRenderingConfigJson" - }, - { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "builtin": { - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "string" - } - ] - }, - "override": { - "$ref": "#/definitions/Partial" - } - }, - "required": [ - "builtin", - "override" - ] - }, - { - "allOf": [ - { - "$ref": "#/definitions/default<(string|QuestionableTagRenderingConfigJson|{builtin:string;override:Partial;})[]>" - }, - { - "type": "object", - "properties": { - "id": { - "type": "string" - } - }, - "required": [ - "id" - ] - } - ] - }, - { - "type": "string" - } - ] - } - }, - "filter": { - "description": "All the extra questions for filtering.\nIf a string is given, mapComplete will search in 'filters.json' for the appropriate filter or will try to parse it as `layername.filterid` and us that one", - "anyOf": [ - { - "type": "array", - "items": { - "anyOf": [ - { - "$ref": "#/definitions/default_1" - }, - { - "type": "string" - } - ] - } - }, - { - "type": "object", - "properties": { - "sameAs": { - "type": "string" - } - }, - "required": [ - "sameAs" - ] - } - ] - }, - "deletion": { - "description": "This block defines under what circumstances the delete dialog is shown for objects of this layer.\nIf set, a dialog is shown to the user to (soft) delete the point.\nThe dialog is built to be user friendly and to prevent mistakes.\nIf deletion is not possible, the dialog will hide itself and show the reason of non-deletability instead.\n\nTo configure, the following values are possible:\n\n- false: never ever show the delete button\n- true: show the default delete button\n- undefined: use the mapcomplete default to show deletion or not. Currently, this is the same as 'false' but this will change in the future\n- or: a hash with options (see below)\n\n The delete dialog\n =================\n\n\n\n#### Hard deletion if enough experience\n\nA feature can only be deleted from OpenStreetMap by mapcomplete if:\n\n- It is a node\n- No ways or relations use the node\n- The logged-in user has enough experience OR the user is the only one to have edited the point previously\n- The logged-in user has no unread messages (or has a ton of experience)\n- The user did not select one of the 'non-delete-options' (see below)\n\nIn all other cases, a 'soft deletion' is used.\n\n#### Soft deletion\n\nA 'soft deletion' is when the point isn't deleted from OSM but retagged so that it'll won't how up in the mapcomplete theme anymore.\nThis makes it look like it was deleted, without doing damage. A fixme will be added to the point.\n\nNote that a soft deletion is _only_ possible if these tags are provided by the theme creator, as they'll be different for every theme\n\n#### No-delete options\n\nIn some cases, the contributor might want to delete something for the wrong reason (e.g. someone who wants to have a path removed \"because the path is on their private property\").\nHowever, the path exists in reality and should thus be on OSM - otherwise the next contributor will pass by and notice \"hey, there is a path missing here! Let me redraw it in OSM!)\n\nThe correct approach is to retag the feature in such a way that it is semantically correct *and* that it doesn't show up on the theme anymore.\nA no-delete option is offered as 'reason to delete it', but secretly retags.", - "anyOf": [ - { - "$ref": "#/definitions/DeleteConfigJson" - }, - { - "type": "boolean" - } - ] - }, - "allowMove": { - "description": "Indicates if a point can be moved and configures the modalities.\n\nA feature can be moved by MapComplete if:\n\n- It is a point\n- The point is _not_ part of a way or a a relation.\n\nOff by default. Can be enabled by setting this flag or by configuring.", - "anyOf": [ - { - "$ref": "#/definitions/default_3" - }, - { - "type": "boolean" - } - ] - }, - "allowSplit": { - "description": "If set, a 'split this way' button is shown on objects rendered as LineStrings, e.g. highways.\n\nIf the way is part of a relation, MapComplete will attempt to update this relation as well", - "type": "boolean" - }, - "units": { - "type": "array", - "items": { - "$ref": "#/definitions/default_2" - } - }, - "syncSelection": { - "description": "If set, synchronizes whether or not this layer is enabled.\n\nno: Do not sync at all, always revert to default\nlocal: keep selection on local storage\ntheme-only: sync via OSM, but this layer will only be toggled in this theme\nglobal: all layers with this ID will be synced accross all themes", - "enum": [ - "global", - "local", - "no", - "theme-only" - ], - "type": "string" - }, - "#": { - "description": "Used for comments and/or to disable some checks\n\nno-question-hint-check: disables a check in MiscTagRenderingChecks which complains about 'div', 'span' or 'class=subtle'-HTML elements in the tagRendering", - "type": "string" - } - }, - "required": [ - "id", - "mapRendering", - "source" - ], - "additionalProperties": false - }, - "Partial": { - "type": "object", - "properties": { - "id": { - "description": "The id of this layer.\nThis should be a simple, lowercase, human readable string that is used to identify the layer.", - "type": "string" - }, - "name": { - "description": "The name of this layer\nUsed in the layer control panel and the 'Personal theme'.\n\nIf not given, will be hidden (and thus not toggable) in the layer control", - "anyOf": [ - { - "$ref": "#/definitions/Record" - }, - { - "type": "string" - } - ] - }, - "description": { - "description": "A description for this layer.\nShown in the layer selections and in the personel theme", - "anyOf": [ - { - "$ref": "#/definitions/Record" - }, - { - "type": "string" - } - ] - }, - "source": { - "description": "This determines where the data for the layer is fetched: from OSM or from an external geojson dataset.\n\nIf no 'geojson' is defined, data will be fetched from overpass and the OSM-API.\n\nEvery source _must_ define which tags _must_ be present in order to be picked up.\n\nNote: a source must always be defined. 'special' is only allowed if this is a builtin-layer", - "anyOf": [ - { - "type": "object", - "properties": { - "osmTags": { - "$ref": "#/definitions/TagConfigJson", - "description": "Every source must set which tags have to be present in order to load the given layer." - }, - "maxCacheAge": { - "description": "The maximum amount of seconds that a tile is allowed to linger in the cache", - "type": "number" - } - }, - "required": [ - "osmTags" - ] - }, - { - "type": "object", - "properties": { - "geoJson": { - "description": "The actual source of the data to load, if loaded via geojson.\n\n# A single geojson-file\nsource: {geoJson: \"https://my.source.net/some-geo-data.geojson\"}\n fetches a geojson from a third party source\n\n# A tiled geojson source\nsource: {geoJson: \"https://my.source.net/some-tile-geojson-{layer}-{z}-{x}-{y}.geojson\", geoJsonZoomLevel: 14}\n to use a tiled geojson source. The web server must offer multiple geojsons. {z}, {x} and {y} are substituted by the location; {layer} is substituted with the id of the loaded layer\n\nSome API's use a BBOX instead of a tile, this can be used by specifying {y_min}, {y_max}, {x_min} and {x_max}", - "type": "string" - }, - "geoJsonZoomLevel": { - "description": "To load a tiled geojson layer, set the zoomlevel of the tiles", - "type": "number" - }, - "isOsmCache": { - "description": "Indicates that the upstream geojson data is OSM-derived.\nUseful for e.g. merging or for scripts generating this cache", - "type": "boolean" - }, - "mercatorCrs": { - "description": "Some API's use a mercator-projection (EPSG:900913) instead of WGS84. Set the flag `mercatorCrs: true` in the source for this", - "type": "boolean" - }, - "idKey": { - "description": "Some API's have an id-field, but give it a different name.\nSetting this key will rename this field into 'id'", - "type": "string" - } - }, - "required": [ - "geoJson" - ] - }, - { - "enum": [ - "special", - "special:library" - ], - "type": "string" - } - ] - }, - "calculatedTags": { - "description": "A list of extra tags to calculate, specified as \"keyToAssignTo=javascript-expression\".\nThere are a few extra functions available. Refer to Docs/CalculatedTags.md for more information\nThe functions will be run in order, e.g.\n[\n \"_max_overlap_m2=Math.max(...feat.overlapsWith(\"someOtherLayer\").map(o => o.overlap))\n \"_max_overlap_ratio=Number(feat._max_overlap_m2)/feat.area\n]\n\nThe specified tags are evaluated lazily. E.g. if a calculated tag is only used in the popup (e.g. the number of nearby features),\nthe expensive calculation will only be performed then for that feature. This avoids clogging up the contributors PC when all features are loaded.\n\nIf a tag has to be evaluated strictly, use ':=' instead:\n\n[\n\"_some_key:=some_javascript_expression\"\n]", - "type": "array", - "items": { - "type": "string" - } - }, - "doNotDownload": { - "description": "If set, this layer will not query overpass; but it'll still match the tags above which are by chance returned by other layers.\nWorks well together with 'passAllFeatures', to add decoration", - "type": "boolean" - }, - "isShown": { - "description": "If set, only features matching this extra tag will be shown.\nThis is useful to hide certain features from view.\n\nImportant: hiding features does not work dynamically, but is only calculated when the data is first renders.\nThis implies that it is not possible to hide a feature after a tagging change\n\nThe default value is 'yes'", - "anyOf": [ - { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" - }, - { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" - }, - { - "type": "string" - } - ] - }, - "forceLoad": { - "description": "Advanced option - might be set by the theme compiler\n\nIf true, this data will _always_ be loaded, even if the theme is disabled", - "type": "boolean" - }, - "minzoom": { - "description": "The minimum needed zoomlevel required before loading of the data start\nDefault: 0", - "type": "number" - }, - "shownByDefault": { - "description": "Indicates if this layer is shown by default;\ncan be used to hide a layer from start, or to load the layer but only to show it where appropriate (e.g. for snapping to it)", - "type": "boolean" - }, - "minzoomVisible": { - "description": "The zoom level at which point the data is hidden again\nDefault: 100 (thus: always visible", - "type": "number" - }, - "title": { - "description": "The title shown in a popup for elements of this layer.", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - }, - "titleIcons": { - "description": "Small icons shown next to the title.\nIf not specified, the OsmLink and wikipedia links will be used by default.\nUse an empty array to hide them.\nNote that \"defaults\" will insert all the default titleIcons (which are added automatically)\n\nType: icon[]", - "anyOf": [ - { - "type": "array", - "items": { - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - } - }, - { - "type": "array", - "items": [ - { - "type": "string", - "enum": [ - "defaults" - ] - } - ], - "minItems": 1, - "maxItems": 1 - } - ] - }, - "mapRendering": { - "description": "Visualisation of the items on the map", - "anyOf": [ - { - "type": "array", - "items": { - "anyOf": [ - { - "$ref": "#/definitions/default_4" - }, - { - "$ref": "#/definitions/default_5" - }, - { - "$ref": "#/definitions/default" - } - ] - } - }, - { - "type": "null" - } - ] - }, - "passAllFeatures": { - "description": "If set, this layer will pass all the features it receives onto the next layer.\nThis is ideal for decoration, e.g. directionss on cameras", - "type": "boolean" - }, - "presets": { - "description": "Presets for this layer.\nA preset shows up when clicking the map on a without data (or when right-clicking/long-pressing);\nit will prompt the user to add a new point.\n\nThe most important aspect are the tags, which define which tags the new point will have;\nThe title is shown in the dialog, along with the first sentence of the description.\n\nUpon confirmation, the full description is shown beneath the buttons - perfect to add pictures and examples.\n\nNote: the icon of the preset is determined automatically based on the tags and the icon above. Don't worry about that!\nNB: if no presets are defined, the popup to add new points doesn't show up at all", - "type": "array", - "items": { - "type": "object", - "properties": { - "title": { - "description": "The title - shown on the 'add-new'-button.\n\nThis should include the article of the noun, e.g. 'a hydrant', 'a bicycle pump'.\nThis text will be inserted into `Add {category} here`, becoming `Add a hydrant here`.\n\nDo _not_ indicate 'new': 'add a new shop here' is incorrect, as the shop might have existed forever, it could just be unmapped!", - "anyOf": [ - { - "$ref": "#/definitions/Record" - }, - { - "type": "string" - } - ] - }, - "tags": { - "description": "The tags to add. It determines the icon too", - "type": "array", - "items": { - "type": "string" - } - }, - "description": { - "description": "The _first sentence_ of the description is shown on the button of the `add` menu.\nThe full description is shown in the confirmation dialog.\n\n(The first sentence is until the first '.'-character in the description)", - "anyOf": [ - { - "$ref": "#/definitions/Record" - }, - { - "type": "string" - } - ] - }, - "exampleImages": { - "description": "Example images, which show real-life pictures of what such a feature might look like\n\nType: image", - "type": "array", - "items": { - "type": "string" - } - }, - "preciseInput": { - "description": "If set, the user will prompted to confirm the location before actually adding the data.\nThis will be with a 'drag crosshair'-method.\n\nIf 'preferredBackgroundCategory' is set, the element will attempt to pick a background layer of that category.", - "anyOf": [ - { - "type": "object", - "properties": { - "preferredBackground": { - "description": "The type of background picture", - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "string" - } - ] - }, - "snapToLayer": { - "description": "If specified, these layers will be shown to and the new point will be snapped towards it", - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "string" - } - ] - }, - "maxSnapDistance": { - "description": "If specified, a new point will only be snapped if it is within this range.\nDistance in meter\n\nDefault: 10", - "type": "number" - } - } - }, - { - "enum": [ - true - ], - "type": "boolean" - } - ] - } - }, - "required": [ - "tags", - "title" - ] - } - }, - "tagRenderings": { - "description": "All the tag renderings.\nA tag rendering is a block that either shows the known value or asks a question.\n\nRefer to the class `TagRenderingConfigJson` to see the possibilities.\n\nNote that we can also use a string here - where the string refers to a tag rendering defined in `assets/questions/questions.json`,\nwhere a few very general questions are defined e.g. website, phone number, ...\nFurthermore, _all_ the questions of another layer can be reused with `otherlayer.*`\nIf you need only a single of the tagRenderings, use `otherlayer.tagrenderingId`\nIf one or more questions have a 'group' or 'label' set, select all the entries with the corresponding group or label with `otherlayer.*group`\nRemark: if a tagRendering is 'lent' from another layer, the 'source'-tags are copied and added as condition.\nIf they are not wanted, remove them with an override\n\nA special value is 'questions', which indicates the location of the questions box. If not specified, it'll be appended to the bottom of the featureInfobox.\n\nAt last, one can define a group of renderings where parts of all strings will be replaced by multiple other strings.\nThis is mainly create questions for a 'left' and a 'right' side of the road.\nThese will be grouped and questions will be asked together", - "type": "array", - "items": { - "anyOf": [ - { - "$ref": "#/definitions/QuestionableTagRenderingConfigJson" - }, - { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "builtin": { - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "string" - } - ] - }, - "override": { - "$ref": "#/definitions/Partial" - } - }, - "required": [ - "builtin", - "override" - ] - }, - { - "allOf": [ - { - "$ref": "#/definitions/default<(string|QuestionableTagRenderingConfigJson|{builtin:string;override:Partial;})[]>" - }, - { - "type": "object", - "properties": { - "id": { - "type": "string" - } - }, - "required": [ - "id" - ] - } - ] - }, - { - "type": "string" - } - ] - } - }, - "filter": { - "description": "All the extra questions for filtering.\nIf a string is given, mapComplete will search in 'filters.json' for the appropriate filter or will try to parse it as `layername.filterid` and us that one", - "anyOf": [ - { - "type": "array", - "items": { - "anyOf": [ - { - "$ref": "#/definitions/default_1" - }, - { - "type": "string" - } - ] - } - }, - { - "type": "object", - "properties": { - "sameAs": { - "type": "string" - } - }, - "required": [ - "sameAs" - ] - } - ] - }, - "deletion": { - "description": "This block defines under what circumstances the delete dialog is shown for objects of this layer.\nIf set, a dialog is shown to the user to (soft) delete the point.\nThe dialog is built to be user friendly and to prevent mistakes.\nIf deletion is not possible, the dialog will hide itself and show the reason of non-deletability instead.\n\nTo configure, the following values are possible:\n\n- false: never ever show the delete button\n- true: show the default delete button\n- undefined: use the mapcomplete default to show deletion or not. Currently, this is the same as 'false' but this will change in the future\n- or: a hash with options (see below)\n\n The delete dialog\n =================\n\n\n\n#### Hard deletion if enough experience\n\nA feature can only be deleted from OpenStreetMap by mapcomplete if:\n\n- It is a node\n- No ways or relations use the node\n- The logged-in user has enough experience OR the user is the only one to have edited the point previously\n- The logged-in user has no unread messages (or has a ton of experience)\n- The user did not select one of the 'non-delete-options' (see below)\n\nIn all other cases, a 'soft deletion' is used.\n\n#### Soft deletion\n\nA 'soft deletion' is when the point isn't deleted from OSM but retagged so that it'll won't how up in the mapcomplete theme anymore.\nThis makes it look like it was deleted, without doing damage. A fixme will be added to the point.\n\nNote that a soft deletion is _only_ possible if these tags are provided by the theme creator, as they'll be different for every theme\n\n#### No-delete options\n\nIn some cases, the contributor might want to delete something for the wrong reason (e.g. someone who wants to have a path removed \"because the path is on their private property\").\nHowever, the path exists in reality and should thus be on OSM - otherwise the next contributor will pass by and notice \"hey, there is a path missing here! Let me redraw it in OSM!)\n\nThe correct approach is to retag the feature in such a way that it is semantically correct *and* that it doesn't show up on the theme anymore.\nA no-delete option is offered as 'reason to delete it', but secretly retags.", - "anyOf": [ - { - "$ref": "#/definitions/DeleteConfigJson" - }, - { - "type": "boolean" - } - ] - }, - "allowMove": { - "description": "Indicates if a point can be moved and configures the modalities.\n\nA feature can be moved by MapComplete if:\n\n- It is a point\n- The point is _not_ part of a way or a a relation.\n\nOff by default. Can be enabled by setting this flag or by configuring.", - "anyOf": [ - { - "$ref": "#/definitions/default_3" - }, - { - "type": "boolean" - } - ] - }, - "allowSplit": { - "description": "If set, a 'split this way' button is shown on objects rendered as LineStrings, e.g. highways.\n\nIf the way is part of a relation, MapComplete will attempt to update this relation as well", - "type": "boolean" - }, - "units": { - "type": "array", - "items": { - "$ref": "#/definitions/default_2" - } - }, - "syncSelection": { - "description": "If set, synchronizes whether or not this layer is enabled.\n\nno: Do not sync at all, always revert to default\nlocal: keep selection on local storage\ntheme-only: sync via OSM, but this layer will only be toggled in this theme\nglobal: all layers with this ID will be synced accross all themes", - "enum": [ - "global", - "local", - "no", - "theme-only" - ], - "type": "string" - }, - "#": { - "description": "Used for comments and/or to disable some checks\n\nno-question-hint-check: disables a check in MiscTagRenderingChecks which complains about 'div', 'span' or 'class=subtle'-HTML elements in the tagRendering", - "type": "string" - } - }, - "additionalProperties": false - }, - "default": { - "type": "object", - "properties": { - "icon": { - "type": "string" - }, - "text": {}, - "href": { - "type": "string" - }, - "newTab": { - "type": "boolean" - }, - "requirements": { - "type": "array", - "items": { - "enum": [ - "iframe", - "no-iframe", - "no-welcome-message", - "welcome-message" - ], - "type": "string" - } - } - }, - "required": [ - "href" - ], - "additionalProperties": false } }, "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false -} +} \ No newline at end of file diff --git a/Docs/Schemas/LayoutConfigJsonJSC.ts b/Docs/Schemas/LayoutConfigJsonJSC.ts index 8e2dd5229..5913488bc 100644 --- a/Docs/Schemas/LayoutConfigJsonJSC.ts +++ b/Docs/Schemas/LayoutConfigJsonJSC.ts @@ -3,12 +3,19 @@ export default { "type": "object", "properties": { "id": { - "description": "The id of this layout.\n\nThis is used as hashtag in the changeset message, which will read something like \"Adding data with #mapcomplete for theme #\"\nMake sure it is something decent and descriptive, it should be a simple, lowercase string.\n\nOn official themes, it'll become the name of the page, e.g.\n'cyclestreets' which become 'cyclestreets.html'", + "description": "question: What is the id of this layout?\n\nThe id is a unique string to identify the theme\n\nIt should be\n- in english\n- describe the theme in a single word (or a few words)\n- all lowercase and with only [a-z] or underscores (_)\n\nThis is used as hashtag in the changeset message, which will read something like \"Adding data with #mapcomplete for theme #\"\n\nOn official themes, it'll become the name of the page, e.g.\n'cyclestreets' which become 'cyclestreets.html'\n\ntype: id\ngroup: basic", "type": "string" }, - "credits": { - "description": "Who helped to create this theme and should be attributed?", - "type": "string" + "title": { + "description": "question: What is the title of this theme?\n\nThe human-readable title, as shown in the welcome message and the index page\ngroup: basic", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] }, "mustHaveLanguage": { "description": "Only used in 'generateLayerOverview': if present, every translation will be checked to make sure it is fully translated.\n\nThis must be a list of two-letter, lowercase codes which identifies the language, e.g. \"en\", \"nl\", ...", @@ -17,8 +24,8 @@ export default { "type": "string" } }, - "title": { - "description": "The title, as shown in the welcome message and the more-screen.", + "description": { + "description": "question: How would you describe this theme?\nThe description, as shown in the welcome message and the more-screen\ngroup: basic", "anyOf": [ { "$ref": "#/definitions/Record" @@ -29,18 +36,7 @@ export default { ] }, "shortDescription": { - "description": "A short description, showed as social description and in the 'more theme'-buttons.\nNote that if this one is not defined, the first sentence of 'description' is used", - "anyOf": [ - { - "$ref": "#/definitions/Record" - }, - { - "type": "string" - } - ] - }, - "description": { - "description": "The description, as shown in the welcome message and the more-screen", + "description": "A short description, showed as social description and in the 'more theme'-buttons.\nNote that if this one is not defined, the first sentence of 'description' is used\ngroup: hidden", "anyOf": [ { "$ref": "#/definitions/Record" @@ -51,7 +47,7 @@ export default { ] }, "descriptionTail": { - "description": "A part of the description, shown under the login-button.", + "description": "A part of the description, shown under the login-button.\ngroup: hidden", "anyOf": [ { "$ref": "#/definitions/Record" @@ -62,64 +58,53 @@ export default { ] }, "icon": { - "description": "The icon representing this theme.\nUsed as logo in the more-screen and (for official themes) as favicon, webmanifest logo, ...\nEither a URL or a base64 encoded value (which should include 'data:image/svg+xml;base64)\n\nType: icon", + "description": "question: What icon should be used to represent this theme?\n\nUsed as logo in the more-screen and (for official themes) as favicon, webmanifest logo, ...\n\nEither a URL or a base64 encoded value (which should include 'data:image/svg+xml;base64)\n\nType: icon\ngroup: basic", "type": "string" }, "socialImage": { - "description": "Link to a 'social image' which is included as og:image-tag on official themes.\nUseful to share the theme on social media.\nSee https://www.h3xed.com/web-and-internet/how-to-use-og-image-meta-tag-facebook-reddit for more information$\n\nType: image", + "description": "question: What image should be used as social image preview?\nThis is included as og:image-tag on official themes.\n\nSee https://www.h3xed.com/web-and-internet/how-to-use-og-image-meta-tag-facebook-reddit for more information\nifunset: use the default social image of mapcomplete (or generate one based on the icon)\nType: image\ngroup: basic", "type": "string" }, + "extraLink": { + "description": "question: should an extra help button be shown in certain circumstances?\nAdds an additional button on the top-left of the application.\nThis can link to an arbitrary location.\n\nFor example {icon: \"./assets/svg/pop-out.svg\", href: 'https://mapcomplete.org/{theme}.html?lat={lat}&lon={lon}&z={zoom}, requirements: [\"iframe\",\"no-welcome-message]},\n\ngroup: advanced\nifunset: show a link to open MapComplete full screen if used in an iframe", + "$ref": "#/definitions/default" + }, "startZoom": { - "description": "Default location and zoom to start.\nNote that this is barely used. Once the user has visited mapcomplete at least once, the previous location of the user will be used", + "description": "question: At what zoomlevel should this theme open?\nDefault location and zoom to start.\nNote that this is barely used. Once the user has visited mapcomplete at least once, the previous location of the user will be used\nifunset: Use the default startzoom (0)\ntype: float\ngroup: start_location", "type": "number" }, "startLat": { + "description": "question: At what start latitude should this theme open?\nDefault location and zoom to start.\nNote that this is barely used. Once the user has visited mapcomplete at least once, the previous location of the user will be used\nifunset: Use 0 as start latitude\ntype: float\ngroup: start_location", "type": "number" }, "startLon": { + "description": "question: At what start longitude should this theme open?\nDefault location and zoom to start.\nNote that this is barely used. Once the user has visited mapcomplete at least once, the previous location of the user will be used\nifunset: Use 0 as start longitude\ntype: float\ngroup: start_location", "type": "number" }, - "widenFactor": { - "description": "When a query is run, the data within bounds of the visible map is loaded.\nHowever, users tend to pan and zoom a lot. It is pretty annoying if every single pan means a reloading of the data.\nFor this, the bounds are widened in order to make a small pan still within bounds of the loaded data.\n\nIF widenfactor is 1, this feature is disabled. A recommended value is between 1 and 3", - "type": "number" - }, - "overpassMaxZoom": { - "description": "At low zoom levels, overpass is used to query features.\nAt high zoom level, the OSM api is used to fetch one or more BBOX aligning with a slippy tile.\nThe overpassMaxZoom controls the flipoverpoint: if the zoom is this or lower, overpass is used.", - "type": "number" - }, - "osmApiTileSize": { - "description": "When the OSM-api is used to fetch features, it does so in a tiled fashion.\nThese tiles are using a ceratin zoom level, that can be controlled here\nDefault: overpassMaxZoom + 1", - "type": "number" - }, - "overrideAll": { - "description": "An override applied on all layers of the theme.\n\nE.g.: if there are two layers defined:\n```\n\"layers\":[\n {\"title\": ..., \"tagRenderings\": [...], \"osmSource\":{\"tags\": ...}},\n {\"title\", ..., \"tagRenderings\", [...], \"osmSource\":{\"tags\" ...}}\n]\n```\n\nand overrideAll is specified:\n```\n\"overrideAll\": {\n \"osmSource\":{\"geoJsonSource\":\"xyz\"}\n}\nthen the result will be that all the layers will have these properties applied and result in:\n\"layers\":[\n {\"title\": ..., \"tagRenderings\": [...], \"osmSource\":{\"tags\": ..., \"geoJsonSource\":\"xyz\"}},\n {\"title\", ..., \"tagRenderings\", [...], \"osmSource\":{\"tags\" ..., \"geoJsonSource\":\"xyz\"}}\n]\n```\n\nIf the overrideAll contains a list where the keys starts with a plus, the values will be appended (instead of discarding the old list), for example\n\n\"overrideAll\": {\n \"+tagRenderings\": [ { ... some tagrendering ... }]\n}\n\nIn the above scenario, `sometagrendering` will be added at the beginning of the tagrenderings of every layer", - "$ref": "#/definitions/Partial" - }, "defaultBackgroundId": { "description": "The id of the default background. BY default: vanilla OSM", "type": "string" }, - "tileLayerSources": { - "description": "Define some (overlay) slippy map tilesources", - "type": "array", - "items": { - "allOf": [ - { - "$ref": "#/definitions/RasterLayerProperties" - }, - { - "type": "object", - "properties": { - "defaultState": { - "type": "boolean" - } - } + "credits": { + "description": "Who helped to create this theme and should be attributed?", + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" } - ] - } + }, + { + "type": "string" + } + ] + }, + "hideFromOverview": { + "description": "If set to true, this layout will not be shown in the overview with more themes", + "type": "boolean" }, "layers": { - "description": "The layers to display.\n\nEvery layer contains a description of which feature to display - the overpassTags which are queried.\nInstead of running one query for every layer, the query is fused.\n\nAfterwards, every layer is given the list of features.\nEvery layer takes away the features that match with them*, and give the leftovers to the next layers.\n\nThis implies that the _order_ of the layers is important in the case of features with the same tags;\nas the later layers might never receive their feature.\n\n*layers can also remove 'leftover'-features if the leftovers overlap with a feature in the layer itself\n\nNote that builtin layers can be reused. Either put in the name of the layer to reuse, or use {builtin: \"layername\", override: ...}\n\nThe 'override'-object will be copied over the original values of the layer, which allows to change certain aspects of the layer\n\nFor example: If you would like to use layer nature reserves, but only from a specific operator (eg. Natuurpunt) you would use the following in your theme:\n\n```\n\"layer\": {\n \"builtin\": \"nature_reserve\",\n \"override\": {\"source\":\n {\"osmTags\": {\n \"+and\":[\"operator=Natuurpunt\"]\n }\n }\n }\n}\n```\n\nIt's also possible to load multiple layers at once, for example, if you would like for both drinking water and benches to start at the zoomlevel at 12, you would use the following:\n\n```\n\"layer\": {\n \"builtin\": [\"benches\", \"drinking_water\"],\n \"override\": {\"minzoom\": 12}\n}\n```", + "description": "question: What layers should this map show?\ntype: layer[]\ntypes: hidden | layer | hidden\ngroup: layers\nsuggestions: return Array.from(layers.keys()).map(key => ({if: \"value=\"+key, then: key+\" - \"+layers.get(key).description}))\nEvery layer contains a description of which feature to display - the overpassTags which are queried.\nInstead of running one query for every layer, the query is fused.\n\nAfterwards, every layer is given the list of features.\nEvery layer takes away the features that match with them*, and give the leftovers to the next layers.\n\nThis implies that the _order_ of the layers is important in the case of features with the same tags;\nas the later layers might never receive their feature.\n\n*layers can also remove 'leftover'-features if the leftovers overlap with a feature in the layer itself\n\nNote that builtin layers can be reused. Either put in the name of the layer to reuse, or use {builtin: \"layername\", override: ...}\n\nThe 'override'-object will be copied over the original values of the layer, which allows to change certain aspects of the layer\n\nFor example: If you would like to use layer nature reserves, but only from a specific operator (eg. Natuurpunt) you would use the following in your theme:\n\n```\n\"layer\": {\n \"builtin\": \"nature_reserve\",\n \"override\": {\"source\":\n {\"osmTags\": {\n \"+and\":[\"operator=Natuurpunt\"]\n }\n }\n }\n}\n```\n\nIt's also possible to load multiple layers at once, for example, if you would like for both drinking water and benches to start at the zoomlevel at 12, you would use the following:\n\n```\n\"layer\": {\n \"builtin\": [\"benches\", \"drinking_water\"],\n \"override\": {\"minzoom\": 12}\n}\n```", "type": "array", "items": { "anyOf": [ @@ -164,13 +149,32 @@ export default { ] } }, - "customCss": { - "description": "The URL of a custom CSS stylesheet to modify the layout", - "type": "string" + "overrideAll": { + "description": "An override applied on all layers of the theme.\n\nE.g.: if there are two layers defined:\n```\n\"layers\":[\n {\"title\": ..., \"tagRenderings\": [...], \"osmSource\":{\"tags\": ...}},\n {\"title\", ..., \"tagRenderings\", [...], \"osmSource\":{\"tags\" ...}}\n]\n```\n\nand overrideAll is specified:\n```\n\"overrideAll\": {\n \"osmSource\":{\"geoJsonSource\":\"xyz\"}\n}\nthen the result will be that all the layers will have these properties applied and result in:\n\"layers\":[\n {\"title\": ..., \"tagRenderings\": [...], \"osmSource\":{\"tags\": ..., \"geoJsonSource\":\"xyz\"}},\n {\"title\", ..., \"tagRenderings\", [...], \"osmSource\":{\"tags\" ..., \"geoJsonSource\":\"xyz\"}}\n]\n```\n\nIf the overrideAll contains a list where the keys starts with a plus, the values will be appended (instead of discarding the old list), for example\n\n\"overrideAll\": {\n \"+tagRenderings\": [ { ... some tagrendering ... }]\n}\n\nIn the above scenario, `sometagrendering` will be added at the beginning of the tagrenderings of every layer", + "$ref": "#/definitions/Partial" }, - "hideFromOverview": { - "description": "If set to true, this layout will not be shown in the overview with more themes", - "type": "boolean" + "tileLayerSources": { + "description": "Define some (overlay) slippy map tilesources", + "type": "array", + "items": { + "allOf": [ + { + "$ref": "#/definitions/RasterLayerProperties" + }, + { + "type": "object", + "properties": { + "defaultState": { + "type": "boolean" + } + } + } + ] + } + }, + "customCss": { + "description": "The URL of a custom CSS stylesheet to modify the layout\ngroup: advanced", + "type": "string" }, "lockLocation": { "description": "If set to true, the basemap will not scroll outside of the area visible on initial zoom.\nIf set to [[lon, lat], [lon, lat]], the map will not scroll outside of those bounds.\nOff by default, which will enable panning to the entire world", @@ -219,78 +223,79 @@ export default { } ] }, - "extraLink": { - "description": "Adds an additional button on the top-left of the application.\nThis can link to an arbitrary location.\n\nNote that {lat},{lon},{zoom}, {language} and {theme} will be replaced\n\nDefault: {icon: \"./assets/svg/pop-out.svg\", href: 'https://mapcomplete.org/{theme}.html?lat={lat}&lon={lon}&z={zoom}, requirements: [\"iframe\",\"no-welcome-message]},", - "$ref": "#/definitions/default" - }, "enableUserBadge": { - "description": "If set to false, disables logging in.\nThe userbadge will be hidden, all login-buttons will be hidden and editing will be disabled", + "description": "question: Should a user be able to login with OpenStreetMap?\n\nIf not logged in, will not show the login buttons and hide all the editable elements.\nAs such, MapComplete will become read-only and a purely visualisation tool.\n\nifunset: Enable the possiblity to login with OpenStreetMap (default)\niffalse: Do not enable to login with OpenStreetMap, have a read-only view of MapComplete.\niftrue: Enable the possiblity to login with OpenStreetMap\ngroup: feature_switches", "type": "boolean" }, "enableShareScreen": { - "description": "If false, hides the tab 'share'-tab in the welcomeMessage", + "description": "question: Should the tab with options to share the current screen be enabled?\n\nOn can get the iFrame embed code here\n\nifunset: Enable the sharescreen (default)\niffalse: Do not enable the share screen\niftrue: Enable the share screen\ngroup: feature_switches", "type": "boolean" }, "enableMoreQuests": { - "description": "Hides the tab with more themes in the welcomeMessage", + "description": "question: Should the user be able to switch to different themes?\n\nTypically enabled in iframes and/or on commisioned themes\n\niftrue: enable to go back to the index page showing all themes\niffalse: do not enable to go back to the index page showing all themes; hide the 'more themes' buttons\nifunset: mapcomplete default: enable to go back to the index page showing all themes\ngroup: feature_switches", "type": "boolean" }, "enableLayers": { - "description": "If false, the layer selection/filter view will be hidden\nThe corresponding URL-parameter is 'fs-filters' instead of 'fs-layers'", + "description": "question: Should the user be able to enable/disable layers and to filter the layers?\n\nThe corresponding URL-parameter is 'fs-filters' instead of 'fs-layers'\niftrue: enable the filters/layers pane\niffalse: do not enable to filter or to disable layers; hide the 'filter' tab from the overview and the button at the bottom-left\nifunset: mapcomplete default: enable to filter or to enable/disable layers\ngroup: feature_switches", "type": "boolean" }, "enableSearch": { - "description": "If set to false, hides the search bar", + "description": "question: Should the user be able to search for locations?\n\nifunset: MapComplete default: allow to search\niftrue: Allow to search\niffalse: Do not allow to search; hide the search-bar\ngroup: feature_switches", "type": "boolean" }, "enableAddNewPoints": { - "description": "If set to false, the ability to add new points or nodes will be disabled.\nEditing already existing features will still be possible", + "description": "question: Should the user be able to add new points?\n\nAdding new points is only possible if the loaded layers have presets set.\nSome layers do not have presets. If the theme only has layers without presets, then adding new points will not be possible.\n\nifunset: MapComplete default: allow to create new points\niftrue: Allow to create new points\niffalse: Do not allow to create new points, even if the layers in this theme support creating new points\ngroup: feature_switches", "type": "boolean" }, "enableGeolocation": { - "description": "If set to false, the 'geolocation'-button will be hidden.", + "description": "question: Should the user be able to use their GPS to geolocate themselfes on the map?\nifunset: MapComplete default: allow to use the GPS\niftrue: Allow to use the GPS\niffalse: Do not allow to use the GPS, hide the geolocation-buttons\ngroup: feature_switches", "type": "boolean" }, "enableBackgroundLayerSelection": { - "description": "Enable switching the backgroundlayer.\nIf false, the quickswitch-buttons are removed (bottom left) and the dropdown in the layer selection is removed as well", + "description": "Enable switching the backgroundlayer.\nIf false, the quickswitch-buttons are removed (bottom left) and the dropdown in the layer selection is removed as well\n\nquestion: Should the user be able to switch the background layer?\n\niftrue: Allow to switch the background layer\niffalse: Do not allow to switch the background layer\nifunset: MapComplete default: Allow to switch the background layer\ngroup: feature_switches", "type": "boolean" }, "enableShowAllQuestions": { - "description": "If set to true, will show _all_ unanswered questions in a popup instead of just the next one", + "description": "question: Should the questions about a feature be presented one by one or all at once?\niftrue: Show all unanswered questions at the same time\niffalse: Show unanswered questions one by one\nifunset: MapComplete default: Use the preference of the user to show questions at the same time or one by one\ngroup: feature_switches", "type": "boolean" }, "enableDownload": { - "description": "If set to true, download button for the data will be shown (offers downloading as geojson and csv)", + "description": "question: Should the 'download as CSV'- and 'download as Geojson'-buttons be enabled?\niftrue: Enable the option to download the map as CSV and GeoJson\niffalse: Enable the option to download the map as CSV and GeoJson\nifunset: MapComplete default: Enable the option to download the map as CSV and GeoJson\ngroup: feature_switches", "type": "boolean" }, "enablePdfDownload": { - "description": "If set to true, exporting a pdf is enabled", + "description": "question: Should the 'download as PDF'-button be enabled?\niftrue: Enable the option to download the map as PDF\niffalse: Enable the option to download the map as PDF\nifunset: MapComplete default: Enable the option to download the map as PDF\ngroup: feature_switches", "type": "boolean" }, "enableNoteImports": { - "description": "If true, notes will be loaded and parsed. If a note is an import (as created by the import_helper.html-tool from mapcomplete),\nthese notes will be shown if a relevant layer is present.\n\nDefault is true for official layers and false for unofficial (sideloaded) layers", + "description": "question: Should the 'notes' from OpenStreetMap be loaded and parsed for import helper notes?\nIf true, notes will be loaded and parsed. If a note is an import (as created by the import_helper.html-tool from mapcomplete),\nthese notes will be shown if a relevant layer is present.\n\nifunset: MapComplete default: do not load import notes for sideloaded themes but do load them for official themes\niftrue: Load notes and show import notes\niffalse: Do not load import notes\ngroup: advanced", "type": "boolean" }, "overpassUrl": { - "description": "Set one or more overpass URLs to use for this theme..", - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "string" - } - ] + "description": "question: What overpass-api instance should be used for this layout?\n\nifunset: Use the default, builtin collection of overpass instances\ngroup: advanced", + "type": "array", + "items": { + "type": "string" + } }, "overpassTimeout": { - "description": "Set a different timeout for overpass queries - in seconds. Default: 30s", + "description": "question: After how much seconds should the overpass-query stop?\nIf a query takes too long, the overpass-server will abort.\nOnce can set the amount of time before overpass gives up here.\nifunset: use the default amount of 30 seconds as timeout\ntype: pnat\ngroup: advanced", + "type": "number" + }, + "widenFactor": { + "description": "When a query is run, the data within bounds of the visible map is loaded.\nHowever, users tend to pan and zoom a lot. It is pretty annoying if every single pan means a reloading of the data.\nFor this, the bounds are widened in order to make a small pan still within bounds of the loaded data.\n\nIF widenfactor is 1, this feature is disabled. A recommended value is between 1 and 3", + "type": "number" + }, + "overpassMaxZoom": { + "description": "At low zoom levels, overpass is used to query features.\nAt high zoom level, the OSM api is used to fetch one or more BBOX aligning with a slippy tile.\nThe overpassMaxZoom controls the flipoverpoint: if the zoom is this or lower, overpass is used.", + "type": "number" + }, + "osmApiTileSize": { + "description": "When the OSM-api is used to fetch features, it does so in a tiled fashion.\nThese tiles are using a ceratin zoom level, that can be controlled here\nDefault: overpassMaxZoom + 1", "type": "number" }, "enableNodeDatabase": { - "description": "Enables tracking of all nodes when data is loaded.\nThis is useful for the 'ImportWay' and 'ConflateWay'-buttons who need this database.\n\nNote: this flag will be automatically set.", + "description": "Enables tracking of all nodes when data is loaded.\nThis is useful for the 'ImportWay' and 'ConflateWay'-buttons who need this database.\n\nNote: this flag will be automatically set and can thus be ignored.\ngroup: hidden", "type": "boolean" } }, @@ -299,20 +304,16 @@ export default { "icon", "id", "layers", - "startLat", - "startLon", - "startZoom", "title" ], "definitions": { "TagConfigJson": { - "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation", + "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation\n\ntype: tag", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", "type": "object", "properties": { "or": { @@ -331,8 +332,7 @@ export default { } ] }, - "AndTagConfigJson": { - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", + "{and:TagConfigJson[];}": { "type": "object", "properties": { "and": { @@ -346,8 +346,7 @@ export default { "and" ] }, - "OrTagConfigJson": { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", + "{or:TagConfigJson[];}": { "type": "object", "properties": { "or": { @@ -430,48 +429,99 @@ export default { "canonicalDenomination" ] }, + "MinimalTagRenderingConfigJson": { + "description": "Mostly used for lineRendering and pointRendering", + "type": "object", + "properties": { + "render": { + "description": "question: What value should be rendered?\n\nThis piece of text will be shown in the infobox.\nNote that \"&LBRACEkey&RBRACE\"-parts are substituted by the corresponding values of the element.\n\nThis value will be used if there is no mapping which matches (or there are no matches)\nNote that this is a HTML-interpreted value, so you can add links as e.g. '<a href='{website}'>{website}</a>' or include images such as `This is of type A <br><img src='typeA-icon.svg' />`", + "type": "string" + }, + "mappings": { + "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", + "type": "array", + "items": { + "type": "object", + "properties": { + "if": { + "$ref": "#/definitions/TagConfigJson", + "description": "question: When should this single mapping match?\n\nIf this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}" + }, + "then": { + "description": "question: What text should be shown?\n\nIf the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option", + "type": "string" + } + }, + "required": [ + "if", + "then" + ] + } + } + } + }, + "IconConfigJson": { + "type": "object", + "properties": { + "icon": { + "description": "question: What icon should be used?\ntype: icon\nsuggestions: return [\"pin\",\"square\",\"circle\",\"checkmark\",\"clock\",\"close\",\"crosshair\",\"help\",\"home\",\"invalid\",\"location\",\"location_empty\",\"location_locked\",\"note\",\"resolved\",\"ring\",\"scissors\",\"teardrop\",\"teardrop_with_hole_green\",\"triangle\"].map(i => ({if: \"value=\"+i, then: i, icon: i}))", + "anyOf": [ + { + "$ref": "#/definitions/MinimalTagRenderingConfigJson" + }, + { + "type": "object", + "properties": { + "builtin": { + "type": "string" + }, + "override": {} + }, + "required": [ + "builtin", + "override" + ] + }, + { + "type": "string" + } + ] + }, + "color": { + "description": "question: What colour should the icon be?\nThis will only work for the default icons such as `pin`,`circle`,...\ntype: color", + "anyOf": [ + { + "$ref": "#/definitions/MinimalTagRenderingConfigJson" + }, + { + "type": "object", + "properties": { + "builtin": { + "type": "string" + }, + "override": {} + }, + "required": [ + "builtin", + "override" + ] + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "icon" + ] + }, "TagRenderingConfigJson": { "description": "A TagRenderingConfigJson is a single piece of code which converts one ore more tags into a HTML-snippet.\nFor an _editable_ tagRendering, use 'QuestionableTagRenderingConfigJson' instead, which extends this one", "type": "object", "properties": { - "id": { - "description": "The id of the tagrendering, should be an unique string.\nUsed to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise.\n\nUse 'questions' to trigger the question box of this group (if a group is defined)", - "type": "string" - }, - "labels": { - "description": "A list of labels. These are strings that are used for various purposes, e.g. to filter them away", - "type": "array", - "items": { - "type": "string" - } - }, - "classes": { - "description": "A list of css-classes to apply to the entire tagRendering if the answer is known (not applied on the question).\nThis is only for advanced users", - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "string" - } - ] - }, - "description": { - "description": "A human-readable text explaining what this tagRendering does", - "anyOf": [ - { - "$ref": "#/definitions/Record" - }, - { - "type": "string" - } - ] - }, "render": { - "description": "Renders this value. Note that \"{key}\"-parts are substituted by the corresponding values of the element.\nIf neither 'textFieldQuestion' nor 'mappings' are defined, this text is simply shown as default value.\n\nNote 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
`\ntype: rendered", + "description": "question: What text should be rendered?\n\nThis piece of text will be shown in the infobox.\nIn this text, values within braces (such as {braced(key)}) are replaced by the corresponding `value` in the object.\nFor example, if the object contains tags `amenity=school; name=Windy Hill School`, the render string `This school is named {name}` will be shown to the user as `This school is named Windy Hill School`\n\nThis text will be shown if:\n- there is no mapping which matches (or there are no matches)\n- no question, no mappings and no 'freeform' is set\n\nNote that this is a HTML-interpreted value, so you can add links as e.g. '<a href='{website}'>{website}</a>' or include images such as `This is of type A <br><img src='typeA-icon.svg' />`\ntype: rendered\nifunset: no text is rendered if no predefined options match", "anyOf": [ { "$ref": "#/definitions/Record" @@ -507,16 +557,38 @@ export default { } ] }, - "condition": { - "description": "Only show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", + "icon": { + "description": "question: what icon should be shown next to the 'render' value?\nAn icon shown next to the rendering; typically shown pretty small\nThis is only shown next to the \"render\" value\nType: icon\nifunset: do not show an icon next to the \"render\"-value", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "type": "object", + "properties": { + "path": { + "description": "The path to the icon\nType: icon", + "type": "string" + }, + "class": { + "description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-', so defining your own in combination with a custom CSS is possible (but discouraged)", + "type": "string" + } + }, + "required": [ + "path" + ] }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "type": "string" + } + ] + }, + "condition": { + "description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or ask the question if unkown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", + "anyOf": [ + { + "$ref": "#/definitions/{and:TagConfigJson[];}" + }, + { + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -524,15 +596,13 @@ export default { ] }, "metacondition": { - "description": "If set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", + "description": "question: When should this item be shown (including special conditions)?\ntype: tag\n\nIf set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -540,17 +610,14 @@ export default { ] }, "freeform": { - "description": "Allow freeform text input from the user", + "description": "question: Should a freeform text field be shown?\nAllow freeform text input from the user\nifunset: Do not add a freeform text field", "type": "object", "properties": { "key": { - "description": "If this key is present, then 'render' is used to display the value.\nIf this is undefined, the rendering is _always_ shown", + "description": "What attribute should be filled out\nIf this key is present in the feature, then 'render' is used to display the value.\nIf this is undefined, the rendering is _always_ shown", "type": "string" } - }, - "required": [ - "key" - ] + } }, "mappings": { "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", @@ -560,10 +627,10 @@ export default { "properties": { "if": { "$ref": "#/definitions/TagConfigJson", - "description": "If this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}" + "description": "question: When should this single mapping match?\n\nIf this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}" }, "then": { - "description": "If the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option\nType: rendered", + "description": "question: What text should be shown?\n\nIf the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option\nType: rendered", "anyOf": [ { "$ref": "#/definitions/Record" @@ -574,7 +641,7 @@ export default { ] }, "icon": { - "description": "An icon supporting this mapping; typically shown pretty small\nType: icon", + "description": "question: What icon should be added to this mapping?\nifunset: Do not show an extra icon next to the render value\n\nAn icon supporting this mapping; typically shown pretty small.\nThis can be used to show a 'phone'-icon next to the phone number\ninline: {icon}\nType: icon", "anyOf": [ { "type": "object", @@ -603,6 +670,21 @@ export default { "then" ] } + }, + "description": { + "description": "A human-readable text explaining what this tagRendering does.\nMostly used for the shared tagrenderings", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] + }, + "classes": { + "description": "question: What css-classes should be applied to showing this attribute?\n\nA list of css-classes to apply to the entire tagRendering.\nThese classes are applied in 'answer'-mode, not in question mode\nThis is only for advanced users.\n\nValues are split on ` ` (space)", + "type": "string" } } }, @@ -614,13 +696,21 @@ export default { "properties": { "if": { "$ref": "#/definitions/TagConfigJson", - "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation" + "description": "question: What tags should be matched to show this option?\n\nIf in 'question'-mode and the contributor selects this option, these tags will be applied to the object" }, "then": { - "description": "Shown if the 'if is fulfilled\nType: rendered" + "description": "Question: What corresponding text should be shown?\nShown if the `if` is fulfilled\nType: rendered", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] }, "icon": { - "description": "An extra icon supporting the choice\nType: icon", + "description": "question: What icon should be shown next to this mapping?\n\nThis icon will only be shown if the value is known, it is not displayed in the options (but might be in the future)\n\nifunset: Show no icon\nType: icon", "anyOf": [ { "type": "object", @@ -644,15 +734,13 @@ export default { ] }, "hideInAnswer": { - "description": "In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n\n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}", + "description": "question: Under what circumstances should this mapping be hidden from the possibilities a contributor can pick?\niftrue: Never show this mapping as option to pick\nifunset: Always show this mapping as option to pick\ntype: tag\n\nIn some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n\n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": [ @@ -663,15 +751,13 @@ export default { ] }, "ifnot": { - "description": "Only applicable if 'multiAnswer' is set.\nThis is for situations such as:\n`accepts:coins=no` where one can select all the possible payment methods. However, we want to make explicit that some options _were not_ selected.\nThis can be done with `ifnot`\nNote that we can not explicitly render this negative case to the user, we cannot show `does _not_ accept coins`.\nIf this is important to your usecase, consider using multiple radiobutton-fields without `multiAnswer`", + "description": "question: What tags should be applied if this mapping is _not_ chosen?\n\nOnly applicable if 'multiAnswer' is set.\nThis is for situations such as:\n`accepts:coins=no` where one can select all the possible payment methods. However, we want to make explicit that some options _were not_ selected.\nThis can be done with `ifnot`\nNote that we can not explicitly render this negative case to the user, we cannot show `does _not_ accept coins`.\nIf this is important to your usecase, consider using multiple radiobutton-fields without `multiAnswer`\n\nifunset: Do not apply a tag if a different mapping is chosen.", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -679,26 +765,24 @@ export default { ] }, "addExtraTags": { - "description": "If chosen as answer, these tags will be applied as well onto the object.\nNot compatible with multiAnswer.\n\nThis can be used e.g. to erase other keys which indicate the 'not' value:\n```json\n{\n \"if\": \"crossing:marking=rainbow\",\n \"then\": \"This is a rainbow crossing\",\n \"addExtraTags\": \"not:crossing:marking=\"\n}\n```", + "description": "question: What extra tags should be added to the object if this object is chosen?\ntype: simple_tag\n\nIf chosen as answer, these tags will be applied onto the object, together with the tags from the `if`\nNot compatible with multiAnswer.\n\nThis can be used e.g. to erase other keys which indicate the 'not' value:\n```json\n{\n \"if\": \"crossing:marking=rainbow\",\n \"then\": \"This is a rainbow crossing\",\n \"addExtraTags\": [\"not:crossing:marking=\"]\n}\n```", "type": "array", "items": { "type": "string" } }, "searchTerms": { - "description": "If there are many options, the mappings-radiobuttons will be replaced by an element with a searchfunction\n\nSearchterms (per language) allow to easily find an option if there are many options", + "description": "question: If there are many options, what search terms match too?\nIf there are many options, the mappings-radiobuttons will be replaced by an element with a searchfunction\n\nSearchterms (per language) allow to easily find an option if there are many options\ngroup: hidden", "$ref": "#/definitions/Record" }, "priorityIf": { - "description": "If the searchable selector is picked, mappings with this item will have priority and show up even if the others are hidden\nUse this sparingly", + "description": "If the searchable selector is picked, mappings with this item will have priority and show up even if the others are hidden\nUse this sparingly\ngroup: hidden", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -706,7 +790,7 @@ export default { ] }, "#": { - "description": "Used for comments or to disable a validation\n\nignore-image-in-then: normally, a `then`-clause is not allowed to have an `img`-html-element as icons are preferred. In some cases (most notably title-icons), this is allowed", + "description": "Used for comments or to disable a validation\n\ngroup: hidden\nignore-image-in-then: normally, a `then`-clause is not allowed to have an `img`-html-element as icons are preferred. In some cases (most notably title-icons), this is allowed", "type": "string" } }, @@ -723,38 +807,34 @@ export default { "type": "object", "properties": { "location": { - "description": "All the locations that this point should be rendered at.\nPossible values are:\n- `point`: only renders points at their location\n- `centroid`: show a symbol at the centerpoint of a (multi)Linestring and (multi)polygon. Points will _not_ be rendered with this\n- `projected_centerpoint`: Only on (multi)linestrings: calculate the centerpoint and snap it to the way\n- `start` and `end`: only on linestrings: add a point to the first/last coordinate of the LineString", + "description": "question: At what location should this icon be shown?\nmultianswer: true\nsuggestions: return [{if: \"value=point\",then: \"Show an icon for point (node) objects\"},{if: \"value=centroid\",then: \"Show an icon for line or polygon (way) objects at their centroid location\"}, {if: \"value=start\",then: \"Show an icon for line (way) objects at the start\"},{if: \"value=end\",then: \"Show an icon for line (way) object at the end\"},{if: \"value=projected_centerpoint\",then: \"Show an icon for line (way) object near the centroid location, but moved onto the line\"}]", "type": "array", "items": { "type": "string" } }, - "icon": { - "description": "The icon for an element.\nNote that this also doubles as the icon for this layer (rendered with the overpass-tags) ánd the icon in the presets.\n\nThe result of the icon is rendered as follows:\nthe resulting string is interpreted as a _list_ of items, separated by \";\". The bottommost layer is the first layer.\nAs a result, on could use a generic pin, then overlay it with a specific icon.\nTo make things even more practical, one can use all SVG's from the folder \"assets/svg\" and _substitute the color_ in it.\nE.g. to draw a red pin, use \"pin:#f00\", to have a green circle with your icon on top, use `circle:#0f0;`\n\nType: icon", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] + "marker": { + "description": "The marker for an element.\nNote that this also defines the icon for this layer (rendered with the overpass-tags) and the icon in the presets.\n\nThe result of the icon is rendered as follows:\n- The first icon is rendered on the map\n- The second entry is overlayed on top of it\n- ...\n\nAs a result, on could use a generic icon (`pin`, `circle`, `square`) with a color, then overlay it with a specific icon.", + "type": "array", + "items": { + "$ref": "#/definitions/IconConfigJson" + } }, "iconBadges": { - "description": "A list of extra badges to show next to the icon as small badge\nThey will be added as a 25% height icon at the bottom right of the icon, with all the badges in a flex layout.\n\nNote: strings are interpreted as icons, so layering and substituting is supported. You can use `circle:white;./my_icon.svg` to add a background circle", + "description": "A list of extra badges to show next to the icon as small badge\nThey will be added as a 25% height icon at the bottom right of the icon, with all the badges in a flex layout.\n\nNote: strings are interpreted as icons, so layering and substituting is supported. You can use `circle:white;./my_icon.svg` to add a background circle\ngroup: hidden", "type": "array", "items": { "type": "object", "properties": { "if": { "$ref": "#/definitions/TagConfigJson", - "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation" + "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation\n\ntype: tag" }, "then": { "description": "Badge to show\nType: icon", "anyOf": [ { - "$ref": "#/definitions/TagRenderingConfigJson" + "$ref": "#/definitions/MinimalTagRenderingConfigJson" }, { "type": "string" @@ -769,7 +849,18 @@ export default { } }, "iconSize": { - "description": "A string containing \"width,height\" or \"width,height,anchorpoint\" where anchorpoint is any of 'center', 'top', 'bottom', 'left', 'right', 'bottomleft','topright', ...\nDefault is '40,40,center'", + "description": "question: What size should the marker be on the map?\nA string containing \",\" in pixels\nifunset: Use the default size (40,40 px)", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "anchor": { + "description": "question: What is the anchorpoint of the icon?\n\nThis matches the geographical point with a location on the icon.\n\nifunset: Use MapComplete-default (center)\nsuggestions: return [{if: \"value=center\", then: \"Place the center of the icon on the geographical location\"},{if: \"value=top\", then: \"Place the top of the icon on the geographical location\"},{if: \"value=bottom\", then: \"Place the bottom of the icon on the geographical location\"},{if: \"value=left\", then: \"Place the left of the icon on the geographical location\"},{if: \"value=right\", then: \"Place the right of the icon on the geographical location\"}]", "anyOf": [ { "$ref": "#/definitions/TagRenderingConfigJson" @@ -780,7 +871,7 @@ export default { ] }, "rotation": { - "description": "The rotation of an icon, useful for e.g. directions.\nUsage: 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)``", + "description": "question: What rotation should be applied on the icon?\nThis is mostly useful for items that face a specific direction, such as surveillance cameras\nThis is interpreted as css property for 'rotate', thus has to end with 'deg', e.g. `90deg`, `{direction}deg`, `calc(90deg - {camera:direction}deg)``\nifunset: Do not rotate", "anyOf": [ { "$ref": "#/definitions/TagRenderingConfigJson" @@ -791,29 +882,7 @@ export default { ] }, "label": { - "description": "A HTML-fragment that is shown below the icon, for example:\n
{name}
\n\nIf the icon is undefined, then the label is shown in the center of the feature.\nNote that, if the wayhandling hides the icon then no label is shown as well.", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - }, - "css": { - "description": "A snippet of css code which is applied onto the container of the entire marker", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - }, - "cssClasses": { - "description": "A snippet of css-classes which are applied onto the container of the entire marker. They can be space-separated", + "description": "question: What label should be shown beneath the marker?\nFor example: `<div style=\"background: white\">{name}</div>`\n\nIf the icon is undefined, then the label is shown in the center of the feature.\ntypes: Dynamic value based on the attributes ; string\ninline: Always show label {value} beneath the marker\nifunset: Do not show a label beneath the marker", "anyOf": [ { "$ref": "#/definitions/TagRenderingConfigJson" @@ -824,7 +893,7 @@ export default { ] }, "labelCss": { - "description": "Css that is applied onto the label", + "description": "question: What CSS should be applied to the label?\nYou can set the css-properties here, e.g. `background: red; font-size: 12px; `\ninline: Apply CSS-style {value} to the label\ntypes: Dynamic value ; string\nifunset: Do not apply extra CSS-labels to the label\ngroup: expert", "anyOf": [ { "$ref": "#/definitions/TagRenderingConfigJson" @@ -835,7 +904,29 @@ export default { ] }, "labelCssClasses": { - "description": "Css classes that are applied onto the label; can be space-separated", + "description": "question: Which CSS-classes should be applied to the label?\n\nThe classes should be separated by a space (` `)\nYou can use most Tailwind-css classes, see https://tailwindcss.com/ for more information\nFor example: `center bg-gray-500 mx-2 my-1 rounded-full`\ninline: Apply CSS-classes {value} to the label\ntypes: Dynamic value ; string\nifunset: Do not apply extra CSS-classes to the label\nsuggestions: return [{if: \"value=bg-white rounded px-2\", then: \"Draw on a white background\"}]", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "css": { + "description": "question: What CSS should be applied to the entire marker?\nYou can set the css-properties here, e.g. `background: red; font-size: 12px; `\nThis will be applied to the _container_ containing both the marker and the label\ninline: Apply CSS-style {value} to the _entire marker_\ntypes: Dynamic value ; string\nifunset: Do not apply extra CSS element to the entire marker\ngroup: expert", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "cssClasses": { + "description": "question: Which CSS-classes should be applied to the entire marker?\nThis will be applied to the _container_ containing both the marker and the label\n\nThe classes should be separated by a space (` `)\nYou can use most Tailwind-css classes, see https://tailwindcss.com/ for more information\nFor example: `center bg-gray-500 mx-2 my-1 rounded-full`\ninline: Apply CSS-classes {value} to the entire container\nifunset: Do not apply extra CSS-classes to the label\ntypes: Dynamic value ; string\nifunset: Do not apply extra CSS-classes to the entire marker\ngroup: expert", "anyOf": [ { "$ref": "#/definitions/TagRenderingConfigJson" @@ -846,7 +937,7 @@ export default { ] }, "pitchAlignment": { - "description": "If the map is pitched, the marker will stay parallel to the screen.\nSet to 'map' if you want to put it flattened on the map", + "description": "question: If the map is pitched, should the icon stay parallel to the screen or to the groundplane?\nsuggestions: return [{if: \"value=canvas\", then: \"The icon will stay upward and not be transformed as if it sticks to the screen\"}, {if: \"value=map\", then: \"The icon will be transformed as if it were painted onto the ground. (Automatically sets rotationAlignment)\"}]\ngroup: expert", "anyOf": [ { "$ref": "#/definitions/TagRenderingConfigJson" @@ -861,7 +952,7 @@ export default { ] }, "rotationAlignment": { - "description": "If the map is rotated, the icon will still point to the north if no rotation was applied", + "description": "question: Should the icon be rotated if the map is rotated?\nifunset: Do not rotate or tilt icons. Always keep the icons straight\nsuggestions: return [{if: \"value=canvas\", then: \"Never rotate the icon\"}, {if: \"value=map\", then: \"If the map is rotated, rotate the icon as well. This gives the impression of an icon that floats perpendicular above the ground.\"}]\ngroup: expert", "anyOf": [ { "$ref": "#/definitions/TagRenderingConfigJson" @@ -885,10 +976,10 @@ export default { "type": "object", "properties": { "color": { - "description": "The color for way-elements and SVG-elements.\nIf the value starts with \"--\", the style of the body element will be queried for the corresponding variable instead", + "description": "question: What color should lines be drawn in?\n\nFor an area, this will be the colour of the outside line.\nIf the value starts with \"--\", the style of the body element will be queried for the corresponding variable instead\n\ntypes: dynamic value ; string\ntitle: Line Colour\ninline: The line colour always is {value}\ntype: color", "anyOf": [ { - "$ref": "#/definitions/TagRenderingConfigJson" + "$ref": "#/definitions/MinimalTagRenderingConfigJson" }, { "type": "string" @@ -896,10 +987,10 @@ export default { ] }, "width": { - "description": "The stroke-width for way-elements", + "description": "question: How wide should the line be?\nThe stroke-width for way-elements\n\ntypes: dynamic value ; string\ntitle: Line width\ninline: The line width is {value} pixels\ntype: pnat\nifunset: Use the default-linewidth of 7 pixels", "anyOf": [ { - "$ref": "#/definitions/TagRenderingConfigJson" + "$ref": "#/definitions/MinimalTagRenderingConfigJson" }, { "type": [ @@ -910,47 +1001,25 @@ export default { ] }, "dashArray": { - "description": "A dasharray, e.g. \"5 6\"\nThe dasharray defines 'pixels of line, pixels of gap, pixels of line, pixels of gap',\nDefault value: \"\" (empty string == full line)", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] + "description": "question: Should a dasharray be used to render the lines?\nThe dasharray defines 'pixels of line, pixels of gap, pixels of line, pixels of gap, ...'. For example, `5 6` will be 5 pixels of line followed by a 6 pixel gap.\nCannot be a dynamic property due to a mapbox limitation\nifunset: Ways are rendered with a full line", + "type": "string" }, "lineCap": { - "description": "The form at the end of a line", + "description": "question: What form should the line-ending have?\nsuggestions: return [{if:\"value=round\",then:\"Round endings\"}, {if: \"value=square\", then: \"square endings\"}, {if: \"value=butt\", then: \"no ending (square ending at the end, without padding)\"}]\ntypes: dynamic value ; string\ntitle: Line Cap\nifunset: Use the default value (round ending)", "anyOf": [ { - "$ref": "#/definitions/TagRenderingConfigJson" + "$ref": "#/definitions/MinimalTagRenderingConfigJson" }, { "type": "string" } ] }, - "fill": { - "description": "Whether or not to fill polygons", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "enum": [ - "no", - "yes" - ], - "type": "string" - } - ] - }, "fillColor": { - "description": "The color to fill a polygon with.\nIf undefined, this will be slightly more opaque version of the stroke line", + "description": "question: What colour should be used as fill colour for polygons?\nifunset: The polygon fill colour will be a more transparent version of the stroke colour\nsuggestions: return [{if: \"value=#00000000\", then: \"Use a transparent fill (only render the outline)\"}]\ninline: The fill colour is {value}\ntypes: dynamic value ; string\ntype: color", "anyOf": [ { - "$ref": "#/definitions/TagRenderingConfigJson" + "$ref": "#/definitions/MinimalTagRenderingConfigJson" }, { "type": "string" @@ -958,10 +1027,10 @@ export default { ] }, "offset": { - "description": "The number of pixels this line should be moved.\nUse a positive numbe to move to the right, a negative to move to the left (left/right as defined by the drawing direction of the line).\n\nIMPORTANT: MapComplete will already normalize 'key:both:property' and 'key:both' into the corresponding 'key:left' and 'key:right' tagging (same for 'sidewalk=left/right/both' which is rewritten to 'sidewalk:left' and 'sidewalk:right')\nThis simplifies programming. Refer to the CalculatedTags.md-documentation for more details", + "description": "question: Should the lines be moved (offsetted) with a number of pixels against the geographical lines?\nThe number of pixels this line should be moved.\nUse a positive number to move to the right in the drawing direction or a negative to move to the left (left/right as defined by the drawing direction of the line).\n\nIMPORTANT: MapComplete will already normalize 'key:both:property' and 'key:both' into the corresponding 'key:left' and 'key:right' tagging (same for 'sidewalk=left/right/both' which is rewritten to 'sidewalk:left' and 'sidewalk:right')\nThis simplifies programming. Refer to the CalculatedTags.md-documentation for more details\nifunset: don't offset lines on the map\ninline: Pixel offset by {value} pixels\ntypes: dynamic value ; number\ntype: int", "anyOf": [ { - "$ref": "#/definitions/TagRenderingConfigJson" + "$ref": "#/definitions/MinimalTagRenderingConfigJson" }, { "type": "number" @@ -970,66 +1039,85 @@ export default { } } }, - "default": { - "description": "Rewrites and multiplies the given renderings of type T.\n\nThis can be used for introducing many similar questions automatically,\nwhich also makes translations easier.\n\n(Note that the key does _not_ need to be wrapped in {}.\nHowever, we recommend to use them if the key is used in a translation, as missing keys will be picked up and warned for by the translation scripts)\n\nFor example:\n\n```\n{\n rewrite: {\n sourceString: [\"key\", \"a|b|c\"],\n into: [\n [\"X\", 0]\n [\"Y\", 1],\n [\"Z\", 2]\n ],\n renderings: [{\n \"key\":\"a|b|c\"\n }]\n }\n}\n```\nwill result in _three_ copies (as the values to rewrite into have three values, namely:\n\n[\n {\n # The first pair: key --> X, a|b|c --> 0\n \"X\": 0\n },\n {\n \"Y\": 1\n },\n {\n \"Z\": 2\n }\n\n]", - "type": "object", - "properties": { - "rewrite": { - "type": "object", - "properties": { - "sourceString": { - "type": "array", - "items": { - "type": "string" - } - }, - "into": { - "type": "array", - "items": { - "type": "array", - "items": {} - } - } - }, - "required": [ - "into", - "sourceString" - ] - }, - "renderings": { - "anyOf": [ - { - "$ref": "#/definitions/default_4" - }, - { - "$ref": "#/definitions/default_5" - }, - { - "type": "array", - "items": { - "$ref": "#/definitions/default_5" - } - }, - { - "type": "array", - "items": { - "$ref": "#/definitions/default_4" - } - } - ] - } - }, - "required": [ - "renderings", - "rewrite" - ] - }, "QuestionableTagRenderingConfigJson": { "description": "A QuestionableTagRenderingConfigJson is a single piece of code which converts one ore more tags into a HTML-snippet.\nIf the desired tags are missing and a question is defined, a question will be shown instead.", "type": "object", "properties": { + "id": { + "type": "string" + }, + "mappings": { + "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes\n\nquestion: What are common options?", + "type": "array", + "items": { + "$ref": "#/definitions/MappingConfigJson" + } + }, + "multiAnswer": { + "description": "If true, use checkboxes instead of radio buttons when asking the question\n\nquestion: Should a contributor be allowed to select multiple mappings?\n\niftrue: allow to select multiple mappings\niffalse: only allow to select a single mapping\nifunset: only allow to select a single mapping", + "type": "boolean" + }, + "freeform": { + "description": "Allow freeform text input from the user", + "type": "object", + "properties": { + "key": { + "description": "question: What is the name of the attribute that should be written to?\nThis is the OpenStreetMap-key that that value will be written to\nifunset: do not offer a freeform textfield as answer option", + "type": "string" + }, + "type": { + "description": "question: What is the input type?\nThe type of the text-field, e.g. 'string', 'nat', 'float', 'date',...\nSee Docs/SpecialInputElements.md and UI/Input/ValidatedTextField.ts for supported values\nifunset: use an unconstrained string as input (default)\nsuggestions: return validators.AllValidators.filter(type => !type.isMeta).map((type) => ({if: \"value=\"+type.name, then: \"\"+type.name+\" \"+type.explanation.split(\"\\n\")[0]}))", + "type": "string" + }, + "placeholder": { + "description": "question: What placeholder text should be shown in the input-element if there is no input?\nA (translated) text that is shown (as gray text) within the textfield\ntype: translation\ngroup: expert", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] + }, + "helperArgs": { + "description": "Extra parameters to initialize the input helper arguments.\nFor semantics, see the 'SpecialInputElements.md'\ngroup: expert", + "type": "array", + "items": {} + }, + "addExtraTags": { + "description": "If a value is added with the textfield, these extra tag is addded.\nUseful to add a 'fixme=freeform textfield used - to be checked'\ngroup: expert", + "type": "array", + "items": { + "type": "string" + } + }, + "inline": { + "description": "question: Show the freeform as box within the question?\nInstead of showing a full-width text field, the text field will be shown within the rendering of the question.\n\nThis combines badly with special input elements, as it'll distort the layout.\nifunset: show the freeform input field full-width\niftrue: show the freeform input field as a small field within the question\ngroup: expert", + "type": "boolean" + }, + "default": { + "description": "question: What value should be entered in the text field if no value is set?\nThis can help people to quickly enter the most common option\nifunset: do not prefill the textfield\ngroup: expert", + "type": "string" + }, + "invalidValues": { + "description": "question: What values of the freeform key should be interpreted as 'unknown'?\nFor example, if a feature has `shop=yes`, the question 'what type of shop is this?' should still asked\nifunset: The question will be considered answered if any value is set for the key\ngroup: expert", + "anyOf": [ + { + "$ref": "#/definitions/{and:TagConfigJson[];}" + }, + { + "$ref": "#/definitions/{or:TagConfigJson[];}" + }, + { + "type": "string" + } + ] + } + } + }, "question": { - "description": "If it turns out that this tagRendering doesn't match _any_ value, then we show this question.\nIf undefined, the question is never asked and this tagrendering is read-only", + "description": "question: What question should be shown to the contributor?\n\nA question is presented ot the user if no mapping matches and the 'freeform' key is not set as well.\n\nifunset: This tagrendering will be shown if it is known, but cannot be edited by the contributor, effectively resutling in a read-only rendering", "anyOf": [ { "$ref": "#/definitions/Record" @@ -1040,7 +1128,7 @@ export default { ] }, "questionHint": { - "description": "A hint which is shown in subtle text under the question.\nThis can give some extra information on what the answer should ook like", + "description": "question: Should some extra information be shown to the contributor, alongside the question?\nThis hint is shown in subtle text under the question.\nThis can give some extra information on what the answer should ook like\nifunset: No extra hint is given", "anyOf": [ { "$ref": "#/definitions/Record" @@ -1050,94 +1138,15 @@ export default { } ] }, - "freeform": { - "description": "Allow freeform text input from the user", - "type": "object", - "properties": { - "key": { - "type": "string" - }, - "type": { - "description": "The type of the text-field, e.g. 'string', 'nat', 'float', 'date',...\nSee Docs/SpecialInputElements.md and UI/Input/ValidatedTextField.ts for supported values", - "type": "string" - }, - "placeholder": { - "description": "A (translated) text that is shown (as gray text) within the textfield" - }, - "helperArgs": { - "description": "Extra parameters to initialize the input helper arguments.\nFor semantics, see the 'SpecialInputElements.md'", - "type": "array", - "items": {} - }, - "addExtraTags": { - "description": "If a value is added with the textfield, these extra tag is addded.\nUseful to add a 'fixme=freeform textfield used - to be checked'", - "type": "array", - "items": { - "type": "string" - } - }, - "inline": { - "description": "When set, influences the way a question is asked.\nInstead of showing a full-width text field, the text field will be shown within the rendering of the question.\n\nThis combines badly with special input elements, as it'll distort the layout.\nNote that this will be set automatically if no special elements are present.", - "type": "boolean" - }, - "default": { - "description": "default value to enter if no previous tagging is present.\nNormally undefined (aka do not enter anything)", - "type": "string" - } - }, - "required": [ - "key" - ] - }, - "multiAnswer": { - "description": "If true, use checkboxes instead of radio buttons when asking the question", - "type": "boolean" - }, - "mappings": { - "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", - "type": "array", - "items": { - "$ref": "#/definitions/MappingConfigJson" - } - }, - "id": { - "description": "The id of the tagrendering, should be an unique string.\nUsed to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise.\n\nUse 'questions' to trigger the question box of this group (if a group is defined)", - "type": "string" - }, "labels": { - "description": "A list of labels. These are strings that are used for various purposes, e.g. to filter them away", + "description": "A list of labels. These are strings that are used for various purposes, e.g. to only include a subset of the tagRenderings when reusing a layer", "type": "array", "items": { "type": "string" } }, - "classes": { - "description": "A list of css-classes to apply to the entire tagRendering if the answer is known (not applied on the question).\nThis is only for advanced users", - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "string" - } - ] - }, - "description": { - "description": "A human-readable text explaining what this tagRendering does", - "anyOf": [ - { - "$ref": "#/definitions/Record" - }, - { - "type": "string" - } - ] - }, "render": { - "description": "Renders this value. Note that \"{key}\"-parts are substituted by the corresponding values of the element.\nIf neither 'textFieldQuestion' nor 'mappings' are defined, this text is simply shown as default value.\n\nNote 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
`\ntype: rendered", + "description": "question: What text should be rendered?\n\nThis piece of text will be shown in the infobox.\nIn this text, values within braces (such as {braced(key)}) are replaced by the corresponding `value` in the object.\nFor example, if the object contains tags `amenity=school; name=Windy Hill School`, the render string `This school is named {name}` will be shown to the user as `This school is named Windy Hill School`\n\nThis text will be shown if:\n- there is no mapping which matches (or there are no matches)\n- no question, no mappings and no 'freeform' is set\n\nNote that this is a HTML-interpreted value, so you can add links as e.g. '<a href='{website}'>{website}</a>' or include images such as `This is of type A <br><img src='typeA-icon.svg' />`\ntype: rendered\nifunset: no text is rendered if no predefined options match", "anyOf": [ { "$ref": "#/definitions/Record" @@ -1173,16 +1182,38 @@ export default { } ] }, - "condition": { - "description": "Only show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", + "icon": { + "description": "question: what icon should be shown next to the 'render' value?\nAn icon shown next to the rendering; typically shown pretty small\nThis is only shown next to the \"render\" value\nType: icon\nifunset: do not show an icon next to the \"render\"-value", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "type": "object", + "properties": { + "path": { + "description": "The path to the icon\nType: icon", + "type": "string" + }, + "class": { + "description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-', so defining your own in combination with a custom CSS is possible (but discouraged)", + "type": "string" + } + }, + "required": [ + "path" + ] }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "type": "string" + } + ] + }, + "condition": { + "description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or ask the question if unkown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", + "anyOf": [ + { + "$ref": "#/definitions/{and:TagConfigJson[];}" + }, + { + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -1190,28 +1221,117 @@ export default { ] }, "metacondition": { - "description": "If set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", + "description": "question: When should this item be shown (including special conditions)?\ntype: tag\n\nIf set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" } ] + }, + "description": { + "description": "A human-readable text explaining what this tagRendering does.\nMostly used for the shared tagrenderings", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] + }, + "classes": { + "description": "question: What css-classes should be applied to showing this attribute?\n\nA list of css-classes to apply to the entire tagRendering.\nThese classes are applied in 'answer'-mode, not in question mode\nThis is only for advanced users.\n\nValues are split on ` ` (space)", + "type": "string" } - } + }, + "required": [ + "id" + ] }, "Partial": { "type": "object", "properties": { + "id": { + "type": "string" + }, + "mappings": { + "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes\n\nquestion: What are common options?", + "type": "array", + "items": { + "$ref": "#/definitions/MappingConfigJson" + } + }, + "multiAnswer": { + "description": "If true, use checkboxes instead of radio buttons when asking the question\n\nquestion: Should a contributor be allowed to select multiple mappings?\n\niftrue: allow to select multiple mappings\niffalse: only allow to select a single mapping\nifunset: only allow to select a single mapping", + "type": "boolean" + }, + "freeform": { + "description": "Allow freeform text input from the user", + "type": "object", + "properties": { + "key": { + "description": "question: What is the name of the attribute that should be written to?\nThis is the OpenStreetMap-key that that value will be written to\nifunset: do not offer a freeform textfield as answer option", + "type": "string" + }, + "type": { + "description": "question: What is the input type?\nThe type of the text-field, e.g. 'string', 'nat', 'float', 'date',...\nSee Docs/SpecialInputElements.md and UI/Input/ValidatedTextField.ts for supported values\nifunset: use an unconstrained string as input (default)\nsuggestions: return validators.AllValidators.filter(type => !type.isMeta).map((type) => ({if: \"value=\"+type.name, then: \"\"+type.name+\" \"+type.explanation.split(\"\\n\")[0]}))", + "type": "string" + }, + "placeholder": { + "description": "question: What placeholder text should be shown in the input-element if there is no input?\nA (translated) text that is shown (as gray text) within the textfield\ntype: translation\ngroup: expert", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] + }, + "helperArgs": { + "description": "Extra parameters to initialize the input helper arguments.\nFor semantics, see the 'SpecialInputElements.md'\ngroup: expert", + "type": "array", + "items": {} + }, + "addExtraTags": { + "description": "If a value is added with the textfield, these extra tag is addded.\nUseful to add a 'fixme=freeform textfield used - to be checked'\ngroup: expert", + "type": "array", + "items": { + "type": "string" + } + }, + "inline": { + "description": "question: Show the freeform as box within the question?\nInstead of showing a full-width text field, the text field will be shown within the rendering of the question.\n\nThis combines badly with special input elements, as it'll distort the layout.\nifunset: show the freeform input field full-width\niftrue: show the freeform input field as a small field within the question\ngroup: expert", + "type": "boolean" + }, + "default": { + "description": "question: What value should be entered in the text field if no value is set?\nThis can help people to quickly enter the most common option\nifunset: do not prefill the textfield\ngroup: expert", + "type": "string" + }, + "invalidValues": { + "description": "question: What values of the freeform key should be interpreted as 'unknown'?\nFor example, if a feature has `shop=yes`, the question 'what type of shop is this?' should still asked\nifunset: The question will be considered answered if any value is set for the key\ngroup: expert", + "anyOf": [ + { + "$ref": "#/definitions/{and:TagConfigJson[];}" + }, + { + "$ref": "#/definitions/{or:TagConfigJson[];}" + }, + { + "type": "string" + } + ] + } + } + }, "question": { - "description": "If it turns out that this tagRendering doesn't match _any_ value, then we show this question.\nIf undefined, the question is never asked and this tagrendering is read-only", + "description": "question: What question should be shown to the contributor?\n\nA question is presented ot the user if no mapping matches and the 'freeform' key is not set as well.\n\nifunset: This tagrendering will be shown if it is known, but cannot be edited by the contributor, effectively resutling in a read-only rendering", "anyOf": [ { "$ref": "#/definitions/Record" @@ -1222,7 +1342,7 @@ export default { ] }, "questionHint": { - "description": "A hint which is shown in subtle text under the question.\nThis can give some extra information on what the answer should ook like", + "description": "question: Should some extra information be shown to the contributor, alongside the question?\nThis hint is shown in subtle text under the question.\nThis can give some extra information on what the answer should ook like\nifunset: No extra hint is given", "anyOf": [ { "$ref": "#/definitions/Record" @@ -1232,94 +1352,15 @@ export default { } ] }, - "freeform": { - "description": "Allow freeform text input from the user", - "type": "object", - "properties": { - "key": { - "type": "string" - }, - "type": { - "description": "The type of the text-field, e.g. 'string', 'nat', 'float', 'date',...\nSee Docs/SpecialInputElements.md and UI/Input/ValidatedTextField.ts for supported values", - "type": "string" - }, - "placeholder": { - "description": "A (translated) text that is shown (as gray text) within the textfield" - }, - "helperArgs": { - "description": "Extra parameters to initialize the input helper arguments.\nFor semantics, see the 'SpecialInputElements.md'", - "type": "array", - "items": {} - }, - "addExtraTags": { - "description": "If a value is added with the textfield, these extra tag is addded.\nUseful to add a 'fixme=freeform textfield used - to be checked'", - "type": "array", - "items": { - "type": "string" - } - }, - "inline": { - "description": "When set, influences the way a question is asked.\nInstead of showing a full-width text field, the text field will be shown within the rendering of the question.\n\nThis combines badly with special input elements, as it'll distort the layout.\nNote that this will be set automatically if no special elements are present.", - "type": "boolean" - }, - "default": { - "description": "default value to enter if no previous tagging is present.\nNormally undefined (aka do not enter anything)", - "type": "string" - } - }, - "required": [ - "key" - ] - }, - "multiAnswer": { - "description": "If true, use checkboxes instead of radio buttons when asking the question", - "type": "boolean" - }, - "mappings": { - "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", - "type": "array", - "items": { - "$ref": "#/definitions/MappingConfigJson" - } - }, - "id": { - "description": "The id of the tagrendering, should be an unique string.\nUsed to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise.\n\nUse 'questions' to trigger the question box of this group (if a group is defined)", - "type": "string" - }, "labels": { - "description": "A list of labels. These are strings that are used for various purposes, e.g. to filter them away", + "description": "A list of labels. These are strings that are used for various purposes, e.g. to only include a subset of the tagRenderings when reusing a layer", "type": "array", "items": { "type": "string" } }, - "classes": { - "description": "A list of css-classes to apply to the entire tagRendering if the answer is known (not applied on the question).\nThis is only for advanced users", - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "string" - } - ] - }, - "description": { - "description": "A human-readable text explaining what this tagRendering does", - "anyOf": [ - { - "$ref": "#/definitions/Record" - }, - { - "type": "string" - } - ] - }, "render": { - "description": "Renders this value. Note that \"{key}\"-parts are substituted by the corresponding values of the element.\nIf neither 'textFieldQuestion' nor 'mappings' are defined, this text is simply shown as default value.\n\nNote 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
`\ntype: rendered", + "description": "question: What text should be rendered?\n\nThis piece of text will be shown in the infobox.\nIn this text, values within braces (such as {braced(key)}) are replaced by the corresponding `value` in the object.\nFor example, if the object contains tags `amenity=school; name=Windy Hill School`, the render string `This school is named {name}` will be shown to the user as `This school is named Windy Hill School`\n\nThis text will be shown if:\n- there is no mapping which matches (or there are no matches)\n- no question, no mappings and no 'freeform' is set\n\nNote that this is a HTML-interpreted value, so you can add links as e.g. '<a href='{website}'>{website}</a>' or include images such as `This is of type A <br><img src='typeA-icon.svg' />`\ntype: rendered\nifunset: no text is rendered if no predefined options match", "anyOf": [ { "$ref": "#/definitions/Record" @@ -1355,16 +1396,38 @@ export default { } ] }, - "condition": { - "description": "Only show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", + "icon": { + "description": "question: what icon should be shown next to the 'render' value?\nAn icon shown next to the rendering; typically shown pretty small\nThis is only shown next to the \"render\" value\nType: icon\nifunset: do not show an icon next to the \"render\"-value", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "type": "object", + "properties": { + "path": { + "description": "The path to the icon\nType: icon", + "type": "string" + }, + "class": { + "description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-', so defining your own in combination with a custom CSS is possible (but discouraged)", + "type": "string" + } + }, + "required": [ + "path" + ] }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "type": "string" + } + ] + }, + "condition": { + "description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or ask the question if unkown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", + "anyOf": [ + { + "$ref": "#/definitions/{and:TagConfigJson[];}" + }, + { + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -1372,20 +1435,33 @@ export default { ] }, "metacondition": { - "description": "If set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", + "description": "question: When should this item be shown (including special conditions)?\ntype: tag\n\nIf set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" } ] + }, + "description": { + "description": "A human-readable text explaining what this tagRendering does.\nMostly used for the shared tagrenderings", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] + }, + "classes": { + "description": "question: What css-classes should be applied to showing this attribute?\n\nA list of css-classes to apply to the entire tagRendering.\nThese classes are applied in 'answer'-mode, not in question mode\nThis is only for advanced users.\n\nValues are split on ` ` (space)", + "type": "string" } } }, @@ -1464,15 +1540,13 @@ export default { "properties": { "question": {}, "osmTags": { - "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation", + "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation\n\ntype: tag", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -1519,6 +1593,10 @@ export default { "DeleteConfigJson": { "type": "object", "properties": { + "neededChangesets": { + "description": "*\nBy default, the contributor needs 20 previous changesets to delete points edited by others.\nFor some small features (e.g. bicycle racks) this is too much and this requirement can be lowered or dropped, which can be done here.\n\ntype: nat\nquestion: How many changesets must a contributor have before being allowed to delete a point?", + "type": "number" + }, "extraDeleteReasons": { "description": "*\nBy default, three reasons to delete a point are shown:\n\n- The point does not exist anymore\n- The point was a testing point\n- THe point could not be found\n\nHowever, for some layers, there might be different or more specific reasons for deletion which can be user friendly to set, e.g.:\n\n- the shop has closed\n- the climbing route has been closed of for nature conservation reasons\n- ...\n\nThese reasons can be stated here and will be shown in the list of options the user can choose from", "type": "array", @@ -1526,10 +1604,10 @@ export default { "type": "object", "properties": { "explanation": { - "description": "The text that will be shown to the user - translatable" + "description": "The text that will be shown to the user as option for why this point does not exist anymore.\nNote that the most common reasons (test point, does not exist anymore, cannot be found) are already offered by default\n\nquestion: For what extra reason might this feature be removed in real-life?" }, "changesetMessage": { - "description": "The text that will be uploaded into the changeset or will be used in the fixme in case of a soft deletion\nShould be a few words, in english", + "description": "The text that will be uploaded into the changeset or will be used in the fixme in case of a soft deletion\nShould be a few words, in english\n\nquestion: What should be added to the changeset as delete reason?", "type": "string" } }, @@ -1547,10 +1625,10 @@ export default { "properties": { "if": { "$ref": "#/definitions/TagConfigJson", - "description": "The tags that will be given to the object.\nThis must remove tags so that the 'source/osmTags' won't match anymore" + "description": "The tags that will be given to the object.\nThis must remove tags so that the 'source/osmTags' won't match anymore\n\nquestion: What tags should be applied to the object?" }, "then": { - "description": "The human explanation for the options" + "description": "The human explanation for the options\n\nquestion: What text should be shown to the contributor for this reason?" } }, "required": [ @@ -1560,27 +1638,21 @@ export default { } }, "softDeletionTags": { - "description": "In some cases, the contributor is not allowed to delete the current feature (e.g. because it isn't a point, the point is referenced by a relation or the user isn't experienced enough).\nTo still offer the user a 'delete'-option, the feature is retagged with these tags. This is a soft deletion, as the point isn't actually removed from OSM but rather marked as 'disused'\nIt is important that the feature will be retagged in such a way that it won't be picked up by the layer anymore!\n\nExample (note that \"amenity=\" erases the 'amenity'-key alltogether):\n```\n{\n \"and\": [\"disussed:amenity=public_bookcase\", \"amenity=\"]\n}\n```\n\nor (notice the use of the ':='-tag to copy the old value of 'shop=*' into 'disused:shop='):\n```\n{\n \"and\": [\"disused:shop:={shop}\", \"shop=\"]\n}\n```", + "description": "In some cases, the contributor is not allowed to delete the current feature (e.g. because it isn't a point, the point is referenced by a relation or the user isn't experienced enough).\nTo still offer the user a 'delete'-option, the feature is retagged with these tags. This is a soft deletion, as the point isn't actually removed from OSM but rather marked as 'disused'\nIt is important that the feature will be retagged in such a way that it won't be picked up by the layer anymore!\n\nExample (note that \"amenity=\" erases the 'amenity'-key alltogether):\n\n```\n{\n \"and\": [\"disussed:amenity=public_bookcase\", \"amenity=\"]\n}\n```\n\nor (notice the use of the ':='-tag to copy the old value of 'shop=*' into 'disused:shop='):\n\n```\n{\n \"and\": [\"disused:shop:={shop}\", \"shop=\"]\n}\n```\n\nquestion: If a hard delete is not possible, what tags should be applied to mark this feature as deleted?\ntype: tag", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" } ] }, - "neededChangesets": { - "description": "*\nBy default, the contributor needs 20 previous changesets to delete points edited by others.\nFor some small features (e.g. bicycle racks) this is too much and this requirement can be lowered or dropped, which can be done here.", - "type": "number" - }, "omitDefaultDeleteReasons": { - "description": "Set this flag if the default delete reasons should be omitted from the dialog.\nThis requires at least one extraDeleteReason or nonDeleteMapping", + "description": "Set this flag if the default delete reasons should be omitted from the dialog.\nThis requires at least one extraDeleteReason or nonDeleteMapping\n\nquestion: Should the default delete reasons be hidden?\niftrue: Hide the default delete reasons\niffalse: Show the default delete reasons\nifunset: Show the default delete reasons (default behaviour)", "type": "boolean" } } @@ -1589,11 +1661,11 @@ export default { "type": "object", "properties": { "enableImproveAccuracy": { - "description": "One default reason to move a point is to improve accuracy.\nSet to false to disable this reason", + "description": "question: Should moving this type of point to improve the accuracy be allowed?\niftrue: This point can be moved to improve the accuracy\nifunset: (default) This point can be moved to improve the accuracy\niffalse: This point cannot be moved to improve the accuracy", "type": "boolean" }, "enableRelocation": { - "description": "One default reason to move a point is because it has relocated\nSet to false to disable this reason", + "description": "question: Should moving this type of point due to a relocation be allowed?\n\nThis will erase the attributes `addr:street`, `addr:housenumber`, `addr:city` and `addr:postcode`\n\niftrue: This type of point can be moved due to a relocation (and will remove address information when this is done)\nifunset: (default) This type of point can be moved due to a relocation (and will remove address information when this is done)\niffalse: This type of point cannot be moved due to a relocation", "type": "boolean" } } @@ -1603,7 +1675,7 @@ export default { "type": "object", "properties": { "appliesToKey": { - "description": "Every key from this list will be normalized.\n\nTo render a united value properly, use", + "description": "Every key from this list will be normalized.\n\nTo render the value properly (with a human readable denomination), use `{canonical()}`", "type": "array", "items": { "type": "string" @@ -1630,6 +1702,844 @@ export default { "appliesToKey" ] }, + "default": { + "type": "object", + "properties": { + "icon": { + "description": "question: What icon should be shown in the link button?\nifunset: do not show an icon\ntype: icon", + "type": "string" + }, + "text": { + "description": "question: What text should be shown in the link icon?\n\nNote that {lat},{lon},{zoom}, {language} and {theme} will be replaced\n\nifunset: do not show a text", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] + }, + "href": { + "description": "question: if clicked, what webpage should open?\nNote that {lat},{lon},{zoom}, {language} and {theme} will be replaced\n\ntype: url", + "type": "string" + }, + "newTab": { + "description": "question: Should the link open in a new tab?\niftrue: Open in a new tab\niffalse: do not open in a new tab\nifunset: do not open in a new tab", + "type": "boolean" + }, + "requirements": { + "description": "question: When should the extra button be shown?\nsuggestions: return [{if: \"value=iframe\", then: \"When shown in an iframe\"}, {if: \"value=no-iframe\", then: \"When shown as stand-alone webpage\"}, {if: \"value=welcome-message\", then: \"When the welcome messages are enabled\"}, {if: \"value=iframe\", then: \"When the welcome messages are disabled\"}]", + "type": "array", + "items": { + "enum": [ + "iframe", + "no-iframe", + "no-welcome-message", + "welcome-message" + ], + "type": "string" + } + } + }, + "required": [ + "href" + ] + }, + "LayerConfigJson": { + "description": "Configuration for a single layer", + "type": "object", + "properties": { + "id": { + "description": "question: What is the identifier of this layer?\n\nThis should be a simple, lowercase, human readable string that is used to identify the layer.\n A good ID is:\n - a noun\n - written in singular\n - describes the object\n - in english\n - only has lowercase letters, numbers or underscores. Do not use a space or a dash\n\ntype: id\ngroup: Basic", + "type": "string" + }, + "name": { + "description": "Used in the layer control panel to toggle a layer on and of.\n\nifunset: This will hide the layer in the layer control, making it not filterable and not toggleable\n\ngroup: Basic\nquestion: What is the name of this layer?", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] + }, + "description": { + "description": "A description for the features shown in this layer.\nThis often resembles the introduction of the wiki.osm.org-page for this feature.\n\ngroup: Basic\nquestion: How would you describe the features that are shown on this layer?", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] + }, + "source": { + "description": "Question: Where should the data be fetched from?\ntitle: Data Source\n\nThis determines where the data for the layer is fetched: from OSM or from an external geojson dataset.\n\nIf no 'geojson' is defined, data will be fetched from overpass and the OSM-API.\n\nEvery source _must_ define which tags _must_ be present in order to be picked up.\n\nNote: a source must always be defined. 'special' is only allowed if this is a builtin-layer\n\ntypes: Load data with specific tags from OpenStreetMap ; Load data from an external geojson source ;\ntypesdefault: 0\ngroup: Basic", + "anyOf": [ + { + "type": "object", + "properties": { + "osmTags": { + "$ref": "#/definitions/TagConfigJson", + "description": "question: Which tags must be present on the feature to show it in this layer?\nEvery source must set which tags have to be present in order to load the given layer." + }, + "maxCacheAge": { + "description": "question: How long (in seconds) is the data allowed to remain cached until it must be refreshed?\nThe maximum amount of seconds that a tile is allowed to linger in the cache\n\ntype: nat\ndefault: 30 days\ngroup: expert", + "type": "number" + } + }, + "required": [ + "osmTags" + ] + }, + { + "type": "object", + "properties": { + "geoJson": { + "description": "The actual source of the data to load, if loaded via geojson.\n\n# A single geojson-file\nsource: {geoJson: \"https://my.source.net/some-geo-data.geojson\"}\n fetches a geojson from a third party source\n\n# A tiled geojson source\nsource: {geoJson: \"https://my.source.net/some-tile-geojson-{layer}-{z}-{x}-{y}.geojson\", geoJsonZoomLevel: 14}\n to use a tiled geojson source. The web server must offer multiple geojsons. {z}, {x} and {y} are substituted by the location; {layer} is substituted with the id of the loaded layer\n\nSome API's use a BBOX instead of a tile, this can be used by specifying {y_min}, {y_max}, {x_min} and {x_max}\n\nquestion: What is the URL of the geojson?\ntype: url", + "type": "string" + }, + "geoJsonZoomLevel": { + "description": "To load a tiled geojson layer, set the zoomlevel of the tiles\n\nquestion: If using a tiled geojson, what is the zoomlevel of the tiles?\nifunset: This is not a tiled geojson", + "type": "number" + }, + "isOsmCache": { + "description": "Indicates that the upstream geojson data is OSM-derived.\nUseful for e.g. merging or for scripts generating this cache.\nThis also indicates that making changes on this data is possible\n\nquestion: Is this geojson a cache of OpenStreetMap data?\nifunset: This is not an OpenStreetMap cache\niftrue: this is based on OpenStreetMap and can thus be edited\ngroup: expert", + "type": "boolean" + }, + "mercatorCrs": { + "description": "Some API's use a mercator-projection (EPSG:900913) instead of WGS84. Set the flag `mercatorCrs: true` in the source for this\n\nquestion: Does this geojson use EPSG:900913 instead of WGS84 as projection?\niftrue: This geojson uses EPSG:900913 instead of WGS84\nifunset: This geojson uses WGS84 just like most geojson (default)", + "type": "boolean" + }, + "idKey": { + "description": "Some API's have an id-field, but give it a different name.\nSetting this key will rename this field into 'id'\n\nifunset: An id with key `id` will be assigned automatically if no attribute `id` is set\ninline: This geojson uses {value} as attribute to set the id\nquestion: What is the name of the attribute containing the ID of the object?", + "type": "string" + } + }, + "required": [ + "geoJson" + ] + }, + { + "enum": [ + "special", + "special:library" + ], + "type": "string" + } + ] + }, + "calculatedTags": { + "description": "A list of extra tags to calculate, specified as \"keyToAssignTo=javascript-expression\".\nThere are a few extra functions available. Refer to Docs/CalculatedTags.md for more information\nThe functions will be run in order, e.g.\n[\nNot found... * \"_max_overlap_m2=Math.max(...feat.overlapsWith(\"someOtherLayer\").map(o => o.overlap))\n \"_max_overlap_ratio=Number(feat._max_overlap_m2)/feat.area\n]\n\nThe specified tags are evaluated lazily. E.g. if a calculated tag is only used in the popup (e.g. the number of nearby features),\nthe expensive calculation will only be performed then for that feature. This avoids clogging up the contributors PC when all features are loaded.\n\nIf a tag has to be evaluated strictly, use ':=' instead:\n\n[\n\"_some_key:=some_javascript_expression\"\n]\n\nSee the full documentation on [https://github.com/pietervdvn/MapComplete/blob/master/Docs/CalculatedTags.md]\n\ngroup: expert\nquestion: What extra attributes should be calculated with javascript?", + "type": "array", + "items": { + "type": "string" + } + }, + "isShown": { + "description": "If set, only features matching this extra tag will be shown.\nThis is useful to hide certain features from view based on a calculated tag or if the features are provided by a different layer.\n\nquestion: What other tags should features match for being shown?\ngroup: advanced\nifunset: all features which match the 'source'-specification are shown.", + "anyOf": [ + { + "$ref": "#/definitions/{and:TagConfigJson[];}" + }, + { + "$ref": "#/definitions/{or:TagConfigJson[];}" + }, + { + "type": "string" + } + ] + }, + "minzoom": { + "description": "The minimum needed zoomlevel required to start loading and displaying the data.\nThis can be used to only show common features (e.g. a bicycle parking) only when the map is zoomed in very much (17).\nThis prevents cluttering the map with thousands of parkings if one is looking to an entire city.\n\nDefault: 0\ngroup: Basic\ntype: nat\nquestion: At what zoom level should features of the layer be shown?\nifunset: Always load this layer, even if the entire world is in view.", + "type": "number" + }, + "shownByDefault": { + "description": "Indicates if this layer is shown by default;\ncan be used to hide a layer from start, or to load the layer but only to show it when appropriate (e.g. for advanced users)\n\nquestion: Should this layer be enabled when opening the map for the first time?\niftrue: the layer is enabled when opening the map\niffalse: the layer is hidden until the contributor enables it. (If the filter-popup is disabled, this might never get enabled nor loaded)\ndefault: true\ngroup: advanced", + "type": "boolean" + }, + "minzoomVisible": { + "description": "The zoom level at which point the data is hidden again\nDefault: 100 (thus: always visible\n\ngroup: expert", + "type": "number" + }, + "title": { + "description": "question: What title should be shown on the infobox?\nThe title shown in a popup for elements of this layer.\n\ngroup: title\ntypes: use a fixed translation ; Use a dynamic tagRendering ; hidden\ntypesdefault: 1\ntype: translation\ninline: {translated{value}}", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "popupInFloatover": { + "description": "Question: Should the information for this layer be shown in the sidebar or in a splash screen?\n\nIf set, open the selectedElementView in a floatOver instead of on the right.\n\niftrue: show the infobox in the splashscreen floating over the entire UI\niffalse: show the infobox in a sidebar on the right\ngroup: advanced\ndefault: sidebar", + "type": "boolean" + }, + "titleIcons": { + "description": "Small icons shown next to the title.\nIf not specified, the OsmLink and wikipedia links will be used by default.\nUse an empty array to hide them.\nNote that \"defaults\" will insert all the default titleIcons (which are added automatically)\n\nType: icon[]\ngroup: infobox", + "anyOf": [ + { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + } + }, + { + "type": "array", + "items": [ + { + "type": "string", + "enum": [ + "defaults" + ] + } + ], + "minItems": 1, + "maxItems": 1 + } + ] + }, + "pointRendering": { + "description": "Creates points to render on the map.\nThis can render points for point-objects, lineobjects or areaobjects; use 'location' to indicate where it should be rendered\ngroup: pointrendering", + "type": "array", + "items": { + "$ref": "#/definitions/default_4" + } + }, + "lineRendering": { + "description": "Creates lines and areas to render on the map\ngroup: linerendering", + "type": "array", + "items": { + "$ref": "#/definitions/default_5" + } + }, + "passAllFeatures": { + "description": "If set, this layer will pass all the features it receives onto the next layer.\nThis is ideal for decoration, e.g. directions on cameras\niftrue: Make the features from this layer also available to the other layer; might result in this object being rendered by multiple layers\niffalse: normal behaviour: don't pass features allong\nquestion: should this layer pass features to the next layers?\ngroup: expert", + "type": "boolean" + }, + "doNotDownload": { + "description": "If set, this layer will not query overpass; but it'll still match the tags above which are by chance returned by other layers.\nWorks well together with 'passAllFeatures', to add decoration\nThe opposite of `forceLoad`\n\niftrue: Do not attempt to query the data for this layer from overpass/the OSM API\niffalse: download the data as usual\ngroup: expert\nquestion: Should this layer be downloaded or is the data provided by a different layer (which has 'passAllFeatures'-set)?\ndefault: false", + "type": "boolean" + }, + "forceLoad": { + "description": "Advanced option - might be set by the theme compiler\n\nIf true, this data will _always_ be loaded, even if the theme is disabled by a filter or hidden.\nThe opposite of `doNotDownload`\n\nquestion: Should this layer be forcibly loaded?\nifftrue: always download this layer, even if it is disabled\niffalse: only download data for this layer when needed (default)\ndefault: false\ngroup: expert", + "type": "boolean" + }, + "presets": { + "description": "Presets for this layer.\nA preset shows up when clicking the map on a without data (or when right-clicking/long-pressing);\nit will prompt the user to add a new point.\n\nThe most important aspect are the tags, which define which tags the new point will have;\nThe title is shown in the dialog, along with the first sentence of the description.\n\nUpon confirmation, the full description is shown beneath the buttons - perfect to add pictures and examples.\n\nNote: the icon of the preset is determined automatically based on the tags and the icon above. Don't worry about that!\nNB: if no presets are defined, the popup to add new points doesn't show up at all\n\ngroup: presets", + "type": "array", + "items": { + "type": "object", + "properties": { + "title": { + "description": "The title - shown on the 'add-new'-button.\n\nThis should include the article of the noun, e.g. 'a hydrant', 'a bicycle pump'.\nThis text will be inserted into `Add {category} here`, becoming `Add a hydrant here`.\n\nDo _not_ indicate 'new': 'add a new shop here' is incorrect, as the shop might have existed forever, it could just be unmapped!\n\nquestion: What is the word to describe this object?\ninline: Add {translated(value)::font-bold} here", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] + }, + "tags": { + "description": "A single tag (encoded as key=value) out of all the tags to add onto the newly created point.\nNote that the icon in the UI will be chosen automatically based on the tags provided here.\n\nquestion: What tag should be added to the new object?\ntype: simple_tag\ntypeHelper: uploadableOnly", + "type": "array", + "items": { + "type": "string" + } + }, + "description": { + "description": "An extra explanation of what the feature is, if it is not immediately clear from the title alone.\n\nThe _first sentence_ of the description is shown on the button of the `add` menu.\nThe full description is shown in the confirmation dialog.\n\n(The first sentence is until the first '.'-character in the description)\n\nquestion: How would you describe this feature?\nifunset: No extra description is given. This can be used to further explain the preset", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] + }, + "exampleImages": { + "description": "The URL of an example image which shows a real-life example of what such a feature might look like.\n\nType: image\nquestion: What is the URL of an image showing such a feature?", + "type": "array", + "items": { + "type": "string" + } + }, + "snapToLayer": { + "description": "question: Should the created point be snapped to a line layer?\n\nIf specified, these layers will be shown in the precise location picker and the new point will be snapped towards it.\nFor example, this can be used to snap against `walls_and_buildings` (e.g. to attach a defibrillator, an entrance, an artwork, ... to the wall)\nor to snap an obstacle (such as a bollard) to the `cycleways_and_roads`.\n\nsuggestions: return Array.from(layers.keys()).map(key => ({if: \"value=\"+key, then: key+\" - \"+layers.get(key).description}))", + "type": "array", + "items": { + "type": "string" + } + }, + "maxSnapDistance": { + "description": "question: What is the maximum distance in the location-input that a point can be moved to be snapped to a way?\n\ninline: a point is snapped if the location input is at most {value}m away from an object\n\nIf specified, a new point will only be snapped if it is within this range.\nIf further away, it'll be placed in the center of the location input\nDistance in meter\n\nifunset: Do not snap to a layer", + "type": "number" + } + }, + "required": [ + "tags", + "title" + ] + } + }, + "tagRenderings": { + "description": "question: Edit this tagRendering\n\nA tag rendering is a block that either shows the known value or asks a question.\n\nRefer to the class `TagRenderingConfigJson` to see the possibilities.\n\nNote that we can also use a string here - where the string refers to a tag rendering defined in `assets/questions/questions.json`,\nwhere a few very general questions are defined e.g. website, phone number, ...\nFurthermore, _all_ the questions of another layer can be reused with `otherlayer.*`\nIf you need only a single of the tagRenderings, use `otherlayer.tagrenderingId`\nIf one or more questions have a 'group' or 'label' set, select all the entries with the corresponding group or label with `otherlayer.*group`\nRemark: if a tagRendering is 'lent' from another layer, the 'source'-tags are copied and added as condition.\nIf they are not wanted, remove them with an override\n\nA special value is 'questions', which indicates the location of the questions box. If not specified, it'll be appended to the bottom of the featureInfobox.\n\nAt last, one can define a group of renderings where parts of all strings will be replaced by multiple other strings.\nThis is mainly create questions for a 'left' and a 'right' side of the road.\nThese will be grouped and questions will be asked together\n\ntype: tagrendering[]\ngroup: tagrenderings", + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/QuestionableTagRenderingConfigJson" + }, + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "builtin": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "override": { + "$ref": "#/definitions/Partial" + } + }, + "required": [ + "builtin", + "override" + ] + }, + { + "allOf": [ + { + "$ref": "#/definitions/default<(string|QuestionableTagRenderingConfigJson|{builtin:string;override:Partial;})[]>" + }, + { + "type": "object", + "properties": { + "id": { + "type": "string" + } + }, + "required": [ + "id" + ] + } + ] + }, + { + "type": "string" + } + ] + } + }, + "filter": { + "description": "All the extra questions for filtering.\nIf a string is given, mapComplete will search in 'filters.json' for the appropriate filter or will try to parse it as `layername.filterid` and us that one\n\ngroup: filters", + "anyOf": [ + { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/default_1" + }, + { + "type": "string" + } + ] + } + }, + { + "type": "object", + "properties": { + "sameAs": { + "type": "string" + } + }, + "required": [ + "sameAs" + ] + } + ] + }, + "deletion": { + "description": "This block defines under what circumstances the delete dialog is shown for objects of this layer.\nIf set, a dialog is shown to the user to (soft) delete the point.\nThe dialog is built to be user friendly and to prevent mistakes.\nIf deletion is not possible, the dialog will hide itself and show the reason of non-deletability instead.\n\nTo configure, the following values are possible:\n\n- false: never ever show the delete button\n- true: show the default delete button\n- undefined: use the mapcomplete default to show deletion or not. Currently, this is the same as 'false' but this will change in the future\n- or: a hash with options (see below)\n\n### The delete dialog\n\n\n\n#### Hard deletion if enough experience\n\nA feature can only be deleted from OpenStreetMap by mapcomplete if:\n\n- It is a node\n- No ways or relations use the node\n- The logged-in user has enough experience OR the user is the only one to have edited the point previously\n- The logged-in user has no unread messages (or has a ton of experience)\n- The user did not select one of the 'non-delete-options' (see below)\n\nIn all other cases, a 'soft deletion' is used.\n\n#### Soft deletion\n\nA 'soft deletion' is when the point isn't deleted fromOSM but retagged so that it'll won't how up in the mapcomplete theme anymore.\nThis makes it look like it was deleted, without doing damage. A fixme will be added to the point.\n\nNote that a soft deletion is _only_ possible if these tags are provided by the theme creator, as they'll be different for every theme\n\n##### No-delete options\n\nIn some cases, the contributor might want to delete something for the wrong reason (e.g. someone who wants to have a path removed \"because the path is on their private property\").\nHowever, the path exists in reality and should thus be on OSM - otherwise the next contributor will pass by and notice \"hey, there is a path missing here! Let me redraw it in OSM!)\n\nThe correct approach is to retag the feature in such a way that it is semantically correct *and* that it doesn't show up on the theme anymore.\nA no-delete option is offered as 'reason to delete it', but secretly retags.\n\ngroup: editing\ntypes: Use an advanced delete configuration ; boolean\niftrue: Allow deletion\niffalse: Do not allow deletion\nifunset: Do not allow deletion", + "anyOf": [ + { + "$ref": "#/definitions/DeleteConfigJson" + }, + { + "type": "boolean" + } + ] + }, + "allowMove": { + "description": "Indicates if a point can be moved and why.\n\nA feature can be moved by MapComplete if:\n\n- It is a point\n- The point is _not_ part of a way or a a relation.\n\ntypes: use an advanced move configuration ; boolean\ngroup: editing\nquestion: Is deleting a point allowed?\niftrue: Allow contributors to move a point (for accuracy or a relocation)\niffalse: Don't allow contributors to move points\nifunset: Don't allow contributors to move points (default)", + "anyOf": [ + { + "$ref": "#/definitions/default_3" + }, + { + "type": "boolean" + } + ] + }, + "allowSplit": { + "description": "If set, a 'split this way' button is shown on objects rendered as LineStrings, e.g. highways.\n\nIf the way is part of a relation, MapComplete will attempt to update this relation as well\nquestion: Should the contributor be able to split ways using this layer?\niftrue: enable the 'split-roads'-component\niffalse: don't enable the split-roads componenet\nifunset: don't enable the split-roads component\ngroup: editing", + "type": "boolean" + }, + "units": { + "type": "array", + "items": { + "$ref": "#/definitions/default_2" + } + }, + "syncSelection": { + "description": "If set, synchronizes whether or not this layer is enabled.\n\ngroup: advanced\nquestion: Should enabling/disabling the layer be saved (locally or in the cloud)?\nsuggestions: return [{if: \"value=no\", then: \"Don't save, always revert to the default\"}, {if: \"value=local\", then: \"Save selection in local storage\"}, {if: \"value=theme-only\", then: \"Save the state in the OSM-usersettings, but apply on this theme only (default)\"}, {if: \"value=global\", then: \"Save in OSM-usersettings and toggle on _all_ themes using this layer\"}]", + "enum": [ + "global", + "local", + "no", + "theme-only" + ], + "type": "string" + }, + "#": { + "description": "Used for comments and/or to disable some checks\n\nno-question-hint-check: disables a check in MiscTagRenderingChecks which complains about 'div', 'span' or 'class=subtle'-HTML elements in the tagRendering\n\ngroup: hidden", + "type": "string" + }, + "fullNodeDatabase": { + "description": "_Set automatically by MapComplete, please ignore_\n\ngroup: hidden", + "type": "boolean" + } + }, + "required": [ + "id", + "pointRendering", + "source" + ] + }, + "Partial": { + "type": "object", + "properties": { + "id": { + "description": "question: What is the identifier of this layer?\n\nThis should be a simple, lowercase, human readable string that is used to identify the layer.\n A good ID is:\n - a noun\n - written in singular\n - describes the object\n - in english\n - only has lowercase letters, numbers or underscores. Do not use a space or a dash\n\ntype: id\ngroup: Basic", + "type": "string" + }, + "name": { + "description": "Used in the layer control panel to toggle a layer on and of.\n\nifunset: This will hide the layer in the layer control, making it not filterable and not toggleable\n\ngroup: Basic\nquestion: What is the name of this layer?", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] + }, + "description": { + "description": "A description for the features shown in this layer.\nThis often resembles the introduction of the wiki.osm.org-page for this feature.\n\ngroup: Basic\nquestion: How would you describe the features that are shown on this layer?", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] + }, + "source": { + "description": "Question: Where should the data be fetched from?\ntitle: Data Source\n\nThis determines where the data for the layer is fetched: from OSM or from an external geojson dataset.\n\nIf no 'geojson' is defined, data will be fetched from overpass and the OSM-API.\n\nEvery source _must_ define which tags _must_ be present in order to be picked up.\n\nNote: a source must always be defined. 'special' is only allowed if this is a builtin-layer\n\ntypes: Load data with specific tags from OpenStreetMap ; Load data from an external geojson source ;\ntypesdefault: 0\ngroup: Basic", + "anyOf": [ + { + "type": "object", + "properties": { + "osmTags": { + "$ref": "#/definitions/TagConfigJson", + "description": "question: Which tags must be present on the feature to show it in this layer?\nEvery source must set which tags have to be present in order to load the given layer." + }, + "maxCacheAge": { + "description": "question: How long (in seconds) is the data allowed to remain cached until it must be refreshed?\nThe maximum amount of seconds that a tile is allowed to linger in the cache\n\ntype: nat\ndefault: 30 days\ngroup: expert", + "type": "number" + } + }, + "required": [ + "osmTags" + ] + }, + { + "type": "object", + "properties": { + "geoJson": { + "description": "The actual source of the data to load, if loaded via geojson.\n\n# A single geojson-file\nsource: {geoJson: \"https://my.source.net/some-geo-data.geojson\"}\n fetches a geojson from a third party source\n\n# A tiled geojson source\nsource: {geoJson: \"https://my.source.net/some-tile-geojson-{layer}-{z}-{x}-{y}.geojson\", geoJsonZoomLevel: 14}\n to use a tiled geojson source. The web server must offer multiple geojsons. {z}, {x} and {y} are substituted by the location; {layer} is substituted with the id of the loaded layer\n\nSome API's use a BBOX instead of a tile, this can be used by specifying {y_min}, {y_max}, {x_min} and {x_max}\n\nquestion: What is the URL of the geojson?\ntype: url", + "type": "string" + }, + "geoJsonZoomLevel": { + "description": "To load a tiled geojson layer, set the zoomlevel of the tiles\n\nquestion: If using a tiled geojson, what is the zoomlevel of the tiles?\nifunset: This is not a tiled geojson", + "type": "number" + }, + "isOsmCache": { + "description": "Indicates that the upstream geojson data is OSM-derived.\nUseful for e.g. merging or for scripts generating this cache.\nThis also indicates that making changes on this data is possible\n\nquestion: Is this geojson a cache of OpenStreetMap data?\nifunset: This is not an OpenStreetMap cache\niftrue: this is based on OpenStreetMap and can thus be edited\ngroup: expert", + "type": "boolean" + }, + "mercatorCrs": { + "description": "Some API's use a mercator-projection (EPSG:900913) instead of WGS84. Set the flag `mercatorCrs: true` in the source for this\n\nquestion: Does this geojson use EPSG:900913 instead of WGS84 as projection?\niftrue: This geojson uses EPSG:900913 instead of WGS84\nifunset: This geojson uses WGS84 just like most geojson (default)", + "type": "boolean" + }, + "idKey": { + "description": "Some API's have an id-field, but give it a different name.\nSetting this key will rename this field into 'id'\n\nifunset: An id with key `id` will be assigned automatically if no attribute `id` is set\ninline: This geojson uses {value} as attribute to set the id\nquestion: What is the name of the attribute containing the ID of the object?", + "type": "string" + } + }, + "required": [ + "geoJson" + ] + }, + { + "enum": [ + "special", + "special:library" + ], + "type": "string" + } + ] + }, + "calculatedTags": { + "description": "A list of extra tags to calculate, specified as \"keyToAssignTo=javascript-expression\".\nThere are a few extra functions available. Refer to Docs/CalculatedTags.md for more information\nThe functions will be run in order, e.g.\n[\nNot found... * \"_max_overlap_m2=Math.max(...feat.overlapsWith(\"someOtherLayer\").map(o => o.overlap))\n \"_max_overlap_ratio=Number(feat._max_overlap_m2)/feat.area\n]\n\nThe specified tags are evaluated lazily. E.g. if a calculated tag is only used in the popup (e.g. the number of nearby features),\nthe expensive calculation will only be performed then for that feature. This avoids clogging up the contributors PC when all features are loaded.\n\nIf a tag has to be evaluated strictly, use ':=' instead:\n\n[\n\"_some_key:=some_javascript_expression\"\n]\n\nSee the full documentation on [https://github.com/pietervdvn/MapComplete/blob/master/Docs/CalculatedTags.md]\n\ngroup: expert\nquestion: What extra attributes should be calculated with javascript?", + "type": "array", + "items": { + "type": "string" + } + }, + "isShown": { + "description": "If set, only features matching this extra tag will be shown.\nThis is useful to hide certain features from view based on a calculated tag or if the features are provided by a different layer.\n\nquestion: What other tags should features match for being shown?\ngroup: advanced\nifunset: all features which match the 'source'-specification are shown.", + "anyOf": [ + { + "$ref": "#/definitions/{and:TagConfigJson[];}" + }, + { + "$ref": "#/definitions/{or:TagConfigJson[];}" + }, + { + "type": "string" + } + ] + }, + "minzoom": { + "description": "The minimum needed zoomlevel required to start loading and displaying the data.\nThis can be used to only show common features (e.g. a bicycle parking) only when the map is zoomed in very much (17).\nThis prevents cluttering the map with thousands of parkings if one is looking to an entire city.\n\nDefault: 0\ngroup: Basic\ntype: nat\nquestion: At what zoom level should features of the layer be shown?\nifunset: Always load this layer, even if the entire world is in view.", + "type": "number" + }, + "shownByDefault": { + "description": "Indicates if this layer is shown by default;\ncan be used to hide a layer from start, or to load the layer but only to show it when appropriate (e.g. for advanced users)\n\nquestion: Should this layer be enabled when opening the map for the first time?\niftrue: the layer is enabled when opening the map\niffalse: the layer is hidden until the contributor enables it. (If the filter-popup is disabled, this might never get enabled nor loaded)\ndefault: true\ngroup: advanced", + "type": "boolean" + }, + "minzoomVisible": { + "description": "The zoom level at which point the data is hidden again\nDefault: 100 (thus: always visible\n\ngroup: expert", + "type": "number" + }, + "title": { + "description": "question: What title should be shown on the infobox?\nThe title shown in a popup for elements of this layer.\n\ngroup: title\ntypes: use a fixed translation ; Use a dynamic tagRendering ; hidden\ntypesdefault: 1\ntype: translation\ninline: {translated{value}}", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "popupInFloatover": { + "description": "Question: Should the information for this layer be shown in the sidebar or in a splash screen?\n\nIf set, open the selectedElementView in a floatOver instead of on the right.\n\niftrue: show the infobox in the splashscreen floating over the entire UI\niffalse: show the infobox in a sidebar on the right\ngroup: advanced\ndefault: sidebar", + "type": "boolean" + }, + "titleIcons": { + "description": "Small icons shown next to the title.\nIf not specified, the OsmLink and wikipedia links will be used by default.\nUse an empty array to hide them.\nNote that \"defaults\" will insert all the default titleIcons (which are added automatically)\n\nType: icon[]\ngroup: infobox", + "anyOf": [ + { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + } + }, + { + "type": "array", + "items": [ + { + "type": "string", + "enum": [ + "defaults" + ] + } + ], + "minItems": 1, + "maxItems": 1 + } + ] + }, + "pointRendering": { + "description": "Creates points to render on the map.\nThis can render points for point-objects, lineobjects or areaobjects; use 'location' to indicate where it should be rendered\ngroup: pointrendering", + "type": "array", + "items": { + "$ref": "#/definitions/default_4" + } + }, + "lineRendering": { + "description": "Creates lines and areas to render on the map\ngroup: linerendering", + "type": "array", + "items": { + "$ref": "#/definitions/default_5" + } + }, + "passAllFeatures": { + "description": "If set, this layer will pass all the features it receives onto the next layer.\nThis is ideal for decoration, e.g. directions on cameras\niftrue: Make the features from this layer also available to the other layer; might result in this object being rendered by multiple layers\niffalse: normal behaviour: don't pass features allong\nquestion: should this layer pass features to the next layers?\ngroup: expert", + "type": "boolean" + }, + "doNotDownload": { + "description": "If set, this layer will not query overpass; but it'll still match the tags above which are by chance returned by other layers.\nWorks well together with 'passAllFeatures', to add decoration\nThe opposite of `forceLoad`\n\niftrue: Do not attempt to query the data for this layer from overpass/the OSM API\niffalse: download the data as usual\ngroup: expert\nquestion: Should this layer be downloaded or is the data provided by a different layer (which has 'passAllFeatures'-set)?\ndefault: false", + "type": "boolean" + }, + "forceLoad": { + "description": "Advanced option - might be set by the theme compiler\n\nIf true, this data will _always_ be loaded, even if the theme is disabled by a filter or hidden.\nThe opposite of `doNotDownload`\n\nquestion: Should this layer be forcibly loaded?\nifftrue: always download this layer, even if it is disabled\niffalse: only download data for this layer when needed (default)\ndefault: false\ngroup: expert", + "type": "boolean" + }, + "presets": { + "description": "Presets for this layer.\nA preset shows up when clicking the map on a without data (or when right-clicking/long-pressing);\nit will prompt the user to add a new point.\n\nThe most important aspect are the tags, which define which tags the new point will have;\nThe title is shown in the dialog, along with the first sentence of the description.\n\nUpon confirmation, the full description is shown beneath the buttons - perfect to add pictures and examples.\n\nNote: the icon of the preset is determined automatically based on the tags and the icon above. Don't worry about that!\nNB: if no presets are defined, the popup to add new points doesn't show up at all\n\ngroup: presets", + "type": "array", + "items": { + "type": "object", + "properties": { + "title": { + "description": "The title - shown on the 'add-new'-button.\n\nThis should include the article of the noun, e.g. 'a hydrant', 'a bicycle pump'.\nThis text will be inserted into `Add {category} here`, becoming `Add a hydrant here`.\n\nDo _not_ indicate 'new': 'add a new shop here' is incorrect, as the shop might have existed forever, it could just be unmapped!\n\nquestion: What is the word to describe this object?\ninline: Add {translated(value)::font-bold} here", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] + }, + "tags": { + "description": "A single tag (encoded as key=value) out of all the tags to add onto the newly created point.\nNote that the icon in the UI will be chosen automatically based on the tags provided here.\n\nquestion: What tag should be added to the new object?\ntype: simple_tag\ntypeHelper: uploadableOnly", + "type": "array", + "items": { + "type": "string" + } + }, + "description": { + "description": "An extra explanation of what the feature is, if it is not immediately clear from the title alone.\n\nThe _first sentence_ of the description is shown on the button of the `add` menu.\nThe full description is shown in the confirmation dialog.\n\n(The first sentence is until the first '.'-character in the description)\n\nquestion: How would you describe this feature?\nifunset: No extra description is given. This can be used to further explain the preset", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] + }, + "exampleImages": { + "description": "The URL of an example image which shows a real-life example of what such a feature might look like.\n\nType: image\nquestion: What is the URL of an image showing such a feature?", + "type": "array", + "items": { + "type": "string" + } + }, + "snapToLayer": { + "description": "question: Should the created point be snapped to a line layer?\n\nIf specified, these layers will be shown in the precise location picker and the new point will be snapped towards it.\nFor example, this can be used to snap against `walls_and_buildings` (e.g. to attach a defibrillator, an entrance, an artwork, ... to the wall)\nor to snap an obstacle (such as a bollard) to the `cycleways_and_roads`.\n\nsuggestions: return Array.from(layers.keys()).map(key => ({if: \"value=\"+key, then: key+\" - \"+layers.get(key).description}))", + "type": "array", + "items": { + "type": "string" + } + }, + "maxSnapDistance": { + "description": "question: What is the maximum distance in the location-input that a point can be moved to be snapped to a way?\n\ninline: a point is snapped if the location input is at most {value}m away from an object\n\nIf specified, a new point will only be snapped if it is within this range.\nIf further away, it'll be placed in the center of the location input\nDistance in meter\n\nifunset: Do not snap to a layer", + "type": "number" + } + }, + "required": [ + "tags", + "title" + ] + } + }, + "tagRenderings": { + "description": "question: Edit this tagRendering\n\nA tag rendering is a block that either shows the known value or asks a question.\n\nRefer to the class `TagRenderingConfigJson` to see the possibilities.\n\nNote that we can also use a string here - where the string refers to a tag rendering defined in `assets/questions/questions.json`,\nwhere a few very general questions are defined e.g. website, phone number, ...\nFurthermore, _all_ the questions of another layer can be reused with `otherlayer.*`\nIf you need only a single of the tagRenderings, use `otherlayer.tagrenderingId`\nIf one or more questions have a 'group' or 'label' set, select all the entries with the corresponding group or label with `otherlayer.*group`\nRemark: if a tagRendering is 'lent' from another layer, the 'source'-tags are copied and added as condition.\nIf they are not wanted, remove them with an override\n\nA special value is 'questions', which indicates the location of the questions box. If not specified, it'll be appended to the bottom of the featureInfobox.\n\nAt last, one can define a group of renderings where parts of all strings will be replaced by multiple other strings.\nThis is mainly create questions for a 'left' and a 'right' side of the road.\nThese will be grouped and questions will be asked together\n\ntype: tagrendering[]\ngroup: tagrenderings", + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/QuestionableTagRenderingConfigJson" + }, + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "builtin": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "override": { + "$ref": "#/definitions/Partial" + } + }, + "required": [ + "builtin", + "override" + ] + }, + { + "allOf": [ + { + "$ref": "#/definitions/default<(string|QuestionableTagRenderingConfigJson|{builtin:string;override:Partial;})[]>" + }, + { + "type": "object", + "properties": { + "id": { + "type": "string" + } + }, + "required": [ + "id" + ] + } + ] + }, + { + "type": "string" + } + ] + } + }, + "filter": { + "description": "All the extra questions for filtering.\nIf a string is given, mapComplete will search in 'filters.json' for the appropriate filter or will try to parse it as `layername.filterid` and us that one\n\ngroup: filters", + "anyOf": [ + { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/default_1" + }, + { + "type": "string" + } + ] + } + }, + { + "type": "object", + "properties": { + "sameAs": { + "type": "string" + } + }, + "required": [ + "sameAs" + ] + } + ] + }, + "deletion": { + "description": "This block defines under what circumstances the delete dialog is shown for objects of this layer.\nIf set, a dialog is shown to the user to (soft) delete the point.\nThe dialog is built to be user friendly and to prevent mistakes.\nIf deletion is not possible, the dialog will hide itself and show the reason of non-deletability instead.\n\nTo configure, the following values are possible:\n\n- false: never ever show the delete button\n- true: show the default delete button\n- undefined: use the mapcomplete default to show deletion or not. Currently, this is the same as 'false' but this will change in the future\n- or: a hash with options (see below)\n\n### The delete dialog\n\n\n\n#### Hard deletion if enough experience\n\nA feature can only be deleted from OpenStreetMap by mapcomplete if:\n\n- It is a node\n- No ways or relations use the node\n- The logged-in user has enough experience OR the user is the only one to have edited the point previously\n- The logged-in user has no unread messages (or has a ton of experience)\n- The user did not select one of the 'non-delete-options' (see below)\n\nIn all other cases, a 'soft deletion' is used.\n\n#### Soft deletion\n\nA 'soft deletion' is when the point isn't deleted fromOSM but retagged so that it'll won't how up in the mapcomplete theme anymore.\nThis makes it look like it was deleted, without doing damage. A fixme will be added to the point.\n\nNote that a soft deletion is _only_ possible if these tags are provided by the theme creator, as they'll be different for every theme\n\n##### No-delete options\n\nIn some cases, the contributor might want to delete something for the wrong reason (e.g. someone who wants to have a path removed \"because the path is on their private property\").\nHowever, the path exists in reality and should thus be on OSM - otherwise the next contributor will pass by and notice \"hey, there is a path missing here! Let me redraw it in OSM!)\n\nThe correct approach is to retag the feature in such a way that it is semantically correct *and* that it doesn't show up on the theme anymore.\nA no-delete option is offered as 'reason to delete it', but secretly retags.\n\ngroup: editing\ntypes: Use an advanced delete configuration ; boolean\niftrue: Allow deletion\niffalse: Do not allow deletion\nifunset: Do not allow deletion", + "anyOf": [ + { + "$ref": "#/definitions/DeleteConfigJson" + }, + { + "type": "boolean" + } + ] + }, + "allowMove": { + "description": "Indicates if a point can be moved and why.\n\nA feature can be moved by MapComplete if:\n\n- It is a point\n- The point is _not_ part of a way or a a relation.\n\ntypes: use an advanced move configuration ; boolean\ngroup: editing\nquestion: Is deleting a point allowed?\niftrue: Allow contributors to move a point (for accuracy or a relocation)\niffalse: Don't allow contributors to move points\nifunset: Don't allow contributors to move points (default)", + "anyOf": [ + { + "$ref": "#/definitions/default_3" + }, + { + "type": "boolean" + } + ] + }, + "allowSplit": { + "description": "If set, a 'split this way' button is shown on objects rendered as LineStrings, e.g. highways.\n\nIf the way is part of a relation, MapComplete will attempt to update this relation as well\nquestion: Should the contributor be able to split ways using this layer?\niftrue: enable the 'split-roads'-component\niffalse: don't enable the split-roads componenet\nifunset: don't enable the split-roads component\ngroup: editing", + "type": "boolean" + }, + "units": { + "type": "array", + "items": { + "$ref": "#/definitions/default_2" + } + }, + "syncSelection": { + "description": "If set, synchronizes whether or not this layer is enabled.\n\ngroup: advanced\nquestion: Should enabling/disabling the layer be saved (locally or in the cloud)?\nsuggestions: return [{if: \"value=no\", then: \"Don't save, always revert to the default\"}, {if: \"value=local\", then: \"Save selection in local storage\"}, {if: \"value=theme-only\", then: \"Save the state in the OSM-usersettings, but apply on this theme only (default)\"}, {if: \"value=global\", then: \"Save in OSM-usersettings and toggle on _all_ themes using this layer\"}]", + "enum": [ + "global", + "local", + "no", + "theme-only" + ], + "type": "string" + }, + "#": { + "description": "Used for comments and/or to disable some checks\n\nno-question-hint-check: disables a check in MiscTagRenderingChecks which complains about 'div', 'span' or 'class=subtle'-HTML elements in the tagRendering\n\ngroup: hidden", + "type": "string" + }, + "fullNodeDatabase": { + "description": "_Set automatically by MapComplete, please ignore_\n\ngroup: hidden", + "type": "boolean" + } + } + }, "Partial": { "type": "object" }, @@ -1659,6 +2569,9 @@ export default { "category": { "type": "string" }, + "type": { + "type": "string" + }, "attribution": { "type": "object", "properties": { @@ -1691,907 +2604,7 @@ export default { "name", "url" ] - }, - "LayerConfigJson": { - "description": "Configuration for a single layer", - "type": "object", - "properties": { - "id": { - "description": "The id of this layer.\nThis should be a simple, lowercase, human readable string that is used to identify the layer.", - "type": "string" - }, - "name": { - "description": "The name of this layer\nUsed in the layer control panel and the 'Personal theme'.\n\nIf not given, will be hidden (and thus not toggable) in the layer control", - "anyOf": [ - { - "$ref": "#/definitions/Record" - }, - { - "type": "string" - } - ] - }, - "description": { - "description": "A description for this layer.\nShown in the layer selections and in the personel theme", - "anyOf": [ - { - "$ref": "#/definitions/Record" - }, - { - "type": "string" - } - ] - }, - "source": { - "description": "This determines where the data for the layer is fetched: from OSM or from an external geojson dataset.\n\nIf no 'geojson' is defined, data will be fetched from overpass and the OSM-API.\n\nEvery source _must_ define which tags _must_ be present in order to be picked up.\n\nNote: a source must always be defined. 'special' is only allowed if this is a builtin-layer", - "anyOf": [ - { - "type": "object", - "properties": { - "osmTags": { - "$ref": "#/definitions/TagConfigJson", - "description": "Every source must set which tags have to be present in order to load the given layer." - }, - "maxCacheAge": { - "description": "The maximum amount of seconds that a tile is allowed to linger in the cache", - "type": "number" - } - }, - "required": [ - "osmTags" - ] - }, - { - "type": "object", - "properties": { - "geoJson": { - "description": "The actual source of the data to load, if loaded via geojson.\n\n# A single geojson-file\nsource: {geoJson: \"https://my.source.net/some-geo-data.geojson\"}\n fetches a geojson from a third party source\n\n# A tiled geojson source\nsource: {geoJson: \"https://my.source.net/some-tile-geojson-{layer}-{z}-{x}-{y}.geojson\", geoJsonZoomLevel: 14}\n to use a tiled geojson source. The web server must offer multiple geojsons. {z}, {x} and {y} are substituted by the location; {layer} is substituted with the id of the loaded layer\n\nSome API's use a BBOX instead of a tile, this can be used by specifying {y_min}, {y_max}, {x_min} and {x_max}", - "type": "string" - }, - "geoJsonZoomLevel": { - "description": "To load a tiled geojson layer, set the zoomlevel of the tiles", - "type": "number" - }, - "isOsmCache": { - "description": "Indicates that the upstream geojson data is OSM-derived.\nUseful for e.g. merging or for scripts generating this cache", - "type": "boolean" - }, - "mercatorCrs": { - "description": "Some API's use a mercator-projection (EPSG:900913) instead of WGS84. Set the flag `mercatorCrs: true` in the source for this", - "type": "boolean" - }, - "idKey": { - "description": "Some API's have an id-field, but give it a different name.\nSetting this key will rename this field into 'id'", - "type": "string" - } - }, - "required": [ - "geoJson" - ] - }, - { - "enum": [ - "special", - "special:library" - ], - "type": "string" - } - ] - }, - "calculatedTags": { - "description": "A list of extra tags to calculate, specified as \"keyToAssignTo=javascript-expression\".\nThere are a few extra functions available. Refer to Docs/CalculatedTags.md for more information\nThe functions will be run in order, e.g.\n[\n \"_max_overlap_m2=Math.max(...feat.overlapsWith(\"someOtherLayer\").map(o => o.overlap))\n \"_max_overlap_ratio=Number(feat._max_overlap_m2)/feat.area\n]\n\nThe specified tags are evaluated lazily. E.g. if a calculated tag is only used in the popup (e.g. the number of nearby features),\nthe expensive calculation will only be performed then for that feature. This avoids clogging up the contributors PC when all features are loaded.\n\nIf a tag has to be evaluated strictly, use ':=' instead:\n\n[\n\"_some_key:=some_javascript_expression\"\n]", - "type": "array", - "items": { - "type": "string" - } - }, - "doNotDownload": { - "description": "If set, this layer will not query overpass; but it'll still match the tags above which are by chance returned by other layers.\nWorks well together with 'passAllFeatures', to add decoration", - "type": "boolean" - }, - "isShown": { - "description": "If set, only features matching this extra tag will be shown.\nThis is useful to hide certain features from view.\n\nImportant: hiding features does not work dynamically, but is only calculated when the data is first renders.\nThis implies that it is not possible to hide a feature after a tagging change\n\nThe default value is 'yes'", - "anyOf": [ - { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" - }, - { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" - }, - { - "type": "string" - } - ] - }, - "forceLoad": { - "description": "Advanced option - might be set by the theme compiler\n\nIf true, this data will _always_ be loaded, even if the theme is disabled", - "type": "boolean" - }, - "minzoom": { - "description": "The minimum needed zoomlevel required before loading of the data start\nDefault: 0", - "type": "number" - }, - "shownByDefault": { - "description": "Indicates if this layer is shown by default;\ncan be used to hide a layer from start, or to load the layer but only to show it where appropriate (e.g. for snapping to it)", - "type": "boolean" - }, - "minzoomVisible": { - "description": "The zoom level at which point the data is hidden again\nDefault: 100 (thus: always visible", - "type": "number" - }, - "title": { - "description": "The title shown in a popup for elements of this layer.", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - }, - "titleIcons": { - "description": "Small icons shown next to the title.\nIf not specified, the OsmLink and wikipedia links will be used by default.\nUse an empty array to hide them.\nNote that \"defaults\" will insert all the default titleIcons (which are added automatically)\n\nType: icon[]", - "anyOf": [ - { - "type": "array", - "items": { - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - } - }, - { - "type": "array", - "items": [ - { - "type": "string", - "enum": [ - "defaults" - ] - } - ], - "minItems": 1, - "maxItems": 1 - } - ] - }, - "mapRendering": { - "description": "Visualisation of the items on the map", - "anyOf": [ - { - "type": "array", - "items": { - "anyOf": [ - { - "$ref": "#/definitions/default_4" - }, - { - "$ref": "#/definitions/default_5" - }, - { - "$ref": "#/definitions/default" - } - ] - } - }, - { - "type": "null" - } - ] - }, - "passAllFeatures": { - "description": "If set, this layer will pass all the features it receives onto the next layer.\nThis is ideal for decoration, e.g. directionss on cameras", - "type": "boolean" - }, - "presets": { - "description": "Presets for this layer.\nA preset shows up when clicking the map on a without data (or when right-clicking/long-pressing);\nit will prompt the user to add a new point.\n\nThe most important aspect are the tags, which define which tags the new point will have;\nThe title is shown in the dialog, along with the first sentence of the description.\n\nUpon confirmation, the full description is shown beneath the buttons - perfect to add pictures and examples.\n\nNote: the icon of the preset is determined automatically based on the tags and the icon above. Don't worry about that!\nNB: if no presets are defined, the popup to add new points doesn't show up at all", - "type": "array", - "items": { - "type": "object", - "properties": { - "title": { - "description": "The title - shown on the 'add-new'-button.\n\nThis should include the article of the noun, e.g. 'a hydrant', 'a bicycle pump'.\nThis text will be inserted into `Add {category} here`, becoming `Add a hydrant here`.\n\nDo _not_ indicate 'new': 'add a new shop here' is incorrect, as the shop might have existed forever, it could just be unmapped!", - "anyOf": [ - { - "$ref": "#/definitions/Record" - }, - { - "type": "string" - } - ] - }, - "tags": { - "description": "The tags to add. It determines the icon too", - "type": "array", - "items": { - "type": "string" - } - }, - "description": { - "description": "The _first sentence_ of the description is shown on the button of the `add` menu.\nThe full description is shown in the confirmation dialog.\n\n(The first sentence is until the first '.'-character in the description)", - "anyOf": [ - { - "$ref": "#/definitions/Record" - }, - { - "type": "string" - } - ] - }, - "exampleImages": { - "description": "Example images, which show real-life pictures of what such a feature might look like\n\nType: image", - "type": "array", - "items": { - "type": "string" - } - }, - "preciseInput": { - "description": "If set, the user will prompted to confirm the location before actually adding the data.\nThis will be with a 'drag crosshair'-method.\n\nIf 'preferredBackgroundCategory' is set, the element will attempt to pick a background layer of that category.", - "anyOf": [ - { - "type": "object", - "properties": { - "preferredBackground": { - "description": "The type of background picture", - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "string" - } - ] - }, - "snapToLayer": { - "description": "If specified, these layers will be shown to and the new point will be snapped towards it", - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "string" - } - ] - }, - "maxSnapDistance": { - "description": "If specified, a new point will only be snapped if it is within this range.\nDistance in meter\n\nDefault: 10", - "type": "number" - } - } - }, - { - "enum": [ - true - ], - "type": "boolean" - } - ] - } - }, - "required": [ - "tags", - "title" - ] - } - }, - "tagRenderings": { - "description": "All the tag renderings.\nA tag rendering is a block that either shows the known value or asks a question.\n\nRefer to the class `TagRenderingConfigJson` to see the possibilities.\n\nNote that we can also use a string here - where the string refers to a tag rendering defined in `assets/questions/questions.json`,\nwhere a few very general questions are defined e.g. website, phone number, ...\nFurthermore, _all_ the questions of another layer can be reused with `otherlayer.*`\nIf you need only a single of the tagRenderings, use `otherlayer.tagrenderingId`\nIf one or more questions have a 'group' or 'label' set, select all the entries with the corresponding group or label with `otherlayer.*group`\nRemark: if a tagRendering is 'lent' from another layer, the 'source'-tags are copied and added as condition.\nIf they are not wanted, remove them with an override\n\nA special value is 'questions', which indicates the location of the questions box. If not specified, it'll be appended to the bottom of the featureInfobox.\n\nAt last, one can define a group of renderings where parts of all strings will be replaced by multiple other strings.\nThis is mainly create questions for a 'left' and a 'right' side of the road.\nThese will be grouped and questions will be asked together", - "type": "array", - "items": { - "anyOf": [ - { - "$ref": "#/definitions/QuestionableTagRenderingConfigJson" - }, - { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "builtin": { - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "string" - } - ] - }, - "override": { - "$ref": "#/definitions/Partial" - } - }, - "required": [ - "builtin", - "override" - ] - }, - { - "allOf": [ - { - "$ref": "#/definitions/default<(string|QuestionableTagRenderingConfigJson|{builtin:string;override:Partial;})[]>" - }, - { - "type": "object", - "properties": { - "id": { - "type": "string" - } - }, - "required": [ - "id" - ] - } - ] - }, - { - "type": "string" - } - ] - } - }, - "filter": { - "description": "All the extra questions for filtering.\nIf a string is given, mapComplete will search in 'filters.json' for the appropriate filter or will try to parse it as `layername.filterid` and us that one", - "anyOf": [ - { - "type": "array", - "items": { - "anyOf": [ - { - "$ref": "#/definitions/default_1" - }, - { - "type": "string" - } - ] - } - }, - { - "type": "object", - "properties": { - "sameAs": { - "type": "string" - } - }, - "required": [ - "sameAs" - ] - } - ] - }, - "deletion": { - "description": "This block defines under what circumstances the delete dialog is shown for objects of this layer.\nIf set, a dialog is shown to the user to (soft) delete the point.\nThe dialog is built to be user friendly and to prevent mistakes.\nIf deletion is not possible, the dialog will hide itself and show the reason of non-deletability instead.\n\nTo configure, the following values are possible:\n\n- false: never ever show the delete button\n- true: show the default delete button\n- undefined: use the mapcomplete default to show deletion or not. Currently, this is the same as 'false' but this will change in the future\n- or: a hash with options (see below)\n\n The delete dialog\n =================\n\n\n\n#### Hard deletion if enough experience\n\nA feature can only be deleted from OpenStreetMap by mapcomplete if:\n\n- It is a node\n- No ways or relations use the node\n- The logged-in user has enough experience OR the user is the only one to have edited the point previously\n- The logged-in user has no unread messages (or has a ton of experience)\n- The user did not select one of the 'non-delete-options' (see below)\n\nIn all other cases, a 'soft deletion' is used.\n\n#### Soft deletion\n\nA 'soft deletion' is when the point isn't deleted from OSM but retagged so that it'll won't how up in the mapcomplete theme anymore.\nThis makes it look like it was deleted, without doing damage. A fixme will be added to the point.\n\nNote that a soft deletion is _only_ possible if these tags are provided by the theme creator, as they'll be different for every theme\n\n#### No-delete options\n\nIn some cases, the contributor might want to delete something for the wrong reason (e.g. someone who wants to have a path removed \"because the path is on their private property\").\nHowever, the path exists in reality and should thus be on OSM - otherwise the next contributor will pass by and notice \"hey, there is a path missing here! Let me redraw it in OSM!)\n\nThe correct approach is to retag the feature in such a way that it is semantically correct *and* that it doesn't show up on the theme anymore.\nA no-delete option is offered as 'reason to delete it', but secretly retags.", - "anyOf": [ - { - "$ref": "#/definitions/DeleteConfigJson" - }, - { - "type": "boolean" - } - ] - }, - "allowMove": { - "description": "Indicates if a point can be moved and configures the modalities.\n\nA feature can be moved by MapComplete if:\n\n- It is a point\n- The point is _not_ part of a way or a a relation.\n\nOff by default. Can be enabled by setting this flag or by configuring.", - "anyOf": [ - { - "$ref": "#/definitions/default_3" - }, - { - "type": "boolean" - } - ] - }, - "allowSplit": { - "description": "If set, a 'split this way' button is shown on objects rendered as LineStrings, e.g. highways.\n\nIf the way is part of a relation, MapComplete will attempt to update this relation as well", - "type": "boolean" - }, - "units": { - "type": "array", - "items": { - "$ref": "#/definitions/default_2" - } - }, - "syncSelection": { - "description": "If set, synchronizes whether or not this layer is enabled.\n\nno: Do not sync at all, always revert to default\nlocal: keep selection on local storage\ntheme-only: sync via OSM, but this layer will only be toggled in this theme\nglobal: all layers with this ID will be synced accross all themes", - "enum": [ - "global", - "local", - "no", - "theme-only" - ], - "type": "string" - }, - "#": { - "description": "Used for comments and/or to disable some checks\n\nno-question-hint-check: disables a check in MiscTagRenderingChecks which complains about 'div', 'span' or 'class=subtle'-HTML elements in the tagRendering", - "type": "string" - } - }, - "required": [ - "id", - "mapRendering", - "source" - ] - }, - "Partial": { - "type": "object", - "properties": { - "id": { - "description": "The id of this layer.\nThis should be a simple, lowercase, human readable string that is used to identify the layer.", - "type": "string" - }, - "name": { - "description": "The name of this layer\nUsed in the layer control panel and the 'Personal theme'.\n\nIf not given, will be hidden (and thus not toggable) in the layer control", - "anyOf": [ - { - "$ref": "#/definitions/Record" - }, - { - "type": "string" - } - ] - }, - "description": { - "description": "A description for this layer.\nShown in the layer selections and in the personel theme", - "anyOf": [ - { - "$ref": "#/definitions/Record" - }, - { - "type": "string" - } - ] - }, - "source": { - "description": "This determines where the data for the layer is fetched: from OSM or from an external geojson dataset.\n\nIf no 'geojson' is defined, data will be fetched from overpass and the OSM-API.\n\nEvery source _must_ define which tags _must_ be present in order to be picked up.\n\nNote: a source must always be defined. 'special' is only allowed if this is a builtin-layer", - "anyOf": [ - { - "type": "object", - "properties": { - "osmTags": { - "$ref": "#/definitions/TagConfigJson", - "description": "Every source must set which tags have to be present in order to load the given layer." - }, - "maxCacheAge": { - "description": "The maximum amount of seconds that a tile is allowed to linger in the cache", - "type": "number" - } - }, - "required": [ - "osmTags" - ] - }, - { - "type": "object", - "properties": { - "geoJson": { - "description": "The actual source of the data to load, if loaded via geojson.\n\n# A single geojson-file\nsource: {geoJson: \"https://my.source.net/some-geo-data.geojson\"}\n fetches a geojson from a third party source\n\n# A tiled geojson source\nsource: {geoJson: \"https://my.source.net/some-tile-geojson-{layer}-{z}-{x}-{y}.geojson\", geoJsonZoomLevel: 14}\n to use a tiled geojson source. The web server must offer multiple geojsons. {z}, {x} and {y} are substituted by the location; {layer} is substituted with the id of the loaded layer\n\nSome API's use a BBOX instead of a tile, this can be used by specifying {y_min}, {y_max}, {x_min} and {x_max}", - "type": "string" - }, - "geoJsonZoomLevel": { - "description": "To load a tiled geojson layer, set the zoomlevel of the tiles", - "type": "number" - }, - "isOsmCache": { - "description": "Indicates that the upstream geojson data is OSM-derived.\nUseful for e.g. merging or for scripts generating this cache", - "type": "boolean" - }, - "mercatorCrs": { - "description": "Some API's use a mercator-projection (EPSG:900913) instead of WGS84. Set the flag `mercatorCrs: true` in the source for this", - "type": "boolean" - }, - "idKey": { - "description": "Some API's have an id-field, but give it a different name.\nSetting this key will rename this field into 'id'", - "type": "string" - } - }, - "required": [ - "geoJson" - ] - }, - { - "enum": [ - "special", - "special:library" - ], - "type": "string" - } - ] - }, - "calculatedTags": { - "description": "A list of extra tags to calculate, specified as \"keyToAssignTo=javascript-expression\".\nThere are a few extra functions available. Refer to Docs/CalculatedTags.md for more information\nThe functions will be run in order, e.g.\n[\n \"_max_overlap_m2=Math.max(...feat.overlapsWith(\"someOtherLayer\").map(o => o.overlap))\n \"_max_overlap_ratio=Number(feat._max_overlap_m2)/feat.area\n]\n\nThe specified tags are evaluated lazily. E.g. if a calculated tag is only used in the popup (e.g. the number of nearby features),\nthe expensive calculation will only be performed then for that feature. This avoids clogging up the contributors PC when all features are loaded.\n\nIf a tag has to be evaluated strictly, use ':=' instead:\n\n[\n\"_some_key:=some_javascript_expression\"\n]", - "type": "array", - "items": { - "type": "string" - } - }, - "doNotDownload": { - "description": "If set, this layer will not query overpass; but it'll still match the tags above which are by chance returned by other layers.\nWorks well together with 'passAllFeatures', to add decoration", - "type": "boolean" - }, - "isShown": { - "description": "If set, only features matching this extra tag will be shown.\nThis is useful to hide certain features from view.\n\nImportant: hiding features does not work dynamically, but is only calculated when the data is first renders.\nThis implies that it is not possible to hide a feature after a tagging change\n\nThe default value is 'yes'", - "anyOf": [ - { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" - }, - { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" - }, - { - "type": "string" - } - ] - }, - "forceLoad": { - "description": "Advanced option - might be set by the theme compiler\n\nIf true, this data will _always_ be loaded, even if the theme is disabled", - "type": "boolean" - }, - "minzoom": { - "description": "The minimum needed zoomlevel required before loading of the data start\nDefault: 0", - "type": "number" - }, - "shownByDefault": { - "description": "Indicates if this layer is shown by default;\ncan be used to hide a layer from start, or to load the layer but only to show it where appropriate (e.g. for snapping to it)", - "type": "boolean" - }, - "minzoomVisible": { - "description": "The zoom level at which point the data is hidden again\nDefault: 100 (thus: always visible", - "type": "number" - }, - "title": { - "description": "The title shown in a popup for elements of this layer.", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - }, - "titleIcons": { - "description": "Small icons shown next to the title.\nIf not specified, the OsmLink and wikipedia links will be used by default.\nUse an empty array to hide them.\nNote that \"defaults\" will insert all the default titleIcons (which are added automatically)\n\nType: icon[]", - "anyOf": [ - { - "type": "array", - "items": { - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - } - }, - { - "type": "array", - "items": [ - { - "type": "string", - "enum": [ - "defaults" - ] - } - ], - "minItems": 1, - "maxItems": 1 - } - ] - }, - "mapRendering": { - "description": "Visualisation of the items on the map", - "anyOf": [ - { - "type": "array", - "items": { - "anyOf": [ - { - "$ref": "#/definitions/default_4" - }, - { - "$ref": "#/definitions/default_5" - }, - { - "$ref": "#/definitions/default" - } - ] - } - }, - { - "type": "null" - } - ] - }, - "passAllFeatures": { - "description": "If set, this layer will pass all the features it receives onto the next layer.\nThis is ideal for decoration, e.g. directionss on cameras", - "type": "boolean" - }, - "presets": { - "description": "Presets for this layer.\nA preset shows up when clicking the map on a without data (or when right-clicking/long-pressing);\nit will prompt the user to add a new point.\n\nThe most important aspect are the tags, which define which tags the new point will have;\nThe title is shown in the dialog, along with the first sentence of the description.\n\nUpon confirmation, the full description is shown beneath the buttons - perfect to add pictures and examples.\n\nNote: the icon of the preset is determined automatically based on the tags and the icon above. Don't worry about that!\nNB: if no presets are defined, the popup to add new points doesn't show up at all", - "type": "array", - "items": { - "type": "object", - "properties": { - "title": { - "description": "The title - shown on the 'add-new'-button.\n\nThis should include the article of the noun, e.g. 'a hydrant', 'a bicycle pump'.\nThis text will be inserted into `Add {category} here`, becoming `Add a hydrant here`.\n\nDo _not_ indicate 'new': 'add a new shop here' is incorrect, as the shop might have existed forever, it could just be unmapped!", - "anyOf": [ - { - "$ref": "#/definitions/Record" - }, - { - "type": "string" - } - ] - }, - "tags": { - "description": "The tags to add. It determines the icon too", - "type": "array", - "items": { - "type": "string" - } - }, - "description": { - "description": "The _first sentence_ of the description is shown on the button of the `add` menu.\nThe full description is shown in the confirmation dialog.\n\n(The first sentence is until the first '.'-character in the description)", - "anyOf": [ - { - "$ref": "#/definitions/Record" - }, - { - "type": "string" - } - ] - }, - "exampleImages": { - "description": "Example images, which show real-life pictures of what such a feature might look like\n\nType: image", - "type": "array", - "items": { - "type": "string" - } - }, - "preciseInput": { - "description": "If set, the user will prompted to confirm the location before actually adding the data.\nThis will be with a 'drag crosshair'-method.\n\nIf 'preferredBackgroundCategory' is set, the element will attempt to pick a background layer of that category.", - "anyOf": [ - { - "type": "object", - "properties": { - "preferredBackground": { - "description": "The type of background picture", - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "string" - } - ] - }, - "snapToLayer": { - "description": "If specified, these layers will be shown to and the new point will be snapped towards it", - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "string" - } - ] - }, - "maxSnapDistance": { - "description": "If specified, a new point will only be snapped if it is within this range.\nDistance in meter\n\nDefault: 10", - "type": "number" - } - } - }, - { - "enum": [ - true - ], - "type": "boolean" - } - ] - } - }, - "required": [ - "tags", - "title" - ] - } - }, - "tagRenderings": { - "description": "All the tag renderings.\nA tag rendering is a block that either shows the known value or asks a question.\n\nRefer to the class `TagRenderingConfigJson` to see the possibilities.\n\nNote that we can also use a string here - where the string refers to a tag rendering defined in `assets/questions/questions.json`,\nwhere a few very general questions are defined e.g. website, phone number, ...\nFurthermore, _all_ the questions of another layer can be reused with `otherlayer.*`\nIf you need only a single of the tagRenderings, use `otherlayer.tagrenderingId`\nIf one or more questions have a 'group' or 'label' set, select all the entries with the corresponding group or label with `otherlayer.*group`\nRemark: if a tagRendering is 'lent' from another layer, the 'source'-tags are copied and added as condition.\nIf they are not wanted, remove them with an override\n\nA special value is 'questions', which indicates the location of the questions box. If not specified, it'll be appended to the bottom of the featureInfobox.\n\nAt last, one can define a group of renderings where parts of all strings will be replaced by multiple other strings.\nThis is mainly create questions for a 'left' and a 'right' side of the road.\nThese will be grouped and questions will be asked together", - "type": "array", - "items": { - "anyOf": [ - { - "$ref": "#/definitions/QuestionableTagRenderingConfigJson" - }, - { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "builtin": { - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "string" - } - ] - }, - "override": { - "$ref": "#/definitions/Partial" - } - }, - "required": [ - "builtin", - "override" - ] - }, - { - "allOf": [ - { - "$ref": "#/definitions/default<(string|QuestionableTagRenderingConfigJson|{builtin:string;override:Partial;})[]>" - }, - { - "type": "object", - "properties": { - "id": { - "type": "string" - } - }, - "required": [ - "id" - ] - } - ] - }, - { - "type": "string" - } - ] - } - }, - "filter": { - "description": "All the extra questions for filtering.\nIf a string is given, mapComplete will search in 'filters.json' for the appropriate filter or will try to parse it as `layername.filterid` and us that one", - "anyOf": [ - { - "type": "array", - "items": { - "anyOf": [ - { - "$ref": "#/definitions/default_1" - }, - { - "type": "string" - } - ] - } - }, - { - "type": "object", - "properties": { - "sameAs": { - "type": "string" - } - }, - "required": [ - "sameAs" - ] - } - ] - }, - "deletion": { - "description": "This block defines under what circumstances the delete dialog is shown for objects of this layer.\nIf set, a dialog is shown to the user to (soft) delete the point.\nThe dialog is built to be user friendly and to prevent mistakes.\nIf deletion is not possible, the dialog will hide itself and show the reason of non-deletability instead.\n\nTo configure, the following values are possible:\n\n- false: never ever show the delete button\n- true: show the default delete button\n- undefined: use the mapcomplete default to show deletion or not. Currently, this is the same as 'false' but this will change in the future\n- or: a hash with options (see below)\n\n The delete dialog\n =================\n\n\n\n#### Hard deletion if enough experience\n\nA feature can only be deleted from OpenStreetMap by mapcomplete if:\n\n- It is a node\n- No ways or relations use the node\n- The logged-in user has enough experience OR the user is the only one to have edited the point previously\n- The logged-in user has no unread messages (or has a ton of experience)\n- The user did not select one of the 'non-delete-options' (see below)\n\nIn all other cases, a 'soft deletion' is used.\n\n#### Soft deletion\n\nA 'soft deletion' is when the point isn't deleted from OSM but retagged so that it'll won't how up in the mapcomplete theme anymore.\nThis makes it look like it was deleted, without doing damage. A fixme will be added to the point.\n\nNote that a soft deletion is _only_ possible if these tags are provided by the theme creator, as they'll be different for every theme\n\n#### No-delete options\n\nIn some cases, the contributor might want to delete something for the wrong reason (e.g. someone who wants to have a path removed \"because the path is on their private property\").\nHowever, the path exists in reality and should thus be on OSM - otherwise the next contributor will pass by and notice \"hey, there is a path missing here! Let me redraw it in OSM!)\n\nThe correct approach is to retag the feature in such a way that it is semantically correct *and* that it doesn't show up on the theme anymore.\nA no-delete option is offered as 'reason to delete it', but secretly retags.", - "anyOf": [ - { - "$ref": "#/definitions/DeleteConfigJson" - }, - { - "type": "boolean" - } - ] - }, - "allowMove": { - "description": "Indicates if a point can be moved and configures the modalities.\n\nA feature can be moved by MapComplete if:\n\n- It is a point\n- The point is _not_ part of a way or a a relation.\n\nOff by default. Can be enabled by setting this flag or by configuring.", - "anyOf": [ - { - "$ref": "#/definitions/default_3" - }, - { - "type": "boolean" - } - ] - }, - "allowSplit": { - "description": "If set, a 'split this way' button is shown on objects rendered as LineStrings, e.g. highways.\n\nIf the way is part of a relation, MapComplete will attempt to update this relation as well", - "type": "boolean" - }, - "units": { - "type": "array", - "items": { - "$ref": "#/definitions/default_2" - } - }, - "syncSelection": { - "description": "If set, synchronizes whether or not this layer is enabled.\n\nno: Do not sync at all, always revert to default\nlocal: keep selection on local storage\ntheme-only: sync via OSM, but this layer will only be toggled in this theme\nglobal: all layers with this ID will be synced accross all themes", - "enum": [ - "global", - "local", - "no", - "theme-only" - ], - "type": "string" - }, - "#": { - "description": "Used for comments and/or to disable some checks\n\nno-question-hint-check: disables a check in MiscTagRenderingChecks which complains about 'div', 'span' or 'class=subtle'-HTML elements in the tagRendering", - "type": "string" - } - } - }, - "default": { - "type": "object", - "properties": { - "icon": { - "type": "string" - }, - "text": {}, - "href": { - "type": "string" - }, - "newTab": { - "type": "boolean" - }, - "requirements": { - "type": "array", - "items": { - "enum": [ - "iframe", - "no-iframe", - "no-welcome-message", - "welcome-message" - ], - "type": "string" - } - } - }, - "required": [ - "href" - ] } }, "$schema": "http://json-schema.org/draft-07/schema#" -} +} \ No newline at end of file diff --git a/Docs/Schemas/LineRenderingConfigJson.schema.json b/Docs/Schemas/LineRenderingConfigJson.schema.json index 744b13d2b..a60c94e2d 100644 --- a/Docs/Schemas/LineRenderingConfigJson.schema.json +++ b/Docs/Schemas/LineRenderingConfigJson.schema.json @@ -3,10 +3,10 @@ "type": "object", "properties": { "color": { - "description": "The color for way-elements and SVG-elements.\nIf the value starts with \"--\", the style of the body element will be queried for the corresponding variable instead", + "description": "question: What color should lines be drawn in?\n\nFor an area, this will be the colour of the outside line.\nIf the value starts with \"--\", the style of the body element will be queried for the corresponding variable instead\n\ntypes: dynamic value ; string\ntitle: Line Colour\ninline: The line colour always is {value}\ntype: color", "anyOf": [ { - "$ref": "#/definitions/TagRenderingConfigJson" + "$ref": "#/definitions/MinimalTagRenderingConfigJson" }, { "type": "string" @@ -14,10 +14,10 @@ ] }, "width": { - "description": "The stroke-width for way-elements", + "description": "question: How wide should the line be?\nThe stroke-width for way-elements\n\ntypes: dynamic value ; string\ntitle: Line width\ninline: The line width is {value} pixels\ntype: pnat\nifunset: Use the default-linewidth of 7 pixels", "anyOf": [ { - "$ref": "#/definitions/TagRenderingConfigJson" + "$ref": "#/definitions/MinimalTagRenderingConfigJson" }, { "type": [ @@ -28,47 +28,25 @@ ] }, "dashArray": { - "description": "A dasharray, e.g. \"5 6\"\nThe dasharray defines 'pixels of line, pixels of gap, pixels of line, pixels of gap',\nDefault value: \"\" (empty string == full line)", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] + "description": "question: Should a dasharray be used to render the lines?\nThe dasharray defines 'pixels of line, pixels of gap, pixels of line, pixels of gap, ...'. For example, `5 6` will be 5 pixels of line followed by a 6 pixel gap.\nCannot be a dynamic property due to a mapbox limitation\nifunset: Ways are rendered with a full line", + "type": "string" }, "lineCap": { - "description": "The form at the end of a line", + "description": "question: What form should the line-ending have?\nsuggestions: return [{if:\"value=round\",then:\"Round endings\"}, {if: \"value=square\", then: \"square endings\"}, {if: \"value=butt\", then: \"no ending (square ending at the end, without padding)\"}]\ntypes: dynamic value ; string\ntitle: Line Cap\nifunset: Use the default value (round ending)", "anyOf": [ { - "$ref": "#/definitions/TagRenderingConfigJson" + "$ref": "#/definitions/MinimalTagRenderingConfigJson" }, { "type": "string" } ] }, - "fill": { - "description": "Whether or not to fill polygons", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "enum": [ - "no", - "yes" - ], - "type": "string" - } - ] - }, "fillColor": { - "description": "The color to fill a polygon with.\nIf undefined, this will be slightly more opaque version of the stroke line", + "description": "question: What colour should be used as fill colour for polygons?\nifunset: The polygon fill colour will be a more transparent version of the stroke colour\nsuggestions: return [{if: \"value=#00000000\", then: \"Use a transparent fill (only render the outline)\"}]\ninline: The fill colour is {value}\ntypes: dynamic value ; string\ntype: color", "anyOf": [ { - "$ref": "#/definitions/TagRenderingConfigJson" + "$ref": "#/definitions/MinimalTagRenderingConfigJson" }, { "type": "string" @@ -76,10 +54,10 @@ ] }, "offset": { - "description": "The number of pixels this line should be moved.\nUse a positive numbe to move to the right, a negative to move to the left (left/right as defined by the drawing direction of the line).\n\nIMPORTANT: MapComplete will already normalize 'key:both:property' and 'key:both' into the corresponding 'key:left' and 'key:right' tagging (same for 'sidewalk=left/right/both' which is rewritten to 'sidewalk:left' and 'sidewalk:right')\nThis simplifies programming. Refer to the CalculatedTags.md-documentation for more details", + "description": "question: Should the lines be moved (offsetted) with a number of pixels against the geographical lines?\nThe number of pixels this line should be moved.\nUse a positive number to move to the right in the drawing direction or a negative to move to the left (left/right as defined by the drawing direction of the line).\n\nIMPORTANT: MapComplete will already normalize 'key:both:property' and 'key:both' into the corresponding 'key:left' and 'key:right' tagging (same for 'sidewalk=left/right/both' which is rewritten to 'sidewalk:left' and 'sidewalk:right')\nThis simplifies programming. Refer to the CalculatedTags.md-documentation for more details\nifunset: don't offset lines on the map\ninline: Pixel offset by {value} pixels\ntypes: dynamic value ; number\ntype: int", "anyOf": [ { - "$ref": "#/definitions/TagRenderingConfigJson" + "$ref": "#/definitions/MinimalTagRenderingConfigJson" }, { "type": "number" @@ -89,13 +67,12 @@ }, "definitions": { "TagConfigJson": { - "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation", + "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation\n\ntype: tag", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", "type": "object", "properties": { "or": { @@ -114,8 +91,7 @@ } ] }, - "AndTagConfigJson": { - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", + "{and:TagConfigJson[];}": { "type": "object", "properties": { "and": { @@ -130,8 +106,7 @@ ], "additionalProperties": false }, - "OrTagConfigJson": { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", + "{or:TagConfigJson[];}": { "type": "object", "properties": { "or": { @@ -218,48 +193,101 @@ ], "additionalProperties": false }, + "MinimalTagRenderingConfigJson": { + "description": "Mostly used for lineRendering and pointRendering", + "type": "object", + "properties": { + "render": { + "description": "question: What value should be rendered?\n\nThis piece of text will be shown in the infobox.\nNote that \"&LBRACEkey&RBRACE\"-parts are substituted by the corresponding values of the element.\n\nThis value will be used if there is no mapping which matches (or there are no matches)\nNote that this is a HTML-interpreted value, so you can add links as e.g. '<a href='{website}'>{website}</a>' or include images such as `This is of type A <br><img src='typeA-icon.svg' />`", + "type": "string" + }, + "mappings": { + "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", + "type": "array", + "items": { + "type": "object", + "properties": { + "if": { + "$ref": "#/definitions/TagConfigJson", + "description": "question: When should this single mapping match?\n\nIf this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}" + }, + "then": { + "description": "question: What text should be shown?\n\nIf the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option", + "type": "string" + } + }, + "required": [ + "if", + "then" + ] + } + } + }, + "additionalProperties": false + }, + "IconConfigJson": { + "type": "object", + "properties": { + "icon": { + "description": "question: What icon should be used?\ntype: icon\nsuggestions: return [\"pin\",\"square\",\"circle\",\"checkmark\",\"clock\",\"close\",\"crosshair\",\"help\",\"home\",\"invalid\",\"location\",\"location_empty\",\"location_locked\",\"note\",\"resolved\",\"ring\",\"scissors\",\"teardrop\",\"teardrop_with_hole_green\",\"triangle\"].map(i => ({if: \"value=\"+i, then: i, icon: i}))", + "anyOf": [ + { + "$ref": "#/definitions/MinimalTagRenderingConfigJson" + }, + { + "type": "object", + "properties": { + "builtin": { + "type": "string" + }, + "override": {} + }, + "required": [ + "builtin", + "override" + ] + }, + { + "type": "string" + } + ] + }, + "color": { + "description": "question: What colour should the icon be?\nThis will only work for the default icons such as `pin`,`circle`,...\ntype: color", + "anyOf": [ + { + "$ref": "#/definitions/MinimalTagRenderingConfigJson" + }, + { + "type": "object", + "properties": { + "builtin": { + "type": "string" + }, + "override": {} + }, + "required": [ + "builtin", + "override" + ] + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "icon" + ], + "additionalProperties": false + }, "TagRenderingConfigJson": { "description": "A TagRenderingConfigJson is a single piece of code which converts one ore more tags into a HTML-snippet.\nFor an _editable_ tagRendering, use 'QuestionableTagRenderingConfigJson' instead, which extends this one", "type": "object", "properties": { - "id": { - "description": "The id of the tagrendering, should be an unique string.\nUsed to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise.\n\nUse 'questions' to trigger the question box of this group (if a group is defined)", - "type": "string" - }, - "labels": { - "description": "A list of labels. These are strings that are used for various purposes, e.g. to filter them away", - "type": "array", - "items": { - "type": "string" - } - }, - "classes": { - "description": "A list of css-classes to apply to the entire tagRendering if the answer is known (not applied on the question).\nThis is only for advanced users", - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "string" - } - ] - }, - "description": { - "description": "A human-readable text explaining what this tagRendering does", - "anyOf": [ - { - "$ref": "#/definitions/Record" - }, - { - "type": "string" - } - ] - }, "render": { - "description": "Renders this value. Note that \"{key}\"-parts are substituted by the corresponding values of the element.\nIf neither 'textFieldQuestion' nor 'mappings' are defined, this text is simply shown as default value.\n\nNote 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
`\ntype: rendered", + "description": "question: What text should be rendered?\n\nThis piece of text will be shown in the infobox.\nIn this text, values within braces (such as {braced(key)}) are replaced by the corresponding `value` in the object.\nFor example, if the object contains tags `amenity=school; name=Windy Hill School`, the render string `This school is named {name}` will be shown to the user as `This school is named Windy Hill School`\n\nThis text will be shown if:\n- there is no mapping which matches (or there are no matches)\n- no question, no mappings and no 'freeform' is set\n\nNote that this is a HTML-interpreted value, so you can add links as e.g. '<a href='{website}'>{website}</a>' or include images such as `This is of type A <br><img src='typeA-icon.svg' />`\ntype: rendered\nifunset: no text is rendered if no predefined options match", "anyOf": [ { "$ref": "#/definitions/Record" @@ -295,16 +323,38 @@ } ] }, - "condition": { - "description": "Only show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", + "icon": { + "description": "question: what icon should be shown next to the 'render' value?\nAn icon shown next to the rendering; typically shown pretty small\nThis is only shown next to the \"render\" value\nType: icon\nifunset: do not show an icon next to the \"render\"-value", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "type": "object", + "properties": { + "path": { + "description": "The path to the icon\nType: icon", + "type": "string" + }, + "class": { + "description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-', so defining your own in combination with a custom CSS is possible (but discouraged)", + "type": "string" + } + }, + "required": [ + "path" + ] }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "type": "string" + } + ] + }, + "condition": { + "description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or ask the question if unkown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", + "anyOf": [ + { + "$ref": "#/definitions/{and:TagConfigJson[];}" + }, + { + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -312,15 +362,13 @@ ] }, "metacondition": { - "description": "If set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", + "description": "question: When should this item be shown (including special conditions)?\ntype: tag\n\nIf set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -328,17 +376,14 @@ ] }, "freeform": { - "description": "Allow freeform text input from the user", + "description": "question: Should a freeform text field be shown?\nAllow freeform text input from the user\nifunset: Do not add a freeform text field", "type": "object", "properties": { "key": { - "description": "If this key is present, then 'render' is used to display the value.\nIf this is undefined, the rendering is _always_ shown", + "description": "What attribute should be filled out\nIf this key is present in the feature, then 'render' is used to display the value.\nIf this is undefined, the rendering is _always_ shown", "type": "string" } - }, - "required": [ - "key" - ] + } }, "mappings": { "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", @@ -348,10 +393,10 @@ "properties": { "if": { "$ref": "#/definitions/TagConfigJson", - "description": "If this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}" + "description": "question: When should this single mapping match?\n\nIf this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}" }, "then": { - "description": "If the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option\nType: rendered", + "description": "question: What text should be shown?\n\nIf the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option\nType: rendered", "anyOf": [ { "$ref": "#/definitions/Record" @@ -362,7 +407,7 @@ ] }, "icon": { - "description": "An icon supporting this mapping; typically shown pretty small\nType: icon", + "description": "question: What icon should be added to this mapping?\nifunset: Do not show an extra icon next to the render value\n\nAn icon supporting this mapping; typically shown pretty small.\nThis can be used to show a 'phone'-icon next to the phone number\ninline: {icon}\nType: icon", "anyOf": [ { "type": "object", @@ -391,6 +436,21 @@ "then" ] } + }, + "description": { + "description": "A human-readable text explaining what this tagRendering does.\nMostly used for the shared tagrenderings", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] + }, + "classes": { + "description": "question: What css-classes should be applied to showing this attribute?\n\nA list of css-classes to apply to the entire tagRendering.\nThese classes are applied in 'answer'-mode, not in question mode\nThis is only for advanced users.\n\nValues are split on ` ` (space)", + "type": "string" } }, "additionalProperties": false diff --git a/Docs/Schemas/LineRenderingConfigJsonJSC.ts b/Docs/Schemas/LineRenderingConfigJsonJSC.ts index db7177b6f..3e6169438 100644 --- a/Docs/Schemas/LineRenderingConfigJsonJSC.ts +++ b/Docs/Schemas/LineRenderingConfigJsonJSC.ts @@ -3,10 +3,10 @@ export default { "type": "object", "properties": { "color": { - "description": "The color for way-elements and SVG-elements.\nIf the value starts with \"--\", the style of the body element will be queried for the corresponding variable instead", + "description": "question: What color should lines be drawn in?\n\nFor an area, this will be the colour of the outside line.\nIf the value starts with \"--\", the style of the body element will be queried for the corresponding variable instead\n\ntypes: dynamic value ; string\ntitle: Line Colour\ninline: The line colour always is {value}\ntype: color", "anyOf": [ { - "$ref": "#/definitions/TagRenderingConfigJson" + "$ref": "#/definitions/MinimalTagRenderingConfigJson" }, { "type": "string" @@ -14,10 +14,10 @@ export default { ] }, "width": { - "description": "The stroke-width for way-elements", + "description": "question: How wide should the line be?\nThe stroke-width for way-elements\n\ntypes: dynamic value ; string\ntitle: Line width\ninline: The line width is {value} pixels\ntype: pnat\nifunset: Use the default-linewidth of 7 pixels", "anyOf": [ { - "$ref": "#/definitions/TagRenderingConfigJson" + "$ref": "#/definitions/MinimalTagRenderingConfigJson" }, { "type": [ @@ -28,47 +28,25 @@ export default { ] }, "dashArray": { - "description": "A dasharray, e.g. \"5 6\"\nThe dasharray defines 'pixels of line, pixels of gap, pixels of line, pixels of gap',\nDefault value: \"\" (empty string == full line)", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] + "description": "question: Should a dasharray be used to render the lines?\nThe dasharray defines 'pixels of line, pixels of gap, pixels of line, pixels of gap, ...'. For example, `5 6` will be 5 pixels of line followed by a 6 pixel gap.\nCannot be a dynamic property due to a mapbox limitation\nifunset: Ways are rendered with a full line", + "type": "string" }, "lineCap": { - "description": "The form at the end of a line", + "description": "question: What form should the line-ending have?\nsuggestions: return [{if:\"value=round\",then:\"Round endings\"}, {if: \"value=square\", then: \"square endings\"}, {if: \"value=butt\", then: \"no ending (square ending at the end, without padding)\"}]\ntypes: dynamic value ; string\ntitle: Line Cap\nifunset: Use the default value (round ending)", "anyOf": [ { - "$ref": "#/definitions/TagRenderingConfigJson" + "$ref": "#/definitions/MinimalTagRenderingConfigJson" }, { "type": "string" } ] }, - "fill": { - "description": "Whether or not to fill polygons", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "enum": [ - "no", - "yes" - ], - "type": "string" - } - ] - }, "fillColor": { - "description": "The color to fill a polygon with.\nIf undefined, this will be slightly more opaque version of the stroke line", + "description": "question: What colour should be used as fill colour for polygons?\nifunset: The polygon fill colour will be a more transparent version of the stroke colour\nsuggestions: return [{if: \"value=#00000000\", then: \"Use a transparent fill (only render the outline)\"}]\ninline: The fill colour is {value}\ntypes: dynamic value ; string\ntype: color", "anyOf": [ { - "$ref": "#/definitions/TagRenderingConfigJson" + "$ref": "#/definitions/MinimalTagRenderingConfigJson" }, { "type": "string" @@ -76,10 +54,10 @@ export default { ] }, "offset": { - "description": "The number of pixels this line should be moved.\nUse a positive numbe to move to the right, a negative to move to the left (left/right as defined by the drawing direction of the line).\n\nIMPORTANT: MapComplete will already normalize 'key:both:property' and 'key:both' into the corresponding 'key:left' and 'key:right' tagging (same for 'sidewalk=left/right/both' which is rewritten to 'sidewalk:left' and 'sidewalk:right')\nThis simplifies programming. Refer to the CalculatedTags.md-documentation for more details", + "description": "question: Should the lines be moved (offsetted) with a number of pixels against the geographical lines?\nThe number of pixels this line should be moved.\nUse a positive number to move to the right in the drawing direction or a negative to move to the left (left/right as defined by the drawing direction of the line).\n\nIMPORTANT: MapComplete will already normalize 'key:both:property' and 'key:both' into the corresponding 'key:left' and 'key:right' tagging (same for 'sidewalk=left/right/both' which is rewritten to 'sidewalk:left' and 'sidewalk:right')\nThis simplifies programming. Refer to the CalculatedTags.md-documentation for more details\nifunset: don't offset lines on the map\ninline: Pixel offset by {value} pixels\ntypes: dynamic value ; number\ntype: int", "anyOf": [ { - "$ref": "#/definitions/TagRenderingConfigJson" + "$ref": "#/definitions/MinimalTagRenderingConfigJson" }, { "type": "number" @@ -89,13 +67,12 @@ export default { }, "definitions": { "TagConfigJson": { - "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation", + "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation\n\ntype: tag", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", "type": "object", "properties": { "or": { @@ -114,8 +91,7 @@ export default { } ] }, - "AndTagConfigJson": { - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", + "{and:TagConfigJson[];}": { "type": "object", "properties": { "and": { @@ -129,8 +105,7 @@ export default { "and" ] }, - "OrTagConfigJson": { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", + "{or:TagConfigJson[];}": { "type": "object", "properties": { "or": { @@ -213,48 +188,99 @@ export default { "canonicalDenomination" ] }, + "MinimalTagRenderingConfigJson": { + "description": "Mostly used for lineRendering and pointRendering", + "type": "object", + "properties": { + "render": { + "description": "question: What value should be rendered?\n\nThis piece of text will be shown in the infobox.\nNote that \"&LBRACEkey&RBRACE\"-parts are substituted by the corresponding values of the element.\n\nThis value will be used if there is no mapping which matches (or there are no matches)\nNote that this is a HTML-interpreted value, so you can add links as e.g. '<a href='{website}'>{website}</a>' or include images such as `This is of type A <br><img src='typeA-icon.svg' />`", + "type": "string" + }, + "mappings": { + "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", + "type": "array", + "items": { + "type": "object", + "properties": { + "if": { + "$ref": "#/definitions/TagConfigJson", + "description": "question: When should this single mapping match?\n\nIf this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}" + }, + "then": { + "description": "question: What text should be shown?\n\nIf the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option", + "type": "string" + } + }, + "required": [ + "if", + "then" + ] + } + } + } + }, + "IconConfigJson": { + "type": "object", + "properties": { + "icon": { + "description": "question: What icon should be used?\ntype: icon\nsuggestions: return [\"pin\",\"square\",\"circle\",\"checkmark\",\"clock\",\"close\",\"crosshair\",\"help\",\"home\",\"invalid\",\"location\",\"location_empty\",\"location_locked\",\"note\",\"resolved\",\"ring\",\"scissors\",\"teardrop\",\"teardrop_with_hole_green\",\"triangle\"].map(i => ({if: \"value=\"+i, then: i, icon: i}))", + "anyOf": [ + { + "$ref": "#/definitions/MinimalTagRenderingConfigJson" + }, + { + "type": "object", + "properties": { + "builtin": { + "type": "string" + }, + "override": {} + }, + "required": [ + "builtin", + "override" + ] + }, + { + "type": "string" + } + ] + }, + "color": { + "description": "question: What colour should the icon be?\nThis will only work for the default icons such as `pin`,`circle`,...\ntype: color", + "anyOf": [ + { + "$ref": "#/definitions/MinimalTagRenderingConfigJson" + }, + { + "type": "object", + "properties": { + "builtin": { + "type": "string" + }, + "override": {} + }, + "required": [ + "builtin", + "override" + ] + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "icon" + ] + }, "TagRenderingConfigJson": { "description": "A TagRenderingConfigJson is a single piece of code which converts one ore more tags into a HTML-snippet.\nFor an _editable_ tagRendering, use 'QuestionableTagRenderingConfigJson' instead, which extends this one", "type": "object", "properties": { - "id": { - "description": "The id of the tagrendering, should be an unique string.\nUsed to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise.\n\nUse 'questions' to trigger the question box of this group (if a group is defined)", - "type": "string" - }, - "labels": { - "description": "A list of labels. These are strings that are used for various purposes, e.g. to filter them away", - "type": "array", - "items": { - "type": "string" - } - }, - "classes": { - "description": "A list of css-classes to apply to the entire tagRendering if the answer is known (not applied on the question).\nThis is only for advanced users", - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "string" - } - ] - }, - "description": { - "description": "A human-readable text explaining what this tagRendering does", - "anyOf": [ - { - "$ref": "#/definitions/Record" - }, - { - "type": "string" - } - ] - }, "render": { - "description": "Renders this value. Note that \"{key}\"-parts are substituted by the corresponding values of the element.\nIf neither 'textFieldQuestion' nor 'mappings' are defined, this text is simply shown as default value.\n\nNote 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
`\ntype: rendered", + "description": "question: What text should be rendered?\n\nThis piece of text will be shown in the infobox.\nIn this text, values within braces (such as {braced(key)}) are replaced by the corresponding `value` in the object.\nFor example, if the object contains tags `amenity=school; name=Windy Hill School`, the render string `This school is named {name}` will be shown to the user as `This school is named Windy Hill School`\n\nThis text will be shown if:\n- there is no mapping which matches (or there are no matches)\n- no question, no mappings and no 'freeform' is set\n\nNote that this is a HTML-interpreted value, so you can add links as e.g. '<a href='{website}'>{website}</a>' or include images such as `This is of type A <br><img src='typeA-icon.svg' />`\ntype: rendered\nifunset: no text is rendered if no predefined options match", "anyOf": [ { "$ref": "#/definitions/Record" @@ -290,16 +316,38 @@ export default { } ] }, - "condition": { - "description": "Only show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", + "icon": { + "description": "question: what icon should be shown next to the 'render' value?\nAn icon shown next to the rendering; typically shown pretty small\nThis is only shown next to the \"render\" value\nType: icon\nifunset: do not show an icon next to the \"render\"-value", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "type": "object", + "properties": { + "path": { + "description": "The path to the icon\nType: icon", + "type": "string" + }, + "class": { + "description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-', so defining your own in combination with a custom CSS is possible (but discouraged)", + "type": "string" + } + }, + "required": [ + "path" + ] }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "type": "string" + } + ] + }, + "condition": { + "description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or ask the question if unkown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", + "anyOf": [ + { + "$ref": "#/definitions/{and:TagConfigJson[];}" + }, + { + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -307,15 +355,13 @@ export default { ] }, "metacondition": { - "description": "If set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", + "description": "question: When should this item be shown (including special conditions)?\ntype: tag\n\nIf set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -323,17 +369,14 @@ export default { ] }, "freeform": { - "description": "Allow freeform text input from the user", + "description": "question: Should a freeform text field be shown?\nAllow freeform text input from the user\nifunset: Do not add a freeform text field", "type": "object", "properties": { "key": { - "description": "If this key is present, then 'render' is used to display the value.\nIf this is undefined, the rendering is _always_ shown", + "description": "What attribute should be filled out\nIf this key is present in the feature, then 'render' is used to display the value.\nIf this is undefined, the rendering is _always_ shown", "type": "string" } - }, - "required": [ - "key" - ] + } }, "mappings": { "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", @@ -343,10 +386,10 @@ export default { "properties": { "if": { "$ref": "#/definitions/TagConfigJson", - "description": "If this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}" + "description": "question: When should this single mapping match?\n\nIf this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}" }, "then": { - "description": "If the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option\nType: rendered", + "description": "question: What text should be shown?\n\nIf the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option\nType: rendered", "anyOf": [ { "$ref": "#/definitions/Record" @@ -357,7 +400,7 @@ export default { ] }, "icon": { - "description": "An icon supporting this mapping; typically shown pretty small\nType: icon", + "description": "question: What icon should be added to this mapping?\nifunset: Do not show an extra icon next to the render value\n\nAn icon supporting this mapping; typically shown pretty small.\nThis can be used to show a 'phone'-icon next to the phone number\ninline: {icon}\nType: icon", "anyOf": [ { "type": "object", @@ -386,6 +429,21 @@ export default { "then" ] } + }, + "description": { + "description": "A human-readable text explaining what this tagRendering does.\nMostly used for the shared tagrenderings", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] + }, + "classes": { + "description": "question: What css-classes should be applied to showing this attribute?\n\nA list of css-classes to apply to the entire tagRendering.\nThese classes are applied in 'answer'-mode, not in question mode\nThis is only for advanced users.\n\nValues are split on ` ` (space)", + "type": "string" } } } diff --git a/Docs/Schemas/MappingConfigJson.schema.json b/Docs/Schemas/MappingConfigJson.schema.json index 2b5926dd8..124b4a382 100644 --- a/Docs/Schemas/MappingConfigJson.schema.json +++ b/Docs/Schemas/MappingConfigJson.schema.json @@ -3,13 +3,21 @@ "properties": { "if": { "$ref": "#/definitions/TagConfigJson", - "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation" + "description": "question: What tags should be matched to show this option?\n\nIf in 'question'-mode and the contributor selects this option, these tags will be applied to the object" }, "then": { - "description": "Shown if the 'if is fulfilled\nType: rendered" + "description": "Question: What corresponding text should be shown?\nShown if the `if` is fulfilled\nType: rendered", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] }, "icon": { - "description": "An extra icon supporting the choice\nType: icon", + "description": "question: What icon should be shown next to this mapping?\n\nThis icon will only be shown if the value is known, it is not displayed in the options (but might be in the future)\n\nifunset: Show no icon\nType: icon", "anyOf": [ { "type": "object", @@ -33,15 +41,13 @@ ] }, "hideInAnswer": { - "description": "In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n\n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}", + "description": "question: Under what circumstances should this mapping be hidden from the possibilities a contributor can pick?\niftrue: Never show this mapping as option to pick\nifunset: Always show this mapping as option to pick\ntype: tag\n\nIn some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n\n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": [ @@ -52,15 +58,13 @@ ] }, "ifnot": { - "description": "Only applicable if 'multiAnswer' is set.\nThis is for situations such as:\n`accepts:coins=no` where one can select all the possible payment methods. However, we want to make explicit that some options _were not_ selected.\nThis can be done with `ifnot`\nNote that we can not explicitly render this negative case to the user, we cannot show `does _not_ accept coins`.\nIf this is important to your usecase, consider using multiple radiobutton-fields without `multiAnswer`", + "description": "question: What tags should be applied if this mapping is _not_ chosen?\n\nOnly applicable if 'multiAnswer' is set.\nThis is for situations such as:\n`accepts:coins=no` where one can select all the possible payment methods. However, we want to make explicit that some options _were not_ selected.\nThis can be done with `ifnot`\nNote that we can not explicitly render this negative case to the user, we cannot show `does _not_ accept coins`.\nIf this is important to your usecase, consider using multiple radiobutton-fields without `multiAnswer`\n\nifunset: Do not apply a tag if a different mapping is chosen.", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -68,26 +72,24 @@ ] }, "addExtraTags": { - "description": "If chosen as answer, these tags will be applied as well onto the object.\nNot compatible with multiAnswer.\n\nThis can be used e.g. to erase other keys which indicate the 'not' value:\n```json\n{\n \"if\": \"crossing:marking=rainbow\",\n \"then\": \"This is a rainbow crossing\",\n \"addExtraTags\": \"not:crossing:marking=\"\n}\n```", + "description": "question: What extra tags should be added to the object if this object is chosen?\ntype: simple_tag\n\nIf chosen as answer, these tags will be applied onto the object, together with the tags from the `if`\nNot compatible with multiAnswer.\n\nThis can be used e.g. to erase other keys which indicate the 'not' value:\n```json\n{\n \"if\": \"crossing:marking=rainbow\",\n \"then\": \"This is a rainbow crossing\",\n \"addExtraTags\": [\"not:crossing:marking=\"]\n}\n```", "type": "array", "items": { "type": "string" } }, "searchTerms": { - "description": "If there are many options, the mappings-radiobuttons will be replaced by an element with a searchfunction\n\nSearchterms (per language) allow to easily find an option if there are many options", + "description": "question: If there are many options, what search terms match too?\nIf there are many options, the mappings-radiobuttons will be replaced by an element with a searchfunction\n\nSearchterms (per language) allow to easily find an option if there are many options\ngroup: hidden", "$ref": "#/definitions/Record" }, "priorityIf": { - "description": "If the searchable selector is picked, mappings with this item will have priority and show up even if the others are hidden\nUse this sparingly", + "description": "If the searchable selector is picked, mappings with this item will have priority and show up even if the others are hidden\nUse this sparingly\ngroup: hidden", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -95,7 +97,7 @@ ] }, "#": { - "description": "Used for comments or to disable a validation\n\nignore-image-in-then: normally, a `then`-clause is not allowed to have an `img`-html-element as icons are preferred. In some cases (most notably title-icons), this is allowed", + "description": "Used for comments or to disable a validation\n\ngroup: hidden\nignore-image-in-then: normally, a `then`-clause is not allowed to have an `img`-html-element as icons are preferred. In some cases (most notably title-icons), this is allowed", "type": "string" } }, @@ -105,13 +107,12 @@ ], "definitions": { "TagConfigJson": { - "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation", + "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation\n\ntype: tag", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", "type": "object", "properties": { "or": { @@ -130,8 +131,7 @@ } ] }, - "AndTagConfigJson": { - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", + "{and:TagConfigJson[];}": { "type": "object", "properties": { "and": { @@ -146,8 +146,7 @@ ], "additionalProperties": false }, - "OrTagConfigJson": { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", + "{or:TagConfigJson[];}": { "type": "object", "properties": { "or": { @@ -234,48 +233,101 @@ ], "additionalProperties": false }, + "MinimalTagRenderingConfigJson": { + "description": "Mostly used for lineRendering and pointRendering", + "type": "object", + "properties": { + "render": { + "description": "question: What value should be rendered?\n\nThis piece of text will be shown in the infobox.\nNote that \"&LBRACEkey&RBRACE\"-parts are substituted by the corresponding values of the element.\n\nThis value will be used if there is no mapping which matches (or there are no matches)\nNote that this is a HTML-interpreted value, so you can add links as e.g. '<a href='{website}'>{website}</a>' or include images such as `This is of type A <br><img src='typeA-icon.svg' />`", + "type": "string" + }, + "mappings": { + "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", + "type": "array", + "items": { + "type": "object", + "properties": { + "if": { + "$ref": "#/definitions/TagConfigJson", + "description": "question: When should this single mapping match?\n\nIf this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}" + }, + "then": { + "description": "question: What text should be shown?\n\nIf the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option", + "type": "string" + } + }, + "required": [ + "if", + "then" + ] + } + } + }, + "additionalProperties": false + }, + "IconConfigJson": { + "type": "object", + "properties": { + "icon": { + "description": "question: What icon should be used?\ntype: icon\nsuggestions: return [\"pin\",\"square\",\"circle\",\"checkmark\",\"clock\",\"close\",\"crosshair\",\"help\",\"home\",\"invalid\",\"location\",\"location_empty\",\"location_locked\",\"note\",\"resolved\",\"ring\",\"scissors\",\"teardrop\",\"teardrop_with_hole_green\",\"triangle\"].map(i => ({if: \"value=\"+i, then: i, icon: i}))", + "anyOf": [ + { + "$ref": "#/definitions/MinimalTagRenderingConfigJson" + }, + { + "type": "object", + "properties": { + "builtin": { + "type": "string" + }, + "override": {} + }, + "required": [ + "builtin", + "override" + ] + }, + { + "type": "string" + } + ] + }, + "color": { + "description": "question: What colour should the icon be?\nThis will only work for the default icons such as `pin`,`circle`,...\ntype: color", + "anyOf": [ + { + "$ref": "#/definitions/MinimalTagRenderingConfigJson" + }, + { + "type": "object", + "properties": { + "builtin": { + "type": "string" + }, + "override": {} + }, + "required": [ + "builtin", + "override" + ] + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "icon" + ], + "additionalProperties": false + }, "TagRenderingConfigJson": { "description": "A TagRenderingConfigJson is a single piece of code which converts one ore more tags into a HTML-snippet.\nFor an _editable_ tagRendering, use 'QuestionableTagRenderingConfigJson' instead, which extends this one", "type": "object", "properties": { - "id": { - "description": "The id of the tagrendering, should be an unique string.\nUsed to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise.\n\nUse 'questions' to trigger the question box of this group (if a group is defined)", - "type": "string" - }, - "labels": { - "description": "A list of labels. These are strings that are used for various purposes, e.g. to filter them away", - "type": "array", - "items": { - "type": "string" - } - }, - "classes": { - "description": "A list of css-classes to apply to the entire tagRendering if the answer is known (not applied on the question).\nThis is only for advanced users", - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "string" - } - ] - }, - "description": { - "description": "A human-readable text explaining what this tagRendering does", - "anyOf": [ - { - "$ref": "#/definitions/Record" - }, - { - "type": "string" - } - ] - }, "render": { - "description": "Renders this value. Note that \"{key}\"-parts are substituted by the corresponding values of the element.\nIf neither 'textFieldQuestion' nor 'mappings' are defined, this text is simply shown as default value.\n\nNote 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
`\ntype: rendered", + "description": "question: What text should be rendered?\n\nThis piece of text will be shown in the infobox.\nIn this text, values within braces (such as {braced(key)}) are replaced by the corresponding `value` in the object.\nFor example, if the object contains tags `amenity=school; name=Windy Hill School`, the render string `This school is named {name}` will be shown to the user as `This school is named Windy Hill School`\n\nThis text will be shown if:\n- there is no mapping which matches (or there are no matches)\n- no question, no mappings and no 'freeform' is set\n\nNote that this is a HTML-interpreted value, so you can add links as e.g. '<a href='{website}'>{website}</a>' or include images such as `This is of type A <br><img src='typeA-icon.svg' />`\ntype: rendered\nifunset: no text is rendered if no predefined options match", "anyOf": [ { "$ref": "#/definitions/Record" @@ -311,16 +363,38 @@ } ] }, - "condition": { - "description": "Only show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", + "icon": { + "description": "question: what icon should be shown next to the 'render' value?\nAn icon shown next to the rendering; typically shown pretty small\nThis is only shown next to the \"render\" value\nType: icon\nifunset: do not show an icon next to the \"render\"-value", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "type": "object", + "properties": { + "path": { + "description": "The path to the icon\nType: icon", + "type": "string" + }, + "class": { + "description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-', so defining your own in combination with a custom CSS is possible (but discouraged)", + "type": "string" + } + }, + "required": [ + "path" + ] }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "type": "string" + } + ] + }, + "condition": { + "description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or ask the question if unkown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", + "anyOf": [ + { + "$ref": "#/definitions/{and:TagConfigJson[];}" + }, + { + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -328,15 +402,13 @@ ] }, "metacondition": { - "description": "If set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", + "description": "question: When should this item be shown (including special conditions)?\ntype: tag\n\nIf set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -344,17 +416,14 @@ ] }, "freeform": { - "description": "Allow freeform text input from the user", + "description": "question: Should a freeform text field be shown?\nAllow freeform text input from the user\nifunset: Do not add a freeform text field", "type": "object", "properties": { "key": { - "description": "If this key is present, then 'render' is used to display the value.\nIf this is undefined, the rendering is _always_ shown", + "description": "What attribute should be filled out\nIf this key is present in the feature, then 'render' is used to display the value.\nIf this is undefined, the rendering is _always_ shown", "type": "string" } - }, - "required": [ - "key" - ] + } }, "mappings": { "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", @@ -364,10 +433,10 @@ "properties": { "if": { "$ref": "#/definitions/TagConfigJson", - "description": "If this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}" + "description": "question: When should this single mapping match?\n\nIf this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}" }, "then": { - "description": "If the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option\nType: rendered", + "description": "question: What text should be shown?\n\nIf the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option\nType: rendered", "anyOf": [ { "$ref": "#/definitions/Record" @@ -378,7 +447,7 @@ ] }, "icon": { - "description": "An icon supporting this mapping; typically shown pretty small\nType: icon", + "description": "question: What icon should be added to this mapping?\nifunset: Do not show an extra icon next to the render value\n\nAn icon supporting this mapping; typically shown pretty small.\nThis can be used to show a 'phone'-icon next to the phone number\ninline: {icon}\nType: icon", "anyOf": [ { "type": "object", @@ -407,6 +476,21 @@ "then" ] } + }, + "description": { + "description": "A human-readable text explaining what this tagRendering does.\nMostly used for the shared tagrenderings", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] + }, + "classes": { + "description": "question: What css-classes should be applied to showing this attribute?\n\nA list of css-classes to apply to the entire tagRendering.\nThese classes are applied in 'answer'-mode, not in question mode\nThis is only for advanced users.\n\nValues are split on ` ` (space)", + "type": "string" } }, "additionalProperties": false diff --git a/Docs/Schemas/MappingConfigJsonJSC.ts b/Docs/Schemas/MappingConfigJsonJSC.ts index b53c9837b..19b9c1a78 100644 --- a/Docs/Schemas/MappingConfigJsonJSC.ts +++ b/Docs/Schemas/MappingConfigJsonJSC.ts @@ -3,13 +3,21 @@ export default { "properties": { "if": { "$ref": "#/definitions/TagConfigJson", - "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation" + "description": "question: What tags should be matched to show this option?\n\nIf in 'question'-mode and the contributor selects this option, these tags will be applied to the object" }, "then": { - "description": "Shown if the 'if is fulfilled\nType: rendered" + "description": "Question: What corresponding text should be shown?\nShown if the `if` is fulfilled\nType: rendered", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] }, "icon": { - "description": "An extra icon supporting the choice\nType: icon", + "description": "question: What icon should be shown next to this mapping?\n\nThis icon will only be shown if the value is known, it is not displayed in the options (but might be in the future)\n\nifunset: Show no icon\nType: icon", "anyOf": [ { "type": "object", @@ -33,15 +41,13 @@ export default { ] }, "hideInAnswer": { - "description": "In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n\n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}", + "description": "question: Under what circumstances should this mapping be hidden from the possibilities a contributor can pick?\niftrue: Never show this mapping as option to pick\nifunset: Always show this mapping as option to pick\ntype: tag\n\nIn some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n\n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": [ @@ -52,15 +58,13 @@ export default { ] }, "ifnot": { - "description": "Only applicable if 'multiAnswer' is set.\nThis is for situations such as:\n`accepts:coins=no` where one can select all the possible payment methods. However, we want to make explicit that some options _were not_ selected.\nThis can be done with `ifnot`\nNote that we can not explicitly render this negative case to the user, we cannot show `does _not_ accept coins`.\nIf this is important to your usecase, consider using multiple radiobutton-fields without `multiAnswer`", + "description": "question: What tags should be applied if this mapping is _not_ chosen?\n\nOnly applicable if 'multiAnswer' is set.\nThis is for situations such as:\n`accepts:coins=no` where one can select all the possible payment methods. However, we want to make explicit that some options _were not_ selected.\nThis can be done with `ifnot`\nNote that we can not explicitly render this negative case to the user, we cannot show `does _not_ accept coins`.\nIf this is important to your usecase, consider using multiple radiobutton-fields without `multiAnswer`\n\nifunset: Do not apply a tag if a different mapping is chosen.", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -68,26 +72,24 @@ export default { ] }, "addExtraTags": { - "description": "If chosen as answer, these tags will be applied as well onto the object.\nNot compatible with multiAnswer.\n\nThis can be used e.g. to erase other keys which indicate the 'not' value:\n```json\n{\n \"if\": \"crossing:marking=rainbow\",\n \"then\": \"This is a rainbow crossing\",\n \"addExtraTags\": \"not:crossing:marking=\"\n}\n```", + "description": "question: What extra tags should be added to the object if this object is chosen?\ntype: simple_tag\n\nIf chosen as answer, these tags will be applied onto the object, together with the tags from the `if`\nNot compatible with multiAnswer.\n\nThis can be used e.g. to erase other keys which indicate the 'not' value:\n```json\n{\n \"if\": \"crossing:marking=rainbow\",\n \"then\": \"This is a rainbow crossing\",\n \"addExtraTags\": [\"not:crossing:marking=\"]\n}\n```", "type": "array", "items": { "type": "string" } }, "searchTerms": { - "description": "If there are many options, the mappings-radiobuttons will be replaced by an element with a searchfunction\n\nSearchterms (per language) allow to easily find an option if there are many options", + "description": "question: If there are many options, what search terms match too?\nIf there are many options, the mappings-radiobuttons will be replaced by an element with a searchfunction\n\nSearchterms (per language) allow to easily find an option if there are many options\ngroup: hidden", "$ref": "#/definitions/Record" }, "priorityIf": { - "description": "If the searchable selector is picked, mappings with this item will have priority and show up even if the others are hidden\nUse this sparingly", + "description": "If the searchable selector is picked, mappings with this item will have priority and show up even if the others are hidden\nUse this sparingly\ngroup: hidden", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -95,7 +97,7 @@ export default { ] }, "#": { - "description": "Used for comments or to disable a validation\n\nignore-image-in-then: normally, a `then`-clause is not allowed to have an `img`-html-element as icons are preferred. In some cases (most notably title-icons), this is allowed", + "description": "Used for comments or to disable a validation\n\ngroup: hidden\nignore-image-in-then: normally, a `then`-clause is not allowed to have an `img`-html-element as icons are preferred. In some cases (most notably title-icons), this is allowed", "type": "string" } }, @@ -105,13 +107,12 @@ export default { ], "definitions": { "TagConfigJson": { - "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation", + "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation\n\ntype: tag", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", "type": "object", "properties": { "or": { @@ -130,8 +131,7 @@ export default { } ] }, - "AndTagConfigJson": { - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", + "{and:TagConfigJson[];}": { "type": "object", "properties": { "and": { @@ -145,8 +145,7 @@ export default { "and" ] }, - "OrTagConfigJson": { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", + "{or:TagConfigJson[];}": { "type": "object", "properties": { "or": { @@ -229,48 +228,99 @@ export default { "canonicalDenomination" ] }, + "MinimalTagRenderingConfigJson": { + "description": "Mostly used for lineRendering and pointRendering", + "type": "object", + "properties": { + "render": { + "description": "question: What value should be rendered?\n\nThis piece of text will be shown in the infobox.\nNote that \"&LBRACEkey&RBRACE\"-parts are substituted by the corresponding values of the element.\n\nThis value will be used if there is no mapping which matches (or there are no matches)\nNote that this is a HTML-interpreted value, so you can add links as e.g. '<a href='{website}'>{website}</a>' or include images such as `This is of type A <br><img src='typeA-icon.svg' />`", + "type": "string" + }, + "mappings": { + "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", + "type": "array", + "items": { + "type": "object", + "properties": { + "if": { + "$ref": "#/definitions/TagConfigJson", + "description": "question: When should this single mapping match?\n\nIf this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}" + }, + "then": { + "description": "question: What text should be shown?\n\nIf the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option", + "type": "string" + } + }, + "required": [ + "if", + "then" + ] + } + } + } + }, + "IconConfigJson": { + "type": "object", + "properties": { + "icon": { + "description": "question: What icon should be used?\ntype: icon\nsuggestions: return [\"pin\",\"square\",\"circle\",\"checkmark\",\"clock\",\"close\",\"crosshair\",\"help\",\"home\",\"invalid\",\"location\",\"location_empty\",\"location_locked\",\"note\",\"resolved\",\"ring\",\"scissors\",\"teardrop\",\"teardrop_with_hole_green\",\"triangle\"].map(i => ({if: \"value=\"+i, then: i, icon: i}))", + "anyOf": [ + { + "$ref": "#/definitions/MinimalTagRenderingConfigJson" + }, + { + "type": "object", + "properties": { + "builtin": { + "type": "string" + }, + "override": {} + }, + "required": [ + "builtin", + "override" + ] + }, + { + "type": "string" + } + ] + }, + "color": { + "description": "question: What colour should the icon be?\nThis will only work for the default icons such as `pin`,`circle`,...\ntype: color", + "anyOf": [ + { + "$ref": "#/definitions/MinimalTagRenderingConfigJson" + }, + { + "type": "object", + "properties": { + "builtin": { + "type": "string" + }, + "override": {} + }, + "required": [ + "builtin", + "override" + ] + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "icon" + ] + }, "TagRenderingConfigJson": { "description": "A TagRenderingConfigJson is a single piece of code which converts one ore more tags into a HTML-snippet.\nFor an _editable_ tagRendering, use 'QuestionableTagRenderingConfigJson' instead, which extends this one", "type": "object", "properties": { - "id": { - "description": "The id of the tagrendering, should be an unique string.\nUsed to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise.\n\nUse 'questions' to trigger the question box of this group (if a group is defined)", - "type": "string" - }, - "labels": { - "description": "A list of labels. These are strings that are used for various purposes, e.g. to filter them away", - "type": "array", - "items": { - "type": "string" - } - }, - "classes": { - "description": "A list of css-classes to apply to the entire tagRendering if the answer is known (not applied on the question).\nThis is only for advanced users", - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "string" - } - ] - }, - "description": { - "description": "A human-readable text explaining what this tagRendering does", - "anyOf": [ - { - "$ref": "#/definitions/Record" - }, - { - "type": "string" - } - ] - }, "render": { - "description": "Renders this value. Note that \"{key}\"-parts are substituted by the corresponding values of the element.\nIf neither 'textFieldQuestion' nor 'mappings' are defined, this text is simply shown as default value.\n\nNote 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
`\ntype: rendered", + "description": "question: What text should be rendered?\n\nThis piece of text will be shown in the infobox.\nIn this text, values within braces (such as {braced(key)}) are replaced by the corresponding `value` in the object.\nFor example, if the object contains tags `amenity=school; name=Windy Hill School`, the render string `This school is named {name}` will be shown to the user as `This school is named Windy Hill School`\n\nThis text will be shown if:\n- there is no mapping which matches (or there are no matches)\n- no question, no mappings and no 'freeform' is set\n\nNote that this is a HTML-interpreted value, so you can add links as e.g. '<a href='{website}'>{website}</a>' or include images such as `This is of type A <br><img src='typeA-icon.svg' />`\ntype: rendered\nifunset: no text is rendered if no predefined options match", "anyOf": [ { "$ref": "#/definitions/Record" @@ -306,16 +356,38 @@ export default { } ] }, - "condition": { - "description": "Only show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", + "icon": { + "description": "question: what icon should be shown next to the 'render' value?\nAn icon shown next to the rendering; typically shown pretty small\nThis is only shown next to the \"render\" value\nType: icon\nifunset: do not show an icon next to the \"render\"-value", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "type": "object", + "properties": { + "path": { + "description": "The path to the icon\nType: icon", + "type": "string" + }, + "class": { + "description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-', so defining your own in combination with a custom CSS is possible (but discouraged)", + "type": "string" + } + }, + "required": [ + "path" + ] }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "type": "string" + } + ] + }, + "condition": { + "description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or ask the question if unkown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", + "anyOf": [ + { + "$ref": "#/definitions/{and:TagConfigJson[];}" + }, + { + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -323,15 +395,13 @@ export default { ] }, "metacondition": { - "description": "If set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", + "description": "question: When should this item be shown (including special conditions)?\ntype: tag\n\nIf set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -339,17 +409,14 @@ export default { ] }, "freeform": { - "description": "Allow freeform text input from the user", + "description": "question: Should a freeform text field be shown?\nAllow freeform text input from the user\nifunset: Do not add a freeform text field", "type": "object", "properties": { "key": { - "description": "If this key is present, then 'render' is used to display the value.\nIf this is undefined, the rendering is _always_ shown", + "description": "What attribute should be filled out\nIf this key is present in the feature, then 'render' is used to display the value.\nIf this is undefined, the rendering is _always_ shown", "type": "string" } - }, - "required": [ - "key" - ] + } }, "mappings": { "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", @@ -359,10 +426,10 @@ export default { "properties": { "if": { "$ref": "#/definitions/TagConfigJson", - "description": "If this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}" + "description": "question: When should this single mapping match?\n\nIf this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}" }, "then": { - "description": "If the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option\nType: rendered", + "description": "question: What text should be shown?\n\nIf the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option\nType: rendered", "anyOf": [ { "$ref": "#/definitions/Record" @@ -373,7 +440,7 @@ export default { ] }, "icon": { - "description": "An icon supporting this mapping; typically shown pretty small\nType: icon", + "description": "question: What icon should be added to this mapping?\nifunset: Do not show an extra icon next to the render value\n\nAn icon supporting this mapping; typically shown pretty small.\nThis can be used to show a 'phone'-icon next to the phone number\ninline: {icon}\nType: icon", "anyOf": [ { "type": "object", @@ -402,6 +469,21 @@ export default { "then" ] } + }, + "description": { + "description": "A human-readable text explaining what this tagRendering does.\nMostly used for the shared tagrenderings", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] + }, + "classes": { + "description": "question: What css-classes should be applied to showing this attribute?\n\nA list of css-classes to apply to the entire tagRendering.\nThese classes are applied in 'answer'-mode, not in question mode\nThis is only for advanced users.\n\nValues are split on ` ` (space)", + "type": "string" } } }, diff --git a/Docs/Schemas/MinimalTagRenderingConfigJson.schema.json b/Docs/Schemas/MinimalTagRenderingConfigJson.schema.json new file mode 100644 index 000000000..52e2f5ac3 --- /dev/null +++ b/Docs/Schemas/MinimalTagRenderingConfigJson.schema.json @@ -0,0 +1,94 @@ +{ + "description": "Mostly used for lineRendering and pointRendering", + "type": "object", + "properties": { + "render": { + "description": "question: What value should be rendered?\n\nThis piece of text will be shown in the infobox.\nNote that \"&LBRACEkey&RBRACE\"-parts are substituted by the corresponding values of the element.\n\nThis value will be used if there is no mapping which matches (or there are no matches)\nNote that this is a HTML-interpreted value, so you can add links as e.g. '<a href='{website}'>{website}</a>' or include images such as `This is of type A <br><img src='typeA-icon.svg' />`", + "type": "string" + }, + "mappings": { + "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", + "type": "array", + "items": { + "type": "object", + "properties": { + "if": { + "$ref": "#/definitions/TagConfigJson", + "description": "question: When should this single mapping match?\n\nIf this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}" + }, + "then": { + "description": "question: What text should be shown?\n\nIf the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option", + "type": "string" + } + }, + "required": [ + "if", + "then" + ] + } + } + }, + "definitions": { + "TagConfigJson": { + "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation\n\ntype: tag", + "anyOf": [ + { + "$ref": "#/definitions/{and:TagConfigJson[];}" + }, + { + "type": "object", + "properties": { + "or": { + "type": "array", + "items": { + "$ref": "#/definitions/TagConfigJson" + } + } + }, + "required": [ + "or" + ] + }, + { + "type": "string" + } + ] + }, + "{and:TagConfigJson[];}": { + "type": "object", + "properties": { + "and": { + "type": "array", + "items": { + "$ref": "#/definitions/TagConfigJson" + } + } + }, + "required": [ + "and" + ], + "additionalProperties": false + }, + "{or:TagConfigJson[];}": { + "type": "object", + "properties": { + "or": { + "type": "array", + "items": { + "$ref": "#/definitions/TagConfigJson" + } + } + }, + "required": [ + "or" + ], + "additionalProperties": false + }, + "Record": { + "type": "object", + "additionalProperties": false + } + }, + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false +} \ No newline at end of file diff --git a/Docs/Schemas/MinimalTagRenderingConfigJsonJSC.ts b/Docs/Schemas/MinimalTagRenderingConfigJsonJSC.ts new file mode 100644 index 000000000..3a2d59275 --- /dev/null +++ b/Docs/Schemas/MinimalTagRenderingConfigJsonJSC.ts @@ -0,0 +1,90 @@ +export default { + "description": "Mostly used for lineRendering and pointRendering", + "type": "object", + "properties": { + "render": { + "description": "question: What value should be rendered?\n\nThis piece of text will be shown in the infobox.\nNote that \"&LBRACEkey&RBRACE\"-parts are substituted by the corresponding values of the element.\n\nThis value will be used if there is no mapping which matches (or there are no matches)\nNote that this is a HTML-interpreted value, so you can add links as e.g. '<a href='{website}'>{website}</a>' or include images such as `This is of type A <br><img src='typeA-icon.svg' />`", + "type": "string" + }, + "mappings": { + "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", + "type": "array", + "items": { + "type": "object", + "properties": { + "if": { + "$ref": "#/definitions/TagConfigJson", + "description": "question: When should this single mapping match?\n\nIf this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}" + }, + "then": { + "description": "question: What text should be shown?\n\nIf the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option", + "type": "string" + } + }, + "required": [ + "if", + "then" + ] + } + } + }, + "definitions": { + "TagConfigJson": { + "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation\n\ntype: tag", + "anyOf": [ + { + "$ref": "#/definitions/{and:TagConfigJson[];}" + }, + { + "type": "object", + "properties": { + "or": { + "type": "array", + "items": { + "$ref": "#/definitions/TagConfigJson" + } + } + }, + "required": [ + "or" + ] + }, + { + "type": "string" + } + ] + }, + "{and:TagConfigJson[];}": { + "type": "object", + "properties": { + "and": { + "type": "array", + "items": { + "$ref": "#/definitions/TagConfigJson" + } + } + }, + "required": [ + "and" + ] + }, + "{or:TagConfigJson[];}": { + "type": "object", + "properties": { + "or": { + "type": "array", + "items": { + "$ref": "#/definitions/TagConfigJson" + } + } + }, + "required": [ + "or" + ] + }, + "Record": { + "type": "object" + } + }, + "$schema": "http://json-schema.org/draft-07/schema#" +} \ No newline at end of file diff --git a/Docs/Schemas/MoveConfigJson.schema.json b/Docs/Schemas/MoveConfigJson.schema.json index 33c89a5ba..1ef6e876e 100644 --- a/Docs/Schemas/MoveConfigJson.schema.json +++ b/Docs/Schemas/MoveConfigJson.schema.json @@ -2,23 +2,22 @@ "type": "object", "properties": { "enableImproveAccuracy": { - "description": "One default reason to move a point is to improve accuracy.\nSet to false to disable this reason", + "description": "question: Should moving this type of point to improve the accuracy be allowed?\niftrue: This point can be moved to improve the accuracy\nifunset: (default) This point can be moved to improve the accuracy\niffalse: This point cannot be moved to improve the accuracy", "type": "boolean" }, "enableRelocation": { - "description": "One default reason to move a point is because it has relocated\nSet to false to disable this reason", + "description": "question: Should moving this type of point due to a relocation be allowed?\n\nThis will erase the attributes `addr:street`, `addr:housenumber`, `addr:city` and `addr:postcode`\n\niftrue: This type of point can be moved due to a relocation (and will remove address information when this is done)\nifunset: (default) This type of point can be moved due to a relocation (and will remove address information when this is done)\niffalse: This type of point cannot be moved due to a relocation", "type": "boolean" } }, "definitions": { "TagConfigJson": { - "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation", + "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation\n\ntype: tag", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", "type": "object", "properties": { "or": { @@ -37,8 +36,7 @@ } ] }, - "AndTagConfigJson": { - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", + "{and:TagConfigJson[];}": { "type": "object", "properties": { "and": { @@ -53,8 +51,7 @@ ], "additionalProperties": false }, - "OrTagConfigJson": { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", + "{or:TagConfigJson[];}": { "type": "object", "properties": { "or": { diff --git a/Docs/Schemas/MoveConfigJsonJSC.ts b/Docs/Schemas/MoveConfigJsonJSC.ts index 2d2565825..c25c8d051 100644 --- a/Docs/Schemas/MoveConfigJsonJSC.ts +++ b/Docs/Schemas/MoveConfigJsonJSC.ts @@ -2,23 +2,22 @@ export default { "type": "object", "properties": { "enableImproveAccuracy": { - "description": "One default reason to move a point is to improve accuracy.\nSet to false to disable this reason", + "description": "question: Should moving this type of point to improve the accuracy be allowed?\niftrue: This point can be moved to improve the accuracy\nifunset: (default) This point can be moved to improve the accuracy\niffalse: This point cannot be moved to improve the accuracy", "type": "boolean" }, "enableRelocation": { - "description": "One default reason to move a point is because it has relocated\nSet to false to disable this reason", + "description": "question: Should moving this type of point due to a relocation be allowed?\n\nThis will erase the attributes `addr:street`, `addr:housenumber`, `addr:city` and `addr:postcode`\n\niftrue: This type of point can be moved due to a relocation (and will remove address information when this is done)\nifunset: (default) This type of point can be moved due to a relocation (and will remove address information when this is done)\niffalse: This type of point cannot be moved due to a relocation", "type": "boolean" } }, "definitions": { "TagConfigJson": { - "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation", + "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation\n\ntype: tag", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", "type": "object", "properties": { "or": { @@ -37,8 +36,7 @@ export default { } ] }, - "AndTagConfigJson": { - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", + "{and:TagConfigJson[];}": { "type": "object", "properties": { "and": { @@ -52,8 +50,7 @@ export default { "and" ] }, - "OrTagConfigJson": { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", + "{or:TagConfigJson[];}": { "type": "object", "properties": { "or": { diff --git a/Docs/Schemas/OrTagConfigJson.schema.json b/Docs/Schemas/OrTagConfigJson.schema.json deleted file mode 100644 index 338fb9524..000000000 --- a/Docs/Schemas/OrTagConfigJson.schema.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", - "definitions": { - "TagConfigJson": { - "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation", - "anyOf": [ - { - "$ref": "#/definitions/AndTagConfigJson" - }, - { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", - "type": "object", - "properties": { - "or": { - "type": "array", - "items": { - "$ref": "#/definitions/TagConfigJson" - } - } - }, - "required": [ - "or" - ] - }, - { - "type": "string" - } - ] - }, - "AndTagConfigJson": { - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", - "type": "object", - "properties": { - "and": { - "type": "array", - "items": { - "$ref": "#/definitions/TagConfigJson" - } - } - }, - "required": [ - "and" - ], - "additionalProperties": false - }, - "OrTagConfigJson": { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", - "type": "object", - "properties": { - "or": { - "type": "array", - "items": { - "$ref": "#/definitions/TagConfigJson" - } - } - }, - "required": [ - "or" - ], - "additionalProperties": false - } - }, - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false -} \ No newline at end of file diff --git a/Docs/Schemas/OrTagConfigJsonJSC.ts b/Docs/Schemas/OrTagConfigJsonJSC.ts deleted file mode 100644 index c0aa3ec56..000000000 --- a/Docs/Schemas/OrTagConfigJsonJSC.ts +++ /dev/null @@ -1,63 +0,0 @@ -export default { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", - "definitions": { - "TagConfigJson": { - "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation", - "anyOf": [ - { - "$ref": "#/definitions/AndTagConfigJson" - }, - { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", - "type": "object", - "properties": { - "or": { - "type": "array", - "items": { - "$ref": "#/definitions/TagConfigJson" - } - } - }, - "required": [ - "or" - ] - }, - { - "type": "string" - } - ] - }, - "AndTagConfigJson": { - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", - "type": "object", - "properties": { - "and": { - "type": "array", - "items": { - "$ref": "#/definitions/TagConfigJson" - } - } - }, - "required": [ - "and" - ] - }, - "OrTagConfigJson": { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", - "type": "object", - "properties": { - "or": { - "type": "array", - "items": { - "$ref": "#/definitions/TagConfigJson" - } - } - }, - "required": [ - "or" - ] - } - }, - "$schema": "http://json-schema.org/draft-07/schema#" -} \ No newline at end of file diff --git a/Docs/Schemas/PointRenderingConfigJson.schema.json b/Docs/Schemas/PointRenderingConfigJson.schema.json index a8c0069fd..fd6b8db3d 100644 --- a/Docs/Schemas/PointRenderingConfigJson.schema.json +++ b/Docs/Schemas/PointRenderingConfigJson.schema.json @@ -3,38 +3,34 @@ "type": "object", "properties": { "location": { - "description": "All the locations that this point should be rendered at.\nPossible values are:\n- `point`: only renders points at their location\n- `centroid`: show a symbol at the centerpoint of a (multi)Linestring and (multi)polygon. Points will _not_ be rendered with this\n- `projected_centerpoint`: Only on (multi)linestrings: calculate the centerpoint and snap it to the way\n- `start` and `end`: only on linestrings: add a point to the first/last coordinate of the LineString", + "description": "question: At what location should this icon be shown?\nmultianswer: true\nsuggestions: return [{if: \"value=point\",then: \"Show an icon for point (node) objects\"},{if: \"value=centroid\",then: \"Show an icon for line or polygon (way) objects at their centroid location\"}, {if: \"value=start\",then: \"Show an icon for line (way) objects at the start\"},{if: \"value=end\",then: \"Show an icon for line (way) object at the end\"},{if: \"value=projected_centerpoint\",then: \"Show an icon for line (way) object near the centroid location, but moved onto the line\"}]", "type": "array", "items": { "type": "string" } }, - "icon": { - "description": "The icon for an element.\nNote that this also doubles as the icon for this layer (rendered with the overpass-tags) ánd the icon in the presets.\n\nThe result of the icon is rendered as follows:\nthe resulting string is interpreted as a _list_ of items, separated by \";\". The bottommost layer is the first layer.\nAs a result, on could use a generic pin, then overlay it with a specific icon.\nTo make things even more practical, one can use all SVG's from the folder \"assets/svg\" and _substitute the color_ in it.\nE.g. to draw a red pin, use \"pin:#f00\", to have a green circle with your icon on top, use `circle:#0f0;`\n\nType: icon", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] + "marker": { + "description": "The marker for an element.\nNote that this also defines the icon for this layer (rendered with the overpass-tags) and the icon in the presets.\n\nThe result of the icon is rendered as follows:\n- The first icon is rendered on the map\n- The second entry is overlayed on top of it\n- ...\n\nAs a result, on could use a generic icon (`pin`, `circle`, `square`) with a color, then overlay it with a specific icon.", + "type": "array", + "items": { + "$ref": "#/definitions/IconConfigJson" + } }, "iconBadges": { - "description": "A list of extra badges to show next to the icon as small badge\nThey will be added as a 25% height icon at the bottom right of the icon, with all the badges in a flex layout.\n\nNote: strings are interpreted as icons, so layering and substituting is supported. You can use `circle:white;./my_icon.svg` to add a background circle", + "description": "A list of extra badges to show next to the icon as small badge\nThey will be added as a 25% height icon at the bottom right of the icon, with all the badges in a flex layout.\n\nNote: strings are interpreted as icons, so layering and substituting is supported. You can use `circle:white;./my_icon.svg` to add a background circle\ngroup: hidden", "type": "array", "items": { "type": "object", "properties": { "if": { "$ref": "#/definitions/TagConfigJson", - "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation" + "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation\n\ntype: tag" }, "then": { "description": "Badge to show\nType: icon", "anyOf": [ { - "$ref": "#/definitions/TagRenderingConfigJson" + "$ref": "#/definitions/MinimalTagRenderingConfigJson" }, { "type": "string" @@ -49,7 +45,18 @@ } }, "iconSize": { - "description": "A string containing \"width,height\" or \"width,height,anchorpoint\" where anchorpoint is any of 'center', 'top', 'bottom', 'left', 'right', 'bottomleft','topright', ...\nDefault is '40,40,center'", + "description": "question: What size should the marker be on the map?\nA string containing \",\" in pixels\nifunset: Use the default size (40,40 px)", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "anchor": { + "description": "question: What is the anchorpoint of the icon?\n\nThis matches the geographical point with a location on the icon.\n\nifunset: Use MapComplete-default (center)\nsuggestions: return [{if: \"value=center\", then: \"Place the center of the icon on the geographical location\"},{if: \"value=top\", then: \"Place the top of the icon on the geographical location\"},{if: \"value=bottom\", then: \"Place the bottom of the icon on the geographical location\"},{if: \"value=left\", then: \"Place the left of the icon on the geographical location\"},{if: \"value=right\", then: \"Place the right of the icon on the geographical location\"}]", "anyOf": [ { "$ref": "#/definitions/TagRenderingConfigJson" @@ -60,7 +67,7 @@ ] }, "rotation": { - "description": "The rotation of an icon, useful for e.g. directions.\nUsage: 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)``", + "description": "question: What rotation should be applied on the icon?\nThis is mostly useful for items that face a specific direction, such as surveillance cameras\nThis is interpreted as css property for 'rotate', thus has to end with 'deg', e.g. `90deg`, `{direction}deg`, `calc(90deg - {camera:direction}deg)``\nifunset: Do not rotate", "anyOf": [ { "$ref": "#/definitions/TagRenderingConfigJson" @@ -71,29 +78,7 @@ ] }, "label": { - "description": "A HTML-fragment that is shown below the icon, for example:\n
{name}
\n\nIf the icon is undefined, then the label is shown in the center of the feature.\nNote that, if the wayhandling hides the icon then no label is shown as well.", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - }, - "css": { - "description": "A snippet of css code which is applied onto the container of the entire marker", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - }, - "cssClasses": { - "description": "A snippet of css-classes which are applied onto the container of the entire marker. They can be space-separated", + "description": "question: What label should be shown beneath the marker?\nFor example: `<div style=\"background: white\">{name}</div>`\n\nIf the icon is undefined, then the label is shown in the center of the feature.\ntypes: Dynamic value based on the attributes ; string\ninline: Always show label {value} beneath the marker\nifunset: Do not show a label beneath the marker", "anyOf": [ { "$ref": "#/definitions/TagRenderingConfigJson" @@ -104,7 +89,7 @@ ] }, "labelCss": { - "description": "Css that is applied onto the label", + "description": "question: What CSS should be applied to the label?\nYou can set the css-properties here, e.g. `background: red; font-size: 12px; `\ninline: Apply CSS-style {value} to the label\ntypes: Dynamic value ; string\nifunset: Do not apply extra CSS-labels to the label\ngroup: expert", "anyOf": [ { "$ref": "#/definitions/TagRenderingConfigJson" @@ -115,7 +100,29 @@ ] }, "labelCssClasses": { - "description": "Css classes that are applied onto the label; can be space-separated", + "description": "question: Which CSS-classes should be applied to the label?\n\nThe classes should be separated by a space (` `)\nYou can use most Tailwind-css classes, see https://tailwindcss.com/ for more information\nFor example: `center bg-gray-500 mx-2 my-1 rounded-full`\ninline: Apply CSS-classes {value} to the label\ntypes: Dynamic value ; string\nifunset: Do not apply extra CSS-classes to the label\nsuggestions: return [{if: \"value=bg-white rounded px-2\", then: \"Draw on a white background\"}]", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "css": { + "description": "question: What CSS should be applied to the entire marker?\nYou can set the css-properties here, e.g. `background: red; font-size: 12px; `\nThis will be applied to the _container_ containing both the marker and the label\ninline: Apply CSS-style {value} to the _entire marker_\ntypes: Dynamic value ; string\nifunset: Do not apply extra CSS element to the entire marker\ngroup: expert", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "cssClasses": { + "description": "question: Which CSS-classes should be applied to the entire marker?\nThis will be applied to the _container_ containing both the marker and the label\n\nThe classes should be separated by a space (` `)\nYou can use most Tailwind-css classes, see https://tailwindcss.com/ for more information\nFor example: `center bg-gray-500 mx-2 my-1 rounded-full`\ninline: Apply CSS-classes {value} to the entire container\nifunset: Do not apply extra CSS-classes to the label\ntypes: Dynamic value ; string\nifunset: Do not apply extra CSS-classes to the entire marker\ngroup: expert", "anyOf": [ { "$ref": "#/definitions/TagRenderingConfigJson" @@ -126,7 +133,7 @@ ] }, "pitchAlignment": { - "description": "If the map is pitched, the marker will stay parallel to the screen.\nSet to 'map' if you want to put it flattened on the map", + "description": "question: If the map is pitched, should the icon stay parallel to the screen or to the groundplane?\nsuggestions: return [{if: \"value=canvas\", then: \"The icon will stay upward and not be transformed as if it sticks to the screen\"}, {if: \"value=map\", then: \"The icon will be transformed as if it were painted onto the ground. (Automatically sets rotationAlignment)\"}]\ngroup: expert", "anyOf": [ { "$ref": "#/definitions/TagRenderingConfigJson" @@ -141,7 +148,7 @@ ] }, "rotationAlignment": { - "description": "If the map is rotated, the icon will still point to the north if no rotation was applied", + "description": "question: Should the icon be rotated if the map is rotated?\nifunset: Do not rotate or tilt icons. Always keep the icons straight\nsuggestions: return [{if: \"value=canvas\", then: \"Never rotate the icon\"}, {if: \"value=map\", then: \"If the map is rotated, rotate the icon as well. This gives the impression of an icon that floats perpendicular above the ground.\"}]\ngroup: expert", "anyOf": [ { "$ref": "#/definitions/TagRenderingConfigJson" @@ -161,13 +168,12 @@ ], "definitions": { "TagConfigJson": { - "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation", + "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation\n\ntype: tag", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", "type": "object", "properties": { "or": { @@ -186,8 +192,7 @@ } ] }, - "AndTagConfigJson": { - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", + "{and:TagConfigJson[];}": { "type": "object", "properties": { "and": { @@ -202,8 +207,7 @@ ], "additionalProperties": false }, - "OrTagConfigJson": { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", + "{or:TagConfigJson[];}": { "type": "object", "properties": { "or": { @@ -290,48 +294,101 @@ ], "additionalProperties": false }, + "MinimalTagRenderingConfigJson": { + "description": "Mostly used for lineRendering and pointRendering", + "type": "object", + "properties": { + "render": { + "description": "question: What value should be rendered?\n\nThis piece of text will be shown in the infobox.\nNote that \"&LBRACEkey&RBRACE\"-parts are substituted by the corresponding values of the element.\n\nThis value will be used if there is no mapping which matches (or there are no matches)\nNote that this is a HTML-interpreted value, so you can add links as e.g. '<a href='{website}'>{website}</a>' or include images such as `This is of type A <br><img src='typeA-icon.svg' />`", + "type": "string" + }, + "mappings": { + "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", + "type": "array", + "items": { + "type": "object", + "properties": { + "if": { + "$ref": "#/definitions/TagConfigJson", + "description": "question: When should this single mapping match?\n\nIf this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}" + }, + "then": { + "description": "question: What text should be shown?\n\nIf the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option", + "type": "string" + } + }, + "required": [ + "if", + "then" + ] + } + } + }, + "additionalProperties": false + }, + "IconConfigJson": { + "type": "object", + "properties": { + "icon": { + "description": "question: What icon should be used?\ntype: icon\nsuggestions: return [\"pin\",\"square\",\"circle\",\"checkmark\",\"clock\",\"close\",\"crosshair\",\"help\",\"home\",\"invalid\",\"location\",\"location_empty\",\"location_locked\",\"note\",\"resolved\",\"ring\",\"scissors\",\"teardrop\",\"teardrop_with_hole_green\",\"triangle\"].map(i => ({if: \"value=\"+i, then: i, icon: i}))", + "anyOf": [ + { + "$ref": "#/definitions/MinimalTagRenderingConfigJson" + }, + { + "type": "object", + "properties": { + "builtin": { + "type": "string" + }, + "override": {} + }, + "required": [ + "builtin", + "override" + ] + }, + { + "type": "string" + } + ] + }, + "color": { + "description": "question: What colour should the icon be?\nThis will only work for the default icons such as `pin`,`circle`,...\ntype: color", + "anyOf": [ + { + "$ref": "#/definitions/MinimalTagRenderingConfigJson" + }, + { + "type": "object", + "properties": { + "builtin": { + "type": "string" + }, + "override": {} + }, + "required": [ + "builtin", + "override" + ] + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "icon" + ], + "additionalProperties": false + }, "TagRenderingConfigJson": { "description": "A TagRenderingConfigJson is a single piece of code which converts one ore more tags into a HTML-snippet.\nFor an _editable_ tagRendering, use 'QuestionableTagRenderingConfigJson' instead, which extends this one", "type": "object", "properties": { - "id": { - "description": "The id of the tagrendering, should be an unique string.\nUsed to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise.\n\nUse 'questions' to trigger the question box of this group (if a group is defined)", - "type": "string" - }, - "labels": { - "description": "A list of labels. These are strings that are used for various purposes, e.g. to filter them away", - "type": "array", - "items": { - "type": "string" - } - }, - "classes": { - "description": "A list of css-classes to apply to the entire tagRendering if the answer is known (not applied on the question).\nThis is only for advanced users", - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "string" - } - ] - }, - "description": { - "description": "A human-readable text explaining what this tagRendering does", - "anyOf": [ - { - "$ref": "#/definitions/Record" - }, - { - "type": "string" - } - ] - }, "render": { - "description": "Renders this value. Note that \"{key}\"-parts are substituted by the corresponding values of the element.\nIf neither 'textFieldQuestion' nor 'mappings' are defined, this text is simply shown as default value.\n\nNote 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
`\ntype: rendered", + "description": "question: What text should be rendered?\n\nThis piece of text will be shown in the infobox.\nIn this text, values within braces (such as {braced(key)}) are replaced by the corresponding `value` in the object.\nFor example, if the object contains tags `amenity=school; name=Windy Hill School`, the render string `This school is named {name}` will be shown to the user as `This school is named Windy Hill School`\n\nThis text will be shown if:\n- there is no mapping which matches (or there are no matches)\n- no question, no mappings and no 'freeform' is set\n\nNote that this is a HTML-interpreted value, so you can add links as e.g. '<a href='{website}'>{website}</a>' or include images such as `This is of type A <br><img src='typeA-icon.svg' />`\ntype: rendered\nifunset: no text is rendered if no predefined options match", "anyOf": [ { "$ref": "#/definitions/Record" @@ -367,16 +424,38 @@ } ] }, - "condition": { - "description": "Only show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", + "icon": { + "description": "question: what icon should be shown next to the 'render' value?\nAn icon shown next to the rendering; typically shown pretty small\nThis is only shown next to the \"render\" value\nType: icon\nifunset: do not show an icon next to the \"render\"-value", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "type": "object", + "properties": { + "path": { + "description": "The path to the icon\nType: icon", + "type": "string" + }, + "class": { + "description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-', so defining your own in combination with a custom CSS is possible (but discouraged)", + "type": "string" + } + }, + "required": [ + "path" + ] }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "type": "string" + } + ] + }, + "condition": { + "description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or ask the question if unkown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", + "anyOf": [ + { + "$ref": "#/definitions/{and:TagConfigJson[];}" + }, + { + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -384,15 +463,13 @@ ] }, "metacondition": { - "description": "If set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", + "description": "question: When should this item be shown (including special conditions)?\ntype: tag\n\nIf set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -400,17 +477,14 @@ ] }, "freeform": { - "description": "Allow freeform text input from the user", + "description": "question: Should a freeform text field be shown?\nAllow freeform text input from the user\nifunset: Do not add a freeform text field", "type": "object", "properties": { "key": { - "description": "If this key is present, then 'render' is used to display the value.\nIf this is undefined, the rendering is _always_ shown", + "description": "What attribute should be filled out\nIf this key is present in the feature, then 'render' is used to display the value.\nIf this is undefined, the rendering is _always_ shown", "type": "string" } - }, - "required": [ - "key" - ] + } }, "mappings": { "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", @@ -420,10 +494,10 @@ "properties": { "if": { "$ref": "#/definitions/TagConfigJson", - "description": "If this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}" + "description": "question: When should this single mapping match?\n\nIf this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}" }, "then": { - "description": "If the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option\nType: rendered", + "description": "question: What text should be shown?\n\nIf the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option\nType: rendered", "anyOf": [ { "$ref": "#/definitions/Record" @@ -434,7 +508,7 @@ ] }, "icon": { - "description": "An icon supporting this mapping; typically shown pretty small\nType: icon", + "description": "question: What icon should be added to this mapping?\nifunset: Do not show an extra icon next to the render value\n\nAn icon supporting this mapping; typically shown pretty small.\nThis can be used to show a 'phone'-icon next to the phone number\ninline: {icon}\nType: icon", "anyOf": [ { "type": "object", @@ -463,6 +537,21 @@ "then" ] } + }, + "description": { + "description": "A human-readable text explaining what this tagRendering does.\nMostly used for the shared tagrenderings", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] + }, + "classes": { + "description": "question: What css-classes should be applied to showing this attribute?\n\nA list of css-classes to apply to the entire tagRendering.\nThese classes are applied in 'answer'-mode, not in question mode\nThis is only for advanced users.\n\nValues are split on ` ` (space)", + "type": "string" } }, "additionalProperties": false diff --git a/Docs/Schemas/PointRenderingConfigJsonJSC.ts b/Docs/Schemas/PointRenderingConfigJsonJSC.ts index 974a1735f..e59df06c4 100644 --- a/Docs/Schemas/PointRenderingConfigJsonJSC.ts +++ b/Docs/Schemas/PointRenderingConfigJsonJSC.ts @@ -3,38 +3,34 @@ export default { "type": "object", "properties": { "location": { - "description": "All the locations that this point should be rendered at.\nPossible values are:\n- `point`: only renders points at their location\n- `centroid`: show a symbol at the centerpoint of a (multi)Linestring and (multi)polygon. Points will _not_ be rendered with this\n- `projected_centerpoint`: Only on (multi)linestrings: calculate the centerpoint and snap it to the way\n- `start` and `end`: only on linestrings: add a point to the first/last coordinate of the LineString", + "description": "question: At what location should this icon be shown?\nmultianswer: true\nsuggestions: return [{if: \"value=point\",then: \"Show an icon for point (node) objects\"},{if: \"value=centroid\",then: \"Show an icon for line or polygon (way) objects at their centroid location\"}, {if: \"value=start\",then: \"Show an icon for line (way) objects at the start\"},{if: \"value=end\",then: \"Show an icon for line (way) object at the end\"},{if: \"value=projected_centerpoint\",then: \"Show an icon for line (way) object near the centroid location, but moved onto the line\"}]", "type": "array", "items": { "type": "string" } }, - "icon": { - "description": "The icon for an element.\nNote that this also doubles as the icon for this layer (rendered with the overpass-tags) ánd the icon in the presets.\n\nThe result of the icon is rendered as follows:\nthe resulting string is interpreted as a _list_ of items, separated by \";\". The bottommost layer is the first layer.\nAs a result, on could use a generic pin, then overlay it with a specific icon.\nTo make things even more practical, one can use all SVG's from the folder \"assets/svg\" and _substitute the color_ in it.\nE.g. to draw a red pin, use \"pin:#f00\", to have a green circle with your icon on top, use `circle:#0f0;`\n\nType: icon", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] + "marker": { + "description": "The marker for an element.\nNote that this also defines the icon for this layer (rendered with the overpass-tags) and the icon in the presets.\n\nThe result of the icon is rendered as follows:\n- The first icon is rendered on the map\n- The second entry is overlayed on top of it\n- ...\n\nAs a result, on could use a generic icon (`pin`, `circle`, `square`) with a color, then overlay it with a specific icon.", + "type": "array", + "items": { + "$ref": "#/definitions/IconConfigJson" + } }, "iconBadges": { - "description": "A list of extra badges to show next to the icon as small badge\nThey will be added as a 25% height icon at the bottom right of the icon, with all the badges in a flex layout.\n\nNote: strings are interpreted as icons, so layering and substituting is supported. You can use `circle:white;./my_icon.svg` to add a background circle", + "description": "A list of extra badges to show next to the icon as small badge\nThey will be added as a 25% height icon at the bottom right of the icon, with all the badges in a flex layout.\n\nNote: strings are interpreted as icons, so layering and substituting is supported. You can use `circle:white;./my_icon.svg` to add a background circle\ngroup: hidden", "type": "array", "items": { "type": "object", "properties": { "if": { "$ref": "#/definitions/TagConfigJson", - "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation" + "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation\n\ntype: tag" }, "then": { "description": "Badge to show\nType: icon", "anyOf": [ { - "$ref": "#/definitions/TagRenderingConfigJson" + "$ref": "#/definitions/MinimalTagRenderingConfigJson" }, { "type": "string" @@ -49,7 +45,18 @@ export default { } }, "iconSize": { - "description": "A string containing \"width,height\" or \"width,height,anchorpoint\" where anchorpoint is any of 'center', 'top', 'bottom', 'left', 'right', 'bottomleft','topright', ...\nDefault is '40,40,center'", + "description": "question: What size should the marker be on the map?\nA string containing \",\" in pixels\nifunset: Use the default size (40,40 px)", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "anchor": { + "description": "question: What is the anchorpoint of the icon?\n\nThis matches the geographical point with a location on the icon.\n\nifunset: Use MapComplete-default (center)\nsuggestions: return [{if: \"value=center\", then: \"Place the center of the icon on the geographical location\"},{if: \"value=top\", then: \"Place the top of the icon on the geographical location\"},{if: \"value=bottom\", then: \"Place the bottom of the icon on the geographical location\"},{if: \"value=left\", then: \"Place the left of the icon on the geographical location\"},{if: \"value=right\", then: \"Place the right of the icon on the geographical location\"}]", "anyOf": [ { "$ref": "#/definitions/TagRenderingConfigJson" @@ -60,7 +67,7 @@ export default { ] }, "rotation": { - "description": "The rotation of an icon, useful for e.g. directions.\nUsage: 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)``", + "description": "question: What rotation should be applied on the icon?\nThis is mostly useful for items that face a specific direction, such as surveillance cameras\nThis is interpreted as css property for 'rotate', thus has to end with 'deg', e.g. `90deg`, `{direction}deg`, `calc(90deg - {camera:direction}deg)``\nifunset: Do not rotate", "anyOf": [ { "$ref": "#/definitions/TagRenderingConfigJson" @@ -71,29 +78,7 @@ export default { ] }, "label": { - "description": "A HTML-fragment that is shown below the icon, for example:\n
{name}
\n\nIf the icon is undefined, then the label is shown in the center of the feature.\nNote that, if the wayhandling hides the icon then no label is shown as well.", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - }, - "css": { - "description": "A snippet of css code which is applied onto the container of the entire marker", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - }, - "cssClasses": { - "description": "A snippet of css-classes which are applied onto the container of the entire marker. They can be space-separated", + "description": "question: What label should be shown beneath the marker?\nFor example: `<div style=\"background: white\">{name}</div>`\n\nIf the icon is undefined, then the label is shown in the center of the feature.\ntypes: Dynamic value based on the attributes ; string\ninline: Always show label {value} beneath the marker\nifunset: Do not show a label beneath the marker", "anyOf": [ { "$ref": "#/definitions/TagRenderingConfigJson" @@ -104,7 +89,7 @@ export default { ] }, "labelCss": { - "description": "Css that is applied onto the label", + "description": "question: What CSS should be applied to the label?\nYou can set the css-properties here, e.g. `background: red; font-size: 12px; `\ninline: Apply CSS-style {value} to the label\ntypes: Dynamic value ; string\nifunset: Do not apply extra CSS-labels to the label\ngroup: expert", "anyOf": [ { "$ref": "#/definitions/TagRenderingConfigJson" @@ -115,7 +100,29 @@ export default { ] }, "labelCssClasses": { - "description": "Css classes that are applied onto the label; can be space-separated", + "description": "question: Which CSS-classes should be applied to the label?\n\nThe classes should be separated by a space (` `)\nYou can use most Tailwind-css classes, see https://tailwindcss.com/ for more information\nFor example: `center bg-gray-500 mx-2 my-1 rounded-full`\ninline: Apply CSS-classes {value} to the label\ntypes: Dynamic value ; string\nifunset: Do not apply extra CSS-classes to the label\nsuggestions: return [{if: \"value=bg-white rounded px-2\", then: \"Draw on a white background\"}]", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "css": { + "description": "question: What CSS should be applied to the entire marker?\nYou can set the css-properties here, e.g. `background: red; font-size: 12px; `\nThis will be applied to the _container_ containing both the marker and the label\ninline: Apply CSS-style {value} to the _entire marker_\ntypes: Dynamic value ; string\nifunset: Do not apply extra CSS element to the entire marker\ngroup: expert", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "cssClasses": { + "description": "question: Which CSS-classes should be applied to the entire marker?\nThis will be applied to the _container_ containing both the marker and the label\n\nThe classes should be separated by a space (` `)\nYou can use most Tailwind-css classes, see https://tailwindcss.com/ for more information\nFor example: `center bg-gray-500 mx-2 my-1 rounded-full`\ninline: Apply CSS-classes {value} to the entire container\nifunset: Do not apply extra CSS-classes to the label\ntypes: Dynamic value ; string\nifunset: Do not apply extra CSS-classes to the entire marker\ngroup: expert", "anyOf": [ { "$ref": "#/definitions/TagRenderingConfigJson" @@ -126,7 +133,7 @@ export default { ] }, "pitchAlignment": { - "description": "If the map is pitched, the marker will stay parallel to the screen.\nSet to 'map' if you want to put it flattened on the map", + "description": "question: If the map is pitched, should the icon stay parallel to the screen or to the groundplane?\nsuggestions: return [{if: \"value=canvas\", then: \"The icon will stay upward and not be transformed as if it sticks to the screen\"}, {if: \"value=map\", then: \"The icon will be transformed as if it were painted onto the ground. (Automatically sets rotationAlignment)\"}]\ngroup: expert", "anyOf": [ { "$ref": "#/definitions/TagRenderingConfigJson" @@ -141,7 +148,7 @@ export default { ] }, "rotationAlignment": { - "description": "If the map is rotated, the icon will still point to the north if no rotation was applied", + "description": "question: Should the icon be rotated if the map is rotated?\nifunset: Do not rotate or tilt icons. Always keep the icons straight\nsuggestions: return [{if: \"value=canvas\", then: \"Never rotate the icon\"}, {if: \"value=map\", then: \"If the map is rotated, rotate the icon as well. This gives the impression of an icon that floats perpendicular above the ground.\"}]\ngroup: expert", "anyOf": [ { "$ref": "#/definitions/TagRenderingConfigJson" @@ -161,13 +168,12 @@ export default { ], "definitions": { "TagConfigJson": { - "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation", + "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation\n\ntype: tag", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", "type": "object", "properties": { "or": { @@ -186,8 +192,7 @@ export default { } ] }, - "AndTagConfigJson": { - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", + "{and:TagConfigJson[];}": { "type": "object", "properties": { "and": { @@ -201,8 +206,7 @@ export default { "and" ] }, - "OrTagConfigJson": { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", + "{or:TagConfigJson[];}": { "type": "object", "properties": { "or": { @@ -285,48 +289,99 @@ export default { "canonicalDenomination" ] }, + "MinimalTagRenderingConfigJson": { + "description": "Mostly used for lineRendering and pointRendering", + "type": "object", + "properties": { + "render": { + "description": "question: What value should be rendered?\n\nThis piece of text will be shown in the infobox.\nNote that \"&LBRACEkey&RBRACE\"-parts are substituted by the corresponding values of the element.\n\nThis value will be used if there is no mapping which matches (or there are no matches)\nNote that this is a HTML-interpreted value, so you can add links as e.g. '<a href='{website}'>{website}</a>' or include images such as `This is of type A <br><img src='typeA-icon.svg' />`", + "type": "string" + }, + "mappings": { + "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", + "type": "array", + "items": { + "type": "object", + "properties": { + "if": { + "$ref": "#/definitions/TagConfigJson", + "description": "question: When should this single mapping match?\n\nIf this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}" + }, + "then": { + "description": "question: What text should be shown?\n\nIf the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option", + "type": "string" + } + }, + "required": [ + "if", + "then" + ] + } + } + } + }, + "IconConfigJson": { + "type": "object", + "properties": { + "icon": { + "description": "question: What icon should be used?\ntype: icon\nsuggestions: return [\"pin\",\"square\",\"circle\",\"checkmark\",\"clock\",\"close\",\"crosshair\",\"help\",\"home\",\"invalid\",\"location\",\"location_empty\",\"location_locked\",\"note\",\"resolved\",\"ring\",\"scissors\",\"teardrop\",\"teardrop_with_hole_green\",\"triangle\"].map(i => ({if: \"value=\"+i, then: i, icon: i}))", + "anyOf": [ + { + "$ref": "#/definitions/MinimalTagRenderingConfigJson" + }, + { + "type": "object", + "properties": { + "builtin": { + "type": "string" + }, + "override": {} + }, + "required": [ + "builtin", + "override" + ] + }, + { + "type": "string" + } + ] + }, + "color": { + "description": "question: What colour should the icon be?\nThis will only work for the default icons such as `pin`,`circle`,...\ntype: color", + "anyOf": [ + { + "$ref": "#/definitions/MinimalTagRenderingConfigJson" + }, + { + "type": "object", + "properties": { + "builtin": { + "type": "string" + }, + "override": {} + }, + "required": [ + "builtin", + "override" + ] + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "icon" + ] + }, "TagRenderingConfigJson": { "description": "A TagRenderingConfigJson is a single piece of code which converts one ore more tags into a HTML-snippet.\nFor an _editable_ tagRendering, use 'QuestionableTagRenderingConfigJson' instead, which extends this one", "type": "object", "properties": { - "id": { - "description": "The id of the tagrendering, should be an unique string.\nUsed to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise.\n\nUse 'questions' to trigger the question box of this group (if a group is defined)", - "type": "string" - }, - "labels": { - "description": "A list of labels. These are strings that are used for various purposes, e.g. to filter them away", - "type": "array", - "items": { - "type": "string" - } - }, - "classes": { - "description": "A list of css-classes to apply to the entire tagRendering if the answer is known (not applied on the question).\nThis is only for advanced users", - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "string" - } - ] - }, - "description": { - "description": "A human-readable text explaining what this tagRendering does", - "anyOf": [ - { - "$ref": "#/definitions/Record" - }, - { - "type": "string" - } - ] - }, "render": { - "description": "Renders this value. Note that \"{key}\"-parts are substituted by the corresponding values of the element.\nIf neither 'textFieldQuestion' nor 'mappings' are defined, this text is simply shown as default value.\n\nNote 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
`\ntype: rendered", + "description": "question: What text should be rendered?\n\nThis piece of text will be shown in the infobox.\nIn this text, values within braces (such as {braced(key)}) are replaced by the corresponding `value` in the object.\nFor example, if the object contains tags `amenity=school; name=Windy Hill School`, the render string `This school is named {name}` will be shown to the user as `This school is named Windy Hill School`\n\nThis text will be shown if:\n- there is no mapping which matches (or there are no matches)\n- no question, no mappings and no 'freeform' is set\n\nNote that this is a HTML-interpreted value, so you can add links as e.g. '<a href='{website}'>{website}</a>' or include images such as `This is of type A <br><img src='typeA-icon.svg' />`\ntype: rendered\nifunset: no text is rendered if no predefined options match", "anyOf": [ { "$ref": "#/definitions/Record" @@ -362,16 +417,38 @@ export default { } ] }, - "condition": { - "description": "Only show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", + "icon": { + "description": "question: what icon should be shown next to the 'render' value?\nAn icon shown next to the rendering; typically shown pretty small\nThis is only shown next to the \"render\" value\nType: icon\nifunset: do not show an icon next to the \"render\"-value", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "type": "object", + "properties": { + "path": { + "description": "The path to the icon\nType: icon", + "type": "string" + }, + "class": { + "description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-', so defining your own in combination with a custom CSS is possible (but discouraged)", + "type": "string" + } + }, + "required": [ + "path" + ] }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "type": "string" + } + ] + }, + "condition": { + "description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or ask the question if unkown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", + "anyOf": [ + { + "$ref": "#/definitions/{and:TagConfigJson[];}" + }, + { + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -379,15 +456,13 @@ export default { ] }, "metacondition": { - "description": "If set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", + "description": "question: When should this item be shown (including special conditions)?\ntype: tag\n\nIf set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -395,17 +470,14 @@ export default { ] }, "freeform": { - "description": "Allow freeform text input from the user", + "description": "question: Should a freeform text field be shown?\nAllow freeform text input from the user\nifunset: Do not add a freeform text field", "type": "object", "properties": { "key": { - "description": "If this key is present, then 'render' is used to display the value.\nIf this is undefined, the rendering is _always_ shown", + "description": "What attribute should be filled out\nIf this key is present in the feature, then 'render' is used to display the value.\nIf this is undefined, the rendering is _always_ shown", "type": "string" } - }, - "required": [ - "key" - ] + } }, "mappings": { "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", @@ -415,10 +487,10 @@ export default { "properties": { "if": { "$ref": "#/definitions/TagConfigJson", - "description": "If this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}" + "description": "question: When should this single mapping match?\n\nIf this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}" }, "then": { - "description": "If the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option\nType: rendered", + "description": "question: What text should be shown?\n\nIf the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option\nType: rendered", "anyOf": [ { "$ref": "#/definitions/Record" @@ -429,7 +501,7 @@ export default { ] }, "icon": { - "description": "An icon supporting this mapping; typically shown pretty small\nType: icon", + "description": "question: What icon should be added to this mapping?\nifunset: Do not show an extra icon next to the render value\n\nAn icon supporting this mapping; typically shown pretty small.\nThis can be used to show a 'phone'-icon next to the phone number\ninline: {icon}\nType: icon", "anyOf": [ { "type": "object", @@ -458,6 +530,21 @@ export default { "then" ] } + }, + "description": { + "description": "A human-readable text explaining what this tagRendering does.\nMostly used for the shared tagrenderings", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] + }, + "classes": { + "description": "question: What css-classes should be applied to showing this attribute?\n\nA list of css-classes to apply to the entire tagRendering.\nThese classes are applied in 'answer'-mode, not in question mode\nThis is only for advanced users.\n\nValues are split on ` ` (space)", + "type": "string" } } } diff --git a/Docs/Schemas/QuestionableTagRenderingConfigJson.schema.json b/Docs/Schemas/QuestionableTagRenderingConfigJson.schema.json index 2eabe2ca6..08134815d 100644 --- a/Docs/Schemas/QuestionableTagRenderingConfigJson.schema.json +++ b/Docs/Schemas/QuestionableTagRenderingConfigJson.schema.json @@ -2,8 +2,81 @@ "description": "A QuestionableTagRenderingConfigJson is a single piece of code which converts one ore more tags into a HTML-snippet.\nIf the desired tags are missing and a question is defined, a question will be shown instead.", "type": "object", "properties": { + "id": { + "type": "string" + }, + "mappings": { + "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes\n\nquestion: What are common options?", + "type": "array", + "items": { + "$ref": "#/definitions/MappingConfigJson" + } + }, + "multiAnswer": { + "description": "If true, use checkboxes instead of radio buttons when asking the question\n\nquestion: Should a contributor be allowed to select multiple mappings?\n\niftrue: allow to select multiple mappings\niffalse: only allow to select a single mapping\nifunset: only allow to select a single mapping", + "type": "boolean" + }, + "freeform": { + "description": "Allow freeform text input from the user", + "type": "object", + "properties": { + "key": { + "description": "question: What is the name of the attribute that should be written to?\nThis is the OpenStreetMap-key that that value will be written to\nifunset: do not offer a freeform textfield as answer option", + "type": "string" + }, + "type": { + "description": "question: What is the input type?\nThe type of the text-field, e.g. 'string', 'nat', 'float', 'date',...\nSee Docs/SpecialInputElements.md and UI/Input/ValidatedTextField.ts for supported values\nifunset: use an unconstrained string as input (default)\nsuggestions: return validators.AllValidators.filter(type => !type.isMeta).map((type) => ({if: \"value=\"+type.name, then: \"\"+type.name+\" \"+type.explanation.split(\"\\n\")[0]}))", + "type": "string" + }, + "placeholder": { + "description": "question: What placeholder text should be shown in the input-element if there is no input?\nA (translated) text that is shown (as gray text) within the textfield\ntype: translation\ngroup: expert", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] + }, + "helperArgs": { + "description": "Extra parameters to initialize the input helper arguments.\nFor semantics, see the 'SpecialInputElements.md'\ngroup: expert", + "type": "array", + "items": {} + }, + "addExtraTags": { + "description": "If a value is added with the textfield, these extra tag is addded.\nUseful to add a 'fixme=freeform textfield used - to be checked'\ngroup: expert", + "type": "array", + "items": { + "type": "string" + } + }, + "inline": { + "description": "question: Show the freeform as box within the question?\nInstead of showing a full-width text field, the text field will be shown within the rendering of the question.\n\nThis combines badly with special input elements, as it'll distort the layout.\nifunset: show the freeform input field full-width\niftrue: show the freeform input field as a small field within the question\ngroup: expert", + "type": "boolean" + }, + "default": { + "description": "question: What value should be entered in the text field if no value is set?\nThis can help people to quickly enter the most common option\nifunset: do not prefill the textfield\ngroup: expert", + "type": "string" + }, + "invalidValues": { + "description": "question: What values of the freeform key should be interpreted as 'unknown'?\nFor example, if a feature has `shop=yes`, the question 'what type of shop is this?' should still asked\nifunset: The question will be considered answered if any value is set for the key\ngroup: expert", + "anyOf": [ + { + "$ref": "#/definitions/{and:TagConfigJson[];}" + }, + { + "$ref": "#/definitions/{or:TagConfigJson[];}" + }, + { + "type": "string" + } + ] + } + } + }, "question": { - "description": "If it turns out that this tagRendering doesn't match _any_ value, then we show this question.\nIf undefined, the question is never asked and this tagrendering is read-only", + "description": "question: What question should be shown to the contributor?\n\nA question is presented ot the user if no mapping matches and the 'freeform' key is not set as well.\n\nifunset: This tagrendering will be shown if it is known, but cannot be edited by the contributor, effectively resutling in a read-only rendering", "anyOf": [ { "$ref": "#/definitions/Record" @@ -14,7 +87,7 @@ ] }, "questionHint": { - "description": "A hint which is shown in subtle text under the question.\nThis can give some extra information on what the answer should ook like", + "description": "question: Should some extra information be shown to the contributor, alongside the question?\nThis hint is shown in subtle text under the question.\nThis can give some extra information on what the answer should ook like\nifunset: No extra hint is given", "anyOf": [ { "$ref": "#/definitions/Record" @@ -24,94 +97,15 @@ } ] }, - "freeform": { - "description": "Allow freeform text input from the user", - "type": "object", - "properties": { - "key": { - "type": "string" - }, - "type": { - "description": "The type of the text-field, e.g. 'string', 'nat', 'float', 'date',...\nSee Docs/SpecialInputElements.md and UI/Input/ValidatedTextField.ts for supported values", - "type": "string" - }, - "placeholder": { - "description": "A (translated) text that is shown (as gray text) within the textfield" - }, - "helperArgs": { - "description": "Extra parameters to initialize the input helper arguments.\nFor semantics, see the 'SpecialInputElements.md'", - "type": "array", - "items": {} - }, - "addExtraTags": { - "description": "If a value is added with the textfield, these extra tag is addded.\nUseful to add a 'fixme=freeform textfield used - to be checked'", - "type": "array", - "items": { - "type": "string" - } - }, - "inline": { - "description": "When set, influences the way a question is asked.\nInstead of showing a full-width text field, the text field will be shown within the rendering of the question.\n\nThis combines badly with special input elements, as it'll distort the layout.\nNote that this will be set automatically if no special elements are present.", - "type": "boolean" - }, - "default": { - "description": "default value to enter if no previous tagging is present.\nNormally undefined (aka do not enter anything)", - "type": "string" - } - }, - "required": [ - "key" - ] - }, - "multiAnswer": { - "description": "If true, use checkboxes instead of radio buttons when asking the question", - "type": "boolean" - }, - "mappings": { - "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", - "type": "array", - "items": { - "$ref": "#/definitions/MappingConfigJson" - } - }, - "id": { - "description": "The id of the tagrendering, should be an unique string.\nUsed to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise.\n\nUse 'questions' to trigger the question box of this group (if a group is defined)", - "type": "string" - }, "labels": { - "description": "A list of labels. These are strings that are used for various purposes, e.g. to filter them away", + "description": "A list of labels. These are strings that are used for various purposes, e.g. to only include a subset of the tagRenderings when reusing a layer", "type": "array", "items": { "type": "string" } }, - "classes": { - "description": "A list of css-classes to apply to the entire tagRendering if the answer is known (not applied on the question).\nThis is only for advanced users", - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "string" - } - ] - }, - "description": { - "description": "A human-readable text explaining what this tagRendering does", - "anyOf": [ - { - "$ref": "#/definitions/Record" - }, - { - "type": "string" - } - ] - }, "render": { - "description": "Renders this value. Note that \"{key}\"-parts are substituted by the corresponding values of the element.\nIf neither 'textFieldQuestion' nor 'mappings' are defined, this text is simply shown as default value.\n\nNote 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
`\ntype: rendered", + "description": "question: What text should be rendered?\n\nThis piece of text will be shown in the infobox.\nIn this text, values within braces (such as {braced(key)}) are replaced by the corresponding `value` in the object.\nFor example, if the object contains tags `amenity=school; name=Windy Hill School`, the render string `This school is named {name}` will be shown to the user as `This school is named Windy Hill School`\n\nThis text will be shown if:\n- there is no mapping which matches (or there are no matches)\n- no question, no mappings and no 'freeform' is set\n\nNote that this is a HTML-interpreted value, so you can add links as e.g. '<a href='{website}'>{website}</a>' or include images such as `This is of type A <br><img src='typeA-icon.svg' />`\ntype: rendered\nifunset: no text is rendered if no predefined options match", "anyOf": [ { "$ref": "#/definitions/Record" @@ -147,16 +141,38 @@ } ] }, - "condition": { - "description": "Only show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", + "icon": { + "description": "question: what icon should be shown next to the 'render' value?\nAn icon shown next to the rendering; typically shown pretty small\nThis is only shown next to the \"render\" value\nType: icon\nifunset: do not show an icon next to the \"render\"-value", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "type": "object", + "properties": { + "path": { + "description": "The path to the icon\nType: icon", + "type": "string" + }, + "class": { + "description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-', so defining your own in combination with a custom CSS is possible (but discouraged)", + "type": "string" + } + }, + "required": [ + "path" + ] }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "type": "string" + } + ] + }, + "condition": { + "description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or ask the question if unkown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", + "anyOf": [ + { + "$ref": "#/definitions/{and:TagConfigJson[];}" + }, + { + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -164,31 +180,46 @@ ] }, "metacondition": { - "description": "If set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", + "description": "question: When should this item be shown (including special conditions)?\ntype: tag\n\nIf set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" } ] - } - }, - "definitions": { - "TagConfigJson": { - "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation", + }, + "description": { + "description": "A human-readable text explaining what this tagRendering does.\nMostly used for the shared tagrenderings", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson" + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] + }, + "classes": { + "description": "question: What css-classes should be applied to showing this attribute?\n\nA list of css-classes to apply to the entire tagRendering.\nThese classes are applied in 'answer'-mode, not in question mode\nThis is only for advanced users.\n\nValues are split on ` ` (space)", + "type": "string" + } + }, + "required": [ + "id" + ], + "definitions": { + "TagConfigJson": { + "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation\n\ntype: tag", + "anyOf": [ + { + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", "type": "object", "properties": { "or": { @@ -207,8 +238,7 @@ } ] }, - "AndTagConfigJson": { - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", + "{and:TagConfigJson[];}": { "type": "object", "properties": { "and": { @@ -223,8 +253,7 @@ ], "additionalProperties": false }, - "OrTagConfigJson": { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", + "{or:TagConfigJson[];}": { "type": "object", "properties": { "or": { @@ -311,48 +340,101 @@ ], "additionalProperties": false }, + "MinimalTagRenderingConfigJson": { + "description": "Mostly used for lineRendering and pointRendering", + "type": "object", + "properties": { + "render": { + "description": "question: What value should be rendered?\n\nThis piece of text will be shown in the infobox.\nNote that \"&LBRACEkey&RBRACE\"-parts are substituted by the corresponding values of the element.\n\nThis value will be used if there is no mapping which matches (or there are no matches)\nNote that this is a HTML-interpreted value, so you can add links as e.g. '<a href='{website}'>{website}</a>' or include images such as `This is of type A <br><img src='typeA-icon.svg' />`", + "type": "string" + }, + "mappings": { + "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", + "type": "array", + "items": { + "type": "object", + "properties": { + "if": { + "$ref": "#/definitions/TagConfigJson", + "description": "question: When should this single mapping match?\n\nIf this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}" + }, + "then": { + "description": "question: What text should be shown?\n\nIf the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option", + "type": "string" + } + }, + "required": [ + "if", + "then" + ] + } + } + }, + "additionalProperties": false + }, + "IconConfigJson": { + "type": "object", + "properties": { + "icon": { + "description": "question: What icon should be used?\ntype: icon\nsuggestions: return [\"pin\",\"square\",\"circle\",\"checkmark\",\"clock\",\"close\",\"crosshair\",\"help\",\"home\",\"invalid\",\"location\",\"location_empty\",\"location_locked\",\"note\",\"resolved\",\"ring\",\"scissors\",\"teardrop\",\"teardrop_with_hole_green\",\"triangle\"].map(i => ({if: \"value=\"+i, then: i, icon: i}))", + "anyOf": [ + { + "$ref": "#/definitions/MinimalTagRenderingConfigJson" + }, + { + "type": "object", + "properties": { + "builtin": { + "type": "string" + }, + "override": {} + }, + "required": [ + "builtin", + "override" + ] + }, + { + "type": "string" + } + ] + }, + "color": { + "description": "question: What colour should the icon be?\nThis will only work for the default icons such as `pin`,`circle`,...\ntype: color", + "anyOf": [ + { + "$ref": "#/definitions/MinimalTagRenderingConfigJson" + }, + { + "type": "object", + "properties": { + "builtin": { + "type": "string" + }, + "override": {} + }, + "required": [ + "builtin", + "override" + ] + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "icon" + ], + "additionalProperties": false + }, "TagRenderingConfigJson": { "description": "A TagRenderingConfigJson is a single piece of code which converts one ore more tags into a HTML-snippet.\nFor an _editable_ tagRendering, use 'QuestionableTagRenderingConfigJson' instead, which extends this one", "type": "object", "properties": { - "id": { - "description": "The id of the tagrendering, should be an unique string.\nUsed to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise.\n\nUse 'questions' to trigger the question box of this group (if a group is defined)", - "type": "string" - }, - "labels": { - "description": "A list of labels. These are strings that are used for various purposes, e.g. to filter them away", - "type": "array", - "items": { - "type": "string" - } - }, - "classes": { - "description": "A list of css-classes to apply to the entire tagRendering if the answer is known (not applied on the question).\nThis is only for advanced users", - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "string" - } - ] - }, - "description": { - "description": "A human-readable text explaining what this tagRendering does", - "anyOf": [ - { - "$ref": "#/definitions/Record" - }, - { - "type": "string" - } - ] - }, "render": { - "description": "Renders this value. Note that \"{key}\"-parts are substituted by the corresponding values of the element.\nIf neither 'textFieldQuestion' nor 'mappings' are defined, this text is simply shown as default value.\n\nNote 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
`\ntype: rendered", + "description": "question: What text should be rendered?\n\nThis piece of text will be shown in the infobox.\nIn this text, values within braces (such as {braced(key)}) are replaced by the corresponding `value` in the object.\nFor example, if the object contains tags `amenity=school; name=Windy Hill School`, the render string `This school is named {name}` will be shown to the user as `This school is named Windy Hill School`\n\nThis text will be shown if:\n- there is no mapping which matches (or there are no matches)\n- no question, no mappings and no 'freeform' is set\n\nNote that this is a HTML-interpreted value, so you can add links as e.g. '<a href='{website}'>{website}</a>' or include images such as `This is of type A <br><img src='typeA-icon.svg' />`\ntype: rendered\nifunset: no text is rendered if no predefined options match", "anyOf": [ { "$ref": "#/definitions/Record" @@ -388,16 +470,38 @@ } ] }, - "condition": { - "description": "Only show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", + "icon": { + "description": "question: what icon should be shown next to the 'render' value?\nAn icon shown next to the rendering; typically shown pretty small\nThis is only shown next to the \"render\" value\nType: icon\nifunset: do not show an icon next to the \"render\"-value", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "type": "object", + "properties": { + "path": { + "description": "The path to the icon\nType: icon", + "type": "string" + }, + "class": { + "description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-', so defining your own in combination with a custom CSS is possible (but discouraged)", + "type": "string" + } + }, + "required": [ + "path" + ] }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "type": "string" + } + ] + }, + "condition": { + "description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or ask the question if unkown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", + "anyOf": [ + { + "$ref": "#/definitions/{and:TagConfigJson[];}" + }, + { + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -405,15 +509,13 @@ ] }, "metacondition": { - "description": "If set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", + "description": "question: When should this item be shown (including special conditions)?\ntype: tag\n\nIf set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -421,17 +523,14 @@ ] }, "freeform": { - "description": "Allow freeform text input from the user", + "description": "question: Should a freeform text field be shown?\nAllow freeform text input from the user\nifunset: Do not add a freeform text field", "type": "object", "properties": { "key": { - "description": "If this key is present, then 'render' is used to display the value.\nIf this is undefined, the rendering is _always_ shown", + "description": "What attribute should be filled out\nIf this key is present in the feature, then 'render' is used to display the value.\nIf this is undefined, the rendering is _always_ shown", "type": "string" } - }, - "required": [ - "key" - ] + } }, "mappings": { "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", @@ -441,10 +540,10 @@ "properties": { "if": { "$ref": "#/definitions/TagConfigJson", - "description": "If this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}" + "description": "question: When should this single mapping match?\n\nIf this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}" }, "then": { - "description": "If the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option\nType: rendered", + "description": "question: What text should be shown?\n\nIf the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option\nType: rendered", "anyOf": [ { "$ref": "#/definitions/Record" @@ -455,7 +554,7 @@ ] }, "icon": { - "description": "An icon supporting this mapping; typically shown pretty small\nType: icon", + "description": "question: What icon should be added to this mapping?\nifunset: Do not show an extra icon next to the render value\n\nAn icon supporting this mapping; typically shown pretty small.\nThis can be used to show a 'phone'-icon next to the phone number\ninline: {icon}\nType: icon", "anyOf": [ { "type": "object", @@ -484,6 +583,21 @@ "then" ] } + }, + "description": { + "description": "A human-readable text explaining what this tagRendering does.\nMostly used for the shared tagrenderings", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] + }, + "classes": { + "description": "question: What css-classes should be applied to showing this attribute?\n\nA list of css-classes to apply to the entire tagRendering.\nThese classes are applied in 'answer'-mode, not in question mode\nThis is only for advanced users.\n\nValues are split on ` ` (space)", + "type": "string" } }, "additionalProperties": false @@ -497,13 +611,21 @@ "properties": { "if": { "$ref": "#/definitions/TagConfigJson", - "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation" + "description": "question: What tags should be matched to show this option?\n\nIf in 'question'-mode and the contributor selects this option, these tags will be applied to the object" }, "then": { - "description": "Shown if the 'if is fulfilled\nType: rendered" + "description": "Question: What corresponding text should be shown?\nShown if the `if` is fulfilled\nType: rendered", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] }, "icon": { - "description": "An extra icon supporting the choice\nType: icon", + "description": "question: What icon should be shown next to this mapping?\n\nThis icon will only be shown if the value is known, it is not displayed in the options (but might be in the future)\n\nifunset: Show no icon\nType: icon", "anyOf": [ { "type": "object", @@ -527,15 +649,13 @@ ] }, "hideInAnswer": { - "description": "In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n\n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}", + "description": "question: Under what circumstances should this mapping be hidden from the possibilities a contributor can pick?\niftrue: Never show this mapping as option to pick\nifunset: Always show this mapping as option to pick\ntype: tag\n\nIn some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n\n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": [ @@ -546,15 +666,13 @@ ] }, "ifnot": { - "description": "Only applicable if 'multiAnswer' is set.\nThis is for situations such as:\n`accepts:coins=no` where one can select all the possible payment methods. However, we want to make explicit that some options _were not_ selected.\nThis can be done with `ifnot`\nNote that we can not explicitly render this negative case to the user, we cannot show `does _not_ accept coins`.\nIf this is important to your usecase, consider using multiple radiobutton-fields without `multiAnswer`", + "description": "question: What tags should be applied if this mapping is _not_ chosen?\n\nOnly applicable if 'multiAnswer' is set.\nThis is for situations such as:\n`accepts:coins=no` where one can select all the possible payment methods. However, we want to make explicit that some options _were not_ selected.\nThis can be done with `ifnot`\nNote that we can not explicitly render this negative case to the user, we cannot show `does _not_ accept coins`.\nIf this is important to your usecase, consider using multiple radiobutton-fields without `multiAnswer`\n\nifunset: Do not apply a tag if a different mapping is chosen.", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -562,26 +680,24 @@ ] }, "addExtraTags": { - "description": "If chosen as answer, these tags will be applied as well onto the object.\nNot compatible with multiAnswer.\n\nThis can be used e.g. to erase other keys which indicate the 'not' value:\n```json\n{\n \"if\": \"crossing:marking=rainbow\",\n \"then\": \"This is a rainbow crossing\",\n \"addExtraTags\": \"not:crossing:marking=\"\n}\n```", + "description": "question: What extra tags should be added to the object if this object is chosen?\ntype: simple_tag\n\nIf chosen as answer, these tags will be applied onto the object, together with the tags from the `if`\nNot compatible with multiAnswer.\n\nThis can be used e.g. to erase other keys which indicate the 'not' value:\n```json\n{\n \"if\": \"crossing:marking=rainbow\",\n \"then\": \"This is a rainbow crossing\",\n \"addExtraTags\": [\"not:crossing:marking=\"]\n}\n```", "type": "array", "items": { "type": "string" } }, "searchTerms": { - "description": "If there are many options, the mappings-radiobuttons will be replaced by an element with a searchfunction\n\nSearchterms (per language) allow to easily find an option if there are many options", + "description": "question: If there are many options, what search terms match too?\nIf there are many options, the mappings-radiobuttons will be replaced by an element with a searchfunction\n\nSearchterms (per language) allow to easily find an option if there are many options\ngroup: hidden", "$ref": "#/definitions/Record" }, "priorityIf": { - "description": "If the searchable selector is picked, mappings with this item will have priority and show up even if the others are hidden\nUse this sparingly", + "description": "If the searchable selector is picked, mappings with this item will have priority and show up even if the others are hidden\nUse this sparingly\ngroup: hidden", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -589,7 +705,7 @@ ] }, "#": { - "description": "Used for comments or to disable a validation\n\nignore-image-in-then: normally, a `then`-clause is not allowed to have an `img`-html-element as icons are preferred. In some cases (most notably title-icons), this is allowed", + "description": "Used for comments or to disable a validation\n\ngroup: hidden\nignore-image-in-then: normally, a `then`-clause is not allowed to have an `img`-html-element as icons are preferred. In some cases (most notably title-icons), this is allowed", "type": "string" } }, diff --git a/Docs/Schemas/QuestionableTagRenderingConfigJsonJSC.ts b/Docs/Schemas/QuestionableTagRenderingConfigJsonJSC.ts index b0b2b1689..defa256df 100644 --- a/Docs/Schemas/QuestionableTagRenderingConfigJsonJSC.ts +++ b/Docs/Schemas/QuestionableTagRenderingConfigJsonJSC.ts @@ -2,8 +2,81 @@ export default { "description": "A QuestionableTagRenderingConfigJson is a single piece of code which converts one ore more tags into a HTML-snippet.\nIf the desired tags are missing and a question is defined, a question will be shown instead.", "type": "object", "properties": { + "id": { + "type": "string" + }, + "mappings": { + "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes\n\nquestion: What are common options?", + "type": "array", + "items": { + "$ref": "#/definitions/MappingConfigJson" + } + }, + "multiAnswer": { + "description": "If true, use checkboxes instead of radio buttons when asking the question\n\nquestion: Should a contributor be allowed to select multiple mappings?\n\niftrue: allow to select multiple mappings\niffalse: only allow to select a single mapping\nifunset: only allow to select a single mapping", + "type": "boolean" + }, + "freeform": { + "description": "Allow freeform text input from the user", + "type": "object", + "properties": { + "key": { + "description": "question: What is the name of the attribute that should be written to?\nThis is the OpenStreetMap-key that that value will be written to\nifunset: do not offer a freeform textfield as answer option", + "type": "string" + }, + "type": { + "description": "question: What is the input type?\nThe type of the text-field, e.g. 'string', 'nat', 'float', 'date',...\nSee Docs/SpecialInputElements.md and UI/Input/ValidatedTextField.ts for supported values\nifunset: use an unconstrained string as input (default)\nsuggestions: return validators.AllValidators.filter(type => !type.isMeta).map((type) => ({if: \"value=\"+type.name, then: \"\"+type.name+\" \"+type.explanation.split(\"\\n\")[0]}))", + "type": "string" + }, + "placeholder": { + "description": "question: What placeholder text should be shown in the input-element if there is no input?\nA (translated) text that is shown (as gray text) within the textfield\ntype: translation\ngroup: expert", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] + }, + "helperArgs": { + "description": "Extra parameters to initialize the input helper arguments.\nFor semantics, see the 'SpecialInputElements.md'\ngroup: expert", + "type": "array", + "items": {} + }, + "addExtraTags": { + "description": "If a value is added with the textfield, these extra tag is addded.\nUseful to add a 'fixme=freeform textfield used - to be checked'\ngroup: expert", + "type": "array", + "items": { + "type": "string" + } + }, + "inline": { + "description": "question: Show the freeform as box within the question?\nInstead of showing a full-width text field, the text field will be shown within the rendering of the question.\n\nThis combines badly with special input elements, as it'll distort the layout.\nifunset: show the freeform input field full-width\niftrue: show the freeform input field as a small field within the question\ngroup: expert", + "type": "boolean" + }, + "default": { + "description": "question: What value should be entered in the text field if no value is set?\nThis can help people to quickly enter the most common option\nifunset: do not prefill the textfield\ngroup: expert", + "type": "string" + }, + "invalidValues": { + "description": "question: What values of the freeform key should be interpreted as 'unknown'?\nFor example, if a feature has `shop=yes`, the question 'what type of shop is this?' should still asked\nifunset: The question will be considered answered if any value is set for the key\ngroup: expert", + "anyOf": [ + { + "$ref": "#/definitions/{and:TagConfigJson[];}" + }, + { + "$ref": "#/definitions/{or:TagConfigJson[];}" + }, + { + "type": "string" + } + ] + } + } + }, "question": { - "description": "If it turns out that this tagRendering doesn't match _any_ value, then we show this question.\nIf undefined, the question is never asked and this tagrendering is read-only", + "description": "question: What question should be shown to the contributor?\n\nA question is presented ot the user if no mapping matches and the 'freeform' key is not set as well.\n\nifunset: This tagrendering will be shown if it is known, but cannot be edited by the contributor, effectively resutling in a read-only rendering", "anyOf": [ { "$ref": "#/definitions/Record" @@ -14,7 +87,7 @@ export default { ] }, "questionHint": { - "description": "A hint which is shown in subtle text under the question.\nThis can give some extra information on what the answer should ook like", + "description": "question: Should some extra information be shown to the contributor, alongside the question?\nThis hint is shown in subtle text under the question.\nThis can give some extra information on what the answer should ook like\nifunset: No extra hint is given", "anyOf": [ { "$ref": "#/definitions/Record" @@ -24,94 +97,15 @@ export default { } ] }, - "freeform": { - "description": "Allow freeform text input from the user", - "type": "object", - "properties": { - "key": { - "type": "string" - }, - "type": { - "description": "The type of the text-field, e.g. 'string', 'nat', 'float', 'date',...\nSee Docs/SpecialInputElements.md and UI/Input/ValidatedTextField.ts for supported values", - "type": "string" - }, - "placeholder": { - "description": "A (translated) text that is shown (as gray text) within the textfield" - }, - "helperArgs": { - "description": "Extra parameters to initialize the input helper arguments.\nFor semantics, see the 'SpecialInputElements.md'", - "type": "array", - "items": {} - }, - "addExtraTags": { - "description": "If a value is added with the textfield, these extra tag is addded.\nUseful to add a 'fixme=freeform textfield used - to be checked'", - "type": "array", - "items": { - "type": "string" - } - }, - "inline": { - "description": "When set, influences the way a question is asked.\nInstead of showing a full-width text field, the text field will be shown within the rendering of the question.\n\nThis combines badly with special input elements, as it'll distort the layout.\nNote that this will be set automatically if no special elements are present.", - "type": "boolean" - }, - "default": { - "description": "default value to enter if no previous tagging is present.\nNormally undefined (aka do not enter anything)", - "type": "string" - } - }, - "required": [ - "key" - ] - }, - "multiAnswer": { - "description": "If true, use checkboxes instead of radio buttons when asking the question", - "type": "boolean" - }, - "mappings": { - "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", - "type": "array", - "items": { - "$ref": "#/definitions/MappingConfigJson" - } - }, - "id": { - "description": "The id of the tagrendering, should be an unique string.\nUsed to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise.\n\nUse 'questions' to trigger the question box of this group (if a group is defined)", - "type": "string" - }, "labels": { - "description": "A list of labels. These are strings that are used for various purposes, e.g. to filter them away", + "description": "A list of labels. These are strings that are used for various purposes, e.g. to only include a subset of the tagRenderings when reusing a layer", "type": "array", "items": { "type": "string" } }, - "classes": { - "description": "A list of css-classes to apply to the entire tagRendering if the answer is known (not applied on the question).\nThis is only for advanced users", - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "string" - } - ] - }, - "description": { - "description": "A human-readable text explaining what this tagRendering does", - "anyOf": [ - { - "$ref": "#/definitions/Record" - }, - { - "type": "string" - } - ] - }, "render": { - "description": "Renders this value. Note that \"{key}\"-parts are substituted by the corresponding values of the element.\nIf neither 'textFieldQuestion' nor 'mappings' are defined, this text is simply shown as default value.\n\nNote 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
`\ntype: rendered", + "description": "question: What text should be rendered?\n\nThis piece of text will be shown in the infobox.\nIn this text, values within braces (such as {braced(key)}) are replaced by the corresponding `value` in the object.\nFor example, if the object contains tags `amenity=school; name=Windy Hill School`, the render string `This school is named {name}` will be shown to the user as `This school is named Windy Hill School`\n\nThis text will be shown if:\n- there is no mapping which matches (or there are no matches)\n- no question, no mappings and no 'freeform' is set\n\nNote that this is a HTML-interpreted value, so you can add links as e.g. '<a href='{website}'>{website}</a>' or include images such as `This is of type A <br><img src='typeA-icon.svg' />`\ntype: rendered\nifunset: no text is rendered if no predefined options match", "anyOf": [ { "$ref": "#/definitions/Record" @@ -147,16 +141,38 @@ export default { } ] }, - "condition": { - "description": "Only show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", + "icon": { + "description": "question: what icon should be shown next to the 'render' value?\nAn icon shown next to the rendering; typically shown pretty small\nThis is only shown next to the \"render\" value\nType: icon\nifunset: do not show an icon next to the \"render\"-value", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "type": "object", + "properties": { + "path": { + "description": "The path to the icon\nType: icon", + "type": "string" + }, + "class": { + "description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-', so defining your own in combination with a custom CSS is possible (but discouraged)", + "type": "string" + } + }, + "required": [ + "path" + ] }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "type": "string" + } + ] + }, + "condition": { + "description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or ask the question if unkown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", + "anyOf": [ + { + "$ref": "#/definitions/{and:TagConfigJson[];}" + }, + { + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -164,31 +180,46 @@ export default { ] }, "metacondition": { - "description": "If set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", + "description": "question: When should this item be shown (including special conditions)?\ntype: tag\n\nIf set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" } ] - } - }, - "definitions": { - "TagConfigJson": { - "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation", + }, + "description": { + "description": "A human-readable text explaining what this tagRendering does.\nMostly used for the shared tagrenderings", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson" + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] + }, + "classes": { + "description": "question: What css-classes should be applied to showing this attribute?\n\nA list of css-classes to apply to the entire tagRendering.\nThese classes are applied in 'answer'-mode, not in question mode\nThis is only for advanced users.\n\nValues are split on ` ` (space)", + "type": "string" + } + }, + "required": [ + "id" + ], + "definitions": { + "TagConfigJson": { + "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation\n\ntype: tag", + "anyOf": [ + { + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", "type": "object", "properties": { "or": { @@ -207,8 +238,7 @@ export default { } ] }, - "AndTagConfigJson": { - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", + "{and:TagConfigJson[];}": { "type": "object", "properties": { "and": { @@ -222,8 +252,7 @@ export default { "and" ] }, - "OrTagConfigJson": { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", + "{or:TagConfigJson[];}": { "type": "object", "properties": { "or": { @@ -306,48 +335,99 @@ export default { "canonicalDenomination" ] }, + "MinimalTagRenderingConfigJson": { + "description": "Mostly used for lineRendering and pointRendering", + "type": "object", + "properties": { + "render": { + "description": "question: What value should be rendered?\n\nThis piece of text will be shown in the infobox.\nNote that \"&LBRACEkey&RBRACE\"-parts are substituted by the corresponding values of the element.\n\nThis value will be used if there is no mapping which matches (or there are no matches)\nNote that this is a HTML-interpreted value, so you can add links as e.g. '<a href='{website}'>{website}</a>' or include images such as `This is of type A <br><img src='typeA-icon.svg' />`", + "type": "string" + }, + "mappings": { + "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", + "type": "array", + "items": { + "type": "object", + "properties": { + "if": { + "$ref": "#/definitions/TagConfigJson", + "description": "question: When should this single mapping match?\n\nIf this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}" + }, + "then": { + "description": "question: What text should be shown?\n\nIf the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option", + "type": "string" + } + }, + "required": [ + "if", + "then" + ] + } + } + } + }, + "IconConfigJson": { + "type": "object", + "properties": { + "icon": { + "description": "question: What icon should be used?\ntype: icon\nsuggestions: return [\"pin\",\"square\",\"circle\",\"checkmark\",\"clock\",\"close\",\"crosshair\",\"help\",\"home\",\"invalid\",\"location\",\"location_empty\",\"location_locked\",\"note\",\"resolved\",\"ring\",\"scissors\",\"teardrop\",\"teardrop_with_hole_green\",\"triangle\"].map(i => ({if: \"value=\"+i, then: i, icon: i}))", + "anyOf": [ + { + "$ref": "#/definitions/MinimalTagRenderingConfigJson" + }, + { + "type": "object", + "properties": { + "builtin": { + "type": "string" + }, + "override": {} + }, + "required": [ + "builtin", + "override" + ] + }, + { + "type": "string" + } + ] + }, + "color": { + "description": "question: What colour should the icon be?\nThis will only work for the default icons such as `pin`,`circle`,...\ntype: color", + "anyOf": [ + { + "$ref": "#/definitions/MinimalTagRenderingConfigJson" + }, + { + "type": "object", + "properties": { + "builtin": { + "type": "string" + }, + "override": {} + }, + "required": [ + "builtin", + "override" + ] + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "icon" + ] + }, "TagRenderingConfigJson": { "description": "A TagRenderingConfigJson is a single piece of code which converts one ore more tags into a HTML-snippet.\nFor an _editable_ tagRendering, use 'QuestionableTagRenderingConfigJson' instead, which extends this one", "type": "object", "properties": { - "id": { - "description": "The id of the tagrendering, should be an unique string.\nUsed to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise.\n\nUse 'questions' to trigger the question box of this group (if a group is defined)", - "type": "string" - }, - "labels": { - "description": "A list of labels. These are strings that are used for various purposes, e.g. to filter them away", - "type": "array", - "items": { - "type": "string" - } - }, - "classes": { - "description": "A list of css-classes to apply to the entire tagRendering if the answer is known (not applied on the question).\nThis is only for advanced users", - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "string" - } - ] - }, - "description": { - "description": "A human-readable text explaining what this tagRendering does", - "anyOf": [ - { - "$ref": "#/definitions/Record" - }, - { - "type": "string" - } - ] - }, "render": { - "description": "Renders this value. Note that \"{key}\"-parts are substituted by the corresponding values of the element.\nIf neither 'textFieldQuestion' nor 'mappings' are defined, this text is simply shown as default value.\n\nNote 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
`\ntype: rendered", + "description": "question: What text should be rendered?\n\nThis piece of text will be shown in the infobox.\nIn this text, values within braces (such as {braced(key)}) are replaced by the corresponding `value` in the object.\nFor example, if the object contains tags `amenity=school; name=Windy Hill School`, the render string `This school is named {name}` will be shown to the user as `This school is named Windy Hill School`\n\nThis text will be shown if:\n- there is no mapping which matches (or there are no matches)\n- no question, no mappings and no 'freeform' is set\n\nNote that this is a HTML-interpreted value, so you can add links as e.g. '<a href='{website}'>{website}</a>' or include images such as `This is of type A <br><img src='typeA-icon.svg' />`\ntype: rendered\nifunset: no text is rendered if no predefined options match", "anyOf": [ { "$ref": "#/definitions/Record" @@ -383,16 +463,38 @@ export default { } ] }, - "condition": { - "description": "Only show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", + "icon": { + "description": "question: what icon should be shown next to the 'render' value?\nAn icon shown next to the rendering; typically shown pretty small\nThis is only shown next to the \"render\" value\nType: icon\nifunset: do not show an icon next to the \"render\"-value", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "type": "object", + "properties": { + "path": { + "description": "The path to the icon\nType: icon", + "type": "string" + }, + "class": { + "description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-', so defining your own in combination with a custom CSS is possible (but discouraged)", + "type": "string" + } + }, + "required": [ + "path" + ] }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "type": "string" + } + ] + }, + "condition": { + "description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or ask the question if unkown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", + "anyOf": [ + { + "$ref": "#/definitions/{and:TagConfigJson[];}" + }, + { + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -400,15 +502,13 @@ export default { ] }, "metacondition": { - "description": "If set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", + "description": "question: When should this item be shown (including special conditions)?\ntype: tag\n\nIf set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -416,17 +516,14 @@ export default { ] }, "freeform": { - "description": "Allow freeform text input from the user", + "description": "question: Should a freeform text field be shown?\nAllow freeform text input from the user\nifunset: Do not add a freeform text field", "type": "object", "properties": { "key": { - "description": "If this key is present, then 'render' is used to display the value.\nIf this is undefined, the rendering is _always_ shown", + "description": "What attribute should be filled out\nIf this key is present in the feature, then 'render' is used to display the value.\nIf this is undefined, the rendering is _always_ shown", "type": "string" } - }, - "required": [ - "key" - ] + } }, "mappings": { "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", @@ -436,10 +533,10 @@ export default { "properties": { "if": { "$ref": "#/definitions/TagConfigJson", - "description": "If this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}" + "description": "question: When should this single mapping match?\n\nIf this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}" }, "then": { - "description": "If the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option\nType: rendered", + "description": "question: What text should be shown?\n\nIf the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option\nType: rendered", "anyOf": [ { "$ref": "#/definitions/Record" @@ -450,7 +547,7 @@ export default { ] }, "icon": { - "description": "An icon supporting this mapping; typically shown pretty small\nType: icon", + "description": "question: What icon should be added to this mapping?\nifunset: Do not show an extra icon next to the render value\n\nAn icon supporting this mapping; typically shown pretty small.\nThis can be used to show a 'phone'-icon next to the phone number\ninline: {icon}\nType: icon", "anyOf": [ { "type": "object", @@ -479,6 +576,21 @@ export default { "then" ] } + }, + "description": { + "description": "A human-readable text explaining what this tagRendering does.\nMostly used for the shared tagrenderings", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] + }, + "classes": { + "description": "question: What css-classes should be applied to showing this attribute?\n\nA list of css-classes to apply to the entire tagRendering.\nThese classes are applied in 'answer'-mode, not in question mode\nThis is only for advanced users.\n\nValues are split on ` ` (space)", + "type": "string" } } }, @@ -490,13 +602,21 @@ export default { "properties": { "if": { "$ref": "#/definitions/TagConfigJson", - "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation" + "description": "question: What tags should be matched to show this option?\n\nIf in 'question'-mode and the contributor selects this option, these tags will be applied to the object" }, "then": { - "description": "Shown if the 'if is fulfilled\nType: rendered" + "description": "Question: What corresponding text should be shown?\nShown if the `if` is fulfilled\nType: rendered", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] }, "icon": { - "description": "An extra icon supporting the choice\nType: icon", + "description": "question: What icon should be shown next to this mapping?\n\nThis icon will only be shown if the value is known, it is not displayed in the options (but might be in the future)\n\nifunset: Show no icon\nType: icon", "anyOf": [ { "type": "object", @@ -520,15 +640,13 @@ export default { ] }, "hideInAnswer": { - "description": "In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n\n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}", + "description": "question: Under what circumstances should this mapping be hidden from the possibilities a contributor can pick?\niftrue: Never show this mapping as option to pick\nifunset: Always show this mapping as option to pick\ntype: tag\n\nIn some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n\n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": [ @@ -539,15 +657,13 @@ export default { ] }, "ifnot": { - "description": "Only applicable if 'multiAnswer' is set.\nThis is for situations such as:\n`accepts:coins=no` where one can select all the possible payment methods. However, we want to make explicit that some options _were not_ selected.\nThis can be done with `ifnot`\nNote that we can not explicitly render this negative case to the user, we cannot show `does _not_ accept coins`.\nIf this is important to your usecase, consider using multiple radiobutton-fields without `multiAnswer`", + "description": "question: What tags should be applied if this mapping is _not_ chosen?\n\nOnly applicable if 'multiAnswer' is set.\nThis is for situations such as:\n`accepts:coins=no` where one can select all the possible payment methods. However, we want to make explicit that some options _were not_ selected.\nThis can be done with `ifnot`\nNote that we can not explicitly render this negative case to the user, we cannot show `does _not_ accept coins`.\nIf this is important to your usecase, consider using multiple radiobutton-fields without `multiAnswer`\n\nifunset: Do not apply a tag if a different mapping is chosen.", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -555,26 +671,24 @@ export default { ] }, "addExtraTags": { - "description": "If chosen as answer, these tags will be applied as well onto the object.\nNot compatible with multiAnswer.\n\nThis can be used e.g. to erase other keys which indicate the 'not' value:\n```json\n{\n \"if\": \"crossing:marking=rainbow\",\n \"then\": \"This is a rainbow crossing\",\n \"addExtraTags\": \"not:crossing:marking=\"\n}\n```", + "description": "question: What extra tags should be added to the object if this object is chosen?\ntype: simple_tag\n\nIf chosen as answer, these tags will be applied onto the object, together with the tags from the `if`\nNot compatible with multiAnswer.\n\nThis can be used e.g. to erase other keys which indicate the 'not' value:\n```json\n{\n \"if\": \"crossing:marking=rainbow\",\n \"then\": \"This is a rainbow crossing\",\n \"addExtraTags\": [\"not:crossing:marking=\"]\n}\n```", "type": "array", "items": { "type": "string" } }, "searchTerms": { - "description": "If there are many options, the mappings-radiobuttons will be replaced by an element with a searchfunction\n\nSearchterms (per language) allow to easily find an option if there are many options", + "description": "question: If there are many options, what search terms match too?\nIf there are many options, the mappings-radiobuttons will be replaced by an element with a searchfunction\n\nSearchterms (per language) allow to easily find an option if there are many options\ngroup: hidden", "$ref": "#/definitions/Record" }, "priorityIf": { - "description": "If the searchable selector is picked, mappings with this item will have priority and show up even if the others are hidden\nUse this sparingly", + "description": "If the searchable selector is picked, mappings with this item will have priority and show up even if the others are hidden\nUse this sparingly\ngroup: hidden", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -582,7 +696,7 @@ export default { ] }, "#": { - "description": "Used for comments or to disable a validation\n\nignore-image-in-then: normally, a `then`-clause is not allowed to have an `img`-html-element as icons are preferred. In some cases (most notably title-icons), this is allowed", + "description": "Used for comments or to disable a validation\n\ngroup: hidden\nignore-image-in-then: normally, a `then`-clause is not allowed to have an `img`-html-element as icons are preferred. In some cases (most notably title-icons), this is allowed", "type": "string" } }, diff --git a/Docs/Schemas/RewritableConfigJson.schema.json b/Docs/Schemas/RewritableConfigJson.schema.json index 01dbd836f..4fc01a982 100644 --- a/Docs/Schemas/RewritableConfigJson.schema.json +++ b/Docs/Schemas/RewritableConfigJson.schema.json @@ -34,13 +34,12 @@ ], "definitions": { "TagConfigJson": { - "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation", + "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation\n\ntype: tag", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", "type": "object", "properties": { "or": { @@ -59,8 +58,7 @@ } ] }, - "AndTagConfigJson": { - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", + "{and:TagConfigJson[];}": { "type": "object", "properties": { "and": { @@ -75,8 +73,7 @@ ], "additionalProperties": false }, - "OrTagConfigJson": { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", + "{or:TagConfigJson[];}": { "type": "object", "properties": { "or": { @@ -163,48 +160,101 @@ ], "additionalProperties": false }, + "MinimalTagRenderingConfigJson": { + "description": "Mostly used for lineRendering and pointRendering", + "type": "object", + "properties": { + "render": { + "description": "question: What value should be rendered?\n\nThis piece of text will be shown in the infobox.\nNote that \"&LBRACEkey&RBRACE\"-parts are substituted by the corresponding values of the element.\n\nThis value will be used if there is no mapping which matches (or there are no matches)\nNote that this is a HTML-interpreted value, so you can add links as e.g. '<a href='{website}'>{website}</a>' or include images such as `This is of type A <br><img src='typeA-icon.svg' />`", + "type": "string" + }, + "mappings": { + "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", + "type": "array", + "items": { + "type": "object", + "properties": { + "if": { + "$ref": "#/definitions/TagConfigJson", + "description": "question: When should this single mapping match?\n\nIf this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}" + }, + "then": { + "description": "question: What text should be shown?\n\nIf the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option", + "type": "string" + } + }, + "required": [ + "if", + "then" + ] + } + } + }, + "additionalProperties": false + }, + "IconConfigJson": { + "type": "object", + "properties": { + "icon": { + "description": "question: What icon should be used?\ntype: icon\nsuggestions: return [\"pin\",\"square\",\"circle\",\"checkmark\",\"clock\",\"close\",\"crosshair\",\"help\",\"home\",\"invalid\",\"location\",\"location_empty\",\"location_locked\",\"note\",\"resolved\",\"ring\",\"scissors\",\"teardrop\",\"teardrop_with_hole_green\",\"triangle\"].map(i => ({if: \"value=\"+i, then: i, icon: i}))", + "anyOf": [ + { + "$ref": "#/definitions/MinimalTagRenderingConfigJson" + }, + { + "type": "object", + "properties": { + "builtin": { + "type": "string" + }, + "override": {} + }, + "required": [ + "builtin", + "override" + ] + }, + { + "type": "string" + } + ] + }, + "color": { + "description": "question: What colour should the icon be?\nThis will only work for the default icons such as `pin`,`circle`,...\ntype: color", + "anyOf": [ + { + "$ref": "#/definitions/MinimalTagRenderingConfigJson" + }, + { + "type": "object", + "properties": { + "builtin": { + "type": "string" + }, + "override": {} + }, + "required": [ + "builtin", + "override" + ] + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "icon" + ], + "additionalProperties": false + }, "TagRenderingConfigJson": { "description": "A TagRenderingConfigJson is a single piece of code which converts one ore more tags into a HTML-snippet.\nFor an _editable_ tagRendering, use 'QuestionableTagRenderingConfigJson' instead, which extends this one", "type": "object", "properties": { - "id": { - "description": "The id of the tagrendering, should be an unique string.\nUsed to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise.\n\nUse 'questions' to trigger the question box of this group (if a group is defined)", - "type": "string" - }, - "labels": { - "description": "A list of labels. These are strings that are used for various purposes, e.g. to filter them away", - "type": "array", - "items": { - "type": "string" - } - }, - "classes": { - "description": "A list of css-classes to apply to the entire tagRendering if the answer is known (not applied on the question).\nThis is only for advanced users", - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "string" - } - ] - }, - "description": { - "description": "A human-readable text explaining what this tagRendering does", - "anyOf": [ - { - "$ref": "#/definitions/Record" - }, - { - "type": "string" - } - ] - }, "render": { - "description": "Renders this value. Note that \"{key}\"-parts are substituted by the corresponding values of the element.\nIf neither 'textFieldQuestion' nor 'mappings' are defined, this text is simply shown as default value.\n\nNote 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
`\ntype: rendered", + "description": "question: What text should be rendered?\n\nThis piece of text will be shown in the infobox.\nIn this text, values within braces (such as {braced(key)}) are replaced by the corresponding `value` in the object.\nFor example, if the object contains tags `amenity=school; name=Windy Hill School`, the render string `This school is named {name}` will be shown to the user as `This school is named Windy Hill School`\n\nThis text will be shown if:\n- there is no mapping which matches (or there are no matches)\n- no question, no mappings and no 'freeform' is set\n\nNote that this is a HTML-interpreted value, so you can add links as e.g. '<a href='{website}'>{website}</a>' or include images such as `This is of type A <br><img src='typeA-icon.svg' />`\ntype: rendered\nifunset: no text is rendered if no predefined options match", "anyOf": [ { "$ref": "#/definitions/Record" @@ -240,16 +290,38 @@ } ] }, - "condition": { - "description": "Only show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", + "icon": { + "description": "question: what icon should be shown next to the 'render' value?\nAn icon shown next to the rendering; typically shown pretty small\nThis is only shown next to the \"render\" value\nType: icon\nifunset: do not show an icon next to the \"render\"-value", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "type": "object", + "properties": { + "path": { + "description": "The path to the icon\nType: icon", + "type": "string" + }, + "class": { + "description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-', so defining your own in combination with a custom CSS is possible (but discouraged)", + "type": "string" + } + }, + "required": [ + "path" + ] }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "type": "string" + } + ] + }, + "condition": { + "description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or ask the question if unkown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", + "anyOf": [ + { + "$ref": "#/definitions/{and:TagConfigJson[];}" + }, + { + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -257,15 +329,13 @@ ] }, "metacondition": { - "description": "If set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", + "description": "question: When should this item be shown (including special conditions)?\ntype: tag\n\nIf set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -273,17 +343,14 @@ ] }, "freeform": { - "description": "Allow freeform text input from the user", + "description": "question: Should a freeform text field be shown?\nAllow freeform text input from the user\nifunset: Do not add a freeform text field", "type": "object", "properties": { "key": { - "description": "If this key is present, then 'render' is used to display the value.\nIf this is undefined, the rendering is _always_ shown", + "description": "What attribute should be filled out\nIf this key is present in the feature, then 'render' is used to display the value.\nIf this is undefined, the rendering is _always_ shown", "type": "string" } - }, - "required": [ - "key" - ] + } }, "mappings": { "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", @@ -293,10 +360,10 @@ "properties": { "if": { "$ref": "#/definitions/TagConfigJson", - "description": "If this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}" + "description": "question: When should this single mapping match?\n\nIf this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}" }, "then": { - "description": "If the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option\nType: rendered", + "description": "question: What text should be shown?\n\nIf the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option\nType: rendered", "anyOf": [ { "$ref": "#/definitions/Record" @@ -307,7 +374,7 @@ ] }, "icon": { - "description": "An icon supporting this mapping; typically shown pretty small\nType: icon", + "description": "question: What icon should be added to this mapping?\nifunset: Do not show an extra icon next to the render value\n\nAn icon supporting this mapping; typically shown pretty small.\nThis can be used to show a 'phone'-icon next to the phone number\ninline: {icon}\nType: icon", "anyOf": [ { "type": "object", @@ -336,6 +403,21 @@ "then" ] } + }, + "description": { + "description": "A human-readable text explaining what this tagRendering does.\nMostly used for the shared tagrenderings", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] + }, + "classes": { + "description": "question: What css-classes should be applied to showing this attribute?\n\nA list of css-classes to apply to the entire tagRendering.\nThese classes are applied in 'answer'-mode, not in question mode\nThis is only for advanced users.\n\nValues are split on ` ` (space)", + "type": "string" } }, "additionalProperties": false @@ -349,13 +431,21 @@ "properties": { "if": { "$ref": "#/definitions/TagConfigJson", - "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation" + "description": "question: What tags should be matched to show this option?\n\nIf in 'question'-mode and the contributor selects this option, these tags will be applied to the object" }, "then": { - "description": "Shown if the 'if is fulfilled\nType: rendered" + "description": "Question: What corresponding text should be shown?\nShown if the `if` is fulfilled\nType: rendered", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] }, "icon": { - "description": "An extra icon supporting the choice\nType: icon", + "description": "question: What icon should be shown next to this mapping?\n\nThis icon will only be shown if the value is known, it is not displayed in the options (but might be in the future)\n\nifunset: Show no icon\nType: icon", "anyOf": [ { "type": "object", @@ -379,15 +469,13 @@ ] }, "hideInAnswer": { - "description": "In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n\n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}", + "description": "question: Under what circumstances should this mapping be hidden from the possibilities a contributor can pick?\niftrue: Never show this mapping as option to pick\nifunset: Always show this mapping as option to pick\ntype: tag\n\nIn some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n\n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": [ @@ -398,15 +486,13 @@ ] }, "ifnot": { - "description": "Only applicable if 'multiAnswer' is set.\nThis is for situations such as:\n`accepts:coins=no` where one can select all the possible payment methods. However, we want to make explicit that some options _were not_ selected.\nThis can be done with `ifnot`\nNote that we can not explicitly render this negative case to the user, we cannot show `does _not_ accept coins`.\nIf this is important to your usecase, consider using multiple radiobutton-fields without `multiAnswer`", + "description": "question: What tags should be applied if this mapping is _not_ chosen?\n\nOnly applicable if 'multiAnswer' is set.\nThis is for situations such as:\n`accepts:coins=no` where one can select all the possible payment methods. However, we want to make explicit that some options _were not_ selected.\nThis can be done with `ifnot`\nNote that we can not explicitly render this negative case to the user, we cannot show `does _not_ accept coins`.\nIf this is important to your usecase, consider using multiple radiobutton-fields without `multiAnswer`\n\nifunset: Do not apply a tag if a different mapping is chosen.", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -414,26 +500,24 @@ ] }, "addExtraTags": { - "description": "If chosen as answer, these tags will be applied as well onto the object.\nNot compatible with multiAnswer.\n\nThis can be used e.g. to erase other keys which indicate the 'not' value:\n```json\n{\n \"if\": \"crossing:marking=rainbow\",\n \"then\": \"This is a rainbow crossing\",\n \"addExtraTags\": \"not:crossing:marking=\"\n}\n```", + "description": "question: What extra tags should be added to the object if this object is chosen?\ntype: simple_tag\n\nIf chosen as answer, these tags will be applied onto the object, together with the tags from the `if`\nNot compatible with multiAnswer.\n\nThis can be used e.g. to erase other keys which indicate the 'not' value:\n```json\n{\n \"if\": \"crossing:marking=rainbow\",\n \"then\": \"This is a rainbow crossing\",\n \"addExtraTags\": [\"not:crossing:marking=\"]\n}\n```", "type": "array", "items": { "type": "string" } }, "searchTerms": { - "description": "If there are many options, the mappings-radiobuttons will be replaced by an element with a searchfunction\n\nSearchterms (per language) allow to easily find an option if there are many options", + "description": "question: If there are many options, what search terms match too?\nIf there are many options, the mappings-radiobuttons will be replaced by an element with a searchfunction\n\nSearchterms (per language) allow to easily find an option if there are many options\ngroup: hidden", "$ref": "#/definitions/Record" }, "priorityIf": { - "description": "If the searchable selector is picked, mappings with this item will have priority and show up even if the others are hidden\nUse this sparingly", + "description": "If the searchable selector is picked, mappings with this item will have priority and show up even if the others are hidden\nUse this sparingly\ngroup: hidden", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -441,7 +525,7 @@ ] }, "#": { - "description": "Used for comments or to disable a validation\n\nignore-image-in-then: normally, a `then`-clause is not allowed to have an `img`-html-element as icons are preferred. In some cases (most notably title-icons), this is allowed", + "description": "Used for comments or to disable a validation\n\ngroup: hidden\nignore-image-in-then: normally, a `then`-clause is not allowed to have an `img`-html-element as icons are preferred. In some cases (most notably title-icons), this is allowed", "type": "string" } }, diff --git a/Docs/Schemas/RewritableConfigJsonJSC.ts b/Docs/Schemas/RewritableConfigJsonJSC.ts index b173395d5..7ab97f2be 100644 --- a/Docs/Schemas/RewritableConfigJsonJSC.ts +++ b/Docs/Schemas/RewritableConfigJsonJSC.ts @@ -34,13 +34,12 @@ export default { ], "definitions": { "TagConfigJson": { - "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation", + "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation\n\ntype: tag", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", "type": "object", "properties": { "or": { @@ -59,8 +58,7 @@ export default { } ] }, - "AndTagConfigJson": { - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", + "{and:TagConfigJson[];}": { "type": "object", "properties": { "and": { @@ -74,8 +72,7 @@ export default { "and" ] }, - "OrTagConfigJson": { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", + "{or:TagConfigJson[];}": { "type": "object", "properties": { "or": { @@ -158,48 +155,99 @@ export default { "canonicalDenomination" ] }, + "MinimalTagRenderingConfigJson": { + "description": "Mostly used for lineRendering and pointRendering", + "type": "object", + "properties": { + "render": { + "description": "question: What value should be rendered?\n\nThis piece of text will be shown in the infobox.\nNote that \"&LBRACEkey&RBRACE\"-parts are substituted by the corresponding values of the element.\n\nThis value will be used if there is no mapping which matches (or there are no matches)\nNote that this is a HTML-interpreted value, so you can add links as e.g. '<a href='{website}'>{website}</a>' or include images such as `This is of type A <br><img src='typeA-icon.svg' />`", + "type": "string" + }, + "mappings": { + "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", + "type": "array", + "items": { + "type": "object", + "properties": { + "if": { + "$ref": "#/definitions/TagConfigJson", + "description": "question: When should this single mapping match?\n\nIf this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}" + }, + "then": { + "description": "question: What text should be shown?\n\nIf the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option", + "type": "string" + } + }, + "required": [ + "if", + "then" + ] + } + } + } + }, + "IconConfigJson": { + "type": "object", + "properties": { + "icon": { + "description": "question: What icon should be used?\ntype: icon\nsuggestions: return [\"pin\",\"square\",\"circle\",\"checkmark\",\"clock\",\"close\",\"crosshair\",\"help\",\"home\",\"invalid\",\"location\",\"location_empty\",\"location_locked\",\"note\",\"resolved\",\"ring\",\"scissors\",\"teardrop\",\"teardrop_with_hole_green\",\"triangle\"].map(i => ({if: \"value=\"+i, then: i, icon: i}))", + "anyOf": [ + { + "$ref": "#/definitions/MinimalTagRenderingConfigJson" + }, + { + "type": "object", + "properties": { + "builtin": { + "type": "string" + }, + "override": {} + }, + "required": [ + "builtin", + "override" + ] + }, + { + "type": "string" + } + ] + }, + "color": { + "description": "question: What colour should the icon be?\nThis will only work for the default icons such as `pin`,`circle`,...\ntype: color", + "anyOf": [ + { + "$ref": "#/definitions/MinimalTagRenderingConfigJson" + }, + { + "type": "object", + "properties": { + "builtin": { + "type": "string" + }, + "override": {} + }, + "required": [ + "builtin", + "override" + ] + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "icon" + ] + }, "TagRenderingConfigJson": { "description": "A TagRenderingConfigJson is a single piece of code which converts one ore more tags into a HTML-snippet.\nFor an _editable_ tagRendering, use 'QuestionableTagRenderingConfigJson' instead, which extends this one", "type": "object", "properties": { - "id": { - "description": "The id of the tagrendering, should be an unique string.\nUsed to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise.\n\nUse 'questions' to trigger the question box of this group (if a group is defined)", - "type": "string" - }, - "labels": { - "description": "A list of labels. These are strings that are used for various purposes, e.g. to filter them away", - "type": "array", - "items": { - "type": "string" - } - }, - "classes": { - "description": "A list of css-classes to apply to the entire tagRendering if the answer is known (not applied on the question).\nThis is only for advanced users", - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "string" - } - ] - }, - "description": { - "description": "A human-readable text explaining what this tagRendering does", - "anyOf": [ - { - "$ref": "#/definitions/Record" - }, - { - "type": "string" - } - ] - }, "render": { - "description": "Renders this value. Note that \"{key}\"-parts are substituted by the corresponding values of the element.\nIf neither 'textFieldQuestion' nor 'mappings' are defined, this text is simply shown as default value.\n\nNote 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
`\ntype: rendered", + "description": "question: What text should be rendered?\n\nThis piece of text will be shown in the infobox.\nIn this text, values within braces (such as {braced(key)}) are replaced by the corresponding `value` in the object.\nFor example, if the object contains tags `amenity=school; name=Windy Hill School`, the render string `This school is named {name}` will be shown to the user as `This school is named Windy Hill School`\n\nThis text will be shown if:\n- there is no mapping which matches (or there are no matches)\n- no question, no mappings and no 'freeform' is set\n\nNote that this is a HTML-interpreted value, so you can add links as e.g. '<a href='{website}'>{website}</a>' or include images such as `This is of type A <br><img src='typeA-icon.svg' />`\ntype: rendered\nifunset: no text is rendered if no predefined options match", "anyOf": [ { "$ref": "#/definitions/Record" @@ -235,16 +283,38 @@ export default { } ] }, - "condition": { - "description": "Only show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", + "icon": { + "description": "question: what icon should be shown next to the 'render' value?\nAn icon shown next to the rendering; typically shown pretty small\nThis is only shown next to the \"render\" value\nType: icon\nifunset: do not show an icon next to the \"render\"-value", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "type": "object", + "properties": { + "path": { + "description": "The path to the icon\nType: icon", + "type": "string" + }, + "class": { + "description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-', so defining your own in combination with a custom CSS is possible (but discouraged)", + "type": "string" + } + }, + "required": [ + "path" + ] }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "type": "string" + } + ] + }, + "condition": { + "description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or ask the question if unkown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", + "anyOf": [ + { + "$ref": "#/definitions/{and:TagConfigJson[];}" + }, + { + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -252,15 +322,13 @@ export default { ] }, "metacondition": { - "description": "If set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", + "description": "question: When should this item be shown (including special conditions)?\ntype: tag\n\nIf set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -268,17 +336,14 @@ export default { ] }, "freeform": { - "description": "Allow freeform text input from the user", + "description": "question: Should a freeform text field be shown?\nAllow freeform text input from the user\nifunset: Do not add a freeform text field", "type": "object", "properties": { "key": { - "description": "If this key is present, then 'render' is used to display the value.\nIf this is undefined, the rendering is _always_ shown", + "description": "What attribute should be filled out\nIf this key is present in the feature, then 'render' is used to display the value.\nIf this is undefined, the rendering is _always_ shown", "type": "string" } - }, - "required": [ - "key" - ] + } }, "mappings": { "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", @@ -288,10 +353,10 @@ export default { "properties": { "if": { "$ref": "#/definitions/TagConfigJson", - "description": "If this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}" + "description": "question: When should this single mapping match?\n\nIf this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}" }, "then": { - "description": "If the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option\nType: rendered", + "description": "question: What text should be shown?\n\nIf the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option\nType: rendered", "anyOf": [ { "$ref": "#/definitions/Record" @@ -302,7 +367,7 @@ export default { ] }, "icon": { - "description": "An icon supporting this mapping; typically shown pretty small\nType: icon", + "description": "question: What icon should be added to this mapping?\nifunset: Do not show an extra icon next to the render value\n\nAn icon supporting this mapping; typically shown pretty small.\nThis can be used to show a 'phone'-icon next to the phone number\ninline: {icon}\nType: icon", "anyOf": [ { "type": "object", @@ -331,6 +396,21 @@ export default { "then" ] } + }, + "description": { + "description": "A human-readable text explaining what this tagRendering does.\nMostly used for the shared tagrenderings", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] + }, + "classes": { + "description": "question: What css-classes should be applied to showing this attribute?\n\nA list of css-classes to apply to the entire tagRendering.\nThese classes are applied in 'answer'-mode, not in question mode\nThis is only for advanced users.\n\nValues are split on ` ` (space)", + "type": "string" } } }, @@ -342,13 +422,21 @@ export default { "properties": { "if": { "$ref": "#/definitions/TagConfigJson", - "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation" + "description": "question: What tags should be matched to show this option?\n\nIf in 'question'-mode and the contributor selects this option, these tags will be applied to the object" }, "then": { - "description": "Shown if the 'if is fulfilled\nType: rendered" + "description": "Question: What corresponding text should be shown?\nShown if the `if` is fulfilled\nType: rendered", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] }, "icon": { - "description": "An extra icon supporting the choice\nType: icon", + "description": "question: What icon should be shown next to this mapping?\n\nThis icon will only be shown if the value is known, it is not displayed in the options (but might be in the future)\n\nifunset: Show no icon\nType: icon", "anyOf": [ { "type": "object", @@ -372,15 +460,13 @@ export default { ] }, "hideInAnswer": { - "description": "In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n\n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}", + "description": "question: Under what circumstances should this mapping be hidden from the possibilities a contributor can pick?\niftrue: Never show this mapping as option to pick\nifunset: Always show this mapping as option to pick\ntype: tag\n\nIn some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n\n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": [ @@ -391,15 +477,13 @@ export default { ] }, "ifnot": { - "description": "Only applicable if 'multiAnswer' is set.\nThis is for situations such as:\n`accepts:coins=no` where one can select all the possible payment methods. However, we want to make explicit that some options _were not_ selected.\nThis can be done with `ifnot`\nNote that we can not explicitly render this negative case to the user, we cannot show `does _not_ accept coins`.\nIf this is important to your usecase, consider using multiple radiobutton-fields without `multiAnswer`", + "description": "question: What tags should be applied if this mapping is _not_ chosen?\n\nOnly applicable if 'multiAnswer' is set.\nThis is for situations such as:\n`accepts:coins=no` where one can select all the possible payment methods. However, we want to make explicit that some options _were not_ selected.\nThis can be done with `ifnot`\nNote that we can not explicitly render this negative case to the user, we cannot show `does _not_ accept coins`.\nIf this is important to your usecase, consider using multiple radiobutton-fields without `multiAnswer`\n\nifunset: Do not apply a tag if a different mapping is chosen.", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -407,26 +491,24 @@ export default { ] }, "addExtraTags": { - "description": "If chosen as answer, these tags will be applied as well onto the object.\nNot compatible with multiAnswer.\n\nThis can be used e.g. to erase other keys which indicate the 'not' value:\n```json\n{\n \"if\": \"crossing:marking=rainbow\",\n \"then\": \"This is a rainbow crossing\",\n \"addExtraTags\": \"not:crossing:marking=\"\n}\n```", + "description": "question: What extra tags should be added to the object if this object is chosen?\ntype: simple_tag\n\nIf chosen as answer, these tags will be applied onto the object, together with the tags from the `if`\nNot compatible with multiAnswer.\n\nThis can be used e.g. to erase other keys which indicate the 'not' value:\n```json\n{\n \"if\": \"crossing:marking=rainbow\",\n \"then\": \"This is a rainbow crossing\",\n \"addExtraTags\": [\"not:crossing:marking=\"]\n}\n```", "type": "array", "items": { "type": "string" } }, "searchTerms": { - "description": "If there are many options, the mappings-radiobuttons will be replaced by an element with a searchfunction\n\nSearchterms (per language) allow to easily find an option if there are many options", + "description": "question: If there are many options, what search terms match too?\nIf there are many options, the mappings-radiobuttons will be replaced by an element with a searchfunction\n\nSearchterms (per language) allow to easily find an option if there are many options\ngroup: hidden", "$ref": "#/definitions/Record" }, "priorityIf": { - "description": "If the searchable selector is picked, mappings with this item will have priority and show up even if the others are hidden\nUse this sparingly", + "description": "If the searchable selector is picked, mappings with this item will have priority and show up even if the others are hidden\nUse this sparingly\ngroup: hidden", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -434,7 +516,7 @@ export default { ] }, "#": { - "description": "Used for comments or to disable a validation\n\nignore-image-in-then: normally, a `then`-clause is not allowed to have an `img`-html-element as icons are preferred. In some cases (most notably title-icons), this is allowed", + "description": "Used for comments or to disable a validation\n\ngroup: hidden\nignore-image-in-then: normally, a `then`-clause is not allowed to have an `img`-html-element as icons are preferred. In some cases (most notably title-icons), this is allowed", "type": "string" } }, diff --git a/Docs/Schemas/TagConfigJson.schema.json b/Docs/Schemas/TagConfigJson.schema.json index 326d7601d..55854f4a6 100644 --- a/Docs/Schemas/TagConfigJson.schema.json +++ b/Docs/Schemas/TagConfigJson.schema.json @@ -1,15 +1,14 @@ { "$ref": "#/definitions/TagConfigJson", - "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation", + "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation\n\ntype: tag", "definitions": { "TagConfigJson": { - "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation", + "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation\n\ntype: tag", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", "type": "object", "properties": { "or": { @@ -28,8 +27,7 @@ } ] }, - "AndTagConfigJson": { - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", + "{and:TagConfigJson[];}": { "type": "object", "properties": { "and": { diff --git a/Docs/Schemas/TagConfigJsonJSC.ts b/Docs/Schemas/TagConfigJsonJSC.ts index 5c3745a21..63d606219 100644 --- a/Docs/Schemas/TagConfigJsonJSC.ts +++ b/Docs/Schemas/TagConfigJsonJSC.ts @@ -1,15 +1,14 @@ export default { "$ref": "#/definitions/TagConfigJson", - "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation", + "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation\n\ntype: tag", "definitions": { "TagConfigJson": { - "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation", + "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation\n\ntype: tag", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", "type": "object", "properties": { "or": { @@ -28,8 +27,7 @@ export default { } ] }, - "AndTagConfigJson": { - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", + "{and:TagConfigJson[];}": { "type": "object", "properties": { "and": { diff --git a/Docs/Schemas/TagRenderingConfigJson.schema.json b/Docs/Schemas/TagRenderingConfigJson.schema.json index 3453db4de..7a62d57c9 100644 --- a/Docs/Schemas/TagRenderingConfigJson.schema.json +++ b/Docs/Schemas/TagRenderingConfigJson.schema.json @@ -2,44 +2,8 @@ "description": "A TagRenderingConfigJson is a single piece of code which converts one ore more tags into a HTML-snippet.\nFor an _editable_ tagRendering, use 'QuestionableTagRenderingConfigJson' instead, which extends this one", "type": "object", "properties": { - "id": { - "description": "The id of the tagrendering, should be an unique string.\nUsed to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise.\n\nUse 'questions' to trigger the question box of this group (if a group is defined)", - "type": "string" - }, - "labels": { - "description": "A list of labels. These are strings that are used for various purposes, e.g. to filter them away", - "type": "array", - "items": { - "type": "string" - } - }, - "classes": { - "description": "A list of css-classes to apply to the entire tagRendering if the answer is known (not applied on the question).\nThis is only for advanced users", - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "string" - } - ] - }, - "description": { - "description": "A human-readable text explaining what this tagRendering does", - "anyOf": [ - { - "$ref": "#/definitions/Record" - }, - { - "type": "string" - } - ] - }, "render": { - "description": "Renders this value. Note that \"{key}\"-parts are substituted by the corresponding values of the element.\nIf neither 'textFieldQuestion' nor 'mappings' are defined, this text is simply shown as default value.\n\nNote 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
`\ntype: rendered", + "description": "question: What text should be rendered?\n\nThis piece of text will be shown in the infobox.\nIn this text, values within braces (such as {braced(key)}) are replaced by the corresponding `value` in the object.\nFor example, if the object contains tags `amenity=school; name=Windy Hill School`, the render string `This school is named {name}` will be shown to the user as `This school is named Windy Hill School`\n\nThis text will be shown if:\n- there is no mapping which matches (or there are no matches)\n- no question, no mappings and no 'freeform' is set\n\nNote that this is a HTML-interpreted value, so you can add links as e.g. '<a href='{website}'>{website}</a>' or include images such as `This is of type A <br><img src='typeA-icon.svg' />`\ntype: rendered\nifunset: no text is rendered if no predefined options match", "anyOf": [ { "$ref": "#/definitions/Record" @@ -75,16 +39,38 @@ } ] }, - "condition": { - "description": "Only show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", + "icon": { + "description": "question: what icon should be shown next to the 'render' value?\nAn icon shown next to the rendering; typically shown pretty small\nThis is only shown next to the \"render\" value\nType: icon\nifunset: do not show an icon next to the \"render\"-value", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "type": "object", + "properties": { + "path": { + "description": "The path to the icon\nType: icon", + "type": "string" + }, + "class": { + "description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-', so defining your own in combination with a custom CSS is possible (but discouraged)", + "type": "string" + } + }, + "required": [ + "path" + ] }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "type": "string" + } + ] + }, + "condition": { + "description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or ask the question if unkown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", + "anyOf": [ + { + "$ref": "#/definitions/{and:TagConfigJson[];}" + }, + { + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -92,15 +78,13 @@ ] }, "metacondition": { - "description": "If set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", + "description": "question: When should this item be shown (including special conditions)?\ntype: tag\n\nIf set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -108,17 +92,14 @@ ] }, "freeform": { - "description": "Allow freeform text input from the user", + "description": "question: Should a freeform text field be shown?\nAllow freeform text input from the user\nifunset: Do not add a freeform text field", "type": "object", "properties": { "key": { - "description": "If this key is present, then 'render' is used to display the value.\nIf this is undefined, the rendering is _always_ shown", + "description": "What attribute should be filled out\nIf this key is present in the feature, then 'render' is used to display the value.\nIf this is undefined, the rendering is _always_ shown", "type": "string" } - }, - "required": [ - "key" - ] + } }, "mappings": { "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", @@ -128,10 +109,10 @@ "properties": { "if": { "$ref": "#/definitions/TagConfigJson", - "description": "If this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}" + "description": "question: When should this single mapping match?\n\nIf this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}" }, "then": { - "description": "If the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option\nType: rendered", + "description": "question: What text should be shown?\n\nIf the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option\nType: rendered", "anyOf": [ { "$ref": "#/definitions/Record" @@ -142,7 +123,7 @@ ] }, "icon": { - "description": "An icon supporting this mapping; typically shown pretty small\nType: icon", + "description": "question: What icon should be added to this mapping?\nifunset: Do not show an extra icon next to the render value\n\nAn icon supporting this mapping; typically shown pretty small.\nThis can be used to show a 'phone'-icon next to the phone number\ninline: {icon}\nType: icon", "anyOf": [ { "type": "object", @@ -171,17 +152,31 @@ "then" ] } + }, + "description": { + "description": "A human-readable text explaining what this tagRendering does.\nMostly used for the shared tagrenderings", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] + }, + "classes": { + "description": "question: What css-classes should be applied to showing this attribute?\n\nA list of css-classes to apply to the entire tagRendering.\nThese classes are applied in 'answer'-mode, not in question mode\nThis is only for advanced users.\n\nValues are split on ` ` (space)", + "type": "string" } }, "definitions": { "TagConfigJson": { - "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation", + "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation\n\ntype: tag", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", "type": "object", "properties": { "or": { @@ -200,8 +195,7 @@ } ] }, - "AndTagConfigJson": { - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", + "{and:TagConfigJson[];}": { "type": "object", "properties": { "and": { @@ -216,8 +210,7 @@ ], "additionalProperties": false }, - "OrTagConfigJson": { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", + "{or:TagConfigJson[];}": { "type": "object", "properties": { "or": { diff --git a/Docs/Schemas/TagRenderingConfigJsonJSC.ts b/Docs/Schemas/TagRenderingConfigJsonJSC.ts index c2bdd5fe0..f1d928dec 100644 --- a/Docs/Schemas/TagRenderingConfigJsonJSC.ts +++ b/Docs/Schemas/TagRenderingConfigJsonJSC.ts @@ -2,44 +2,8 @@ export default { "description": "A TagRenderingConfigJson is a single piece of code which converts one ore more tags into a HTML-snippet.\nFor an _editable_ tagRendering, use 'QuestionableTagRenderingConfigJson' instead, which extends this one", "type": "object", "properties": { - "id": { - "description": "The id of the tagrendering, should be an unique string.\nUsed to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise.\n\nUse 'questions' to trigger the question box of this group (if a group is defined)", - "type": "string" - }, - "labels": { - "description": "A list of labels. These are strings that are used for various purposes, e.g. to filter them away", - "type": "array", - "items": { - "type": "string" - } - }, - "classes": { - "description": "A list of css-classes to apply to the entire tagRendering if the answer is known (not applied on the question).\nThis is only for advanced users", - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "string" - } - ] - }, - "description": { - "description": "A human-readable text explaining what this tagRendering does", - "anyOf": [ - { - "$ref": "#/definitions/Record" - }, - { - "type": "string" - } - ] - }, "render": { - "description": "Renders this value. Note that \"{key}\"-parts are substituted by the corresponding values of the element.\nIf neither 'textFieldQuestion' nor 'mappings' are defined, this text is simply shown as default value.\n\nNote 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
`\ntype: rendered", + "description": "question: What text should be rendered?\n\nThis piece of text will be shown in the infobox.\nIn this text, values within braces (such as {braced(key)}) are replaced by the corresponding `value` in the object.\nFor example, if the object contains tags `amenity=school; name=Windy Hill School`, the render string `This school is named {name}` will be shown to the user as `This school is named Windy Hill School`\n\nThis text will be shown if:\n- there is no mapping which matches (or there are no matches)\n- no question, no mappings and no 'freeform' is set\n\nNote that this is a HTML-interpreted value, so you can add links as e.g. '<a href='{website}'>{website}</a>' or include images such as `This is of type A <br><img src='typeA-icon.svg' />`\ntype: rendered\nifunset: no text is rendered if no predefined options match", "anyOf": [ { "$ref": "#/definitions/Record" @@ -75,16 +39,38 @@ export default { } ] }, - "condition": { - "description": "Only show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", + "icon": { + "description": "question: what icon should be shown next to the 'render' value?\nAn icon shown next to the rendering; typically shown pretty small\nThis is only shown next to the \"render\" value\nType: icon\nifunset: do not show an icon next to the \"render\"-value", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "type": "object", + "properties": { + "path": { + "description": "The path to the icon\nType: icon", + "type": "string" + }, + "class": { + "description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-', so defining your own in combination with a custom CSS is possible (but discouraged)", + "type": "string" + } + }, + "required": [ + "path" + ] }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "type": "string" + } + ] + }, + "condition": { + "description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or ask the question if unkown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", + "anyOf": [ + { + "$ref": "#/definitions/{and:TagConfigJson[];}" + }, + { + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -92,15 +78,13 @@ export default { ] }, "metacondition": { - "description": "If set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", + "description": "question: When should this item be shown (including special conditions)?\ntype: tag\n\nIf set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" + "$ref": "#/definitions/{or:TagConfigJson[];}" }, { "type": "string" @@ -108,17 +92,14 @@ export default { ] }, "freeform": { - "description": "Allow freeform text input from the user", + "description": "question: Should a freeform text field be shown?\nAllow freeform text input from the user\nifunset: Do not add a freeform text field", "type": "object", "properties": { "key": { - "description": "If this key is present, then 'render' is used to display the value.\nIf this is undefined, the rendering is _always_ shown", + "description": "What attribute should be filled out\nIf this key is present in the feature, then 'render' is used to display the value.\nIf this is undefined, the rendering is _always_ shown", "type": "string" } - }, - "required": [ - "key" - ] + } }, "mappings": { "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", @@ -128,10 +109,10 @@ export default { "properties": { "if": { "$ref": "#/definitions/TagConfigJson", - "description": "If this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}" + "description": "question: When should this single mapping match?\n\nIf this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}" }, "then": { - "description": "If the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option\nType: rendered", + "description": "question: What text should be shown?\n\nIf the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option\nType: rendered", "anyOf": [ { "$ref": "#/definitions/Record" @@ -142,7 +123,7 @@ export default { ] }, "icon": { - "description": "An icon supporting this mapping; typically shown pretty small\nType: icon", + "description": "question: What icon should be added to this mapping?\nifunset: Do not show an extra icon next to the render value\n\nAn icon supporting this mapping; typically shown pretty small.\nThis can be used to show a 'phone'-icon next to the phone number\ninline: {icon}\nType: icon", "anyOf": [ { "type": "object", @@ -171,17 +152,31 @@ export default { "then" ] } + }, + "description": { + "description": "A human-readable text explaining what this tagRendering does.\nMostly used for the shared tagrenderings", + "anyOf": [ + { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + } + ] + }, + "classes": { + "description": "question: What css-classes should be applied to showing this attribute?\n\nA list of css-classes to apply to the entire tagRendering.\nThese classes are applied in 'answer'-mode, not in question mode\nThis is only for advanced users.\n\nValues are split on ` ` (space)", + "type": "string" } }, "definitions": { "TagConfigJson": { - "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation", + "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation\n\ntype: tag", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", "type": "object", "properties": { "or": { @@ -200,8 +195,7 @@ export default { } ] }, - "AndTagConfigJson": { - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", + "{and:TagConfigJson[];}": { "type": "object", "properties": { "and": { @@ -215,8 +209,7 @@ export default { "and" ] }, - "OrTagConfigJson": { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", + "{or:TagConfigJson[];}": { "type": "object", "properties": { "or": { diff --git a/Docs/Schemas/TilesourceConfigJson.schema.json b/Docs/Schemas/TilesourceConfigJson.schema.json deleted file mode 100644 index 3fdd289d9..000000000 --- a/Docs/Schemas/TilesourceConfigJson.schema.json +++ /dev/null @@ -1,1118 +0,0 @@ -{ - "description": "Configuration for a tilesource config", - "type": "object", - "properties": { - "id": { - "description": "Id of this overlay, used in the URL-parameters to set the state", - "type": "string" - }, - "source": { - "description": "The path, where {x}, {y} and {z} will be substituted", - "type": "string" - }, - "isOverlay": { - "description": "Wether or not this is an overlay. Default: true", - "type": "boolean" - }, - "name": { - "description": "How this will be shown in the selection menu.\nMake undefined if this may not be toggled" - }, - "minZoom": { - "description": "Only visible at this or a higher zoom level", - "type": "number" - }, - "maxZoom": { - "description": "Only visible at this or a lower zoom level", - "type": "number" - }, - "defaultState": { - "description": "The default state, set to false to hide by default", - "type": "boolean" - } - }, - "required": [ - "defaultState", - "id", - "source" - ], - "definitions": { - "TagConfigJson": { - "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation", - "anyOf": [ - { - "$ref": "#/definitions/AndTagConfigJson" - }, - { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", - "type": "object", - "properties": { - "or": { - "type": "array", - "items": { - "$ref": "#/definitions/TagConfigJson" - } - } - }, - "required": [ - "or" - ] - }, - { - "type": "string" - } - ] - }, - "AndTagConfigJson": { - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", - "type": "object", - "properties": { - "and": { - "type": "array", - "items": { - "$ref": "#/definitions/TagConfigJson" - } - } - }, - "required": [ - "and" - ], - "additionalProperties": false - }, - "OrTagConfigJson": { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", - "type": "object", - "properties": { - "or": { - "type": "array", - "items": { - "$ref": "#/definitions/TagConfigJson" - } - } - }, - "required": [ - "or" - ], - "additionalProperties": false - }, - "DenominationConfigJson": { - "type": "object", - "properties": { - "useIfNoUnitGiven": { - "description": "If this evaluates to true and the value to interpret has _no_ unit given, assumes that this unit is meant.\nAlternatively, a list of country codes can be given where this acts as the default interpretation\n\nE.g., a denomination using \"meter\" would probably set this flag to \"true\";\na denomination for \"mp/h\" will use the condition \"_country=gb\" to indicate that it is the default in the UK.\n\nIf none of the units indicate that they are the default, the first denomination will be used instead", - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "boolean" - } - ] - }, - "canonicalDenomination": { - "description": "The canonical value for this denomination which will be added to the value in OSM.\ne.g. \"m\" for meters\nIf the user inputs '42', the canonical value will be added and it'll become '42m'.\n\nImportant: often, _no_ canonical values are expected, e.g. in the case of 'maxspeed' where 'km/h' is the default.\nIn this case, an empty string should be used", - "type": "string" - }, - "canonicalDenominationSingular": { - "description": "The canonical denomination in the case that the unit is precisely '1'.\nUsed for display purposes only.\n\nE.g.: for duration of something in minutes: `2 minutes` but `1 minute`; the `minute` goes here", - "type": "string" - }, - "alternativeDenomination": { - "description": "A list of alternative values which can occur in the OSM database - used for parsing.\nE.g.: while 'm' is canonical, `meter`, `mtrs`, ... can occur as well", - "type": "array", - "items": { - "type": "string" - } - }, - "human": { - "description": "The value for humans in the dropdown. This should not use abbreviations and should be translated, e.g.\n{\n \"en\": \"meter\",\n \"fr\": \"metre\"\n}", - "anyOf": [ - { - "$ref": "#/definitions/Record" - }, - { - "type": "string" - } - ] - }, - "humanSingular": { - "description": "The value for humans in the dropdown. This should not use abbreviations and should be translated, e.g.\n{\n \"en\": \"minute\",\n \"nl\": \"minuut\"\n}", - "anyOf": [ - { - "$ref": "#/definitions/Record" - }, - { - "type": "string" - } - ] - }, - "prefix": { - "description": "If set, then the canonical value will be prefixed instead, e.g. for '€'\nNote that if all values use 'prefix', the dropdown might move to before the text field", - "type": "boolean" - } - }, - "required": [ - "canonicalDenomination" - ], - "additionalProperties": false - }, - "Record": { - "type": "object", - "additionalProperties": false - }, - "TagRenderingConfigJson": { - "description": "A TagRenderingConfigJson is a single piece of code which converts one ore more tags into a HTML-snippet.\nFor an _editable_ tagRendering, use 'QuestionableTagRenderingConfigJson' instead, which extends this one", - "type": "object", - "properties": { - "id": { - "description": "The id of the tagrendering, should be an unique string.\nUsed to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise.\n\nUse 'questions' to trigger the question box of this group (if a group is defined)", - "type": "string" - }, - "group": { - "description": "If 'group' is defined on many tagRenderings, these are grouped together when shown. The questions are grouped together as well.\nThe first tagRendering of a group will always be a sticky element.", - "type": "string" - }, - "labels": { - "description": "A list of labels. These are strings that are used for various purposes, e.g. to filter them away", - "type": "array", - "items": { - "type": "string" - } - }, - "description": { - "description": "A human-readable text explaining what this tagRendering does" - }, - "render": { - "description": "Renders this value. Note that \"{key}\"-parts are substituted by the corresponding values of the element.\nIf neither 'textFieldQuestion' nor 'mappings' are defined, this text is simply shown as default value.\n\nNote 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
`\ntype: rendered" - }, - "condition": { - "description": "Only show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", - "anyOf": [ - { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" - }, - { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" - }, - { - "type": "string" - } - ] - }, - "freeform": { - "description": "Allow freeform text input from the user", - "type": "object", - "properties": { - "key": { - "description": "If this key is present, then 'render' is used to display the value.\nIf this is undefined, the rendering is _always_ shown", - "type": "string" - } - }, - "required": [ - "key" - ] - }, - "mappings": { - "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", - "type": "array", - "items": { - "type": "object", - "properties": { - "if": { - "$ref": "#/definitions/TagConfigJson", - "description": "If this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}" - }, - "then": { - "description": "If the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option\nType: rendered" - }, - "icon": { - "description": "An icon supporting this mapping; typically shown pretty small\nType: icon", - "anyOf": [ - { - "type": "object", - "properties": { - "path": { - "description": "The path to the icon\nType: icon", - "type": "string" - }, - "class": { - "description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-', so defining your own in combination with a custom CSS is possible (but discouraged)", - "type": "string" - } - }, - "required": [ - "path" - ] - }, - { - "type": "string" - } - ] - } - }, - "required": [ - "if", - "then" - ] - } - } - }, - "additionalProperties": false - }, - "Record": { - "type": "object", - "additionalProperties": false - }, - "MappingConfigJson": { - "type": "object", - "properties": { - "if": { - "$ref": "#/definitions/TagConfigJson", - "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation" - }, - "then": { - "description": "Shown if the 'if is fulfilled\nType: rendered" - }, - "icon": { - "description": "An extra icon supporting the choice\nType: icon", - "anyOf": [ - { - "type": "object", - "properties": { - "path": { - "description": "The path to the icon\nType: icon", - "type": "string" - }, - "class": { - "description": "Size of the image", - "type": "string" - } - }, - "required": [ - "path" - ] - }, - { - "type": "string" - } - ] - }, - "hideInAnswer": { - "description": "In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n\n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}", - "anyOf": [ - { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" - }, - { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" - }, - { - "type": [ - "string", - "boolean" - ] - } - ] - }, - "ifnot": { - "description": "Only applicable if 'multiAnswer' is set.\nThis is for situations such as:\n`accepts:coins=no` where one can select all the possible payment methods. However, we want to make explicit that some options _were not_ selected.\nThis can be done with `ifnot`\nNote that we can not explicitly render this negative case to the user, we cannot show `does _not_ accept coins`.\nIf this is important to your usecase, consider using multiple radiobutton-fields without `multiAnswer`", - "anyOf": [ - { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" - }, - { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" - }, - { - "type": "string" - } - ] - }, - "addExtraTags": { - "description": "If chosen as answer, these tags will be applied as well onto the object.\nNot compatible with multiAnswer.\n\nThis can be used e.g. to erase other keys which indicate the 'not' value:\n```json\n{\n \"if\": \"crossing:marking=rainbow\",\n \"then\": \"This is a rainbow crossing\",\n \"addExtraTags\": \"not:crossing:marking=\"\n}\n```", - "type": "array", - "items": { - "type": "string" - } - }, - "searchTerms": { - "description": "If there are many options, the mappings-radiobuttons will be replaced by an element with a searchfunction\n\nSearchterms (per language) allow to easily find an option if there are many options", - "$ref": "#/definitions/Record" - }, - "priorityIf": { - "description": "If the searchable selector is picked, mappings with this item will have priority and show up even if the others are hidden\nUse this sparingly", - "anyOf": [ - { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" - }, - { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" - }, - { - "type": "string" - } - ] - }, - "#": { - "description": "Used for comments or to disable a validation\n\nignore-image-in-then: normally, a `then`-clause is not allowed to have an `img`-html-element as icons are preferred. In some cases (most notably title-icons), this is allowed", - "type": "string" - } - }, - "required": [ - "if", - "then" - ], - "additionalProperties": false - }, - "T": { - "type": "object", - "additionalProperties": false - }, - "default_4": { - "description": "The PointRenderingConfig gives all details onto how to render a single point of a feature.\n\nThis can be used if:\n\n- The feature is a point\n- To render something at the centroid of an area, or at the start, end or projected centroid of a way", - "type": "object", - "properties": { - "location": { - "description": "All the locations that this point should be rendered at.\nUsing `location: [\"point\", \"centroid\"] will always render centerpoint.\n'projected_centerpoint' will show an item on the line itself, near the middle of the line. (LineStrings only)", - "type": "array", - "items": { - "type": "string" - } - }, - "icon": { - "description": "The icon for an element.\nNote that this also doubles as the icon for this layer (rendered with the overpass-tags) ánd the icon in the presets.\n\nThe result of the icon is rendered as follows:\nthe resulting string is interpreted as a _list_ of items, separated by \";\". The bottommost layer is the first layer.\nAs a result, on could use a generic pin, then overlay it with a specific icon.\nTo make things even more practical, one can use all SVG's from the folder \"assets/svg\" and _substitute the color_ in it.\nE.g. to draw a red pin, use \"pin:#f00\", to have a green circle with your icon on top, use `circle:#0f0;`\n\nType: icon", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - }, - "iconBadges": { - "description": "A list of extra badges to show next to the icon as small badge\nThey will be added as a 25% height icon at the bottom right of the icon, with all the badges in a flex layout.\n\nNote: strings are interpreted as icons, so layering and substituting is supported. You can use `circle:white;./my_icon.svg` to add a background circle", - "type": "array", - "items": { - "type": "object", - "properties": { - "if": { - "$ref": "#/definitions/TagConfigJson", - "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation" - }, - "then": { - "description": "Badge to show\nType: icon", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - } - }, - "required": [ - "if", - "then" - ] - } - }, - "iconSize": { - "description": "A string containing \"width,height\" or \"width,height,anchorpoint\" where anchorpoint is any of 'center', 'top', 'bottom', 'left', 'right', 'bottomleft','topright', ...\nDefault is '40,40,center'", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - }, - "rotation": { - "description": "The rotation of an icon, useful for e.g. directions.\nUsage: 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)``", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - }, - "label": { - "description": "A HTML-fragment that is shown below the icon, for example:\n
{name}
\n\nIf the icon is undefined, then the label is shown in the center of the feature.\nNote that, if the wayhandling hides the icon then no label is shown as well.", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - }, - "css": { - "description": "A snippet of css code", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - }, - "cssClasses": { - "description": "A snippet of css-classes. They can be space-separated", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - } - }, - "required": [ - "location" - ], - "additionalProperties": false - }, - "default_5": { - "description": "The LineRenderingConfig gives all details onto how to render a single line of a feature.\n\nThis can be used if:\n\n- The feature is a line\n- The feature is an area", - "type": "object", - "properties": { - "color": { - "description": "The color for way-elements and SVG-elements.\nIf the value starts with \"--\", the style of the body element will be queried for the corresponding variable instead", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - }, - "width": { - "description": "The stroke-width for way-elements", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": [ - "string", - "number" - ] - } - ] - }, - "dashArray": { - "description": "A dasharray, e.g. \"5 6\"\nThe dasharray defines 'pixels of line, pixels of gap, pixels of line, pixels of gap',\nDefault value: \"\" (empty string == full line)", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - }, - "lineCap": { - "description": "The form at the end of a line", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - }, - "fill": { - "description": "Whether or not to fill polygons", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "enum": [ - "no", - "yes" - ], - "type": "string" - } - ] - }, - "fillColor": { - "description": "The color to fill a polygon with.\nIf undefined, this will be slightly more opaque version of the stroke line", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - }, - "offset": { - "description": "The number of pixels this line should be moved.\nUse a positive numbe to move to the right, a negative to move to the left (left/right as defined by the drawing direction of the line).\n\nIMPORTANT: MapComplete will already normalize 'key:both:property' and 'key:both' into the corresponding 'key:left' and 'key:right' tagging (same for 'sidewalk=left/right/both' which is rewritten to 'sidewalk:left' and 'sidewalk:right')\nThis simplifies programming. Refer to the CalculatedTags.md-documentation for more details", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "number" - } - ] - } - }, - "additionalProperties": false - }, - "default": { - "description": "Rewrites and multiplies the given renderings of type T.\n\nThis can be used for introducing many similar questions automatically,\nwhich also makes translations easier.\n\n(Note that the key does _not_ need to be wrapped in {}.\nHowever, we recommend to use them if the key is used in a translation, as missing keys will be picked up and warned for by the translation scripts)\n\nFor example:\n\n```\n{\n rewrite: {\n sourceString: [\"key\", \"a|b|c\"],\n into: [\n [\"X\", 0]\n [\"Y\", 1],\n [\"Z\", 2]\n ],\n renderings: [{\n \"key\":\"a|b|c\"\n }]\n }\n}\n```\nwill result in _three_ copies (as the values to rewrite into have three values, namely:\n\n[\n {\n # The first pair: key --> X, a|b|c --> 0\n \"X\": 0\n },\n {\n \"Y\": 1\n },\n {\n \"Z\": 2\n }\n\n]", - "type": "object", - "properties": { - "rewrite": { - "type": "object", - "properties": { - "sourceString": { - "type": "array", - "items": { - "type": "string" - } - }, - "into": { - "type": "array", - "items": { - "type": "array", - "items": {} - } - } - }, - "required": [ - "into", - "sourceString" - ] - }, - "renderings": { - "anyOf": [ - { - "$ref": "#/definitions/default_4" - }, - { - "$ref": "#/definitions/default_5" - }, - { - "type": "array", - "items": { - "$ref": "#/definitions/default_5" - } - }, - { - "type": "array", - "items": { - "$ref": "#/definitions/default_4" - } - } - ] - } - }, - "required": [ - "renderings", - "rewrite" - ], - "additionalProperties": false - }, - "QuestionableTagRenderingConfigJson": { - "description": "A QuestionableTagRenderingConfigJson is a single piece of code which converts one ore more tags into a HTML-snippet.\nIf the desired tags are missing and a question is defined, a question will be shown instead.", - "type": "object", - "properties": { - "question": { - "description": "If it turns out that this tagRendering doesn't match _any_ value, then we show this question.\nIf undefined, the question is never asked and this tagrendering is read-only", - "anyOf": [ - { - "$ref": "#/definitions/Record" - }, - { - "type": "string" - } - ] - }, - "questionHint": { - "description": "A hint which is shown in subtle text under the question.\nThis can give some extra information on what the answer should ook like", - "anyOf": [ - { - "$ref": "#/definitions/Record" - }, - { - "type": "string" - } - ] - }, - "freeform": { - "description": "Allow freeform text input from the user", - "type": "object", - "properties": { - "key": { - "type": "string" - }, - "type": { - "description": "The type of the text-field, e.g. 'string', 'nat', 'float', 'date',...\nSee Docs/SpecialInputElements.md and UI/Input/ValidatedTextField.ts for supported values", - "type": "string" - }, - "placeholder": { - "description": "A (translated) text that is shown (as gray text) within the textfield" - }, - "helperArgs": { - "description": "Extra parameters to initialize the input helper arguments.\nFor semantics, see the 'SpecialInputElements.md'", - "type": "array", - "items": {} - }, - "addExtraTags": { - "description": "If a value is added with the textfield, these extra tag is addded.\nUseful to add a 'fixme=freeform textfield used - to be checked'", - "type": "array", - "items": { - "type": "string" - } - }, - "inline": { - "description": "When set, influences the way a question is asked.\nInstead of showing a full-widht text field, the text field will be shown within the rendering of the question.\n\nThis combines badly with special input elements, as it'll distort the layout.", - "type": "boolean" - }, - "default": { - "description": "default value to enter if no previous tagging is present.\nNormally undefined (aka do not enter anything)", - "type": "string" - } - }, - "required": [ - "key" - ] - }, - "multiAnswer": { - "description": "If true, use checkboxes instead of radio buttons when asking the question", - "type": "boolean" - }, - "mappings": { - "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", - "type": "array", - "items": { - "$ref": "#/definitions/MappingConfigJson" - } - }, - "id": { - "description": "The id of the tagrendering, should be an unique string.\nUsed to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise.\n\nUse 'questions' to trigger the question box of this group (if a group is defined)", - "type": "string" - }, - "group": { - "description": "If 'group' is defined on many tagRenderings, these are grouped together when shown. The questions are grouped together as well.\nThe first tagRendering of a group will always be a sticky element.", - "type": "string" - }, - "labels": { - "description": "A list of labels. These are strings that are used for various purposes, e.g. to filter them away", - "type": "array", - "items": { - "type": "string" - } - }, - "description": { - "description": "A human-readable text explaining what this tagRendering does" - }, - "render": { - "description": "Renders this value. Note that \"{key}\"-parts are substituted by the corresponding values of the element.\nIf neither 'textFieldQuestion' nor 'mappings' are defined, this text is simply shown as default value.\n\nNote 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
`\ntype: rendered" - }, - "condition": { - "description": "Only show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", - "anyOf": [ - { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" - }, - { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" - }, - { - "type": "string" - } - ] - } - }, - "additionalProperties": false - }, - "Partial": { - "type": "object", - "properties": { - "question": { - "description": "If it turns out that this tagRendering doesn't match _any_ value, then we show this question.\nIf undefined, the question is never asked and this tagrendering is read-only", - "anyOf": [ - { - "$ref": "#/definitions/Record" - }, - { - "type": "string" - } - ] - }, - "questionHint": { - "description": "A hint which is shown in subtle text under the question.\nThis can give some extra information on what the answer should ook like", - "anyOf": [ - { - "$ref": "#/definitions/Record" - }, - { - "type": "string" - } - ] - }, - "freeform": { - "description": "Allow freeform text input from the user", - "type": "object", - "properties": { - "key": { - "type": "string" - }, - "type": { - "description": "The type of the text-field, e.g. 'string', 'nat', 'float', 'date',...\nSee Docs/SpecialInputElements.md and UI/Input/ValidatedTextField.ts for supported values", - "type": "string" - }, - "placeholder": { - "description": "A (translated) text that is shown (as gray text) within the textfield" - }, - "helperArgs": { - "description": "Extra parameters to initialize the input helper arguments.\nFor semantics, see the 'SpecialInputElements.md'", - "type": "array", - "items": {} - }, - "addExtraTags": { - "description": "If a value is added with the textfield, these extra tag is addded.\nUseful to add a 'fixme=freeform textfield used - to be checked'", - "type": "array", - "items": { - "type": "string" - } - }, - "inline": { - "description": "When set, influences the way a question is asked.\nInstead of showing a full-widht text field, the text field will be shown within the rendering of the question.\n\nThis combines badly with special input elements, as it'll distort the layout.", - "type": "boolean" - }, - "default": { - "description": "default value to enter if no previous tagging is present.\nNormally undefined (aka do not enter anything)", - "type": "string" - } - }, - "required": [ - "key" - ] - }, - "multiAnswer": { - "description": "If true, use checkboxes instead of radio buttons when asking the question", - "type": "boolean" - }, - "mappings": { - "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", - "type": "array", - "items": { - "$ref": "#/definitions/MappingConfigJson" - } - }, - "id": { - "description": "The id of the tagrendering, should be an unique string.\nUsed to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise.\n\nUse 'questions' to trigger the question box of this group (if a group is defined)", - "type": "string" - }, - "group": { - "description": "If 'group' is defined on many tagRenderings, these are grouped together when shown. The questions are grouped together as well.\nThe first tagRendering of a group will always be a sticky element.", - "type": "string" - }, - "labels": { - "description": "A list of labels. These are strings that are used for various purposes, e.g. to filter them away", - "type": "array", - "items": { - "type": "string" - } - }, - "description": { - "description": "A human-readable text explaining what this tagRendering does" - }, - "render": { - "description": "Renders this value. Note that \"{key}\"-parts are substituted by the corresponding values of the element.\nIf neither 'textFieldQuestion' nor 'mappings' are defined, this text is simply shown as default value.\n\nNote 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
`\ntype: rendered" - }, - "condition": { - "description": "Only show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", - "anyOf": [ - { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" - }, - { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" - }, - { - "type": "string" - } - ] - } - }, - "additionalProperties": false - }, - "default<(string|QuestionableTagRenderingConfigJson|{builtin:string;override:Partial;})[]>": { - "description": "Rewrites and multiplies the given renderings of type T.\n\nThis can be used for introducing many similar questions automatically,\nwhich also makes translations easier.\n\n(Note that the key does _not_ need to be wrapped in {}.\nHowever, we recommend to use them if the key is used in a translation, as missing keys will be picked up and warned for by the translation scripts)\n\nFor example:\n\n```\n{\n rewrite: {\n sourceString: [\"key\", \"a|b|c\"],\n into: [\n [\"X\", 0]\n [\"Y\", 1],\n [\"Z\", 2]\n ],\n renderings: [{\n \"key\":\"a|b|c\"\n }]\n }\n}\n```\nwill result in _three_ copies (as the values to rewrite into have three values, namely:\n\n[\n {\n # The first pair: key --> X, a|b|c --> 0\n \"X\": 0\n },\n {\n \"Y\": 1\n },\n {\n \"Z\": 2\n }\n\n]", - "type": "object", - "properties": { - "rewrite": { - "type": "object", - "properties": { - "sourceString": { - "type": "array", - "items": { - "type": "string" - } - }, - "into": { - "type": "array", - "items": { - "type": "array", - "items": {} - } - } - }, - "required": [ - "into", - "sourceString" - ] - }, - "renderings": { - "type": "array", - "items": { - "anyOf": [ - { - "$ref": "#/definitions/QuestionableTagRenderingConfigJson" - }, - { - "type": "object", - "properties": { - "builtin": { - "type": "string" - }, - "override": { - "$ref": "#/definitions/Partial" - } - }, - "required": [ - "builtin", - "override" - ] - }, - { - "type": "string" - } - ] - } - } - }, - "required": [ - "renderings", - "rewrite" - ], - "additionalProperties": false - }, - "default_1": { - "type": "object", - "properties": { - "id": { - "description": "An id/name for this filter, used to set the URL parameters", - "type": "string" - }, - "options": { - "description": "The options for a filter\nIf there are multiple options these will be a list of radio buttons\nIf there is only one option this will be a checkbox\nFiltering is done based on the given osmTags that are compared to the objects in that layer.\n\nAn example which searches by name:\n\n```\n{\n \"id\": \"shop-name\",\n \"options\": [\n {\n \"fields\": [\n {\n \"name\": \"search\",\n \"type\": \"string\"\n }\n ],\n \"osmTags\": \"name~i~.*{search}.*\",\n \"question\": {\n \"en\": \"Only show shops with name {search}\",\n }\n }\n ]\n }\n ```", - "type": "array", - "items": { - "type": "object", - "properties": { - "question": {}, - "osmTags": { - "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation", - "anyOf": [ - { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" - }, - { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" - }, - { - "type": "string" - } - ] - }, - "default": { - "type": "boolean" - }, - "fields": { - "type": "array", - "items": { - "type": "object", - "properties": { - "name": { - "description": "If name is `search`, use \"_first_comment~.*{search}.*\" as osmTags", - "type": "string" - }, - "type": { - "type": "string" - } - }, - "required": [ - "name" - ] - } - } - }, - "required": [ - "question" - ] - } - }, - "#": { - "description": "Used for comments or to disable a check\n\n\"ignore-possible-duplicate\": disables a check in `DetectDuplicateFilters` which complains that a filter can be replaced by a filter from the `filters`-library-layer", - "type": "string" - } - }, - "required": [ - "id", - "options" - ], - "additionalProperties": false - }, - "DeleteConfigJson": { - "type": "object", - "properties": { - "extraDeleteReasons": { - "description": "*\nBy default, three reasons to delete a point are shown:\n\n- The point does not exist anymore\n- The point was a testing point\n- THe point could not be found\n\nHowever, for some layers, there might be different or more specific reasons for deletion which can be user friendly to set, e.g.:\n\n- the shop has closed\n- the climbing route has been closed of for nature conservation reasons\n- ...\n\nThese reasons can be stated here and will be shown in the list of options the user can choose from", - "type": "array", - "items": { - "type": "object", - "properties": { - "explanation": { - "description": "The text that will be shown to the user - translatable" - }, - "changesetMessage": { - "description": "The text that will be uploaded into the changeset or will be used in the fixme in case of a soft deletion\nShould be a few words, in english", - "type": "string" - } - }, - "required": [ - "changesetMessage", - "explanation" - ] - } - }, - "nonDeleteMappings": { - "description": "In some cases, a (starting) contributor might wish to delete a feature even though deletion is not appropriate.\n(The most relevant case are small paths running over private property. These should be marked as 'private' instead of deleted, as the community might trace the path again from aerial imagery, gettting us back to the original situation).\n\nBy adding a 'nonDeleteMapping', an option can be added into the list which will retag the feature.\nIt is important that the feature will be retagged in such a way that it won't be picked up by the layer anymore!", - "type": "array", - "items": { - "type": "object", - "properties": { - "if": { - "$ref": "#/definitions/TagConfigJson", - "description": "The tags that will be given to the object.\nThis must remove tags so that the 'source/osmTags' won't match anymore" - }, - "then": { - "description": "The human explanation for the options" - } - }, - "required": [ - "if", - "then" - ] - } - }, - "softDeletionTags": { - "description": "In some cases, the contributor is not allowed to delete the current feature (e.g. because it isn't a point, the point is referenced by a relation or the user isn't experienced enough).\nTo still offer the user a 'delete'-option, the feature is retagged with these tags. This is a soft deletion, as the point isn't actually removed from OSM but rather marked as 'disused'\nIt is important that the feature will be retagged in such a way that it won't be picked up by the layer anymore!\n\nExample (note that \"amenity=\" erases the 'amenity'-key alltogether):\n```\n{\n \"and\": [\"disussed:amenity=public_bookcase\", \"amenity=\"]\n}\n```\n\nor (notice the use of the ':='-tag to copy the old value of 'shop=*' into 'disused:shop='):\n```\n{\n \"and\": [\"disused:shop:={shop}\", \"shop=\"]\n}\n```", - "anyOf": [ - { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" - }, - { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" - }, - { - "type": "string" - } - ] - }, - "neededChangesets": { - "description": "*\nBy default, the contributor needs 20 previous changesets to delete points edited by others.\nFor some small features (e.g. bicycle racks) this is too much and this requirement can be lowered or dropped, which can be done here.", - "type": "number" - }, - "omitDefaultDeleteReasons": { - "description": "Set this flag if the default delete reasons should be omitted from the dialog.\nThis requires at least one extraDeleteReason or nonDeleteMapping", - "type": "boolean" - } - }, - "additionalProperties": false - }, - "default_3": { - "type": "object", - "properties": { - "enableImproveAccuracy": { - "description": "One default reason to move a point is to improve accuracy.\nSet to false to disable this reason", - "type": "boolean" - }, - "enableRelocation": { - "description": "One default reason to move a point is because it has relocated\nSet to false to disable this reason", - "type": "boolean" - } - }, - "additionalProperties": false - }, - "default_2": { - "description": "In some cases, a value is represented in a certain unit (such as meters for heigt/distance/..., km/h for speed, ...)\n\nSometimes, multiple denominations are possible (e.g. km/h vs mile/h; megawatt vs kilowatt vs gigawatt for power generators, ...)\n\nThis brings in some troubles, as there are multiple ways to write it (no denomitation, 'm' vs 'meter' 'metre', ...)\n\nNot only do we want to write consistent data to OSM, we also want to present this consistently to the user.\nThis is handled by defining units.\n\n# Rendering\n\nTo render a value with long (human) denomination, use {canonical(key)}\n\n# Usage\n\nFirst of all, you define which keys have units applied, for example:\n\n```\nunits: [\n appliesTo: [\"maxspeed\", \"maxspeed:hgv\", \"maxspeed:bus\"]\n applicableUnits: [\n ...\n ]\n]\n```\n\nApplicableUnits defines which is the canonical extension, how it is presented to the user, ...:\n\n```\napplicableUnits: [\n{\n canonicalDenomination: \"km/h\",\n alternativeDenomination: [\"km/u\", \"kmh\", \"kph\"]\n default: true,\n human: {\n en: \"kilometer/hour\",\n nl: \"kilometer/uur\"\n },\n humanShort: {\n en: \"km/h\",\n nl: \"km/u\"\n }\n},\n{\n canoncialDenomination: \"mph\",\n ... similar for miles an hour ...\n}\n]\n```\n\n\nIf this is defined, then every key which the denominations apply to (`maxspeed`, `maxspeed:hgv` and `maxspeed:bus`) will be rewritten at the metatagging stage:\nevery value will be parsed and the canonical extension will be added add presented to the other parts of the code.\n\nAlso, if a freeform text field is used, an extra dropdown with applicable denominations will be given", - "type": "object", - "properties": { - "appliesToKey": { - "description": "Every key from this list will be normalized.\n\nTo render a united value properly, use", - "type": "array", - "items": { - "type": "string" - } - }, - "eraseInvalidValues": { - "description": "If set, invalid values will be erased in the MC application (but not in OSM of course!)\nBe careful with setting this", - "type": "boolean" - }, - "applicableUnits": { - "description": "The possible denominations for this unit.\nFor length, denominations could be \"meter\", \"kilometer\", \"miles\", \"foot\"", - "type": "array", - "items": { - "$ref": "#/definitions/DenominationConfigJson" - } - }, - "defaultInput": { - "description": "In some cases, the default denomination is not the most user friendly to input.\nE.g., when measuring kerb heights, it is illogical to ask contributors to input an amount in meters.\n\nWhen a default input method should be used, this can be specified by setting the canonical denomination here, e.g.\n`defaultInput: \"cm\"`. This must be a denomination which appears in the applicableUnits", - "type": "string" - } - }, - "required": [ - "applicableUnits", - "appliesToKey" - ], - "additionalProperties": false - } - }, - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false -} \ No newline at end of file diff --git a/Docs/Schemas/TilesourceConfigJsonJSC.ts b/Docs/Schemas/TilesourceConfigJsonJSC.ts deleted file mode 100644 index 36eda59d0..000000000 --- a/Docs/Schemas/TilesourceConfigJsonJSC.ts +++ /dev/null @@ -1,1099 +0,0 @@ -export default { - "description": "Configuration for a tilesource config", - "type": "object", - "properties": { - "id": { - "description": "Id of this overlay, used in the URL-parameters to set the state", - "type": "string" - }, - "source": { - "description": "The path, where {x}, {y} and {z} will be substituted", - "type": "string" - }, - "isOverlay": { - "description": "Wether or not this is an overlay. Default: true", - "type": "boolean" - }, - "name": { - "description": "How this will be shown in the selection menu.\nMake undefined if this may not be toggled" - }, - "minZoom": { - "description": "Only visible at this or a higher zoom level", - "type": "number" - }, - "maxZoom": { - "description": "Only visible at this or a lower zoom level", - "type": "number" - }, - "defaultState": { - "description": "The default state, set to false to hide by default", - "type": "boolean" - } - }, - "required": [ - "defaultState", - "id", - "source" - ], - "definitions": { - "TagConfigJson": { - "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation", - "anyOf": [ - { - "$ref": "#/definitions/AndTagConfigJson" - }, - { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", - "type": "object", - "properties": { - "or": { - "type": "array", - "items": { - "$ref": "#/definitions/TagConfigJson" - } - } - }, - "required": [ - "or" - ] - }, - { - "type": "string" - } - ] - }, - "AndTagConfigJson": { - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", - "type": "object", - "properties": { - "and": { - "type": "array", - "items": { - "$ref": "#/definitions/TagConfigJson" - } - } - }, - "required": [ - "and" - ] - }, - "OrTagConfigJson": { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", - "type": "object", - "properties": { - "or": { - "type": "array", - "items": { - "$ref": "#/definitions/TagConfigJson" - } - } - }, - "required": [ - "or" - ] - }, - "DenominationConfigJson": { - "type": "object", - "properties": { - "useIfNoUnitGiven": { - "description": "If this evaluates to true and the value to interpret has _no_ unit given, assumes that this unit is meant.\nAlternatively, a list of country codes can be given where this acts as the default interpretation\n\nE.g., a denomination using \"meter\" would probably set this flag to \"true\";\na denomination for \"mp/h\" will use the condition \"_country=gb\" to indicate that it is the default in the UK.\n\nIf none of the units indicate that they are the default, the first denomination will be used instead", - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "boolean" - } - ] - }, - "canonicalDenomination": { - "description": "The canonical value for this denomination which will be added to the value in OSM.\ne.g. \"m\" for meters\nIf the user inputs '42', the canonical value will be added and it'll become '42m'.\n\nImportant: often, _no_ canonical values are expected, e.g. in the case of 'maxspeed' where 'km/h' is the default.\nIn this case, an empty string should be used", - "type": "string" - }, - "canonicalDenominationSingular": { - "description": "The canonical denomination in the case that the unit is precisely '1'.\nUsed for display purposes only.\n\nE.g.: for duration of something in minutes: `2 minutes` but `1 minute`; the `minute` goes here", - "type": "string" - }, - "alternativeDenomination": { - "description": "A list of alternative values which can occur in the OSM database - used for parsing.\nE.g.: while 'm' is canonical, `meter`, `mtrs`, ... can occur as well", - "type": "array", - "items": { - "type": "string" - } - }, - "human": { - "description": "The value for humans in the dropdown. This should not use abbreviations and should be translated, e.g.\n{\n \"en\": \"meter\",\n \"fr\": \"metre\"\n}", - "anyOf": [ - { - "$ref": "#/definitions/Record" - }, - { - "type": "string" - } - ] - }, - "humanSingular": { - "description": "The value for humans in the dropdown. This should not use abbreviations and should be translated, e.g.\n{\n \"en\": \"minute\",\n \"nl\": \"minuut\"\n}", - "anyOf": [ - { - "$ref": "#/definitions/Record" - }, - { - "type": "string" - } - ] - }, - "prefix": { - "description": "If set, then the canonical value will be prefixed instead, e.g. for '€'\nNote that if all values use 'prefix', the dropdown might move to before the text field", - "type": "boolean" - } - }, - "required": [ - "canonicalDenomination" - ] - }, - "Record": { - "type": "object" - }, - "TagRenderingConfigJson": { - "description": "A TagRenderingConfigJson is a single piece of code which converts one ore more tags into a HTML-snippet.\nFor an _editable_ tagRendering, use 'QuestionableTagRenderingConfigJson' instead, which extends this one", - "type": "object", - "properties": { - "id": { - "description": "The id of the tagrendering, should be an unique string.\nUsed to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise.\n\nUse 'questions' to trigger the question box of this group (if a group is defined)", - "type": "string" - }, - "group": { - "description": "If 'group' is defined on many tagRenderings, these are grouped together when shown. The questions are grouped together as well.\nThe first tagRendering of a group will always be a sticky element.", - "type": "string" - }, - "labels": { - "description": "A list of labels. These are strings that are used for various purposes, e.g. to filter them away", - "type": "array", - "items": { - "type": "string" - } - }, - "description": { - "description": "A human-readable text explaining what this tagRendering does" - }, - "render": { - "description": "Renders this value. Note that \"{key}\"-parts are substituted by the corresponding values of the element.\nIf neither 'textFieldQuestion' nor 'mappings' are defined, this text is simply shown as default value.\n\nNote 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
`\ntype: rendered" - }, - "condition": { - "description": "Only show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", - "anyOf": [ - { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" - }, - { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" - }, - { - "type": "string" - } - ] - }, - "freeform": { - "description": "Allow freeform text input from the user", - "type": "object", - "properties": { - "key": { - "description": "If this key is present, then 'render' is used to display the value.\nIf this is undefined, the rendering is _always_ shown", - "type": "string" - } - }, - "required": [ - "key" - ] - }, - "mappings": { - "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", - "type": "array", - "items": { - "type": "object", - "properties": { - "if": { - "$ref": "#/definitions/TagConfigJson", - "description": "If this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}" - }, - "then": { - "description": "If the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option\nType: rendered" - }, - "icon": { - "description": "An icon supporting this mapping; typically shown pretty small\nType: icon", - "anyOf": [ - { - "type": "object", - "properties": { - "path": { - "description": "The path to the icon\nType: icon", - "type": "string" - }, - "class": { - "description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-', so defining your own in combination with a custom CSS is possible (but discouraged)", - "type": "string" - } - }, - "required": [ - "path" - ] - }, - { - "type": "string" - } - ] - } - }, - "required": [ - "if", - "then" - ] - } - } - } - }, - "Record": { - "type": "object" - }, - "MappingConfigJson": { - "type": "object", - "properties": { - "if": { - "$ref": "#/definitions/TagConfigJson", - "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation" - }, - "then": { - "description": "Shown if the 'if is fulfilled\nType: rendered" - }, - "icon": { - "description": "An extra icon supporting the choice\nType: icon", - "anyOf": [ - { - "type": "object", - "properties": { - "path": { - "description": "The path to the icon\nType: icon", - "type": "string" - }, - "class": { - "description": "Size of the image", - "type": "string" - } - }, - "required": [ - "path" - ] - }, - { - "type": "string" - } - ] - }, - "hideInAnswer": { - "description": "In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n\n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}", - "anyOf": [ - { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" - }, - { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" - }, - { - "type": [ - "string", - "boolean" - ] - } - ] - }, - "ifnot": { - "description": "Only applicable if 'multiAnswer' is set.\nThis is for situations such as:\n`accepts:coins=no` where one can select all the possible payment methods. However, we want to make explicit that some options _were not_ selected.\nThis can be done with `ifnot`\nNote that we can not explicitly render this negative case to the user, we cannot show `does _not_ accept coins`.\nIf this is important to your usecase, consider using multiple radiobutton-fields without `multiAnswer`", - "anyOf": [ - { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" - }, - { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" - }, - { - "type": "string" - } - ] - }, - "addExtraTags": { - "description": "If chosen as answer, these tags will be applied as well onto the object.\nNot compatible with multiAnswer.\n\nThis can be used e.g. to erase other keys which indicate the 'not' value:\n```json\n{\n \"if\": \"crossing:marking=rainbow\",\n \"then\": \"This is a rainbow crossing\",\n \"addExtraTags\": \"not:crossing:marking=\"\n}\n```", - "type": "array", - "items": { - "type": "string" - } - }, - "searchTerms": { - "description": "If there are many options, the mappings-radiobuttons will be replaced by an element with a searchfunction\n\nSearchterms (per language) allow to easily find an option if there are many options", - "$ref": "#/definitions/Record" - }, - "priorityIf": { - "description": "If the searchable selector is picked, mappings with this item will have priority and show up even if the others are hidden\nUse this sparingly", - "anyOf": [ - { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" - }, - { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" - }, - { - "type": "string" - } - ] - }, - "#": { - "description": "Used for comments or to disable a validation\n\nignore-image-in-then: normally, a `then`-clause is not allowed to have an `img`-html-element as icons are preferred. In some cases (most notably title-icons), this is allowed", - "type": "string" - } - }, - "required": [ - "if", - "then" - ] - }, - "T": { - "type": "object" - }, - "default_4": { - "description": "The PointRenderingConfig gives all details onto how to render a single point of a feature.\n\nThis can be used if:\n\n- The feature is a point\n- To render something at the centroid of an area, or at the start, end or projected centroid of a way", - "type": "object", - "properties": { - "location": { - "description": "All the locations that this point should be rendered at.\nUsing `location: [\"point\", \"centroid\"] will always render centerpoint.\n'projected_centerpoint' will show an item on the line itself, near the middle of the line. (LineStrings only)", - "type": "array", - "items": { - "type": "string" - } - }, - "icon": { - "description": "The icon for an element.\nNote that this also doubles as the icon for this layer (rendered with the overpass-tags) ánd the icon in the presets.\n\nThe result of the icon is rendered as follows:\nthe resulting string is interpreted as a _list_ of items, separated by \";\". The bottommost layer is the first layer.\nAs a result, on could use a generic pin, then overlay it with a specific icon.\nTo make things even more practical, one can use all SVG's from the folder \"assets/svg\" and _substitute the color_ in it.\nE.g. to draw a red pin, use \"pin:#f00\", to have a green circle with your icon on top, use `circle:#0f0;`\n\nType: icon", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - }, - "iconBadges": { - "description": "A list of extra badges to show next to the icon as small badge\nThey will be added as a 25% height icon at the bottom right of the icon, with all the badges in a flex layout.\n\nNote: strings are interpreted as icons, so layering and substituting is supported. You can use `circle:white;./my_icon.svg` to add a background circle", - "type": "array", - "items": { - "type": "object", - "properties": { - "if": { - "$ref": "#/definitions/TagConfigJson", - "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation" - }, - "then": { - "description": "Badge to show\nType: icon", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - } - }, - "required": [ - "if", - "then" - ] - } - }, - "iconSize": { - "description": "A string containing \"width,height\" or \"width,height,anchorpoint\" where anchorpoint is any of 'center', 'top', 'bottom', 'left', 'right', 'bottomleft','topright', ...\nDefault is '40,40,center'", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - }, - "rotation": { - "description": "The rotation of an icon, useful for e.g. directions.\nUsage: 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)``", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - }, - "label": { - "description": "A HTML-fragment that is shown below the icon, for example:\n
{name}
\n\nIf the icon is undefined, then the label is shown in the center of the feature.\nNote that, if the wayhandling hides the icon then no label is shown as well.", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - }, - "css": { - "description": "A snippet of css code", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - }, - "cssClasses": { - "description": "A snippet of css-classes. They can be space-separated", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - } - }, - "required": [ - "location" - ] - }, - "default_5": { - "description": "The LineRenderingConfig gives all details onto how to render a single line of a feature.\n\nThis can be used if:\n\n- The feature is a line\n- The feature is an area", - "type": "object", - "properties": { - "color": { - "description": "The color for way-elements and SVG-elements.\nIf the value starts with \"--\", the style of the body element will be queried for the corresponding variable instead", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - }, - "width": { - "description": "The stroke-width for way-elements", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": [ - "string", - "number" - ] - } - ] - }, - "dashArray": { - "description": "A dasharray, e.g. \"5 6\"\nThe dasharray defines 'pixels of line, pixels of gap, pixels of line, pixels of gap',\nDefault value: \"\" (empty string == full line)", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - }, - "lineCap": { - "description": "The form at the end of a line", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - }, - "fill": { - "description": "Whether or not to fill polygons", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "enum": [ - "no", - "yes" - ], - "type": "string" - } - ] - }, - "fillColor": { - "description": "The color to fill a polygon with.\nIf undefined, this will be slightly more opaque version of the stroke line", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - }, - "offset": { - "description": "The number of pixels this line should be moved.\nUse a positive numbe to move to the right, a negative to move to the left (left/right as defined by the drawing direction of the line).\n\nIMPORTANT: MapComplete will already normalize 'key:both:property' and 'key:both' into the corresponding 'key:left' and 'key:right' tagging (same for 'sidewalk=left/right/both' which is rewritten to 'sidewalk:left' and 'sidewalk:right')\nThis simplifies programming. Refer to the CalculatedTags.md-documentation for more details", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "number" - } - ] - } - } - }, - "default": { - "description": "Rewrites and multiplies the given renderings of type T.\n\nThis can be used for introducing many similar questions automatically,\nwhich also makes translations easier.\n\n(Note that the key does _not_ need to be wrapped in {}.\nHowever, we recommend to use them if the key is used in a translation, as missing keys will be picked up and warned for by the translation scripts)\n\nFor example:\n\n```\n{\n rewrite: {\n sourceString: [\"key\", \"a|b|c\"],\n into: [\n [\"X\", 0]\n [\"Y\", 1],\n [\"Z\", 2]\n ],\n renderings: [{\n \"key\":\"a|b|c\"\n }]\n }\n}\n```\nwill result in _three_ copies (as the values to rewrite into have three values, namely:\n\n[\n {\n # The first pair: key --> X, a|b|c --> 0\n \"X\": 0\n },\n {\n \"Y\": 1\n },\n {\n \"Z\": 2\n }\n\n]", - "type": "object", - "properties": { - "rewrite": { - "type": "object", - "properties": { - "sourceString": { - "type": "array", - "items": { - "type": "string" - } - }, - "into": { - "type": "array", - "items": { - "type": "array", - "items": {} - } - } - }, - "required": [ - "into", - "sourceString" - ] - }, - "renderings": { - "anyOf": [ - { - "$ref": "#/definitions/default_4" - }, - { - "$ref": "#/definitions/default_5" - }, - { - "type": "array", - "items": { - "$ref": "#/definitions/default_5" - } - }, - { - "type": "array", - "items": { - "$ref": "#/definitions/default_4" - } - } - ] - } - }, - "required": [ - "renderings", - "rewrite" - ] - }, - "QuestionableTagRenderingConfigJson": { - "description": "A QuestionableTagRenderingConfigJson is a single piece of code which converts one ore more tags into a HTML-snippet.\nIf the desired tags are missing and a question is defined, a question will be shown instead.", - "type": "object", - "properties": { - "question": { - "description": "If it turns out that this tagRendering doesn't match _any_ value, then we show this question.\nIf undefined, the question is never asked and this tagrendering is read-only", - "anyOf": [ - { - "$ref": "#/definitions/Record" - }, - { - "type": "string" - } - ] - }, - "questionHint": { - "description": "A hint which is shown in subtle text under the question.\nThis can give some extra information on what the answer should ook like", - "anyOf": [ - { - "$ref": "#/definitions/Record" - }, - { - "type": "string" - } - ] - }, - "freeform": { - "description": "Allow freeform text input from the user", - "type": "object", - "properties": { - "key": { - "type": "string" - }, - "type": { - "description": "The type of the text-field, e.g. 'string', 'nat', 'float', 'date',...\nSee Docs/SpecialInputElements.md and UI/Input/ValidatedTextField.ts for supported values", - "type": "string" - }, - "placeholder": { - "description": "A (translated) text that is shown (as gray text) within the textfield" - }, - "helperArgs": { - "description": "Extra parameters to initialize the input helper arguments.\nFor semantics, see the 'SpecialInputElements.md'", - "type": "array", - "items": {} - }, - "addExtraTags": { - "description": "If a value is added with the textfield, these extra tag is addded.\nUseful to add a 'fixme=freeform textfield used - to be checked'", - "type": "array", - "items": { - "type": "string" - } - }, - "inline": { - "description": "When set, influences the way a question is asked.\nInstead of showing a full-widht text field, the text field will be shown within the rendering of the question.\n\nThis combines badly with special input elements, as it'll distort the layout.", - "type": "boolean" - }, - "default": { - "description": "default value to enter if no previous tagging is present.\nNormally undefined (aka do not enter anything)", - "type": "string" - } - }, - "required": [ - "key" - ] - }, - "multiAnswer": { - "description": "If true, use checkboxes instead of radio buttons when asking the question", - "type": "boolean" - }, - "mappings": { - "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", - "type": "array", - "items": { - "$ref": "#/definitions/MappingConfigJson" - } - }, - "id": { - "description": "The id of the tagrendering, should be an unique string.\nUsed to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise.\n\nUse 'questions' to trigger the question box of this group (if a group is defined)", - "type": "string" - }, - "group": { - "description": "If 'group' is defined on many tagRenderings, these are grouped together when shown. The questions are grouped together as well.\nThe first tagRendering of a group will always be a sticky element.", - "type": "string" - }, - "labels": { - "description": "A list of labels. These are strings that are used for various purposes, e.g. to filter them away", - "type": "array", - "items": { - "type": "string" - } - }, - "description": { - "description": "A human-readable text explaining what this tagRendering does" - }, - "render": { - "description": "Renders this value. Note that \"{key}\"-parts are substituted by the corresponding values of the element.\nIf neither 'textFieldQuestion' nor 'mappings' are defined, this text is simply shown as default value.\n\nNote 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
`\ntype: rendered" - }, - "condition": { - "description": "Only show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", - "anyOf": [ - { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" - }, - { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" - }, - { - "type": "string" - } - ] - } - } - }, - "Partial": { - "type": "object", - "properties": { - "question": { - "description": "If it turns out that this tagRendering doesn't match _any_ value, then we show this question.\nIf undefined, the question is never asked and this tagrendering is read-only", - "anyOf": [ - { - "$ref": "#/definitions/Record" - }, - { - "type": "string" - } - ] - }, - "questionHint": { - "description": "A hint which is shown in subtle text under the question.\nThis can give some extra information on what the answer should ook like", - "anyOf": [ - { - "$ref": "#/definitions/Record" - }, - { - "type": "string" - } - ] - }, - "freeform": { - "description": "Allow freeform text input from the user", - "type": "object", - "properties": { - "key": { - "type": "string" - }, - "type": { - "description": "The type of the text-field, e.g. 'string', 'nat', 'float', 'date',...\nSee Docs/SpecialInputElements.md and UI/Input/ValidatedTextField.ts for supported values", - "type": "string" - }, - "placeholder": { - "description": "A (translated) text that is shown (as gray text) within the textfield" - }, - "helperArgs": { - "description": "Extra parameters to initialize the input helper arguments.\nFor semantics, see the 'SpecialInputElements.md'", - "type": "array", - "items": {} - }, - "addExtraTags": { - "description": "If a value is added with the textfield, these extra tag is addded.\nUseful to add a 'fixme=freeform textfield used - to be checked'", - "type": "array", - "items": { - "type": "string" - } - }, - "inline": { - "description": "When set, influences the way a question is asked.\nInstead of showing a full-widht text field, the text field will be shown within the rendering of the question.\n\nThis combines badly with special input elements, as it'll distort the layout.", - "type": "boolean" - }, - "default": { - "description": "default value to enter if no previous tagging is present.\nNormally undefined (aka do not enter anything)", - "type": "string" - } - }, - "required": [ - "key" - ] - }, - "multiAnswer": { - "description": "If true, use checkboxes instead of radio buttons when asking the question", - "type": "boolean" - }, - "mappings": { - "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", - "type": "array", - "items": { - "$ref": "#/definitions/MappingConfigJson" - } - }, - "id": { - "description": "The id of the tagrendering, should be an unique string.\nUsed to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise.\n\nUse 'questions' to trigger the question box of this group (if a group is defined)", - "type": "string" - }, - "group": { - "description": "If 'group' is defined on many tagRenderings, these are grouped together when shown. The questions are grouped together as well.\nThe first tagRendering of a group will always be a sticky element.", - "type": "string" - }, - "labels": { - "description": "A list of labels. These are strings that are used for various purposes, e.g. to filter them away", - "type": "array", - "items": { - "type": "string" - } - }, - "description": { - "description": "A human-readable text explaining what this tagRendering does" - }, - "render": { - "description": "Renders this value. Note that \"{key}\"-parts are substituted by the corresponding values of the element.\nIf neither 'textFieldQuestion' nor 'mappings' are defined, this text is simply shown as default value.\n\nNote 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
`\ntype: rendered" - }, - "condition": { - "description": "Only show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", - "anyOf": [ - { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" - }, - { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" - }, - { - "type": "string" - } - ] - } - } - }, - "default<(string|QuestionableTagRenderingConfigJson|{builtin:string;override:Partial;})[]>": { - "description": "Rewrites and multiplies the given renderings of type T.\n\nThis can be used for introducing many similar questions automatically,\nwhich also makes translations easier.\n\n(Note that the key does _not_ need to be wrapped in {}.\nHowever, we recommend to use them if the key is used in a translation, as missing keys will be picked up and warned for by the translation scripts)\n\nFor example:\n\n```\n{\n rewrite: {\n sourceString: [\"key\", \"a|b|c\"],\n into: [\n [\"X\", 0]\n [\"Y\", 1],\n [\"Z\", 2]\n ],\n renderings: [{\n \"key\":\"a|b|c\"\n }]\n }\n}\n```\nwill result in _three_ copies (as the values to rewrite into have three values, namely:\n\n[\n {\n # The first pair: key --> X, a|b|c --> 0\n \"X\": 0\n },\n {\n \"Y\": 1\n },\n {\n \"Z\": 2\n }\n\n]", - "type": "object", - "properties": { - "rewrite": { - "type": "object", - "properties": { - "sourceString": { - "type": "array", - "items": { - "type": "string" - } - }, - "into": { - "type": "array", - "items": { - "type": "array", - "items": {} - } - } - }, - "required": [ - "into", - "sourceString" - ] - }, - "renderings": { - "type": "array", - "items": { - "anyOf": [ - { - "$ref": "#/definitions/QuestionableTagRenderingConfigJson" - }, - { - "type": "object", - "properties": { - "builtin": { - "type": "string" - }, - "override": { - "$ref": "#/definitions/Partial" - } - }, - "required": [ - "builtin", - "override" - ] - }, - { - "type": "string" - } - ] - } - } - }, - "required": [ - "renderings", - "rewrite" - ] - }, - "default_1": { - "type": "object", - "properties": { - "id": { - "description": "An id/name for this filter, used to set the URL parameters", - "type": "string" - }, - "options": { - "description": "The options for a filter\nIf there are multiple options these will be a list of radio buttons\nIf there is only one option this will be a checkbox\nFiltering is done based on the given osmTags that are compared to the objects in that layer.\n\nAn example which searches by name:\n\n```\n{\n \"id\": \"shop-name\",\n \"options\": [\n {\n \"fields\": [\n {\n \"name\": \"search\",\n \"type\": \"string\"\n }\n ],\n \"osmTags\": \"name~i~.*{search}.*\",\n \"question\": {\n \"en\": \"Only show shops with name {search}\",\n }\n }\n ]\n }\n ```", - "type": "array", - "items": { - "type": "object", - "properties": { - "question": {}, - "osmTags": { - "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation", - "anyOf": [ - { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" - }, - { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" - }, - { - "type": "string" - } - ] - }, - "default": { - "type": "boolean" - }, - "fields": { - "type": "array", - "items": { - "type": "object", - "properties": { - "name": { - "description": "If name is `search`, use \"_first_comment~.*{search}.*\" as osmTags", - "type": "string" - }, - "type": { - "type": "string" - } - }, - "required": [ - "name" - ] - } - } - }, - "required": [ - "question" - ] - } - }, - "#": { - "description": "Used for comments or to disable a check\n\n\"ignore-possible-duplicate\": disables a check in `DetectDuplicateFilters` which complains that a filter can be replaced by a filter from the `filters`-library-layer", - "type": "string" - } - }, - "required": [ - "id", - "options" - ] - }, - "DeleteConfigJson": { - "type": "object", - "properties": { - "extraDeleteReasons": { - "description": "*\nBy default, three reasons to delete a point are shown:\n\n- The point does not exist anymore\n- The point was a testing point\n- THe point could not be found\n\nHowever, for some layers, there might be different or more specific reasons for deletion which can be user friendly to set, e.g.:\n\n- the shop has closed\n- the climbing route has been closed of for nature conservation reasons\n- ...\n\nThese reasons can be stated here and will be shown in the list of options the user can choose from", - "type": "array", - "items": { - "type": "object", - "properties": { - "explanation": { - "description": "The text that will be shown to the user - translatable" - }, - "changesetMessage": { - "description": "The text that will be uploaded into the changeset or will be used in the fixme in case of a soft deletion\nShould be a few words, in english", - "type": "string" - } - }, - "required": [ - "changesetMessage", - "explanation" - ] - } - }, - "nonDeleteMappings": { - "description": "In some cases, a (starting) contributor might wish to delete a feature even though deletion is not appropriate.\n(The most relevant case are small paths running over private property. These should be marked as 'private' instead of deleted, as the community might trace the path again from aerial imagery, gettting us back to the original situation).\n\nBy adding a 'nonDeleteMapping', an option can be added into the list which will retag the feature.\nIt is important that the feature will be retagged in such a way that it won't be picked up by the layer anymore!", - "type": "array", - "items": { - "type": "object", - "properties": { - "if": { - "$ref": "#/definitions/TagConfigJson", - "description": "The tags that will be given to the object.\nThis must remove tags so that the 'source/osmTags' won't match anymore" - }, - "then": { - "description": "The human explanation for the options" - } - }, - "required": [ - "if", - "then" - ] - } - }, - "softDeletionTags": { - "description": "In some cases, the contributor is not allowed to delete the current feature (e.g. because it isn't a point, the point is referenced by a relation or the user isn't experienced enough).\nTo still offer the user a 'delete'-option, the feature is retagged with these tags. This is a soft deletion, as the point isn't actually removed from OSM but rather marked as 'disused'\nIt is important that the feature will be retagged in such a way that it won't be picked up by the layer anymore!\n\nExample (note that \"amenity=\" erases the 'amenity'-key alltogether):\n```\n{\n \"and\": [\"disussed:amenity=public_bookcase\", \"amenity=\"]\n}\n```\n\nor (notice the use of the ':='-tag to copy the old value of 'shop=*' into 'disused:shop='):\n```\n{\n \"and\": [\"disused:shop:={shop}\", \"shop=\"]\n}\n```", - "anyOf": [ - { - "$ref": "#/definitions/AndTagConfigJson", - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" - }, - { - "$ref": "#/definitions/OrTagConfigJson", - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation" - }, - { - "type": "string" - } - ] - }, - "neededChangesets": { - "description": "*\nBy default, the contributor needs 20 previous changesets to delete points edited by others.\nFor some small features (e.g. bicycle racks) this is too much and this requirement can be lowered or dropped, which can be done here.", - "type": "number" - }, - "omitDefaultDeleteReasons": { - "description": "Set this flag if the default delete reasons should be omitted from the dialog.\nThis requires at least one extraDeleteReason or nonDeleteMapping", - "type": "boolean" - } - } - }, - "default_3": { - "type": "object", - "properties": { - "enableImproveAccuracy": { - "description": "One default reason to move a point is to improve accuracy.\nSet to false to disable this reason", - "type": "boolean" - }, - "enableRelocation": { - "description": "One default reason to move a point is because it has relocated\nSet to false to disable this reason", - "type": "boolean" - } - } - }, - "default_2": { - "description": "In some cases, a value is represented in a certain unit (such as meters for heigt/distance/..., km/h for speed, ...)\n\nSometimes, multiple denominations are possible (e.g. km/h vs mile/h; megawatt vs kilowatt vs gigawatt for power generators, ...)\n\nThis brings in some troubles, as there are multiple ways to write it (no denomitation, 'm' vs 'meter' 'metre', ...)\n\nNot only do we want to write consistent data to OSM, we also want to present this consistently to the user.\nThis is handled by defining units.\n\n# Rendering\n\nTo render a value with long (human) denomination, use {canonical(key)}\n\n# Usage\n\nFirst of all, you define which keys have units applied, for example:\n\n```\nunits: [\n appliesTo: [\"maxspeed\", \"maxspeed:hgv\", \"maxspeed:bus\"]\n applicableUnits: [\n ...\n ]\n]\n```\n\nApplicableUnits defines which is the canonical extension, how it is presented to the user, ...:\n\n```\napplicableUnits: [\n{\n canonicalDenomination: \"km/h\",\n alternativeDenomination: [\"km/u\", \"kmh\", \"kph\"]\n default: true,\n human: {\n en: \"kilometer/hour\",\n nl: \"kilometer/uur\"\n },\n humanShort: {\n en: \"km/h\",\n nl: \"km/u\"\n }\n},\n{\n canoncialDenomination: \"mph\",\n ... similar for miles an hour ...\n}\n]\n```\n\n\nIf this is defined, then every key which the denominations apply to (`maxspeed`, `maxspeed:hgv` and `maxspeed:bus`) will be rewritten at the metatagging stage:\nevery value will be parsed and the canonical extension will be added add presented to the other parts of the code.\n\nAlso, if a freeform text field is used, an extra dropdown with applicable denominations will be given", - "type": "object", - "properties": { - "appliesToKey": { - "description": "Every key from this list will be normalized.\n\nTo render a united value properly, use", - "type": "array", - "items": { - "type": "string" - } - }, - "eraseInvalidValues": { - "description": "If set, invalid values will be erased in the MC application (but not in OSM of course!)\nBe careful with setting this", - "type": "boolean" - }, - "applicableUnits": { - "description": "The possible denominations for this unit.\nFor length, denominations could be \"meter\", \"kilometer\", \"miles\", \"foot\"", - "type": "array", - "items": { - "$ref": "#/definitions/DenominationConfigJson" - } - }, - "defaultInput": { - "description": "In some cases, the default denomination is not the most user friendly to input.\nE.g., when measuring kerb heights, it is illogical to ask contributors to input an amount in meters.\n\nWhen a default input method should be used, this can be specified by setting the canonical denomination here, e.g.\n`defaultInput: \"cm\"`. This must be a denomination which appears in the applicableUnits", - "type": "string" - } - }, - "required": [ - "applicableUnits", - "appliesToKey" - ] - } - }, - "$schema": "http://json-schema.org/draft-07/schema#" -} \ No newline at end of file diff --git a/Docs/Schemas/UnitConfigJson.schema.json b/Docs/Schemas/UnitConfigJson.schema.json index 624997222..252f208de 100644 --- a/Docs/Schemas/UnitConfigJson.schema.json +++ b/Docs/Schemas/UnitConfigJson.schema.json @@ -3,7 +3,7 @@ "type": "object", "properties": { "appliesToKey": { - "description": "Every key from this list will be normalized.\n\nTo render a united value properly, use", + "description": "Every key from this list will be normalized.\n\nTo render the value properly (with a human readable denomination), use `{canonical()}`", "type": "array", "items": { "type": "string" @@ -31,13 +31,12 @@ ], "definitions": { "TagConfigJson": { - "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation", + "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation\n\ntype: tag", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", "type": "object", "properties": { "or": { @@ -56,8 +55,7 @@ } ] }, - "AndTagConfigJson": { - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", + "{and:TagConfigJson[];}": { "type": "object", "properties": { "and": { @@ -72,8 +70,7 @@ ], "additionalProperties": false }, - "OrTagConfigJson": { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", + "{or:TagConfigJson[];}": { "type": "object", "properties": { "or": { diff --git a/Docs/Schemas/UnitConfigJsonJSC.ts b/Docs/Schemas/UnitConfigJsonJSC.ts index 857c15586..b8d7b913b 100644 --- a/Docs/Schemas/UnitConfigJsonJSC.ts +++ b/Docs/Schemas/UnitConfigJsonJSC.ts @@ -3,7 +3,7 @@ export default { "type": "object", "properties": { "appliesToKey": { - "description": "Every key from this list will be normalized.\n\nTo render a united value properly, use", + "description": "Every key from this list will be normalized.\n\nTo render the value properly (with a human readable denomination), use `{canonical()}`", "type": "array", "items": { "type": "string" @@ -31,13 +31,12 @@ export default { ], "definitions": { "TagConfigJson": { - "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation", + "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation\n\ntype: tag", "anyOf": [ { - "$ref": "#/definitions/AndTagConfigJson" + "$ref": "#/definitions/{and:TagConfigJson[];}" }, { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", "type": "object", "properties": { "or": { @@ -56,8 +55,7 @@ export default { } ] }, - "AndTagConfigJson": { - "description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", + "{and:TagConfigJson[];}": { "type": "object", "properties": { "and": { @@ -71,8 +69,7 @@ export default { "and" ] }, - "OrTagConfigJson": { - "description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation", + "{or:TagConfigJson[];}": { "type": "object", "properties": { "or": { diff --git a/Docs/SpecialInputElements.md b/Docs/SpecialInputElements.md index 43fad305f..b03f44899 100644 --- a/Docs/SpecialInputElements.md +++ b/Docs/SpecialInputElements.md @@ -24,7 +24,14 @@ + [phone](#phone) + [opening_hours](#opening_hours) + [color](#color) + + [image](#image) + + [simple_tag](#simple_tag) + + [tag](#tag) + + [key](#key) + + [translation](#translation) + + [icon](#icon) + [fediverse](#fediverse) + + [id](#id) @@ -262,10 +269,66 @@ Shows a color picker +### image + + + +Same as the URL-parameter, except that it checks that the URL ends with `.jpg`, `.png` or some other typical image format + + + +### simple_tag + + + +A simple tag of the format `key=value` where `key` conforms to a normal key ` + + + +### tag + + + +A simple tag of the format `key=value` OR a tagExpression + + + +### key + + + +Validates a key, mostly that no weird characters are used + + + +### translation + + + +Makes sure the the string is of format `Record` + + + +### icon + + + +Makes sure that a valid .svg-path is added + + + ### fediverse -Validates fediverse addresses and normalizes them into `@username@server`-format +Validates fediverse addresses and normalizes them into `@username@server`-format + + + +### id + + + +Checks for valid identifiers for layers, will automatically replace spaces and uppercase This document is autogenerated from [src/UI/InputElement/Validators.ts](https://github.com/pietervdvn/MapComplete/blob/develop/src/UI/InputElement/Validators.ts) diff --git a/Docs/SpecialRenderings.md b/Docs/SpecialRenderings.md index 2fcbcadf7..1c0ef1d03 100644 --- a/Docs/SpecialRenderings.md +++ b/Docs/SpecialRenderings.md @@ -146,8 +146,14 @@ In other words: use `{ "before": ..., "after": ..., "special": {"type": ..., "ar * [Example usage of link](#example-usage-of-link) + [multi](#multi) * [Example usage of multi](#example-usage-of-multi) + + [translated](#translated) + * [Example usage of translated](#example-usage-of-translated) + [fediverse_link](#fediverse_link) * [Example usage of fediverse_link](#example-usage-of-fediverse_link) + + [braced](#braced) + * [Example usage of braced](#example-usage-of-braced) + + [tags](#tags) + * [Example usage of tags](#example-usage-of-tags) + [auto_apply](#auto_apply) * [Example usage of auto_apply](#example-usage-of-auto_apply) @@ -1038,6 +1044,21 @@ tagrendering | _undefined_ | An entire tagRenderingConfig +### translated + + If the given key can be interpreted as a JSON, only show the key containing the current language (or 'en'). This specialRendering is meant to be used by MapComplete studio and is not useful in map themes + +name | default | description +------ | --------- | ------------- +key | value | The attribute to interpret as json + + +#### Example usage of translated + + `{translated(value)}` + + + ### fediverse_link Converts a fediverse username or link into a clickable link @@ -1053,6 +1074,36 @@ key | _undefined_ | The attribute-name containing the link +### braced + + Show a literal text within braces + +name | default | description +------ | --------- | ------------- +text | _undefined_ | The value to show + + +#### Example usage of braced + + `{braced()}` + + + +### tags + + Shows a (json of) tags in a human-readable way + links to the wiki + +name | default | description +------ | --------- | ------------- +key | value | The key to look for the tags + + +#### Example usage of tags + + `{tags(value)}` + + + ### auto_apply A button to run many actions for many features at once. To effectively use this button, you'll need some ingredients: diff --git a/Docs/Sponsors.md b/Docs/Sponsors.md index 0637889af..5e0ef0e11 100644 --- a/Docs/Sponsors.md +++ b/Docs/Sponsors.md @@ -11,7 +11,7 @@ NL-Net is currently sponsoring Pietervdvn as well [for specific improvements](ht ## Historical sponsors -The following organisations ordered a theme to Pieter Vander Vennet and thus sponsered the project. +The following organisations ordered a theme to Pieter Vander Vennet and thus sponsored the project. As these projects are finished, they have no relation with the project anymore. Most recent projects are first: diff --git a/Docs/Studio/Introduction.md b/Docs/Studio/Introduction.md new file mode 100644 index 000000000..ca858b0cb --- /dev/null +++ b/Docs/Studio/Introduction.md @@ -0,0 +1,126 @@ +# Welcome to MapComplete Studio + +Hi! + +Welcome to MapComplete Studio. + +These slides will walk you through the most important concepts to use MapComplete Studio effectively + +# What is OpenStreetMap? + +[OpenStreetMap](https://openstreetmap.org) is a worldwide, collaborative project where we map the world together. + +People worldwide do add data about features around the world, such as streets, shops, toilets, infrastructure, ... + +All type of objects are welcome to be added into OpenStreetMap, as long as: + +1. *The object can be verified on the ground and is present* +2. *The object is permanent* + + + +The following items are thus *not* welcome: + +- Do not add events such as a festival +- Do not add measurements of e.g. air quality, traffic counts, ... [Sensor.Community](https://sensor.community/) is the right place for this +- Do not add points that are only interesting to you (e.g. the route of your next trip). [UMap](https://umap.openstreetmap.fr) is the right tool for this +- Do not add privacy-sensitive information, e.g. the names of persons living in a house +- Do not add data about now demolished items, such as 'there was a battle here 100 years ago' or 'there was a school here, before it was completely demolished and rebuild'. This can be added to [OpenHistoricalMap](https://www.openhistoricalmap.org/) instead. + +# How can OpenStreetMap data be reused? + +OpenStreetMap data can be reused freely, including for commercial purposes. However, you have to: + +1. Give attribution +2. Keep the data open - changes to data based on OpenStreetMap must be published under the same license. + +You can read the [full copyright notice here](https://osm.org/copyright) + +This also means that we are *not* allowed to copy data from other maps. Do not enter data based on Google Maps! + +# How does OpenStreetMap organise the data? + +In OpenStreetMap, the geodata can be one of three types: + +- **Points** which have a geocoordinate +- **Lines** which are a _list_ of points. Closed lines are used to represent polygons +- **Relations** which are a _list_ of points, lines and/or other relations. + +All of those objects have a set of **attributes**. These are pairs of a **key** and a **value** which tell us what a point or line does represent. For example, `amenity=bench` represents a sitting bench. + +You can find the meaning of all those keys and values on the [OpenStreetMap-wiki](https://wiki.openstreetmap.org/) + + + + +# OpenStreetMap does **not** have layers + +Many traditional GIS-applications organise the data into layers. + +OpenStreetMap does not do this. Consider this place: + +
+ + +
+ +This place has three functions: + +- It is a shop, selling boardgames +- It is a café, where one can drink a tea (while testing one of the board games) +- It is a social inclusion project for people with a mental disability + +In a traditional system with layers, one would either have to choose the most fitting layer (e.g. the layer `pub`, `shops` or `social facility`? ) losing the multi-facetted aspect of the place. +Another approach could be to add it to all three layers, duplicating the data. However, this makes maintaining the data harder. +
+
+ +# What is MapComplete? + +MapComplete is a map viewer and editor. A contributor is presented a *thematic map* with features that are relevant to this topic. + +These features are based on OpenStreetMap. If some data is not known, the user will be asked some **questions** and is invited to answer them. These answers are sent back to OpenStreetMap, updating it there. + + + +Data can also be loaded and visualised from external sources. No changes can be made to the data in that case. + + + +# MapComplete _does_ have layers + +A layer in mapcomplete describes a single type of object, e.g. _shops_, _toilets_, _benches_, _public bookcases_. + +A layer tells us: + +- What features to load from OpenStreetMap - thus what attributes the displayed data should have + - (Or where to find the data if we are using an external datasource) +- How these should be displayed on the map +- What should be shown in the popup... +- ... and what questions should be asked +- How to create a _new point_ onto the map + +# MapComplete does have themes + +A _theme_ is a **collection of layers**, with a title and a description. + +For example, [cyclofix](https://mapcomplete.org/cyclofix) has many bicycle-related layers (of which items are shown on the map) and an introduction. + +
+ + + +
+ + +# Studio + +In MapComplete Studio, you can create and edit layers and themes to tweak it for your needs. + +As a reminder: + +- [OpenStreetMap](https://openstreetmap.org) is an open, geographical database which can be reused under [a permissive license](https://openstreetmap.org/copyright) +- MapComplete visualises data (mostly) from OpenStreetMap and can add new points and attributes to OpenStreetMap +- MapComplete works with layers; which can be bundled into a theme + +Have fun creating your custom MapComplete-map! diff --git a/Docs/Studio/TagRenderingIntro.md b/Docs/Studio/TagRenderingIntro.md new file mode 100644 index 000000000..231689497 --- /dev/null +++ b/Docs/Studio/TagRenderingIntro.md @@ -0,0 +1,59 @@ +# How to work with TagRenderings + +The information box shows various attributes of the selected feature in a human friendly way. + +This is done by a **tagRendering** which converts attributes into text. + +This can be done by using **predefined options** (mappings) or with a **render**-string + +# Predefined options + +A predefined option states that, `if` a certain tag is present, `then` a certain text should be shown. + +For example, a playground may be lit or not. +In OpenStreetMap, this is encoded with the tag `lit=yes` or `lit=no`. We might want to show `This playground is lit at night` and `This playground is not lit at night` to users of MapComplete. + +This is what this will look like in the interface: + + + +# Substituting attributes + +If none of the predefined options match, the string given in the `render`-field is used (under the question _"What text should be rendered?"_). + +A special property about all shown texts is that, **if the name of a key appears between braces, this will be replaced by the corresponding value**. + +For example, if the object has tags `min_age=3` and the text to display is `Accessible to kids older than {min_age} years`, then this will be displayed to the user as **Accessible to kids older than 3 years** + +Note that this also works withing predifined options + +# Special values + +Special components can be summoned by calling them. For example, the relevant wikipedia will be displayed by entering the text `{wikipedia()}`. A table with opening hours is displayed with `{opening_hours()}`. For a full reference, [see the documentation](../SpecialRenderings.md). + +# Requesting data with predefined options + +These renderings can be turned into a way to contribute data easily. If a **question** is provided, then these renderings will be asked if unknown or gain the pencil to make changes. + +A predefined option will show up as an option that can be picked. + + +# Requesting data with an input field + +It is also possible to have a text field. For this, the **key** to write into must be given (_What is the name of the attribute that should be written to?_), in this case `max_age`. + + +# Combining predefined options and freeform text + +A text field and predefined options can be combined. The contributor can then choose between a predefined option or filling out something. + + +# Selecting multiple values + +One can set a question to allow multiple answers. This works with predefined options or a freeform text field. + + + +Note that these will be rendered as a list: + + diff --git a/Docs/TagInfo/mapcomplete_advertising.json b/Docs/TagInfo/mapcomplete_advertising.json index 9882b4ab6..ba770efe0 100644 --- a/Docs/TagInfo/mapcomplete_advertising.json +++ b/Docs/TagInfo/mapcomplete_advertising.json @@ -16,7 +16,7 @@ }, { "key": "id", - "description": "Layer 'Advertise' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Advertising') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Advertise' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Advertising') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -95,27 +95,27 @@ }, { "key": "animated", - "description": "Layer 'Advertise' shows animated=no with a fixed text, namely 'Static, always shows the same message' and allows to pick this as a default answer (in the mapcomplete.org theme 'Advertising') (This is only shown if advertising!=screen&advertising!=flag&advertising!=tarp&advertising!=wall_painting&advertising!=sign&advertising!=board)", + "description": "Layer 'Advertise' shows animated=no with a fixed text, namely 'Static, always shows the same message' and allows to pick this as a default answer (in the mapcomplete.org theme 'Advertising') (This is only shown if advertising!=screen &advertising!=flag &advertising!=tarp &advertising!=wall_painting &advertising!=sign &advertising!=board)", "value": "no" }, { "key": "animated", - "description": "Layer 'Advertise' shows animated=digital_display with a fixed text, namely 'This object has a built-in digital display to show prices or some other message' and allows to pick this as a default answer (in the mapcomplete.org theme 'Advertising') (This is only shown if advertising!=screen&advertising!=flag&advertising!=tarp&advertising!=wall_painting&advertising!=sign&advertising!=board)", + "description": "Layer 'Advertise' shows animated=digital_display with a fixed text, namely 'This object has a built-in digital display to show prices or some other message' and allows to pick this as a default answer (in the mapcomplete.org theme 'Advertising') (This is only shown if advertising!=screen &advertising!=flag &advertising!=tarp &advertising!=wall_painting &advertising!=sign &advertising!=board)", "value": "digital_display" }, { "key": "animated", - "description": "Layer 'Advertise' shows animated=trivision_blades with a fixed text, namely 'Trivision - the billboard consists of many triangular prisms which regularly rotate' and allows to pick this as a default answer (in the mapcomplete.org theme 'Advertising') (This is only shown if advertising!=screen&advertising!=flag&advertising!=tarp&advertising!=wall_painting&advertising!=sign&advertising!=board)", + "description": "Layer 'Advertise' shows animated=trivision_blades with a fixed text, namely 'Trivision - the billboard consists of many triangular prisms which regularly rotate' and allows to pick this as a default answer (in the mapcomplete.org theme 'Advertising') (This is only shown if advertising!=screen &advertising!=flag &advertising!=tarp &advertising!=wall_painting &advertising!=sign &advertising!=board)", "value": "trivision_blades" }, { "key": "animated", - "description": "Layer 'Advertise' shows animated=winding_posters with a fixed text, namely 'Scrolling posters' and allows to pick this as a default answer (in the mapcomplete.org theme 'Advertising') (This is only shown if advertising!=screen&advertising!=flag&advertising!=tarp&advertising!=wall_painting&advertising!=sign&advertising!=board)", + "description": "Layer 'Advertise' shows animated=winding_posters with a fixed text, namely 'Scrolling posters' and allows to pick this as a default answer (in the mapcomplete.org theme 'Advertising') (This is only shown if advertising!=screen &advertising!=flag &advertising!=tarp &advertising!=wall_painting &advertising!=sign &advertising!=board)", "value": "winding_posters" }, { "key": "animated", - "description": "Layer 'Advertise' shows animated=revolving with a fixed text, namely 'Rotates on itself' and allows to pick this as a default answer (in the mapcomplete.org theme 'Advertising') (This is only shown if advertising!=screen&advertising!=flag&advertising!=tarp&advertising!=wall_painting&advertising!=sign&advertising!=board)", + "description": "Layer 'Advertise' shows animated=revolving with a fixed text, namely 'Rotates on itself' and allows to pick this as a default answer (in the mapcomplete.org theme 'Advertising') (This is only shown if advertising!=screen &advertising!=flag &advertising!=tarp &advertising!=wall_painting &advertising!=sign &advertising!=board)", "value": "revolving" }, { @@ -125,12 +125,12 @@ }, { "key": "lit", - "description": "Layer 'Advertise' shows lit=yes&luminous=yes with a fixed text, namely 'This object both emits light and is lighted by an external light source' and allows to pick this as a default answer (in the mapcomplete.org theme 'Advertising') (This is only shown if advertising!=screen)", + "description": "Layer 'Advertise' shows lit=yes &luminous=yes with a fixed text, namely 'This object both emits light and is lighted by an external light source' and allows to pick this as a default answer (in the mapcomplete.org theme 'Advertising') (This is only shown if advertising!=screen)", "value": "yes" }, { "key": "luminous", - "description": "Layer 'Advertise' shows lit=yes&luminous=yes with a fixed text, namely 'This object both emits light and is lighted by an external light source' and allows to pick this as a default answer (in the mapcomplete.org theme 'Advertising') (This is only shown if advertising!=screen)", + "description": "Layer 'Advertise' shows lit=yes &luminous=yes with a fixed text, namely 'This object both emits light and is lighted by an external light source' and allows to pick this as a default answer (in the mapcomplete.org theme 'Advertising') (This is only shown if advertising!=screen)", "value": "yes" }, { @@ -145,12 +145,12 @@ }, { "key": "lit", - "description": "Layer 'Advertise' shows lit=no&luminous=no with a fixed text, namely 'This object does not emit light and is not lighted by externally' and allows to pick this as a default answer (in the mapcomplete.org theme 'Advertising') (This is only shown if advertising!=screen)", + "description": "Layer 'Advertise' shows lit=no &luminous=no with a fixed text, namely 'This object does not emit light and is not lighted by externally' and allows to pick this as a default answer (in the mapcomplete.org theme 'Advertising') (This is only shown if advertising!=screen)", "value": "no" }, { "key": "luminous", - "description": "Layer 'Advertise' shows lit=no&luminous=no with a fixed text, namely 'This object does not emit light and is not lighted by externally' and allows to pick this as a default answer (in the mapcomplete.org theme 'Advertising') (This is only shown if advertising!=screen)", + "description": "Layer 'Advertise' shows lit=no &luminous=no with a fixed text, namely 'This object does not emit light and is not lighted by externally' and allows to pick this as a default answer (in the mapcomplete.org theme 'Advertising') (This is only shown if advertising!=screen)", "value": "no" }, { @@ -209,12 +209,12 @@ }, { "key": "sides", - "description": "Layer 'Advertise' shows sides=1 with a fixed text, namely 'This object has advertisements on a single side' and allows to pick this as a default answer (in the mapcomplete.org theme 'Advertising') (This is only shown if advertising=poster_box|advertising=screen|advertising=billboard)", + "description": "Layer 'Advertise' shows sides=1 with a fixed text, namely 'This object has advertisements on a single side' and allows to pick this as a default answer (in the mapcomplete.org theme 'Advertising') (This is only shown if advertising=poster_box |advertising=screen |advertising=billboard)", "value": "1" }, { "key": "sides", - "description": "Layer 'Advertise' shows sides=2 with a fixed text, namely 'This object has advertisements on both sides' and allows to pick this as a default answer (in the mapcomplete.org theme 'Advertising') (This is only shown if advertising=poster_box|advertising=screen|advertising=billboard)", + "description": "Layer 'Advertise' shows sides=2 with a fixed text, namely 'This object has advertisements on both sides' and allows to pick this as a default answer (in the mapcomplete.org theme 'Advertising') (This is only shown if advertising=poster_box |advertising=screen |advertising=billboard)", "value": "2" }, { diff --git a/Docs/TagInfo/mapcomplete_aed.json b/Docs/TagInfo/mapcomplete_aed.json index 2d54009a9..51ddd16aa 100644 --- a/Docs/TagInfo/mapcomplete_aed.json +++ b/Docs/TagInfo/mapcomplete_aed.json @@ -17,7 +17,7 @@ }, { "key": "id", - "description": "Layer 'Defibrillators' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Defibrillators') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Defibrillators' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Defibrillators') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", diff --git a/Docs/TagInfo/mapcomplete_artwork.json b/Docs/TagInfo/mapcomplete_artwork.json index c1331641b..711203663 100644 --- a/Docs/TagInfo/mapcomplete_artwork.json +++ b/Docs/TagInfo/mapcomplete_artwork.json @@ -17,7 +17,7 @@ }, { "key": "id", - "description": "Layer 'Artworks' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Artwork') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Artworks' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Artwork') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -145,12 +145,12 @@ }, { "key": "backrest", - "description": "Layer 'Artworks' shows backrest=yes&two_sided=yes with a fixed text, namely 'This bench is two-sided and shares the backrest' and allows to pick this as a default answer (in the mapcomplete.org theme 'Artwork') (This is only shown if amenity=bench)", + "description": "Layer 'Artworks' shows backrest=yes &two_sided=yes with a fixed text, namely 'This bench is two-sided and shares the backrest' and allows to pick this as a default answer (in the mapcomplete.org theme 'Artwork') (This is only shown if amenity=bench)", "value": "yes" }, { "key": "two_sided", - "description": "Layer 'Artworks' shows backrest=yes&two_sided=yes with a fixed text, namely 'This bench is two-sided and shares the backrest' and allows to pick this as a default answer (in the mapcomplete.org theme 'Artwork') (This is only shown if amenity=bench)", + "description": "Layer 'Artworks' shows backrest=yes &two_sided=yes with a fixed text, namely 'This bench is two-sided and shares the backrest' and allows to pick this as a default answer (in the mapcomplete.org theme 'Artwork') (This is only shown if amenity=bench)", "value": "yes" }, { diff --git a/Docs/TagInfo/mapcomplete_atm.json b/Docs/TagInfo/mapcomplete_atm.json index b953fc22c..137a47981 100644 --- a/Docs/TagInfo/mapcomplete_atm.json +++ b/Docs/TagInfo/mapcomplete_atm.json @@ -17,7 +17,7 @@ }, { "key": "id", - "description": "Layer 'ATMs' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'ATM Machines') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'ATMs' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'ATM Machines') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -79,37 +79,37 @@ }, { "key": "cash_out:notes:denominations", - "description": "Layer 'ATMs' shows cash_out:notes:denominations=5 EUR with a fixed text, namely '5 euro notes can be withdrawn' and allows to pick this as a default answer (in the mapcomplete.org theme 'ATM Machines') (This is only shown if |cash_out=yes&|_currency~^(.*EUR.*)$)", + "description": "Layer 'ATMs' shows cash_out:notes:denominations=5 EUR with a fixed text, namely '5 euro notes can be withdrawn' and allows to pick this as a default answer (in the mapcomplete.org theme 'ATM Machines') (This is only shown if |cash_out=yes & |_currency~^(.*EUR.*)$)", "value": "5 EUR" }, { "key": "cash_out:notes:denominations", - "description": "Layer 'ATMs' shows cash_out:notes:denominations=10 EUR with a fixed text, namely '10 euro notes can be withdrawn' and allows to pick this as a default answer (in the mapcomplete.org theme 'ATM Machines') (This is only shown if |cash_out=yes&|_currency~^(.*EUR.*)$)", + "description": "Layer 'ATMs' shows cash_out:notes:denominations=10 EUR with a fixed text, namely '10 euro notes can be withdrawn' and allows to pick this as a default answer (in the mapcomplete.org theme 'ATM Machines') (This is only shown if |cash_out=yes & |_currency~^(.*EUR.*)$)", "value": "10 EUR" }, { "key": "cash_out:notes:denominations", - "description": "Layer 'ATMs' shows cash_out:notes:denominations=20 EUR with a fixed text, namely '20 euro notes can be withdrawn' and allows to pick this as a default answer (in the mapcomplete.org theme 'ATM Machines') (This is only shown if |cash_out=yes&|_currency~^(.*EUR.*)$)", + "description": "Layer 'ATMs' shows cash_out:notes:denominations=20 EUR with a fixed text, namely '20 euro notes can be withdrawn' and allows to pick this as a default answer (in the mapcomplete.org theme 'ATM Machines') (This is only shown if |cash_out=yes & |_currency~^(.*EUR.*)$)", "value": "20 EUR" }, { "key": "cash_out:notes:denominations", - "description": "Layer 'ATMs' shows cash_out:notes:denominations=50 EUR with a fixed text, namely '50 euro notes can be withdrawn' and allows to pick this as a default answer (in the mapcomplete.org theme 'ATM Machines') (This is only shown if |cash_out=yes&|_currency~^(.*EUR.*)$)", + "description": "Layer 'ATMs' shows cash_out:notes:denominations=50 EUR with a fixed text, namely '50 euro notes can be withdrawn' and allows to pick this as a default answer (in the mapcomplete.org theme 'ATM Machines') (This is only shown if |cash_out=yes & |_currency~^(.*EUR.*)$)", "value": "50 EUR" }, { "key": "cash_out:notes:denominations", - "description": "Layer 'ATMs' shows cash_out:notes:denominations=100 EUR with a fixed text, namely '100 euro notes can be withdrawn' and allows to pick this as a default answer (in the mapcomplete.org theme 'ATM Machines') (This is only shown if |cash_out=yes&|_currency~^(.*EUR.*)$)", + "description": "Layer 'ATMs' shows cash_out:notes:denominations=100 EUR with a fixed text, namely '100 euro notes can be withdrawn' and allows to pick this as a default answer (in the mapcomplete.org theme 'ATM Machines') (This is only shown if |cash_out=yes & |_currency~^(.*EUR.*)$)", "value": "100 EUR" }, { "key": "cash_out:notes:denominations", - "description": "Layer 'ATMs' shows cash_out:notes:denominations=200 EUR with a fixed text, namely '200 euro notes can be withdrawn' and allows to pick this as a default answer (in the mapcomplete.org theme 'ATM Machines') (This is only shown if |cash_out=yes&|_currency~^(.*EUR.*)$)", + "description": "Layer 'ATMs' shows cash_out:notes:denominations=200 EUR with a fixed text, namely '200 euro notes can be withdrawn' and allows to pick this as a default answer (in the mapcomplete.org theme 'ATM Machines') (This is only shown if |cash_out=yes & |_currency~^(.*EUR.*)$)", "value": "200 EUR" }, { "key": "cash_out:notes:denominations", - "description": "Layer 'ATMs' shows cash_out:notes:denominations=500 EUR with a fixed text, namely '500 euro notes can be withdrawn' and allows to pick this as a default answer (in the mapcomplete.org theme 'ATM Machines') (This is only shown if |cash_out=yes&|_currency~^(.*EUR.*)$)", + "description": "Layer 'ATMs' shows cash_out:notes:denominations=500 EUR with a fixed text, namely '500 euro notes can be withdrawn' and allows to pick this as a default answer (in the mapcomplete.org theme 'ATM Machines') (This is only shown if |cash_out=yes & |_currency~^(.*EUR.*)$)", "value": "500 EUR" }, { @@ -129,7 +129,7 @@ }, { "key": "id", - "description": "Layer 'Banks' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'ATM Machines') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Banks' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'ATM Machines') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "atm", @@ -163,7 +163,7 @@ }, { "key": "id", - "description": "Layer 'Post offices' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'ATM Machines') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Post offices' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'ATM Machines') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -336,7 +336,7 @@ }, { "key": "id", - "description": "Layer 'Post offices' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'ATM Machines') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Post offices' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'ATM Machines') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", diff --git a/Docs/TagInfo/mapcomplete_benches.json b/Docs/TagInfo/mapcomplete_benches.json index 338a97a45..9187f2b72 100644 --- a/Docs/TagInfo/mapcomplete_benches.json +++ b/Docs/TagInfo/mapcomplete_benches.json @@ -17,7 +17,7 @@ }, { "key": "id", - "description": "Layer 'Picnic tables' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Benches') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Picnic tables' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Benches') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -90,7 +90,7 @@ }, { "key": "id", - "description": "Layer 'Benches' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Benches') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Benches' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Benches') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -110,12 +110,12 @@ }, { "key": "backrest", - "description": "Layer 'Benches' shows backrest=yes&two_sided=yes with a fixed text, namely 'This bench is two-sided and shares the backrest' and allows to pick this as a default answer (in the mapcomplete.org theme 'Benches')", + "description": "Layer 'Benches' shows backrest=yes &two_sided=yes with a fixed text, namely 'This bench is two-sided and shares the backrest' and allows to pick this as a default answer (in the mapcomplete.org theme 'Benches')", "value": "yes" }, { "key": "two_sided", - "description": "Layer 'Benches' shows backrest=yes&two_sided=yes with a fixed text, namely 'This bench is two-sided and shares the backrest' and allows to pick this as a default answer (in the mapcomplete.org theme 'Benches')", + "description": "Layer 'Benches' shows backrest=yes &two_sided=yes with a fixed text, namely 'This bench is two-sided and shares the backrest' and allows to pick this as a default answer (in the mapcomplete.org theme 'Benches')", "value": "yes" }, { @@ -259,17 +259,17 @@ }, { "key": "historic", - "description": "Layer 'Benches' shows historic=memorial with a fixed text, namely 'This bench is a memorial for someone or something' and allows to pick this as a default answer (in the mapcomplete.org theme 'Benches') (This is only shown if historic=memorial|inscription~.+|memorial=bench|tourism=artwork)", + "description": "Layer 'Benches' shows historic=memorial with a fixed text, namely 'This bench is a memorial for someone or something' and allows to pick this as a default answer (in the mapcomplete.org theme 'Benches') (This is only shown if historic=memorial |inscription~.+ |memorial=bench |tourism=artwork)", "value": "memorial" }, { "key": "historic", - "description": "Layer 'Benches' shows not:historic=memorial with a fixed text, namely 'This bench is a not a memorial for someone or something' and allows to pick this as a default answer (in the mapcomplete.org theme 'Benches') Picking this answer will delete the key historic. (This is only shown if historic=memorial|inscription~.+|memorial=bench|tourism=artwork)", + "description": "Layer 'Benches' shows not:historic=memorial with a fixed text, namely 'This bench is a not a memorial for someone or something' and allows to pick this as a default answer (in the mapcomplete.org theme 'Benches') Picking this answer will delete the key historic. (This is only shown if historic=memorial |inscription~.+ |memorial=bench |tourism=artwork)", "value": "" }, { "key": "not:historic", - "description": "Layer 'Benches' shows not:historic=memorial with a fixed text, namely 'This bench is a not a memorial for someone or something' and allows to pick this as a default answer (in the mapcomplete.org theme 'Benches') (This is only shown if historic=memorial|inscription~.+|memorial=bench|tourism=artwork)", + "description": "Layer 'Benches' shows not:historic=memorial with a fixed text, namely 'This bench is a not a memorial for someone or something' and allows to pick this as a default answer (in the mapcomplete.org theme 'Benches') (This is only shown if historic=memorial |inscription~.+ |memorial=bench |tourism=artwork)", "value": "memorial" }, { @@ -374,7 +374,7 @@ }, { "key": "id", - "description": "Layer 'Benches at public transport stops' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Benches') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Benches at public transport stops' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Benches') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", diff --git a/Docs/TagInfo/mapcomplete_bicycle_rental.json b/Docs/TagInfo/mapcomplete_bicycle_rental.json index 07703a993..e9d0f5327 100644 --- a/Docs/TagInfo/mapcomplete_bicycle_rental.json +++ b/Docs/TagInfo/mapcomplete_bicycle_rental.json @@ -30,7 +30,7 @@ }, { "key": "id", - "description": "Layer 'Bicycle rental' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Bicycle rental') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Bicycle rental' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Bicycle rental') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -50,12 +50,12 @@ }, { "key": "shop", - "description": "Layer 'Bicycle rental' shows shop=rental&bicycle_rental=shop with a fixed text, namely 'This is a shop whose main focus is bicycle rental' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle rental') (This is only shown if amenity=bicycle_rental)", + "description": "Layer 'Bicycle rental' shows shop=rental &bicycle_rental=shop with a fixed text, namely 'This is a shop whose main focus is bicycle rental' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle rental') (This is only shown if amenity=bicycle_rental)", "value": "rental" }, { "key": "bicycle_rental", - "description": "Layer 'Bicycle rental' shows shop=rental&bicycle_rental=shop with a fixed text, namely 'This is a shop whose main focus is bicycle rental' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle rental') (This is only shown if amenity=bicycle_rental)", + "description": "Layer 'Bicycle rental' shows shop=rental &bicycle_rental=shop with a fixed text, namely 'This is a shop whose main focus is bicycle rental' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle rental') (This is only shown if amenity=bicycle_rental)", "value": "shop" }, { @@ -65,12 +65,12 @@ }, { "key": "service:bicycle:rental", - "description": "Layer 'Bicycle rental' shows service:bicycle:rental=yes&shop=bicycle with a fixed text, namely 'This is a shop which sells or repairs bicycles, but also rents out bicycles' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle rental') (This is only shown if amenity=bicycle_rental)", + "description": "Layer 'Bicycle rental' shows service:bicycle:rental=yes &shop=bicycle with a fixed text, namely 'This is a shop which sells or repairs bicycles, but also rents out bicycles' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle rental') (This is only shown if amenity=bicycle_rental)", "value": "yes" }, { "key": "shop", - "description": "Layer 'Bicycle rental' shows service:bicycle:rental=yes&shop=bicycle with a fixed text, namely 'This is a shop which sells or repairs bicycles, but also rents out bicycles' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle rental') (This is only shown if amenity=bicycle_rental)", + "description": "Layer 'Bicycle rental' shows service:bicycle:rental=yes &shop=bicycle with a fixed text, namely 'This is a shop which sells or repairs bicycles, but also rents out bicycles' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle rental') (This is only shown if amenity=bicycle_rental)", "value": "bicycle" }, { @@ -114,7 +114,7 @@ }, { "key": "opening_hours", - "description": "Layer 'Bicycle rental' shows and asks freeform values for key 'opening_hours' (in the mapcomplete.org theme 'Bicycle rental') (This is only shown if shop~.+|opening_hours~.+)" + "description": "Layer 'Bicycle rental' shows and asks freeform values for key 'opening_hours' (in the mapcomplete.org theme 'Bicycle rental') (This is only shown if shop~.+ |opening_hours~.+)" }, { "key": "payment:cash", diff --git a/Docs/TagInfo/mapcomplete_bicyclelib.json b/Docs/TagInfo/mapcomplete_bicyclelib.json index 5cffef932..046e87e0b 100644 --- a/Docs/TagInfo/mapcomplete_bicyclelib.json +++ b/Docs/TagInfo/mapcomplete_bicyclelib.json @@ -17,7 +17,7 @@ }, { "key": "id", - "description": "Layer 'Bicycle library' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Bicycle libraries') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Bicycle library' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Bicycle libraries') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -83,12 +83,12 @@ }, { "key": "fee", - "description": "Layer 'Bicycle library' shows fee=yes&charge=€20warranty + €20/year with a fixed text, namely 'Lending a bicycle costs €20/year and €20 warranty' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle libraries')", + "description": "Layer 'Bicycle library' shows fee=yes &charge=€20warranty + €20/year with a fixed text, namely 'Lending a bicycle costs €20/year and €20 warranty' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle libraries')", "value": "yes" }, { "key": "charge", - "description": "Layer 'Bicycle library' shows fee=yes&charge=€20warranty + €20/year with a fixed text, namely 'Lending a bicycle costs €20/year and €20 warranty' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle libraries')", + "description": "Layer 'Bicycle library' shows fee=yes &charge=€20warranty + €20/year with a fixed text, namely 'Lending a bicycle costs €20/year and €20 warranty' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle libraries')", "value": "€20warranty + €20/year" }, { diff --git a/Docs/TagInfo/mapcomplete_binoculars.json b/Docs/TagInfo/mapcomplete_binoculars.json index 6928e367c..9b7f64c94 100644 --- a/Docs/TagInfo/mapcomplete_binoculars.json +++ b/Docs/TagInfo/mapcomplete_binoculars.json @@ -17,7 +17,7 @@ }, { "key": "id", - "description": "Layer 'Binoculars' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Binoculars') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Binoculars' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Binoculars') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", diff --git a/Docs/TagInfo/mapcomplete_blind_osm.json b/Docs/TagInfo/mapcomplete_blind_osm.json index ff0d0a2dc..5af677590 100644 --- a/Docs/TagInfo/mapcomplete_blind_osm.json +++ b/Docs/TagInfo/mapcomplete_blind_osm.json @@ -107,36 +107,36 @@ }, { "key": "id", - "description": "Layer 'Cycleways and roads' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Cycleways and roads' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "cycleway", - "description": "Layer 'Cycleways and roads' shows cycleway=shared_lane with a fixed text, namely 'There is a shared lane' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if highway!=cycleway&highway!=path&highway!=footway&highway!=pedestrian)", + "description": "Layer 'Cycleways and roads' shows cycleway=shared_lane with a fixed text, namely 'There is a shared lane' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if highway!=cycleway &highway!=path &highway!=footway &highway!=pedestrian)", "value": "shared_lane" }, { "key": "cycleway", - "description": "Layer 'Cycleways and roads' shows cycleway=lane with a fixed text, namely 'There is a lane next to the road (separated with paint)' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if highway!=cycleway&highway!=path&highway!=footway&highway!=pedestrian)", + "description": "Layer 'Cycleways and roads' shows cycleway=lane with a fixed text, namely 'There is a lane next to the road (separated with paint)' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if highway!=cycleway &highway!=path &highway!=footway &highway!=pedestrian)", "value": "lane" }, { "key": "cycleway", - "description": "Layer 'Cycleways and roads' shows cycleway=track with a fixed text, namely 'There is a track, but no cycleway drawn separately from this road on the map.' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if highway!=cycleway&highway!=path&highway!=footway&highway!=pedestrian)", + "description": "Layer 'Cycleways and roads' shows cycleway=track with a fixed text, namely 'There is a track, but no cycleway drawn separately from this road on the map.' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if highway!=cycleway &highway!=path &highway!=footway &highway!=pedestrian)", "value": "track" }, { "key": "cycleway", - "description": "Layer 'Cycleways and roads' shows cycleway=separate with a fixed text, namely 'There is a separately drawn cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if highway!=cycleway&highway!=path&highway!=footway&highway!=pedestrian)", + "description": "Layer 'Cycleways and roads' shows cycleway=separate with a fixed text, namely 'There is a separately drawn cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if highway!=cycleway &highway!=path &highway!=footway &highway!=pedestrian)", "value": "separate" }, { "key": "cycleway", - "description": "Layer 'Cycleways and roads' shows cycleway=no with a fixed text, namely 'There is no cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if highway!=cycleway&highway!=path&highway!=footway&highway!=pedestrian)", + "description": "Layer 'Cycleways and roads' shows cycleway=no with a fixed text, namely 'There is no cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if highway!=cycleway &highway!=path &highway!=footway &highway!=pedestrian)", "value": "no" }, { "key": "cycleway", - "description": "Layer 'Cycleways and roads' shows cycleway=no with a fixed text, namely 'There is no cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if highway!=cycleway&highway!=path&highway!=footway&highway!=pedestrian)", + "description": "Layer 'Cycleways and roads' shows cycleway=no with a fixed text, namely 'There is no cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if highway!=cycleway &highway!=path &highway!=footway &highway!=pedestrian)", "value": "no" }, { @@ -161,155 +161,155 @@ }, { "key": "cyclestreet", - "description": "Layer 'Cycleways and roads' shows cyclestreet=yes with a fixed text, namely 'This is a cyclestreet, and a 30km/h zone.' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if highway!=cycleway&highway!=path&highway!=footway)", + "description": "Layer 'Cycleways and roads' shows cyclestreet=yes with a fixed text, namely 'This is a cyclestreet, and a 30km/h zone.' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if highway!=cycleway &highway!=path &highway!=footway)", "value": "yes" }, { "key": "cyclestreet", - "description": "Layer 'Cycleways and roads' shows cyclestreet=yes with a fixed text, namely 'This is a cyclestreet' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if highway!=cycleway&highway!=path&highway!=footway)", + "description": "Layer 'Cycleways and roads' shows cyclestreet=yes with a fixed text, namely 'This is a cyclestreet' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if highway!=cycleway &highway!=path &highway!=footway)", "value": "yes" }, { "key": "cyclestreet", - "description": "Layer 'Cycleways and roads' shows with a fixed text, namely 'This is not a cyclestreet.' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') Picking this answer will delete the key cyclestreet. (This is only shown if highway!=cycleway&highway!=path&highway!=footway)", + "description": "Layer 'Cycleways and roads' shows with a fixed text, namely 'This is not a cyclestreet.' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') Picking this answer will delete the key cyclestreet. (This is only shown if highway!=cycleway &highway!=path &highway!=footway)", "value": "" }, { "key": "maxspeed", - "description": "Layer 'Cycleways and roads' shows and asks freeform values for key 'maxspeed' (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if highway!=cycleway&highway!=path&highway!=footway&highway!=pedestrian)" + "description": "Layer 'Cycleways and roads' shows and asks freeform values for key 'maxspeed' (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if highway!=cycleway &highway!=path &highway!=footway &highway!=pedestrian)" }, { "key": "maxspeed", - "description": "Layer 'Cycleways and roads' shows maxspeed=20 with a fixed text, namely 'The maximum speed is 20 km/h' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if highway!=cycleway&highway!=path&highway!=footway&highway!=pedestrian)", + "description": "Layer 'Cycleways and roads' shows maxspeed=20 with a fixed text, namely 'The maximum speed is 20 km/h' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if highway!=cycleway &highway!=path &highway!=footway &highway!=pedestrian)", "value": "20" }, { "key": "maxspeed", - "description": "Layer 'Cycleways and roads' shows maxspeed=30 with a fixed text, namely 'The maximum speed is 30 km/h' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if highway!=cycleway&highway!=path&highway!=footway&highway!=pedestrian)", + "description": "Layer 'Cycleways and roads' shows maxspeed=30 with a fixed text, namely 'The maximum speed is 30 km/h' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if highway!=cycleway &highway!=path &highway!=footway &highway!=pedestrian)", "value": "30" }, { "key": "maxspeed", - "description": "Layer 'Cycleways and roads' shows maxspeed=50 with a fixed text, namely 'The maximum speed is 50 km/h' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if highway!=cycleway&highway!=path&highway!=footway&highway!=pedestrian)", + "description": "Layer 'Cycleways and roads' shows maxspeed=50 with a fixed text, namely 'The maximum speed is 50 km/h' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if highway!=cycleway &highway!=path &highway!=footway &highway!=pedestrian)", "value": "50" }, { "key": "maxspeed", - "description": "Layer 'Cycleways and roads' shows maxspeed=70 with a fixed text, namely 'The maximum speed is 70 km/h' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if highway!=cycleway&highway!=path&highway!=footway&highway!=pedestrian)", + "description": "Layer 'Cycleways and roads' shows maxspeed=70 with a fixed text, namely 'The maximum speed is 70 km/h' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if highway!=cycleway &highway!=path &highway!=footway &highway!=pedestrian)", "value": "70" }, { "key": "maxspeed", - "description": "Layer 'Cycleways and roads' shows maxspeed=90 with a fixed text, namely 'The maximum speed is 90 km/h' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if highway!=cycleway&highway!=path&highway!=footway&highway!=pedestrian)", + "description": "Layer 'Cycleways and roads' shows maxspeed=90 with a fixed text, namely 'The maximum speed is 90 km/h' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if highway!=cycleway &highway!=path &highway!=footway &highway!=pedestrian)", "value": "90" }, { "key": "cycleway:surface", - "description": "Layer 'Cycleways and roads' shows and asks freeform values for key 'cycleway:surface' (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)" + "description": "Layer 'Cycleways and roads' shows and asks freeform values for key 'cycleway:surface' (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)" }, { "key": "cycleway:surface", - "description": "Layer 'Cycleways and roads' shows cycleway:surface=unpaved with a fixed text, namely 'This cycleway is unpaved' (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:surface=unpaved with a fixed text, namely 'This cycleway is unpaved' (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "unpaved" }, { "key": "cycleway:surface", - "description": "Layer 'Cycleways and roads' shows cycleway:surface=paved with a fixed text, namely 'This cycleway is paved' (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:surface=paved with a fixed text, namely 'This cycleway is paved' (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "paved" }, { "key": "cycleway:surface", - "description": "Layer 'Cycleways and roads' shows cycleway:surface=asphalt with a fixed text, namely 'This cycleway is made of asphalt' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:surface=asphalt with a fixed text, namely 'This cycleway is made of asphalt' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "asphalt" }, { "key": "cycleway:surface", - "description": "Layer 'Cycleways and roads' shows cycleway:surface=paving_stones with a fixed text, namely 'This cycleway is made of smooth paving stones' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:surface=paving_stones with a fixed text, namely 'This cycleway is made of smooth paving stones' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "paving_stones" }, { "key": "cycleway:surface", - "description": "Layer 'Cycleways and roads' shows cycleway:surface=concrete with a fixed text, namely 'This cycleway is made of concrete' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:surface=concrete with a fixed text, namely 'This cycleway is made of concrete' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "concrete" }, { "key": "cycleway:surface", - "description": "Layer 'Cycleways and roads' shows cycleway:surface=cobblestone with a fixed text, namely 'This cycleway is made of cobblestone (unhewn or sett)' (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:surface=cobblestone with a fixed text, namely 'This cycleway is made of cobblestone (unhewn or sett)' (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "cobblestone" }, { "key": "cycleway:surface", - "description": "Layer 'Cycleways and roads' shows cycleway:surface=unhewn_cobblestone with a fixed text, namely 'This cycleway is made of raw, natural cobblestone' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:surface=unhewn_cobblestone with a fixed text, namely 'This cycleway is made of raw, natural cobblestone' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "unhewn_cobblestone" }, { "key": "cycleway:surface", - "description": "Layer 'Cycleways and roads' shows cycleway:surface=sett with a fixed text, namely 'This cycleway is made of flat, square cobblestone' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:surface=sett with a fixed text, namely 'This cycleway is made of flat, square cobblestone' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "sett" }, { "key": "cycleway:surface", - "description": "Layer 'Cycleways and roads' shows cycleway:surface=wood with a fixed text, namely 'This cycleway is made of wood' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:surface=wood with a fixed text, namely 'This cycleway is made of wood' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "wood" }, { "key": "cycleway:surface", - "description": "Layer 'Cycleways and roads' shows cycleway:surface=gravel with a fixed text, namely 'This cycleway is made of gravel' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:surface=gravel with a fixed text, namely 'This cycleway is made of gravel' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "gravel" }, { "key": "cycleway:surface", - "description": "Layer 'Cycleways and roads' shows cycleway:surface=fine_gravel with a fixed text, namely 'This cycleway is made of fine gravel' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:surface=fine_gravel with a fixed text, namely 'This cycleway is made of fine gravel' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "fine_gravel" }, { "key": "cycleway:surface", - "description": "Layer 'Cycleways and roads' shows cycleway:surface=pebblestone with a fixed text, namely 'This cycleway is made of pebblestone' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:surface=pebblestone with a fixed text, namely 'This cycleway is made of pebblestone' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "pebblestone" }, { "key": "cycleway:surface", - "description": "Layer 'Cycleways and roads' shows cycleway:surface=ground with a fixed text, namely 'This cycleway is made from raw ground' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:surface=ground with a fixed text, namely 'This cycleway is made from raw ground' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "ground" }, { "key": "cycleway:smoothness", - "description": "Layer 'Cycleways and roads' shows cycleway:smoothness=excellent with a fixed text, namely 'Usable for thin rollers: rollerblade, skateboard' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:smoothness=excellent with a fixed text, namely 'Usable for thin rollers: rollerblade, skateboard' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "excellent" }, { "key": "cycleway:smoothness", - "description": "Layer 'Cycleways and roads' shows cycleway:smoothness=good with a fixed text, namely 'Usable for thin wheels: racing bike' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:smoothness=good with a fixed text, namely 'Usable for thin wheels: racing bike' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "good" }, { "key": "cycleway:smoothness", - "description": "Layer 'Cycleways and roads' shows cycleway:smoothness=intermediate with a fixed text, namely 'Usable for normal wheels: city bike, wheelchair, scooter' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:smoothness=intermediate with a fixed text, namely 'Usable for normal wheels: city bike, wheelchair, scooter' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "intermediate" }, { "key": "cycleway:smoothness", - "description": "Layer 'Cycleways and roads' shows cycleway:smoothness=bad with a fixed text, namely 'Usable for robust wheels: trekking bike, car, rickshaw' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:smoothness=bad with a fixed text, namely 'Usable for robust wheels: trekking bike, car, rickshaw' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "bad" }, { "key": "cycleway:smoothness", - "description": "Layer 'Cycleways and roads' shows cycleway:smoothness=very_bad with a fixed text, namely 'Usable for vehicles with high clearance: light duty off-road vehicle' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:smoothness=very_bad with a fixed text, namely 'Usable for vehicles with high clearance: light duty off-road vehicle' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "very_bad" }, { "key": "cycleway:smoothness", - "description": "Layer 'Cycleways and roads' shows cycleway:smoothness=horrible with a fixed text, namely 'Usable for off-road vehicles: heavy duty off-road vehicle' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:smoothness=horrible with a fixed text, namely 'Usable for off-road vehicles: heavy duty off-road vehicle' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "horrible" }, { "key": "cycleway:smoothness", - "description": "Layer 'Cycleways and roads' shows cycleway:smoothness=very_horrible with a fixed text, namely 'Usable for specialized off-road vehicles: tractor, ATV' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:smoothness=very_horrible with a fixed text, namely 'Usable for specialized off-road vehicles: tractor, ATV' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "very_horrible" }, { "key": "cycleway:smoothness", - "description": "Layer 'Cycleways and roads' shows cycleway:smoothness=impassable with a fixed text, namely 'Impassable / No wheeled vehicle' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:smoothness=impassable with a fixed text, namely 'Impassable / No wheeled vehicle' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "impassable" }, { @@ -383,188 +383,188 @@ }, { "key": "smoothness", - "description": "Layer 'Cycleways and roads' shows smoothness=excellent with a fixed text, namely 'Usable for thin rollers: rollerblade, skateboard' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=no|highway=cycleway)", + "description": "Layer 'Cycleways and roads' shows smoothness=excellent with a fixed text, namely 'Usable for thin rollers: rollerblade, skateboard' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=no |highway=cycleway)", "value": "excellent" }, { "key": "smoothness", - "description": "Layer 'Cycleways and roads' shows smoothness=good with a fixed text, namely 'Usable for thin wheels: racing bike' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=no|highway=cycleway)", + "description": "Layer 'Cycleways and roads' shows smoothness=good with a fixed text, namely 'Usable for thin wheels: racing bike' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=no |highway=cycleway)", "value": "good" }, { "key": "smoothness", - "description": "Layer 'Cycleways and roads' shows smoothness=intermediate with a fixed text, namely 'Usable for normal wheels: city bike, wheelchair, scooter' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=no|highway=cycleway)", + "description": "Layer 'Cycleways and roads' shows smoothness=intermediate with a fixed text, namely 'Usable for normal wheels: city bike, wheelchair, scooter' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=no |highway=cycleway)", "value": "intermediate" }, { "key": "smoothness", - "description": "Layer 'Cycleways and roads' shows smoothness=bad with a fixed text, namely 'Usable for robust wheels: trekking bike, car, rickshaw' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=no|highway=cycleway)", + "description": "Layer 'Cycleways and roads' shows smoothness=bad with a fixed text, namely 'Usable for robust wheels: trekking bike, car, rickshaw' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=no |highway=cycleway)", "value": "bad" }, { "key": "smoothness", - "description": "Layer 'Cycleways and roads' shows smoothness=very_bad with a fixed text, namely 'Usable for vehicles with high clearance: light duty off-road vehicle' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=no|highway=cycleway)", + "description": "Layer 'Cycleways and roads' shows smoothness=very_bad with a fixed text, namely 'Usable for vehicles with high clearance: light duty off-road vehicle' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=no |highway=cycleway)", "value": "very_bad" }, { "key": "smoothness", - "description": "Layer 'Cycleways and roads' shows smoothness=horrible with a fixed text, namely 'Usable for off-road vehicles: heavy duty off-road vehicle' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=no|highway=cycleway)", + "description": "Layer 'Cycleways and roads' shows smoothness=horrible with a fixed text, namely 'Usable for off-road vehicles: heavy duty off-road vehicle' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=no |highway=cycleway)", "value": "horrible" }, { "key": "smoothness", - "description": "Layer 'Cycleways and roads' shows smoothness=very_horrible with a fixed text, namely 'Usable for specialized off-road vehicles: tractor, ATV' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=no|highway=cycleway)", + "description": "Layer 'Cycleways and roads' shows smoothness=very_horrible with a fixed text, namely 'Usable for specialized off-road vehicles: tractor, ATV' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=no |highway=cycleway)", "value": "very_horrible" }, { "key": "smoothness", - "description": "Layer 'Cycleways and roads' shows smoothness=impassable with a fixed text, namely 'Impassable / No wheeled vehicle' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=no|highway=cycleway)", + "description": "Layer 'Cycleways and roads' shows smoothness=impassable with a fixed text, namely 'Impassable / No wheeled vehicle' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=no |highway=cycleway)", "value": "impassable" }, { "key": "width:carriageway", - "description": "Layer 'Cycleways and roads' shows and asks freeform values for key 'width:carriageway' (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if highway!=cycleway&highway!=path&highway!=footway)" + "description": "Layer 'Cycleways and roads' shows and asks freeform values for key 'width:carriageway' (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if highway!=cycleway &highway!=path &highway!=footway)" }, { "key": "cycleway:traffic_sign", - "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7 with a fixed text, namely 'Compulsory cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=lane|cycleway=track&_country=be)", + "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7 with a fixed text, namely 'Compulsory cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=lane |cycleway=track &_country=be)", "value": "BE:D7" }, { "key": "cycleway:traffic_sign", - "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign~^(BE:D7;.*)$ with a fixed text, namely 'Compulsory cycleway (with supplementary sign)
' (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=lane|cycleway=track&_country=be)" + "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign~^(BE:D7;.*)$ with a fixed text, namely 'Compulsory cycleway (with supplementary sign)
' (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=lane |cycleway=track &_country=be)" }, { "key": "cycleway:traffic_sign", - "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D9 with a fixed text, namely 'Segregated foot/cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=lane|cycleway=track&_country=be)", + "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D9 with a fixed text, namely 'Segregated foot/cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=lane |cycleway=track &_country=be)", "value": "BE:D9" }, { "key": "cycleway:traffic_sign", - "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D10 with a fixed text, namely 'Unsegregated foot/cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=lane|cycleway=track&_country=be)", + "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D10 with a fixed text, namely 'Unsegregated foot/cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=lane |cycleway=track &_country=be)", "value": "BE:D10" }, { "key": "cycleway:traffic_sign", - "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=none with a fixed text, namely 'No traffic sign present' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=lane|cycleway=track&_country=be)", + "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=none with a fixed text, namely 'No traffic sign present' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=lane |cycleway=track &_country=be)", "value": "none" }, { "key": "traffic_sign", - "description": "Layer 'Cycleways and roads' shows traffic_sign=BE:D7 with a fixed text, namely 'Compulsory cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if highway=cycleway|highway=path&_country=be|_country=nl)", + "description": "Layer 'Cycleways and roads' shows traffic_sign=BE:D7 with a fixed text, namely 'Compulsory cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if highway=cycleway |highway=path &_country=be |_country=nl)", "value": "BE:D7" }, { "key": "traffic_sign", - "description": "Layer 'Cycleways and roads' shows traffic_sign~^(BE:D7;.*)$ with a fixed text, namely 'Compulsory cycleway (with supplementary sign)
' (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if highway=cycleway|highway=path&_country=be|_country=nl)" + "description": "Layer 'Cycleways and roads' shows traffic_sign~^(BE:D7;.*)$ with a fixed text, namely 'Compulsory cycleway (with supplementary sign)
' (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if highway=cycleway |highway=path &_country=be |_country=nl)" }, { "key": "traffic_sign", - "description": "Layer 'Cycleways and roads' shows traffic_sign=BE:D9 with a fixed text, namely 'Segregated foot/cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if highway=cycleway|highway=path&_country=be|_country=nl)", + "description": "Layer 'Cycleways and roads' shows traffic_sign=BE:D9 with a fixed text, namely 'Segregated foot/cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if highway=cycleway |highway=path &_country=be |_country=nl)", "value": "BE:D9" }, { "key": "traffic_sign", - "description": "Layer 'Cycleways and roads' shows traffic_sign=BE:D10 with a fixed text, namely 'Unsegregated foot/cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if highway=cycleway|highway=path&_country=be|_country=nl)", + "description": "Layer 'Cycleways and roads' shows traffic_sign=BE:D10 with a fixed text, namely 'Unsegregated foot/cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if highway=cycleway |highway=path &_country=be |_country=nl)", "value": "BE:D10" }, { "key": "traffic_sign", - "description": "Layer 'Cycleways and roads' shows traffic_sign=NL:G11 with a fixed text, namely 'Compulsory cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if highway=cycleway|highway=path&_country=be|_country=nl)", + "description": "Layer 'Cycleways and roads' shows traffic_sign=NL:G11 with a fixed text, namely 'Compulsory cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if highway=cycleway |highway=path &_country=be |_country=nl)", "value": "NL:G11" }, { "key": "traffic_sign", - "description": "Layer 'Cycleways and roads' shows traffic_sign=NL:G12a with a fixed text, namely 'Compulsory (moped)cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if highway=cycleway|highway=path&_country=be|_country=nl)", + "description": "Layer 'Cycleways and roads' shows traffic_sign=NL:G12a with a fixed text, namely 'Compulsory (moped)cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if highway=cycleway |highway=path &_country=be |_country=nl)", "value": "NL:G12a" }, { "key": "traffic_sign", - "description": "Layer 'Cycleways and roads' shows traffic_sign=NL:G13 with a fixed text, namely 'Non-compulsory cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if highway=cycleway|highway=path&_country=be|_country=nl)", + "description": "Layer 'Cycleways and roads' shows traffic_sign=NL:G13 with a fixed text, namely 'Non-compulsory cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if highway=cycleway |highway=path &_country=be |_country=nl)", "value": "NL:G13" }, { "key": "traffic_sign", - "description": "Layer 'Cycleways and roads' shows traffic_sign=none with a fixed text, namely 'No traffic sign present' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if highway=cycleway|highway=path&_country=be|_country=nl)", + "description": "Layer 'Cycleways and roads' shows traffic_sign=none with a fixed text, namely 'No traffic sign present' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if highway=cycleway |highway=path &_country=be |_country=nl)", "value": "none" }, { "key": "cycleway:traffic_sign", - "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7;BE:M6 with a fixed text, namely 'Mopeds must use the cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway:traffic_sign=BE:D7|cycleway:traffic_sign~^(BE:D7;.*)$)", + "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7;BE:M6 with a fixed text, namely 'Mopeds must use the cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway:traffic_sign=BE:D7 |cycleway:traffic_sign~^(BE:D7;.*)$)", "value": "BE:D7;BE:M6" }, { "key": "cycleway:traffic_sign", - "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7;BE:M13 with a fixed text, namely 'Speedpedelecs must use the cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway:traffic_sign=BE:D7|cycleway:traffic_sign~^(BE:D7;.*)$)", + "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7;BE:M13 with a fixed text, namely 'Speedpedelecs must use the cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway:traffic_sign=BE:D7 |cycleway:traffic_sign~^(BE:D7;.*)$)", "value": "BE:D7;BE:M13" }, { "key": "cycleway:traffic_sign", - "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7;BE:M14 with a fixed text, namely 'Mopeds and speedpedelecs must use the cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway:traffic_sign=BE:D7|cycleway:traffic_sign~^(BE:D7;.*)$)", + "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7;BE:M14 with a fixed text, namely 'Mopeds and speedpedelecs must use the cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway:traffic_sign=BE:D7 |cycleway:traffic_sign~^(BE:D7;.*)$)", "value": "BE:D7;BE:M14" }, { "key": "cycleway:traffic_sign", - "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7;BE:M7 with a fixed text, namely 'Mopeds are not allowed' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway:traffic_sign=BE:D7|cycleway:traffic_sign~^(BE:D7;.*)$)", + "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7;BE:M7 with a fixed text, namely 'Mopeds are not allowed' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway:traffic_sign=BE:D7 |cycleway:traffic_sign~^(BE:D7;.*)$)", "value": "BE:D7;BE:M7" }, { "key": "cycleway:traffic_sign", - "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7;BE:M15 with a fixed text, namely 'Speedpedelecs are not allowed' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway:traffic_sign=BE:D7|cycleway:traffic_sign~^(BE:D7;.*)$)", + "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7;BE:M15 with a fixed text, namely 'Speedpedelecs are not allowed' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway:traffic_sign=BE:D7 |cycleway:traffic_sign~^(BE:D7;.*)$)", "value": "BE:D7;BE:M15" }, { "key": "cycleway:traffic_sign", - "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7;BE:M16 with a fixed text, namely 'Mopeds and speedpedelecs are not allowed' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway:traffic_sign=BE:D7|cycleway:traffic_sign~^(BE:D7;.*)$)", + "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7;BE:M16 with a fixed text, namely 'Mopeds and speedpedelecs are not allowed' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway:traffic_sign=BE:D7 |cycleway:traffic_sign~^(BE:D7;.*)$)", "value": "BE:D7;BE:M16" }, { "key": "cycleway:traffic_sign:supplementary", - "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign:supplementary=none with a fixed text, namely 'No supplementary traffic sign present' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway:traffic_sign=BE:D7|cycleway:traffic_sign~^(BE:D7;.*)$)", + "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign:supplementary=none with a fixed text, namely 'No supplementary traffic sign present' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway:traffic_sign=BE:D7 |cycleway:traffic_sign~^(BE:D7;.*)$)", "value": "none" }, { "key": "cycleway:buffer", - "description": "Layer 'Cycleways and roads' shows and asks freeform values for key 'cycleway:buffer' (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=track|cycleway=lane)" + "description": "Layer 'Cycleways and roads' shows and asks freeform values for key 'cycleway:buffer' (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=track |cycleway=lane)" }, { "key": "cycleway:separation", - "description": "Layer 'Cycleways and roads' shows cycleway:separation=dashed_line with a fixed text, namely 'This cycleway is separated by a dashed line' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=track|cycleway=lane)", + "description": "Layer 'Cycleways and roads' shows cycleway:separation=dashed_line with a fixed text, namely 'This cycleway is separated by a dashed line' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=track |cycleway=lane)", "value": "dashed_line" }, { "key": "cycleway:separation", - "description": "Layer 'Cycleways and roads' shows cycleway:separation=solid_line with a fixed text, namely 'This cycleway is separated by a solid line' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=track|cycleway=lane)", + "description": "Layer 'Cycleways and roads' shows cycleway:separation=solid_line with a fixed text, namely 'This cycleway is separated by a solid line' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=track |cycleway=lane)", "value": "solid_line" }, { "key": "cycleway:separation", - "description": "Layer 'Cycleways and roads' shows cycleway:separation=parking_lane with a fixed text, namely 'This cycleway is separated by a parking lane' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=track|cycleway=lane)", + "description": "Layer 'Cycleways and roads' shows cycleway:separation=parking_lane with a fixed text, namely 'This cycleway is separated by a parking lane' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=track |cycleway=lane)", "value": "parking_lane" }, { "key": "cycleway:separation", - "description": "Layer 'Cycleways and roads' shows cycleway:separation=kerb with a fixed text, namely 'This cycleway is separated by a kerb' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=track|cycleway=lane)", + "description": "Layer 'Cycleways and roads' shows cycleway:separation=kerb with a fixed text, namely 'This cycleway is separated by a kerb' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if cycleway=track |cycleway=lane)", "value": "kerb" }, { "key": "separation", - "description": "Layer 'Cycleways and roads' shows separation=dashed_line with a fixed text, namely 'This cycleway is separated by a dashed line' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if highway=cycleway|highway=path)", + "description": "Layer 'Cycleways and roads' shows separation=dashed_line with a fixed text, namely 'This cycleway is separated by a dashed line' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if highway=cycleway |highway=path)", "value": "dashed_line" }, { "key": "separation", - "description": "Layer 'Cycleways and roads' shows separation=solid_line with a fixed text, namely 'This cycleway is separated by a solid line' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if highway=cycleway|highway=path)", + "description": "Layer 'Cycleways and roads' shows separation=solid_line with a fixed text, namely 'This cycleway is separated by a solid line' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if highway=cycleway |highway=path)", "value": "solid_line" }, { "key": "separation", - "description": "Layer 'Cycleways and roads' shows separation=parking_lane with a fixed text, namely 'This cycleway is separated by a parking lane' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if highway=cycleway|highway=path)", + "description": "Layer 'Cycleways and roads' shows separation=parking_lane with a fixed text, namely 'This cycleway is separated by a parking lane' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if highway=cycleway |highway=path)", "value": "parking_lane" }, { "key": "separation", - "description": "Layer 'Cycleways and roads' shows separation=kerb with a fixed text, namely 'This cycleway is separated by a kerb' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if highway=cycleway|highway=path)", + "description": "Layer 'Cycleways and roads' shows separation=kerb with a fixed text, namely 'This cycleway is separated by a kerb' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if highway=cycleway |highway=path)", "value": "kerb" }, { @@ -579,7 +579,7 @@ }, { "key": "id", - "description": "Layer 'Crossings' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Crossings' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -654,12 +654,12 @@ }, { "key": "button_operated", - "description": "Layer 'Crossings' shows button_operated=yes with a fixed text, namely 'This traffic light has a button to request green light' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if highway=traffic_signals|crossing=traffic_signals)", + "description": "Layer 'Crossings' shows button_operated=yes with a fixed text, namely 'This traffic light has a button to request green light' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if highway=traffic_signals |crossing=traffic_signals)", "value": "yes" }, { "key": "button_operated", - "description": "Layer 'Crossings' shows button_operated=no with a fixed text, namely 'This traffic light does not have a button to request green light' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if highway=traffic_signals|crossing=traffic_signals)", + "description": "Layer 'Crossings' shows button_operated=no with a fixed text, namely 'This traffic light does not have a button to request green light' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if highway=traffic_signals |crossing=traffic_signals)", "value": "no" }, { @@ -684,12 +684,12 @@ }, { "key": "traffic_signals:vibration", - "description": "Layer 'Crossings' shows traffic_signals:vibration=yes with a fixed text, namely 'The button for this traffic light has a vibration signal to indicate that it is safe to cross.' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if crossing=traffic_signals&button_operated=yes)", + "description": "Layer 'Crossings' shows traffic_signals:vibration=yes with a fixed text, namely 'The button for this traffic light has a vibration signal to indicate that it is safe to cross.' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if crossing=traffic_signals &button_operated=yes)", "value": "yes" }, { "key": "traffic_signals:vibration", - "description": "Layer 'Crossings' shows traffic_signals:vibration=no with a fixed text, namely 'The button for this traffic light does not have a vibration signal to indicate that it is safe to cross.' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if crossing=traffic_signals&button_operated=yes)", + "description": "Layer 'Crossings' shows traffic_signals:vibration=no with a fixed text, namely 'The button for this traffic light does not have a vibration signal to indicate that it is safe to cross.' and allows to pick this as a default answer (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if crossing=traffic_signals &button_operated=yes)", "value": "no" }, { @@ -749,7 +749,7 @@ }, { "key": "id", - "description": "Layer 'Kerbs' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Kerbs' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -823,7 +823,7 @@ }, { "key": "id", - "description": "Layer 'Transit Stops' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Transit Stops' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "name", @@ -977,7 +977,7 @@ }, { "key": "id", - "description": "Layer 'Elevator' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Elevator' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -1093,7 +1093,7 @@ }, { "key": "id", - "description": "Layer 'Stairs' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Stairs' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'OSM for the blind') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", diff --git a/Docs/TagInfo/mapcomplete_bookcases.json b/Docs/TagInfo/mapcomplete_bookcases.json index fd2a059a9..3b4705e22 100644 --- a/Docs/TagInfo/mapcomplete_bookcases.json +++ b/Docs/TagInfo/mapcomplete_bookcases.json @@ -17,7 +17,7 @@ }, { "key": "id", - "description": "Layer 'Bookcases' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Public bookcases') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Bookcases' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Public bookcases') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", diff --git a/Docs/TagInfo/mapcomplete_cafes_and_pubs.json b/Docs/TagInfo/mapcomplete_cafes_and_pubs.json index d56bae9ef..3125c4d3b 100644 --- a/Docs/TagInfo/mapcomplete_cafes_and_pubs.json +++ b/Docs/TagInfo/mapcomplete_cafes_and_pubs.json @@ -37,7 +37,7 @@ }, { "key": "id", - "description": "Layer 'Cafés and pubs' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Cafés and pubs') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Cafés and pubs' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Cafés and pubs') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -263,17 +263,17 @@ }, { "key": "internet_access:fee", - "description": "Layer 'Cafés and pubs' shows internet_access:fee=yes with a fixed text, namely 'There is a fee for the internet access at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cafés and pubs') (This is only shown if internet_access!=no&internet_access~.+)", + "description": "Layer 'Cafés and pubs' shows internet_access:fee=yes with a fixed text, namely 'There is a fee for the internet access at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cafés and pubs') (This is only shown if internet_access!=no &internet_access~.+)", "value": "yes" }, { "key": "internet_access:fee", - "description": "Layer 'Cafés and pubs' shows internet_access:fee=no with a fixed text, namely 'Internet access is free at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cafés and pubs') (This is only shown if internet_access!=no&internet_access~.+)", + "description": "Layer 'Cafés and pubs' shows internet_access:fee=no with a fixed text, namely 'Internet access is free at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cafés and pubs') (This is only shown if internet_access!=no &internet_access~.+)", "value": "no" }, { "key": "internet_access:fee", - "description": "Layer 'Cafés and pubs' shows internet_access:fee=customers with a fixed text, namely 'Internet access is free at this place, for customers only' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cafés and pubs') (This is only shown if internet_access!=no&internet_access~.+)", + "description": "Layer 'Cafés and pubs' shows internet_access:fee=customers with a fixed text, namely 'Internet access is free at this place, for customers only' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cafés and pubs') (This is only shown if internet_access!=no &internet_access~.+)", "value": "customers" }, { diff --git a/Docs/TagInfo/mapcomplete_campersite.json b/Docs/TagInfo/mapcomplete_campersite.json index be5f51a60..765ddbaaf 100644 --- a/Docs/TagInfo/mapcomplete_campersite.json +++ b/Docs/TagInfo/mapcomplete_campersite.json @@ -17,7 +17,7 @@ }, { "key": "id", - "description": "Layer 'Camper sites' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Campersites') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Camper sites' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Campersites') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -74,12 +74,12 @@ }, { "key": "internet_access", - "description": "Layer 'Camper sites' shows internet_access=wifi|internet_access=wlan with a fixed text, namely 'There is internet access' (in the mapcomplete.org theme 'Campersites')", + "description": "Layer 'Camper sites' shows internet_access=wifi |internet_access=wlan with a fixed text, namely 'There is internet access' (in the mapcomplete.org theme 'Campersites')", "value": "wifi" }, { "key": "internet_access", - "description": "Layer 'Camper sites' shows internet_access=wifi|internet_access=wlan with a fixed text, namely 'There is internet access' (in the mapcomplete.org theme 'Campersites')", + "description": "Layer 'Camper sites' shows internet_access=wifi |internet_access=wlan with a fixed text, namely 'There is internet access' (in the mapcomplete.org theme 'Campersites')", "value": "wlan" }, { @@ -151,7 +151,7 @@ }, { "key": "id", - "description": "Layer 'Sanitary dump stations' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Campersites') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Sanitary dump stations' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Campersites') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", diff --git a/Docs/TagInfo/mapcomplete_charging_stations.json b/Docs/TagInfo/mapcomplete_charging_stations.json index 8c976d37f..96a6d44a9 100644 --- a/Docs/TagInfo/mapcomplete_charging_stations.json +++ b/Docs/TagInfo/mapcomplete_charging_stations.json @@ -32,7 +32,7 @@ }, { "key": "id", - "description": "Layer 'Charging stations' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Charging stations') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Charging stations' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Charging stations') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -120,7 +120,7 @@ }, { "key": "socket:schuko", - "description": "Layer 'Charging stations' shows socket:schuko~.+&socket:schuko!=1 with a fixed text, namely 'Schuko wall plug without ground pin (CEE7/4 type F)' (in the mapcomplete.org theme 'Charging stations')" + "description": "Layer 'Charging stations' shows socket:schuko~.+ &socket:schuko!=1 with a fixed text, namely 'Schuko wall plug without ground pin (CEE7/4 type F)' (in the mapcomplete.org theme 'Charging stations')" }, { "key": "socket:typee", @@ -129,7 +129,7 @@ }, { "key": "socket:typee", - "description": "Layer 'Charging stations' shows socket:typee~.+&socket:typee!=1 with a fixed text, namely 'European wall plug with ground pin (CEE7/4 type E)' (in the mapcomplete.org theme 'Charging stations')" + "description": "Layer 'Charging stations' shows socket:typee~.+ &socket:typee!=1 with a fixed text, namely 'European wall plug with ground pin (CEE7/4 type E)' (in the mapcomplete.org theme 'Charging stations')" }, { "key": "socket:chademo", @@ -138,7 +138,7 @@ }, { "key": "socket:chademo", - "description": "Layer 'Charging stations' shows socket:chademo~.+&socket:chademo!=1 with a fixed text, namely 'Chademo' (in the mapcomplete.org theme 'Charging stations')" + "description": "Layer 'Charging stations' shows socket:chademo~.+ &socket:chademo!=1 with a fixed text, namely 'Chademo' (in the mapcomplete.org theme 'Charging stations')" }, { "key": "socket:type1_cable", @@ -147,7 +147,7 @@ }, { "key": "socket:type1_cable", - "description": "Layer 'Charging stations' shows socket:type1_cable~.+&socket:type1_cable!=1 with a fixed text, namely 'Type 1 with cable (J1772)' (in the mapcomplete.org theme 'Charging stations')" + "description": "Layer 'Charging stations' shows socket:type1_cable~.+ &socket:type1_cable!=1 with a fixed text, namely 'Type 1 with cable (J1772)' (in the mapcomplete.org theme 'Charging stations')" }, { "key": "socket:type1", @@ -156,7 +156,7 @@ }, { "key": "socket:type1", - "description": "Layer 'Charging stations' shows socket:type1~.+&socket:type1!=1 with a fixed text, namely 'Type 1 without cable (J1772)' (in the mapcomplete.org theme 'Charging stations')" + "description": "Layer 'Charging stations' shows socket:type1~.+ &socket:type1!=1 with a fixed text, namely 'Type 1 without cable (J1772)' (in the mapcomplete.org theme 'Charging stations')" }, { "key": "socket:type1_combo", @@ -165,7 +165,7 @@ }, { "key": "socket:type1_combo", - "description": "Layer 'Charging stations' shows socket:type1_combo~.+&socket:type1_combo!=1 with a fixed text, namely 'Type 1 CCS (aka Type 1 Combo)' (in the mapcomplete.org theme 'Charging stations')" + "description": "Layer 'Charging stations' shows socket:type1_combo~.+ &socket:type1_combo!=1 with a fixed text, namely 'Type 1 CCS (aka Type 1 Combo)' (in the mapcomplete.org theme 'Charging stations')" }, { "key": "socket:tesla_supercharger", @@ -174,7 +174,7 @@ }, { "key": "socket:tesla_supercharger", - "description": "Layer 'Charging stations' shows socket:tesla_supercharger~.+&socket:tesla_supercharger!=1 with a fixed text, namely 'Tesla Supercharger' (in the mapcomplete.org theme 'Charging stations')" + "description": "Layer 'Charging stations' shows socket:tesla_supercharger~.+ &socket:tesla_supercharger!=1 with a fixed text, namely 'Tesla Supercharger' (in the mapcomplete.org theme 'Charging stations')" }, { "key": "socket:type2", @@ -183,7 +183,7 @@ }, { "key": "socket:type2", - "description": "Layer 'Charging stations' shows socket:type2~.+&socket:type2!=1 with a fixed text, namely 'Type 2 (mennekes)' (in the mapcomplete.org theme 'Charging stations')" + "description": "Layer 'Charging stations' shows socket:type2~.+ &socket:type2!=1 with a fixed text, namely 'Type 2 (mennekes)' (in the mapcomplete.org theme 'Charging stations')" }, { "key": "socket:type2_combo", @@ -192,7 +192,7 @@ }, { "key": "socket:type2_combo", - "description": "Layer 'Charging stations' shows socket:type2_combo~.+&socket:type2_combo!=1 with a fixed text, namely 'Type 2 CCS (mennekes)' (in the mapcomplete.org theme 'Charging stations')" + "description": "Layer 'Charging stations' shows socket:type2_combo~.+ &socket:type2_combo!=1 with a fixed text, namely 'Type 2 CCS (mennekes)' (in the mapcomplete.org theme 'Charging stations')" }, { "key": "socket:type2_cable", @@ -201,7 +201,7 @@ }, { "key": "socket:type2_cable", - "description": "Layer 'Charging stations' shows socket:type2_cable~.+&socket:type2_cable!=1 with a fixed text, namely 'Type 2 with cable (mennekes)' (in the mapcomplete.org theme 'Charging stations')" + "description": "Layer 'Charging stations' shows socket:type2_cable~.+ &socket:type2_cable!=1 with a fixed text, namely 'Type 2 with cable (mennekes)' (in the mapcomplete.org theme 'Charging stations')" }, { "key": "socket:tesla_supercharger_ccs", @@ -210,7 +210,7 @@ }, { "key": "socket:tesla_supercharger_ccs", - "description": "Layer 'Charging stations' shows socket:tesla_supercharger_ccs~.+&socket:tesla_supercharger_ccs!=1 with a fixed text, namely 'Tesla Supercharger CCS (a branded type2_css)' (in the mapcomplete.org theme 'Charging stations')" + "description": "Layer 'Charging stations' shows socket:tesla_supercharger_ccs~.+ &socket:tesla_supercharger_ccs!=1 with a fixed text, namely 'Tesla Supercharger CCS (a branded type2_css)' (in the mapcomplete.org theme 'Charging stations')" }, { "key": "socket:tesla_destination", @@ -219,7 +219,7 @@ }, { "key": "socket:tesla_destination", - "description": "Layer 'Charging stations' shows socket:tesla_destination~.+&socket:tesla_destination!=1&_country=us with a fixed text, namely 'Tesla Supercharger (destination)' (in the mapcomplete.org theme 'Charging stations')" + "description": "Layer 'Charging stations' shows socket:tesla_destination~.+ &socket:tesla_destination!=1 &_country=us with a fixed text, namely 'Tesla Supercharger (destination)' (in the mapcomplete.org theme 'Charging stations')" }, { "key": "socket:tesla_destination", @@ -228,7 +228,7 @@ }, { "key": "socket:tesla_destination", - "description": "Layer 'Charging stations' shows socket:tesla_destination~.+&socket:tesla_destination!=1&_country!=us with a fixed text, namely 'Tesla supercharger (destination) (A Type 2 with cable branded as tesla)' (in the mapcomplete.org theme 'Charging stations')" + "description": "Layer 'Charging stations' shows socket:tesla_destination~.+ &socket:tesla_destination!=1 &_country!=us with a fixed text, namely 'Tesla supercharger (destination) (A Type 2 with cable branded as tesla)' (in the mapcomplete.org theme 'Charging stations')" }, { "key": "socket:USB-A", @@ -237,7 +237,7 @@ }, { "key": "socket:USB-A", - "description": "Layer 'Charging stations' shows socket:USB-A~.+&socket:USB-A!=1 with a fixed text, namely 'USB to charge phones and small electronics' (in the mapcomplete.org theme 'Charging stations')" + "description": "Layer 'Charging stations' shows socket:USB-A~.+ &socket:USB-A!=1 with a fixed text, namely 'USB to charge phones and small electronics' (in the mapcomplete.org theme 'Charging stations')" }, { "key": "socket:bosch_3pin", @@ -246,7 +246,7 @@ }, { "key": "socket:bosch_3pin", - "description": "Layer 'Charging stations' shows socket:bosch_3pin~.+&socket:bosch_3pin!=1 with a fixed text, namely 'Bosch Active Connect with 3 pins and cable' (in the mapcomplete.org theme 'Charging stations')" + "description": "Layer 'Charging stations' shows socket:bosch_3pin~.+ &socket:bosch_3pin!=1 with a fixed text, namely 'Bosch Active Connect with 3 pins and cable' (in the mapcomplete.org theme 'Charging stations')" }, { "key": "socket:bosch_5pin", @@ -255,638 +255,638 @@ }, { "key": "socket:bosch_5pin", - "description": "Layer 'Charging stations' shows socket:bosch_5pin~.+&socket:bosch_5pin!=1 with a fixed text, namely 'Bosch Active Connect with 5 pins and cable' (in the mapcomplete.org theme 'Charging stations')" + "description": "Layer 'Charging stations' shows socket:bosch_5pin~.+ &socket:bosch_5pin!=1 with a fixed text, namely 'Bosch Active Connect with 5 pins and cable' (in the mapcomplete.org theme 'Charging stations')" }, { "key": "socket:schuko", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:schuko' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:schuko~.+&socket:schuko!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:schuko' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:schuko~.+ &socket:schuko!=0)" }, { "key": "socket:typee", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:typee' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:typee~.+&socket:typee!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:typee' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:typee~.+ &socket:typee!=0)" }, { "key": "socket:chademo", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:chademo' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:chademo~.+&socket:chademo!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:chademo' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:chademo~.+ &socket:chademo!=0)" }, { "key": "socket:type1_cable", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1_cable' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type1_cable~.+&socket:type1_cable!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1_cable' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type1_cable~.+ &socket:type1_cable!=0)" }, { "key": "socket:type1", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type1~.+&socket:type1!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type1~.+ &socket:type1!=0)" }, { "key": "socket:type1_combo", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1_combo' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type1_combo~.+&socket:type1_combo!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1_combo' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type1_combo~.+ &socket:type1_combo!=0)" }, { "key": "socket:tesla_supercharger", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_supercharger' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_supercharger~.+&socket:tesla_supercharger!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_supercharger' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_supercharger~.+ &socket:tesla_supercharger!=0)" }, { "key": "socket:type2", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type2~.+&socket:type2!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type2~.+ &socket:type2!=0)" }, { "key": "socket:type2_combo", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2_combo' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type2_combo~.+&socket:type2_combo!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2_combo' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type2_combo~.+ &socket:type2_combo!=0)" }, { "key": "socket:type2_cable", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2_cable' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type2_cable~.+&socket:type2_cable!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2_cable' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type2_cable~.+ &socket:type2_cable!=0)" }, { "key": "socket:tesla_supercharger_ccs", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_supercharger_ccs' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_supercharger_ccs~.+&socket:tesla_supercharger_ccs!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_supercharger_ccs' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_supercharger_ccs~.+ &socket:tesla_supercharger_ccs!=0)" }, { "key": "socket:tesla_destination", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_destination' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_destination~.+&socket:tesla_destination!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_destination' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_destination~.+ &socket:tesla_destination!=0)" }, { "key": "socket:tesla_destination", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_destination' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_destination~.+&socket:tesla_destination!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_destination' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_destination~.+ &socket:tesla_destination!=0)" }, { "key": "socket:USB-A", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:USB-A' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:USB-A~.+&socket:USB-A!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:USB-A' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:USB-A~.+ &socket:USB-A!=0)" }, { "key": "socket:bosch_3pin", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:bosch_3pin' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:bosch_3pin~.+&socket:bosch_3pin!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:bosch_3pin' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:bosch_3pin~.+ &socket:bosch_3pin!=0)" }, { "key": "socket:bosch_5pin", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:bosch_5pin' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:bosch_5pin~.+&socket:bosch_5pin!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:bosch_5pin' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:bosch_5pin~.+ &socket:bosch_5pin!=0)" }, { "key": "socket:schuko:voltage", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:schuko:voltage' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:schuko~.+&socket:schuko!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:schuko:voltage' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:schuko~.+ &socket:schuko!=0)" }, { "key": "socket:schuko:voltage", - "description": "Layer 'Charging stations' shows socket:schuko:voltage=230 V with a fixed text, namely 'Schuko wall plug without ground pin (CEE7/4 type F) outputs 230 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:schuko~.+&socket:schuko!=0)", + "description": "Layer 'Charging stations' shows socket:schuko:voltage=230 V with a fixed text, namely 'Schuko wall plug without ground pin (CEE7/4 type F) outputs 230 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:schuko~.+ &socket:schuko!=0)", "value": "230 V" }, { "key": "socket:schuko:current", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:schuko:current' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:schuko~.+&socket:schuko!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:schuko:current' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:schuko~.+ &socket:schuko!=0)" }, { "key": "socket:schuko:current", - "description": "Layer 'Charging stations' shows socket:schuko:current=16 A with a fixed text, namely 'Schuko wall plug without ground pin (CEE7/4 type F) outputs at most 16 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:schuko~.+&socket:schuko!=0)", + "description": "Layer 'Charging stations' shows socket:schuko:current=16 A with a fixed text, namely 'Schuko wall plug without ground pin (CEE7/4 type F) outputs at most 16 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:schuko~.+ &socket:schuko!=0)", "value": "16 A" }, { "key": "socket:schuko:output", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:schuko:output' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:schuko~.+&socket:schuko!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:schuko:output' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:schuko~.+ &socket:schuko!=0)" }, { "key": "socket:schuko:output", - "description": "Layer 'Charging stations' shows socket:schuko:output=3.6 kW with a fixed text, namely 'Schuko wall plug without ground pin (CEE7/4 type F) outputs at most 3.6 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:schuko~.+&socket:schuko!=0)", + "description": "Layer 'Charging stations' shows socket:schuko:output=3.6 kW with a fixed text, namely 'Schuko wall plug without ground pin (CEE7/4 type F) outputs at most 3.6 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:schuko~.+ &socket:schuko!=0)", "value": "3.6 kW" }, { "key": "socket:typee:voltage", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:typee:voltage' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:typee~.+&socket:typee!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:typee:voltage' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:typee~.+ &socket:typee!=0)" }, { "key": "socket:typee:voltage", - "description": "Layer 'Charging stations' shows socket:typee:voltage=230 V with a fixed text, namely 'European wall plug with ground pin (CEE7/4 type E) outputs 230 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:typee~.+&socket:typee!=0)", + "description": "Layer 'Charging stations' shows socket:typee:voltage=230 V with a fixed text, namely 'European wall plug with ground pin (CEE7/4 type E) outputs 230 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:typee~.+ &socket:typee!=0)", "value": "230 V" }, { "key": "socket:typee:current", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:typee:current' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:typee~.+&socket:typee!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:typee:current' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:typee~.+ &socket:typee!=0)" }, { "key": "socket:typee:current", - "description": "Layer 'Charging stations' shows socket:typee:current=16 A with a fixed text, namely 'European wall plug with ground pin (CEE7/4 type E) outputs at most 16 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:typee~.+&socket:typee!=0)", + "description": "Layer 'Charging stations' shows socket:typee:current=16 A with a fixed text, namely 'European wall plug with ground pin (CEE7/4 type E) outputs at most 16 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:typee~.+ &socket:typee!=0)", "value": "16 A" }, { "key": "socket:typee:output", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:typee:output' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:typee~.+&socket:typee!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:typee:output' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:typee~.+ &socket:typee!=0)" }, { "key": "socket:typee:output", - "description": "Layer 'Charging stations' shows socket:typee:output=3 kW with a fixed text, namely 'European wall plug with ground pin (CEE7/4 type E) outputs at most 3 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:typee~.+&socket:typee!=0)", + "description": "Layer 'Charging stations' shows socket:typee:output=3 kW with a fixed text, namely 'European wall plug with ground pin (CEE7/4 type E) outputs at most 3 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:typee~.+ &socket:typee!=0)", "value": "3 kW" }, { "key": "socket:typee:output", - "description": "Layer 'Charging stations' shows socket:typee:output=22 kW with a fixed text, namely 'European wall plug with ground pin (CEE7/4 type E) outputs at most 22 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:typee~.+&socket:typee!=0)", + "description": "Layer 'Charging stations' shows socket:typee:output=22 kW with a fixed text, namely 'European wall plug with ground pin (CEE7/4 type E) outputs at most 22 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:typee~.+ &socket:typee!=0)", "value": "22 kW" }, { "key": "socket:chademo:voltage", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:chademo:voltage' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:chademo~.+&socket:chademo!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:chademo:voltage' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:chademo~.+ &socket:chademo!=0)" }, { "key": "socket:chademo:voltage", - "description": "Layer 'Charging stations' shows socket:chademo:voltage=500 V with a fixed text, namely 'Chademo outputs 500 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:chademo~.+&socket:chademo!=0)", + "description": "Layer 'Charging stations' shows socket:chademo:voltage=500 V with a fixed text, namely 'Chademo outputs 500 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:chademo~.+ &socket:chademo!=0)", "value": "500 V" }, { "key": "socket:chademo:current", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:chademo:current' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:chademo~.+&socket:chademo!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:chademo:current' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:chademo~.+ &socket:chademo!=0)" }, { "key": "socket:chademo:current", - "description": "Layer 'Charging stations' shows socket:chademo:current=120 A with a fixed text, namely 'Chademo outputs at most 120 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:chademo~.+&socket:chademo!=0)", + "description": "Layer 'Charging stations' shows socket:chademo:current=120 A with a fixed text, namely 'Chademo outputs at most 120 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:chademo~.+ &socket:chademo!=0)", "value": "120 A" }, { "key": "socket:chademo:output", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:chademo:output' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:chademo~.+&socket:chademo!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:chademo:output' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:chademo~.+ &socket:chademo!=0)" }, { "key": "socket:chademo:output", - "description": "Layer 'Charging stations' shows socket:chademo:output=50 kW with a fixed text, namely 'Chademo outputs at most 50 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:chademo~.+&socket:chademo!=0)", + "description": "Layer 'Charging stations' shows socket:chademo:output=50 kW with a fixed text, namely 'Chademo outputs at most 50 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:chademo~.+ &socket:chademo!=0)", "value": "50 kW" }, { "key": "socket:type1_cable:voltage", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1_cable:voltage' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type1_cable~.+&socket:type1_cable!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1_cable:voltage' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type1_cable~.+ &socket:type1_cable!=0)" }, { "key": "socket:type1_cable:voltage", - "description": "Layer 'Charging stations' shows socket:type1_cable:voltage=200 V with a fixed text, namely 'Type 1 with cable (J1772) outputs 200 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type1_cable~.+&socket:type1_cable!=0)", + "description": "Layer 'Charging stations' shows socket:type1_cable:voltage=200 V with a fixed text, namely 'Type 1 with cable (J1772) outputs 200 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type1_cable~.+ &socket:type1_cable!=0)", "value": "200 V" }, { "key": "socket:type1_cable:voltage", - "description": "Layer 'Charging stations' shows socket:type1_cable:voltage=240 V with a fixed text, namely 'Type 1 with cable (J1772) outputs 240 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type1_cable~.+&socket:type1_cable!=0)", + "description": "Layer 'Charging stations' shows socket:type1_cable:voltage=240 V with a fixed text, namely 'Type 1 with cable (J1772) outputs 240 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type1_cable~.+ &socket:type1_cable!=0)", "value": "240 V" }, { "key": "socket:type1_cable:current", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1_cable:current' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type1_cable~.+&socket:type1_cable!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1_cable:current' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type1_cable~.+ &socket:type1_cable!=0)" }, { "key": "socket:type1_cable:current", - "description": "Layer 'Charging stations' shows socket:type1_cable:current=32 A with a fixed text, namely 'Type 1 with cable (J1772) outputs at most 32 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type1_cable~.+&socket:type1_cable!=0)", + "description": "Layer 'Charging stations' shows socket:type1_cable:current=32 A with a fixed text, namely 'Type 1 with cable (J1772) outputs at most 32 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type1_cable~.+ &socket:type1_cable!=0)", "value": "32 A" }, { "key": "socket:type1_cable:output", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1_cable:output' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type1_cable~.+&socket:type1_cable!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1_cable:output' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type1_cable~.+ &socket:type1_cable!=0)" }, { "key": "socket:type1_cable:output", - "description": "Layer 'Charging stations' shows socket:type1_cable:output=3.7 kW with a fixed text, namely 'Type 1 with cable (J1772) outputs at most 3.7 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type1_cable~.+&socket:type1_cable!=0)", + "description": "Layer 'Charging stations' shows socket:type1_cable:output=3.7 kW with a fixed text, namely 'Type 1 with cable (J1772) outputs at most 3.7 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type1_cable~.+ &socket:type1_cable!=0)", "value": "3.7 kW" }, { "key": "socket:type1_cable:output", - "description": "Layer 'Charging stations' shows socket:type1_cable:output=7 kW with a fixed text, namely 'Type 1 with cable (J1772) outputs at most 7 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type1_cable~.+&socket:type1_cable!=0)", + "description": "Layer 'Charging stations' shows socket:type1_cable:output=7 kW with a fixed text, namely 'Type 1 with cable (J1772) outputs at most 7 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type1_cable~.+ &socket:type1_cable!=0)", "value": "7 kW" }, { "key": "socket:type1:voltage", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1:voltage' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type1~.+&socket:type1!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1:voltage' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type1~.+ &socket:type1!=0)" }, { "key": "socket:type1:voltage", - "description": "Layer 'Charging stations' shows socket:type1:voltage=200 V with a fixed text, namely 'Type 1 without cable (J1772) outputs 200 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type1~.+&socket:type1!=0)", + "description": "Layer 'Charging stations' shows socket:type1:voltage=200 V with a fixed text, namely 'Type 1 without cable (J1772) outputs 200 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type1~.+ &socket:type1!=0)", "value": "200 V" }, { "key": "socket:type1:voltage", - "description": "Layer 'Charging stations' shows socket:type1:voltage=240 V with a fixed text, namely 'Type 1 without cable (J1772) outputs 240 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type1~.+&socket:type1!=0)", + "description": "Layer 'Charging stations' shows socket:type1:voltage=240 V with a fixed text, namely 'Type 1 without cable (J1772) outputs 240 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type1~.+ &socket:type1!=0)", "value": "240 V" }, { "key": "socket:type1:current", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1:current' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type1~.+&socket:type1!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1:current' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type1~.+ &socket:type1!=0)" }, { "key": "socket:type1:current", - "description": "Layer 'Charging stations' shows socket:type1:current=32 A with a fixed text, namely 'Type 1 without cable (J1772) outputs at most 32 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type1~.+&socket:type1!=0)", + "description": "Layer 'Charging stations' shows socket:type1:current=32 A with a fixed text, namely 'Type 1 without cable (J1772) outputs at most 32 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type1~.+ &socket:type1!=0)", "value": "32 A" }, { "key": "socket:type1:output", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1:output' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type1~.+&socket:type1!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1:output' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type1~.+ &socket:type1!=0)" }, { "key": "socket:type1:output", - "description": "Layer 'Charging stations' shows socket:type1:output=3.7 kW with a fixed text, namely 'Type 1 without cable (J1772) outputs at most 3.7 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type1~.+&socket:type1!=0)", + "description": "Layer 'Charging stations' shows socket:type1:output=3.7 kW with a fixed text, namely 'Type 1 without cable (J1772) outputs at most 3.7 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type1~.+ &socket:type1!=0)", "value": "3.7 kW" }, { "key": "socket:type1:output", - "description": "Layer 'Charging stations' shows socket:type1:output=6.6 kW with a fixed text, namely 'Type 1 without cable (J1772) outputs at most 6.6 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type1~.+&socket:type1!=0)", + "description": "Layer 'Charging stations' shows socket:type1:output=6.6 kW with a fixed text, namely 'Type 1 without cable (J1772) outputs at most 6.6 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type1~.+ &socket:type1!=0)", "value": "6.6 kW" }, { "key": "socket:type1:output", - "description": "Layer 'Charging stations' shows socket:type1:output=7 kW with a fixed text, namely 'Type 1 without cable (J1772) outputs at most 7 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type1~.+&socket:type1!=0)", + "description": "Layer 'Charging stations' shows socket:type1:output=7 kW with a fixed text, namely 'Type 1 without cable (J1772) outputs at most 7 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type1~.+ &socket:type1!=0)", "value": "7 kW" }, { "key": "socket:type1:output", - "description": "Layer 'Charging stations' shows socket:type1:output=7.2 kW with a fixed text, namely 'Type 1 without cable (J1772) outputs at most 7.2 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type1~.+&socket:type1!=0)", + "description": "Layer 'Charging stations' shows socket:type1:output=7.2 kW with a fixed text, namely 'Type 1 without cable (J1772) outputs at most 7.2 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type1~.+ &socket:type1!=0)", "value": "7.2 kW" }, { "key": "socket:type1_combo:voltage", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1_combo:voltage' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type1_combo~.+&socket:type1_combo!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1_combo:voltage' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type1_combo~.+ &socket:type1_combo!=0)" }, { "key": "socket:type1_combo:voltage", - "description": "Layer 'Charging stations' shows socket:type1_combo:voltage=400 V with a fixed text, namely 'Type 1 CCS (aka Type 1 Combo) outputs 400 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type1_combo~.+&socket:type1_combo!=0)", + "description": "Layer 'Charging stations' shows socket:type1_combo:voltage=400 V with a fixed text, namely 'Type 1 CCS (aka Type 1 Combo) outputs 400 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type1_combo~.+ &socket:type1_combo!=0)", "value": "400 V" }, { "key": "socket:type1_combo:voltage", - "description": "Layer 'Charging stations' shows socket:type1_combo:voltage=1000 V with a fixed text, namely 'Type 1 CCS (aka Type 1 Combo) outputs 1000 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type1_combo~.+&socket:type1_combo!=0)", + "description": "Layer 'Charging stations' shows socket:type1_combo:voltage=1000 V with a fixed text, namely 'Type 1 CCS (aka Type 1 Combo) outputs 1000 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type1_combo~.+ &socket:type1_combo!=0)", "value": "1000 V" }, { "key": "socket:type1_combo:current", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1_combo:current' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type1_combo~.+&socket:type1_combo!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1_combo:current' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type1_combo~.+ &socket:type1_combo!=0)" }, { "key": "socket:type1_combo:current", - "description": "Layer 'Charging stations' shows socket:type1_combo:current=50 A with a fixed text, namely 'Type 1 CCS (aka Type 1 Combo) outputs at most 50 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type1_combo~.+&socket:type1_combo!=0)", + "description": "Layer 'Charging stations' shows socket:type1_combo:current=50 A with a fixed text, namely 'Type 1 CCS (aka Type 1 Combo) outputs at most 50 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type1_combo~.+ &socket:type1_combo!=0)", "value": "50 A" }, { "key": "socket:type1_combo:current", - "description": "Layer 'Charging stations' shows socket:type1_combo:current=125 A with a fixed text, namely 'Type 1 CCS (aka Type 1 Combo) outputs at most 125 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type1_combo~.+&socket:type1_combo!=0)", + "description": "Layer 'Charging stations' shows socket:type1_combo:current=125 A with a fixed text, namely 'Type 1 CCS (aka Type 1 Combo) outputs at most 125 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type1_combo~.+ &socket:type1_combo!=0)", "value": "125 A" }, { "key": "socket:type1_combo:output", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1_combo:output' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type1_combo~.+&socket:type1_combo!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1_combo:output' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type1_combo~.+ &socket:type1_combo!=0)" }, { "key": "socket:type1_combo:output", - "description": "Layer 'Charging stations' shows socket:type1_combo:output=50 kW with a fixed text, namely 'Type 1 CCS (aka Type 1 Combo) outputs at most 50 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type1_combo~.+&socket:type1_combo!=0)", + "description": "Layer 'Charging stations' shows socket:type1_combo:output=50 kW with a fixed text, namely 'Type 1 CCS (aka Type 1 Combo) outputs at most 50 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type1_combo~.+ &socket:type1_combo!=0)", "value": "50 kW" }, { "key": "socket:type1_combo:output", - "description": "Layer 'Charging stations' shows socket:type1_combo:output=62.5 kW with a fixed text, namely 'Type 1 CCS (aka Type 1 Combo) outputs at most 62.5 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type1_combo~.+&socket:type1_combo!=0)", + "description": "Layer 'Charging stations' shows socket:type1_combo:output=62.5 kW with a fixed text, namely 'Type 1 CCS (aka Type 1 Combo) outputs at most 62.5 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type1_combo~.+ &socket:type1_combo!=0)", "value": "62.5 kW" }, { "key": "socket:type1_combo:output", - "description": "Layer 'Charging stations' shows socket:type1_combo:output=150 kW with a fixed text, namely 'Type 1 CCS (aka Type 1 Combo) outputs at most 150 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type1_combo~.+&socket:type1_combo!=0)", + "description": "Layer 'Charging stations' shows socket:type1_combo:output=150 kW with a fixed text, namely 'Type 1 CCS (aka Type 1 Combo) outputs at most 150 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type1_combo~.+ &socket:type1_combo!=0)", "value": "150 kW" }, { "key": "socket:type1_combo:output", - "description": "Layer 'Charging stations' shows socket:type1_combo:output=350 kW with a fixed text, namely 'Type 1 CCS (aka Type 1 Combo) outputs at most 350 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type1_combo~.+&socket:type1_combo!=0)", + "description": "Layer 'Charging stations' shows socket:type1_combo:output=350 kW with a fixed text, namely 'Type 1 CCS (aka Type 1 Combo) outputs at most 350 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type1_combo~.+ &socket:type1_combo!=0)", "value": "350 kW" }, { "key": "socket:tesla_supercharger:voltage", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_supercharger:voltage' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_supercharger~.+&socket:tesla_supercharger!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_supercharger:voltage' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_supercharger~.+ &socket:tesla_supercharger!=0)" }, { "key": "socket:tesla_supercharger:voltage", - "description": "Layer 'Charging stations' shows socket:tesla_supercharger:voltage=480 V with a fixed text, namely 'Tesla Supercharger outputs 480 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_supercharger~.+&socket:tesla_supercharger!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_supercharger:voltage=480 V with a fixed text, namely 'Tesla Supercharger outputs 480 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_supercharger~.+ &socket:tesla_supercharger!=0)", "value": "480 V" }, { "key": "socket:tesla_supercharger:current", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_supercharger:current' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_supercharger~.+&socket:tesla_supercharger!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_supercharger:current' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_supercharger~.+ &socket:tesla_supercharger!=0)" }, { "key": "socket:tesla_supercharger:current", - "description": "Layer 'Charging stations' shows socket:tesla_supercharger:current=125 A with a fixed text, namely 'Tesla Supercharger outputs at most 125 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_supercharger~.+&socket:tesla_supercharger!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_supercharger:current=125 A with a fixed text, namely 'Tesla Supercharger outputs at most 125 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_supercharger~.+ &socket:tesla_supercharger!=0)", "value": "125 A" }, { "key": "socket:tesla_supercharger:current", - "description": "Layer 'Charging stations' shows socket:tesla_supercharger:current=350 A with a fixed text, namely 'Tesla Supercharger outputs at most 350 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_supercharger~.+&socket:tesla_supercharger!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_supercharger:current=350 A with a fixed text, namely 'Tesla Supercharger outputs at most 350 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_supercharger~.+ &socket:tesla_supercharger!=0)", "value": "350 A" }, { "key": "socket:tesla_supercharger:output", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_supercharger:output' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_supercharger~.+&socket:tesla_supercharger!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_supercharger:output' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_supercharger~.+ &socket:tesla_supercharger!=0)" }, { "key": "socket:tesla_supercharger:output", - "description": "Layer 'Charging stations' shows socket:tesla_supercharger:output=120 kW with a fixed text, namely 'Tesla Supercharger outputs at most 120 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_supercharger~.+&socket:tesla_supercharger!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_supercharger:output=120 kW with a fixed text, namely 'Tesla Supercharger outputs at most 120 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_supercharger~.+ &socket:tesla_supercharger!=0)", "value": "120 kW" }, { "key": "socket:tesla_supercharger:output", - "description": "Layer 'Charging stations' shows socket:tesla_supercharger:output=150 kW with a fixed text, namely 'Tesla Supercharger outputs at most 150 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_supercharger~.+&socket:tesla_supercharger!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_supercharger:output=150 kW with a fixed text, namely 'Tesla Supercharger outputs at most 150 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_supercharger~.+ &socket:tesla_supercharger!=0)", "value": "150 kW" }, { "key": "socket:tesla_supercharger:output", - "description": "Layer 'Charging stations' shows socket:tesla_supercharger:output=250 kW with a fixed text, namely 'Tesla Supercharger outputs at most 250 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_supercharger~.+&socket:tesla_supercharger!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_supercharger:output=250 kW with a fixed text, namely 'Tesla Supercharger outputs at most 250 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_supercharger~.+ &socket:tesla_supercharger!=0)", "value": "250 kW" }, { "key": "socket:type2:voltage", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2:voltage' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type2~.+&socket:type2!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2:voltage' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type2~.+ &socket:type2!=0)" }, { "key": "socket:type2:voltage", - "description": "Layer 'Charging stations' shows socket:type2:voltage=230 V with a fixed text, namely 'Type 2 (mennekes) outputs 230 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type2~.+&socket:type2!=0)", + "description": "Layer 'Charging stations' shows socket:type2:voltage=230 V with a fixed text, namely 'Type 2 (mennekes) outputs 230 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type2~.+ &socket:type2!=0)", "value": "230 V" }, { "key": "socket:type2:voltage", - "description": "Layer 'Charging stations' shows socket:type2:voltage=400 V with a fixed text, namely 'Type 2 (mennekes) outputs 400 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type2~.+&socket:type2!=0)", + "description": "Layer 'Charging stations' shows socket:type2:voltage=400 V with a fixed text, namely 'Type 2 (mennekes) outputs 400 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type2~.+ &socket:type2!=0)", "value": "400 V" }, { "key": "socket:type2:current", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2:current' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type2~.+&socket:type2!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2:current' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type2~.+ &socket:type2!=0)" }, { "key": "socket:type2:current", - "description": "Layer 'Charging stations' shows socket:type2:current=16 A with a fixed text, namely 'Type 2 (mennekes) outputs at most 16 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type2~.+&socket:type2!=0)", + "description": "Layer 'Charging stations' shows socket:type2:current=16 A with a fixed text, namely 'Type 2 (mennekes) outputs at most 16 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type2~.+ &socket:type2!=0)", "value": "16 A" }, { "key": "socket:type2:current", - "description": "Layer 'Charging stations' shows socket:type2:current=32 A with a fixed text, namely 'Type 2 (mennekes) outputs at most 32 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type2~.+&socket:type2!=0)", + "description": "Layer 'Charging stations' shows socket:type2:current=32 A with a fixed text, namely 'Type 2 (mennekes) outputs at most 32 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type2~.+ &socket:type2!=0)", "value": "32 A" }, { "key": "socket:type2:output", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2:output' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type2~.+&socket:type2!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2:output' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type2~.+ &socket:type2!=0)" }, { "key": "socket:type2:output", - "description": "Layer 'Charging stations' shows socket:type2:output=11 kW with a fixed text, namely 'Type 2 (mennekes) outputs at most 11 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type2~.+&socket:type2!=0)", + "description": "Layer 'Charging stations' shows socket:type2:output=11 kW with a fixed text, namely 'Type 2 (mennekes) outputs at most 11 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type2~.+ &socket:type2!=0)", "value": "11 kW" }, { "key": "socket:type2:output", - "description": "Layer 'Charging stations' shows socket:type2:output=22 kW with a fixed text, namely 'Type 2 (mennekes) outputs at most 22 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type2~.+&socket:type2!=0)", + "description": "Layer 'Charging stations' shows socket:type2:output=22 kW with a fixed text, namely 'Type 2 (mennekes) outputs at most 22 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type2~.+ &socket:type2!=0)", "value": "22 kW" }, { "key": "socket:type2_combo:voltage", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2_combo:voltage' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type2_combo~.+&socket:type2_combo!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2_combo:voltage' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type2_combo~.+ &socket:type2_combo!=0)" }, { "key": "socket:type2_combo:voltage", - "description": "Layer 'Charging stations' shows socket:type2_combo:voltage=500 V with a fixed text, namely 'Type 2 CCS (mennekes) outputs 500 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type2_combo~.+&socket:type2_combo!=0)", + "description": "Layer 'Charging stations' shows socket:type2_combo:voltage=500 V with a fixed text, namely 'Type 2 CCS (mennekes) outputs 500 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type2_combo~.+ &socket:type2_combo!=0)", "value": "500 V" }, { "key": "socket:type2_combo:voltage", - "description": "Layer 'Charging stations' shows socket:type2_combo:voltage=920 V with a fixed text, namely 'Type 2 CCS (mennekes) outputs 920 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type2_combo~.+&socket:type2_combo!=0)", + "description": "Layer 'Charging stations' shows socket:type2_combo:voltage=920 V with a fixed text, namely 'Type 2 CCS (mennekes) outputs 920 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type2_combo~.+ &socket:type2_combo!=0)", "value": "920 V" }, { "key": "socket:type2_combo:current", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2_combo:current' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type2_combo~.+&socket:type2_combo!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2_combo:current' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type2_combo~.+ &socket:type2_combo!=0)" }, { "key": "socket:type2_combo:current", - "description": "Layer 'Charging stations' shows socket:type2_combo:current=125 A with a fixed text, namely 'Type 2 CCS (mennekes) outputs at most 125 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type2_combo~.+&socket:type2_combo!=0)", + "description": "Layer 'Charging stations' shows socket:type2_combo:current=125 A with a fixed text, namely 'Type 2 CCS (mennekes) outputs at most 125 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type2_combo~.+ &socket:type2_combo!=0)", "value": "125 A" }, { "key": "socket:type2_combo:current", - "description": "Layer 'Charging stations' shows socket:type2_combo:current=350 A with a fixed text, namely 'Type 2 CCS (mennekes) outputs at most 350 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type2_combo~.+&socket:type2_combo!=0)", + "description": "Layer 'Charging stations' shows socket:type2_combo:current=350 A with a fixed text, namely 'Type 2 CCS (mennekes) outputs at most 350 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type2_combo~.+ &socket:type2_combo!=0)", "value": "350 A" }, { "key": "socket:type2_combo:output", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2_combo:output' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type2_combo~.+&socket:type2_combo!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2_combo:output' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type2_combo~.+ &socket:type2_combo!=0)" }, { "key": "socket:type2_combo:output", - "description": "Layer 'Charging stations' shows socket:type2_combo:output=50 kW with a fixed text, namely 'Type 2 CCS (mennekes) outputs at most 50 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type2_combo~.+&socket:type2_combo!=0)", + "description": "Layer 'Charging stations' shows socket:type2_combo:output=50 kW with a fixed text, namely 'Type 2 CCS (mennekes) outputs at most 50 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type2_combo~.+ &socket:type2_combo!=0)", "value": "50 kW" }, { "key": "socket:type2_cable:voltage", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2_cable:voltage' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type2_cable~.+&socket:type2_cable!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2_cable:voltage' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type2_cable~.+ &socket:type2_cable!=0)" }, { "key": "socket:type2_cable:voltage", - "description": "Layer 'Charging stations' shows socket:type2_cable:voltage=230 V with a fixed text, namely 'Type 2 with cable (mennekes) outputs 230 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type2_cable~.+&socket:type2_cable!=0)", + "description": "Layer 'Charging stations' shows socket:type2_cable:voltage=230 V with a fixed text, namely 'Type 2 with cable (mennekes) outputs 230 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type2_cable~.+ &socket:type2_cable!=0)", "value": "230 V" }, { "key": "socket:type2_cable:voltage", - "description": "Layer 'Charging stations' shows socket:type2_cable:voltage=400 V with a fixed text, namely 'Type 2 with cable (mennekes) outputs 400 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type2_cable~.+&socket:type2_cable!=0)", + "description": "Layer 'Charging stations' shows socket:type2_cable:voltage=400 V with a fixed text, namely 'Type 2 with cable (mennekes) outputs 400 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type2_cable~.+ &socket:type2_cable!=0)", "value": "400 V" }, { "key": "socket:type2_cable:current", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2_cable:current' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type2_cable~.+&socket:type2_cable!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2_cable:current' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type2_cable~.+ &socket:type2_cable!=0)" }, { "key": "socket:type2_cable:current", - "description": "Layer 'Charging stations' shows socket:type2_cable:current=16 A with a fixed text, namely 'Type 2 with cable (mennekes) outputs at most 16 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type2_cable~.+&socket:type2_cable!=0)", + "description": "Layer 'Charging stations' shows socket:type2_cable:current=16 A with a fixed text, namely 'Type 2 with cable (mennekes) outputs at most 16 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type2_cable~.+ &socket:type2_cable!=0)", "value": "16 A" }, { "key": "socket:type2_cable:current", - "description": "Layer 'Charging stations' shows socket:type2_cable:current=32 A with a fixed text, namely 'Type 2 with cable (mennekes) outputs at most 32 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type2_cable~.+&socket:type2_cable!=0)", + "description": "Layer 'Charging stations' shows socket:type2_cable:current=32 A with a fixed text, namely 'Type 2 with cable (mennekes) outputs at most 32 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type2_cable~.+ &socket:type2_cable!=0)", "value": "32 A" }, { "key": "socket:type2_cable:output", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2_cable:output' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type2_cable~.+&socket:type2_cable!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2_cable:output' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type2_cable~.+ &socket:type2_cable!=0)" }, { "key": "socket:type2_cable:output", - "description": "Layer 'Charging stations' shows socket:type2_cable:output=11 kW with a fixed text, namely 'Type 2 with cable (mennekes) outputs at most 11 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type2_cable~.+&socket:type2_cable!=0)", + "description": "Layer 'Charging stations' shows socket:type2_cable:output=11 kW with a fixed text, namely 'Type 2 with cable (mennekes) outputs at most 11 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type2_cable~.+ &socket:type2_cable!=0)", "value": "11 kW" }, { "key": "socket:type2_cable:output", - "description": "Layer 'Charging stations' shows socket:type2_cable:output=22 kW with a fixed text, namely 'Type 2 with cable (mennekes) outputs at most 22 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type2_cable~.+&socket:type2_cable!=0)", + "description": "Layer 'Charging stations' shows socket:type2_cable:output=22 kW with a fixed text, namely 'Type 2 with cable (mennekes) outputs at most 22 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:type2_cable~.+ &socket:type2_cable!=0)", "value": "22 kW" }, { "key": "socket:tesla_supercharger_ccs:voltage", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_supercharger_ccs:voltage' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_supercharger_ccs~.+&socket:tesla_supercharger_ccs!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_supercharger_ccs:voltage' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_supercharger_ccs~.+ &socket:tesla_supercharger_ccs!=0)" }, { "key": "socket:tesla_supercharger_ccs:voltage", - "description": "Layer 'Charging stations' shows socket:tesla_supercharger_ccs:voltage=500 V with a fixed text, namely 'Tesla Supercharger CCS (a branded Type 2 CSS) outputs 500 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_supercharger_ccs~.+&socket:tesla_supercharger_ccs!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_supercharger_ccs:voltage=500 V with a fixed text, namely 'Tesla Supercharger CCS (a branded Type 2 CSS) outputs 500 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_supercharger_ccs~.+ &socket:tesla_supercharger_ccs!=0)", "value": "500 V" }, { "key": "socket:tesla_supercharger_ccs:voltage", - "description": "Layer 'Charging stations' shows socket:tesla_supercharger_ccs:voltage=920 V with a fixed text, namely 'Tesla Supercharger CCS (a branded Type 2 CSS) outputs 920 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_supercharger_ccs~.+&socket:tesla_supercharger_ccs!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_supercharger_ccs:voltage=920 V with a fixed text, namely 'Tesla Supercharger CCS (a branded Type 2 CSS) outputs 920 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_supercharger_ccs~.+ &socket:tesla_supercharger_ccs!=0)", "value": "920 V" }, { "key": "socket:tesla_supercharger_ccs:current", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_supercharger_ccs:current' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_supercharger_ccs~.+&socket:tesla_supercharger_ccs!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_supercharger_ccs:current' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_supercharger_ccs~.+ &socket:tesla_supercharger_ccs!=0)" }, { "key": "socket:tesla_supercharger_ccs:current", - "description": "Layer 'Charging stations' shows socket:tesla_supercharger_ccs:current=125 A with a fixed text, namely 'Tesla Supercharger CCS (a branded type2_css) outputs at most 125 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_supercharger_ccs~.+&socket:tesla_supercharger_ccs!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_supercharger_ccs:current=125 A with a fixed text, namely 'Tesla Supercharger CCS (a branded type2_css) outputs at most 125 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_supercharger_ccs~.+ &socket:tesla_supercharger_ccs!=0)", "value": "125 A" }, { "key": "socket:tesla_supercharger_ccs:current", - "description": "Layer 'Charging stations' shows socket:tesla_supercharger_ccs:current=350 A with a fixed text, namely 'Tesla Supercharger CCS (a branded type2_css) outputs at most 350 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_supercharger_ccs~.+&socket:tesla_supercharger_ccs!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_supercharger_ccs:current=350 A with a fixed text, namely 'Tesla Supercharger CCS (a branded type2_css) outputs at most 350 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_supercharger_ccs~.+ &socket:tesla_supercharger_ccs!=0)", "value": "350 A" }, { "key": "socket:tesla_supercharger_ccs:output", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_supercharger_ccs:output' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_supercharger_ccs~.+&socket:tesla_supercharger_ccs!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_supercharger_ccs:output' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_supercharger_ccs~.+ &socket:tesla_supercharger_ccs!=0)" }, { "key": "socket:tesla_supercharger_ccs:output", - "description": "Layer 'Charging stations' shows socket:tesla_supercharger_ccs:output=50 kW with a fixed text, namely 'Tesla Supercharger CCS (a branded Type 2 CSS) outputs at most 50 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_supercharger_ccs~.+&socket:tesla_supercharger_ccs!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_supercharger_ccs:output=50 kW with a fixed text, namely 'Tesla Supercharger CCS (a branded Type 2 CSS) outputs at most 50 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_supercharger_ccs~.+ &socket:tesla_supercharger_ccs!=0)", "value": "50 kW" }, { "key": "socket:tesla_destination:voltage", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_destination:voltage' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_destination~.+&socket:tesla_destination!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_destination:voltage' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_destination~.+ &socket:tesla_destination!=0)" }, { "key": "socket:tesla_destination:voltage", - "description": "Layer 'Charging stations' shows socket:tesla_destination:voltage=480 V with a fixed text, namely 'Tesla Supercharger (Destination) outputs 480 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_destination~.+&socket:tesla_destination!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_destination:voltage=480 V with a fixed text, namely 'Tesla Supercharger (Destination) outputs 480 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_destination~.+ &socket:tesla_destination!=0)", "value": "480 V" }, { "key": "socket:tesla_destination:current", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_destination:current' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_destination~.+&socket:tesla_destination!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_destination:current' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_destination~.+ &socket:tesla_destination!=0)" }, { "key": "socket:tesla_destination:current", - "description": "Layer 'Charging stations' shows socket:tesla_destination:current=125 A with a fixed text, namely 'Tesla Supercharger (Destination) outputs at most 125 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_destination~.+&socket:tesla_destination!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_destination:current=125 A with a fixed text, namely 'Tesla Supercharger (Destination) outputs at most 125 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_destination~.+ &socket:tesla_destination!=0)", "value": "125 A" }, { "key": "socket:tesla_destination:current", - "description": "Layer 'Charging stations' shows socket:tesla_destination:current=350 A with a fixed text, namely 'Tesla Supercharger (Destination) outputs at most 350 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_destination~.+&socket:tesla_destination!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_destination:current=350 A with a fixed text, namely 'Tesla Supercharger (Destination) outputs at most 350 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_destination~.+ &socket:tesla_destination!=0)", "value": "350 A" }, { "key": "socket:tesla_destination:output", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_destination:output' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_destination~.+&socket:tesla_destination!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_destination:output' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_destination~.+ &socket:tesla_destination!=0)" }, { "key": "socket:tesla_destination:output", - "description": "Layer 'Charging stations' shows socket:tesla_destination:output=120 kW with a fixed text, namely 'Tesla Supercharger (Destination) outputs at most 120 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_destination~.+&socket:tesla_destination!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_destination:output=120 kW with a fixed text, namely 'Tesla Supercharger (Destination) outputs at most 120 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_destination~.+ &socket:tesla_destination!=0)", "value": "120 kW" }, { "key": "socket:tesla_destination:output", - "description": "Layer 'Charging stations' shows socket:tesla_destination:output=150 kW with a fixed text, namely 'Tesla Supercharger (Destination) outputs at most 150 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_destination~.+&socket:tesla_destination!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_destination:output=150 kW with a fixed text, namely 'Tesla Supercharger (Destination) outputs at most 150 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_destination~.+ &socket:tesla_destination!=0)", "value": "150 kW" }, { "key": "socket:tesla_destination:output", - "description": "Layer 'Charging stations' shows socket:tesla_destination:output=250 kW with a fixed text, namely 'Tesla Supercharger (Destination) outputs at most 250 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_destination~.+&socket:tesla_destination!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_destination:output=250 kW with a fixed text, namely 'Tesla Supercharger (Destination) outputs at most 250 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_destination~.+ &socket:tesla_destination!=0)", "value": "250 kW" }, { "key": "socket:tesla_destination:voltage", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_destination:voltage' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_destination~.+&socket:tesla_destination!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_destination:voltage' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_destination~.+ &socket:tesla_destination!=0)" }, { "key": "socket:tesla_destination:voltage", - "description": "Layer 'Charging stations' shows socket:tesla_destination:voltage=230 V with a fixed text, namely 'Tesla Supercharger (Destination) (A Type 2 with cable branded as Tesla) outputs 230 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_destination~.+&socket:tesla_destination!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_destination:voltage=230 V with a fixed text, namely 'Tesla Supercharger (Destination) (A Type 2 with cable branded as Tesla) outputs 230 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_destination~.+ &socket:tesla_destination!=0)", "value": "230 V" }, { "key": "socket:tesla_destination:voltage", - "description": "Layer 'Charging stations' shows socket:tesla_destination:voltage=400 V with a fixed text, namely 'Tesla Supercharger (Destination) (A Type 2 with cable branded as Tesla) outputs 400 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_destination~.+&socket:tesla_destination!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_destination:voltage=400 V with a fixed text, namely 'Tesla Supercharger (Destination) (A Type 2 with cable branded as Tesla) outputs 400 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_destination~.+ &socket:tesla_destination!=0)", "value": "400 V" }, { "key": "socket:tesla_destination:current", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_destination:current' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_destination~.+&socket:tesla_destination!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_destination:current' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_destination~.+ &socket:tesla_destination!=0)" }, { "key": "socket:tesla_destination:current", - "description": "Layer 'Charging stations' shows socket:tesla_destination:current=16 A with a fixed text, namely 'Tesla Supercharger (Destination) (A Type 2 with cable branded as tesla) outputs at most 16 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_destination~.+&socket:tesla_destination!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_destination:current=16 A with a fixed text, namely 'Tesla Supercharger (Destination) (A Type 2 with cable branded as tesla) outputs at most 16 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_destination~.+ &socket:tesla_destination!=0)", "value": "16 A" }, { "key": "socket:tesla_destination:current", - "description": "Layer 'Charging stations' shows socket:tesla_destination:current=32 A with a fixed text, namely 'Tesla Supercharger (Destination) (A Type 2 with cable branded as Tesla) outputs at most 32 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_destination~.+&socket:tesla_destination!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_destination:current=32 A with a fixed text, namely 'Tesla Supercharger (Destination) (A Type 2 with cable branded as Tesla) outputs at most 32 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_destination~.+ &socket:tesla_destination!=0)", "value": "32 A" }, { "key": "socket:tesla_destination:output", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_destination:output' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_destination~.+&socket:tesla_destination!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_destination:output' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_destination~.+ &socket:tesla_destination!=0)" }, { "key": "socket:tesla_destination:output", - "description": "Layer 'Charging stations' shows socket:tesla_destination:output=11 kW with a fixed text, namely 'Tesla Supercharger (Destination) (A Type 2 with cable branded as Tesla) outputs at most 11 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_destination~.+&socket:tesla_destination!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_destination:output=11 kW with a fixed text, namely 'Tesla Supercharger (Destination) (A Type 2 with cable branded as Tesla) outputs at most 11 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_destination~.+ &socket:tesla_destination!=0)", "value": "11 kW" }, { "key": "socket:tesla_destination:output", - "description": "Layer 'Charging stations' shows socket:tesla_destination:output=22 kW with a fixed text, namely 'Tesla Supercharger (Destination) (A Type 2 with cable branded as Tesla) outputs at most 22 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_destination~.+&socket:tesla_destination!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_destination:output=22 kW with a fixed text, namely 'Tesla Supercharger (Destination) (A Type 2 with cable branded as Tesla) outputs at most 22 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:tesla_destination~.+ &socket:tesla_destination!=0)", "value": "22 kW" }, { "key": "socket:USB-A:voltage", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:USB-A:voltage' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:USB-A~.+&socket:USB-A!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:USB-A:voltage' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:USB-A~.+ &socket:USB-A!=0)" }, { "key": "socket:USB-A:voltage", - "description": "Layer 'Charging stations' shows socket:USB-A:voltage=5 V with a fixed text, namely 'USB to charge phones and small electronics outputs 5 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:USB-A~.+&socket:USB-A!=0)", + "description": "Layer 'Charging stations' shows socket:USB-A:voltage=5 V with a fixed text, namely 'USB to charge phones and small electronics outputs 5 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:USB-A~.+ &socket:USB-A!=0)", "value": "5 V" }, { "key": "socket:USB-A:current", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:USB-A:current' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:USB-A~.+&socket:USB-A!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:USB-A:current' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:USB-A~.+ &socket:USB-A!=0)" }, { "key": "socket:USB-A:current", - "description": "Layer 'Charging stations' shows socket:USB-A:current=1 A with a fixed text, namely 'USB to charge phones and small electronics outputs at most 1 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:USB-A~.+&socket:USB-A!=0)", + "description": "Layer 'Charging stations' shows socket:USB-A:current=1 A with a fixed text, namely 'USB to charge phones and small electronics outputs at most 1 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:USB-A~.+ &socket:USB-A!=0)", "value": "1 A" }, { "key": "socket:USB-A:current", - "description": "Layer 'Charging stations' shows socket:USB-A:current=2 A with a fixed text, namely 'USB to charge phones and small electronics outputs at most 2 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:USB-A~.+&socket:USB-A!=0)", + "description": "Layer 'Charging stations' shows socket:USB-A:current=2 A with a fixed text, namely 'USB to charge phones and small electronics outputs at most 2 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:USB-A~.+ &socket:USB-A!=0)", "value": "2 A" }, { "key": "socket:USB-A:output", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:USB-A:output' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:USB-A~.+&socket:USB-A!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:USB-A:output' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:USB-A~.+ &socket:USB-A!=0)" }, { "key": "socket:USB-A:output", - "description": "Layer 'Charging stations' shows socket:USB-A:output=5W with a fixed text, namely 'USB to charge phones and small electronics outputs at most 5w A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:USB-A~.+&socket:USB-A!=0)", + "description": "Layer 'Charging stations' shows socket:USB-A:output=5W with a fixed text, namely 'USB to charge phones and small electronics outputs at most 5w A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:USB-A~.+ &socket:USB-A!=0)", "value": "5W" }, { "key": "socket:USB-A:output", - "description": "Layer 'Charging stations' shows socket:USB-A:output=10W with a fixed text, namely 'USB to charge phones and small electronics outputs at most 10w A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:USB-A~.+&socket:USB-A!=0)", + "description": "Layer 'Charging stations' shows socket:USB-A:output=10W with a fixed text, namely 'USB to charge phones and small electronics outputs at most 10w A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:USB-A~.+ &socket:USB-A!=0)", "value": "10W" }, { "key": "socket:bosch_3pin:voltage", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:bosch_3pin:voltage' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:bosch_3pin~.+&socket:bosch_3pin!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:bosch_3pin:voltage' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:bosch_3pin~.+ &socket:bosch_3pin!=0)" }, { "key": "socket:bosch_3pin:current", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:bosch_3pin:current' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:bosch_3pin~.+&socket:bosch_3pin!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:bosch_3pin:current' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:bosch_3pin~.+ &socket:bosch_3pin!=0)" }, { "key": "socket:bosch_3pin:output", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:bosch_3pin:output' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:bosch_3pin~.+&socket:bosch_3pin!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:bosch_3pin:output' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:bosch_3pin~.+ &socket:bosch_3pin!=0)" }, { "key": "socket:bosch_5pin:voltage", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:bosch_5pin:voltage' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:bosch_5pin~.+&socket:bosch_5pin!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:bosch_5pin:voltage' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:bosch_5pin~.+ &socket:bosch_5pin!=0)" }, { "key": "socket:bosch_5pin:current", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:bosch_5pin:current' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:bosch_5pin~.+&socket:bosch_5pin!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:bosch_5pin:current' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:bosch_5pin~.+ &socket:bosch_5pin!=0)" }, { "key": "socket:bosch_5pin:output", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:bosch_5pin:output' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:bosch_5pin~.+&socket:bosch_5pin!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:bosch_5pin:output' (in the mapcomplete.org theme 'Charging stations') (This is only shown if socket:bosch_5pin~.+ &socket:bosch_5pin!=0)" }, { "key": "opening_hours", @@ -899,42 +899,42 @@ }, { "key": "fee", - "description": "Layer 'Charging stations' shows fee=no&authentication:none=yes with a fixed text, namely 'Free to use (without authenticating)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations')", + "description": "Layer 'Charging stations' shows fee=no &authentication:none=yes with a fixed text, namely 'Free to use (without authenticating)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations')", "value": "no" }, { "key": "fee:conditional", - "description": "Layer 'Charging stations' shows fee=no&authentication:none=yes with a fixed text, namely 'Free to use (without authenticating)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') Picking this answer will delete the key fee:conditional.", + "description": "Layer 'Charging stations' shows fee=no &authentication:none=yes with a fixed text, namely 'Free to use (without authenticating)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') Picking this answer will delete the key fee:conditional.", "value": "" }, { "key": "charge", - "description": "Layer 'Charging stations' shows fee=no&authentication:none=yes with a fixed text, namely 'Free to use (without authenticating)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') Picking this answer will delete the key charge.", + "description": "Layer 'Charging stations' shows fee=no &authentication:none=yes with a fixed text, namely 'Free to use (without authenticating)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') Picking this answer will delete the key charge.", "value": "" }, { "key": "authentication:none", - "description": "Layer 'Charging stations' shows fee=no&authentication:none=yes with a fixed text, namely 'Free to use (without authenticating)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations')", + "description": "Layer 'Charging stations' shows fee=no &authentication:none=yes with a fixed text, namely 'Free to use (without authenticating)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations')", "value": "yes" }, { "key": "fee", - "description": "Layer 'Charging stations' shows fee=no&authentication:none=no with a fixed text, namely 'Free to use, but one has to authenticate' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations')", + "description": "Layer 'Charging stations' shows fee=no &authentication:none=no with a fixed text, namely 'Free to use, but one has to authenticate' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations')", "value": "no" }, { "key": "fee:conditional", - "description": "Layer 'Charging stations' shows fee=no&authentication:none=no with a fixed text, namely 'Free to use, but one has to authenticate' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') Picking this answer will delete the key fee:conditional.", + "description": "Layer 'Charging stations' shows fee=no &authentication:none=no with a fixed text, namely 'Free to use, but one has to authenticate' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') Picking this answer will delete the key fee:conditional.", "value": "" }, { "key": "charge", - "description": "Layer 'Charging stations' shows fee=no&authentication:none=no with a fixed text, namely 'Free to use, but one has to authenticate' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') Picking this answer will delete the key charge.", + "description": "Layer 'Charging stations' shows fee=no &authentication:none=no with a fixed text, namely 'Free to use, but one has to authenticate' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') Picking this answer will delete the key charge.", "value": "" }, { "key": "authentication:none", - "description": "Layer 'Charging stations' shows fee=no&authentication:none=no with a fixed text, namely 'Free to use, but one has to authenticate' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations')", + "description": "Layer 'Charging stations' shows fee=no &authentication:none=no with a fixed text, namely 'Free to use, but one has to authenticate' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations')", "value": "no" }, { @@ -944,12 +944,12 @@ }, { "key": "fee", - "description": "Layer 'Charging stations' shows fee=yes&fee:conditional=no @ customers with a fixed text, namely 'Paid use, but free for customers of the hotel/pub/hospital/… who operates the charging station' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations')", + "description": "Layer 'Charging stations' shows fee=yes &fee:conditional=no @ customers with a fixed text, namely 'Paid use, but free for customers of the hotel/pub/hospital/… who operates the charging station' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations')", "value": "yes" }, { "key": "fee:conditional", - "description": "Layer 'Charging stations' shows fee=yes&fee:conditional=no @ customers with a fixed text, namely 'Paid use, but free for customers of the hotel/pub/hospital/… who operates the charging station' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations')", + "description": "Layer 'Charging stations' shows fee=yes &fee:conditional=no @ customers with a fixed text, namely 'Paid use, but free for customers of the hotel/pub/hospital/… who operates the charging station' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations')", "value": "no @ customers" }, { @@ -968,80 +968,80 @@ }, { "key": "payment:cash", - "description": "Layer 'Charging stations' shows payment:cash=yes with a fixed text, namely 'Cash is accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if fee=yes|charge~.+)", + "description": "Layer 'Charging stations' shows payment:cash=yes with a fixed text, namely 'Cash is accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if fee=yes |charge~.+)", "value": "yes" }, { "key": "payment:cards", - "description": "Layer 'Charging stations' shows payment:cards=yes with a fixed text, namely 'Payment cards are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if fee=yes|charge~.+)", + "description": "Layer 'Charging stations' shows payment:cards=yes with a fixed text, namely 'Payment cards are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if fee=yes |charge~.+)", "value": "yes" }, { "key": "payment:qr_code", - "description": "Layer 'Charging stations' shows payment:qr_code=yes with a fixed text, namely 'Payment by QR-code is possible here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if fee=yes|charge~.+)", + "description": "Layer 'Charging stations' shows payment:qr_code=yes with a fixed text, namely 'Payment by QR-code is possible here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if fee=yes |charge~.+)", "value": "yes" }, { "key": "payment:app", - "description": "Layer 'Charging stations' shows payment:app=yes with a fixed text, namely 'Payment is done using a dedicated app' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if fee=yes|charge~.+)", + "description": "Layer 'Charging stations' shows payment:app=yes with a fixed text, namely 'Payment is done using a dedicated app' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if fee=yes |charge~.+)", "value": "yes" }, { "key": "payment:membership_card", - "description": "Layer 'Charging stations' shows payment:membership_card=yes with a fixed text, namely 'Payment is done using a membership card' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if fee=yes|charge~.+)", + "description": "Layer 'Charging stations' shows payment:membership_card=yes with a fixed text, namely 'Payment is done using a membership card' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if fee=yes |charge~.+)", "value": "yes" }, { "key": "authentication:membership_card", - "description": "Layer 'Charging stations' shows authentication:membership_card=yes with a fixed text, namely 'Authentication by a membership card' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if fee=no|)", + "description": "Layer 'Charging stations' shows authentication:membership_card=yes with a fixed text, namely 'Authentication by a membership card' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if fee=no |)", "value": "yes" }, { "key": "authentication:app", - "description": "Layer 'Charging stations' shows authentication:app=yes with a fixed text, namely 'Authentication by an app' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if fee=no|)", + "description": "Layer 'Charging stations' shows authentication:app=yes with a fixed text, namely 'Authentication by an app' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if fee=no |)", "value": "yes" }, { "key": "authentication:phone_call", - "description": "Layer 'Charging stations' shows authentication:phone_call=yes with a fixed text, namely 'Authentication via phone call is available' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if fee=no|)", + "description": "Layer 'Charging stations' shows authentication:phone_call=yes with a fixed text, namely 'Authentication via phone call is available' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if fee=no |)", "value": "yes" }, { "key": "authentication:short_message", - "description": "Layer 'Charging stations' shows authentication:short_message=yes with a fixed text, namely 'Authentication via SMS is available' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if fee=no|)", + "description": "Layer 'Charging stations' shows authentication:short_message=yes with a fixed text, namely 'Authentication via SMS is available' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if fee=no |)", "value": "yes" }, { "key": "authentication:nfc", - "description": "Layer 'Charging stations' shows authentication:nfc=yes with a fixed text, namely 'Authentication via NFC is available' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if fee=no|)", + "description": "Layer 'Charging stations' shows authentication:nfc=yes with a fixed text, namely 'Authentication via NFC is available' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if fee=no |)", "value": "yes" }, { "key": "authentication:money_card", - "description": "Layer 'Charging stations' shows authentication:money_card=yes with a fixed text, namely 'Authentication via Money Card is available' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if fee=no|)", + "description": "Layer 'Charging stations' shows authentication:money_card=yes with a fixed text, namely 'Authentication via Money Card is available' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if fee=no |)", "value": "yes" }, { "key": "authentication:debit_card", - "description": "Layer 'Charging stations' shows authentication:debit_card=yes with a fixed text, namely 'Authentication via debit card is available' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if fee=no|)", + "description": "Layer 'Charging stations' shows authentication:debit_card=yes with a fixed text, namely 'Authentication via debit card is available' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if fee=no |)", "value": "yes" }, { "key": "authentication:none", - "description": "Layer 'Charging stations' shows authentication:none=yes with a fixed text, namely 'Charging here is (also) possible without authentication' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if fee=no|)", + "description": "Layer 'Charging stations' shows authentication:none=yes with a fixed text, namely 'Charging here is (also) possible without authentication' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if fee=no |)", "value": "yes" }, { "key": "authentication:phone_call:number", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'authentication:phone_call:number' (in the mapcomplete.org theme 'Charging stations') (This is only shown if authentication:phone_call=yes|authentication:short_message=yes)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'authentication:phone_call:number' (in the mapcomplete.org theme 'Charging stations') (This is only shown if authentication:phone_call=yes |authentication:short_message=yes)" }, { "key": "maxstay", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'maxstay' (in the mapcomplete.org theme 'Charging stations') (This is only shown if maxstay~.+|motorcar=yes|hgv=yes|bus=yes)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'maxstay' (in the mapcomplete.org theme 'Charging stations') (This is only shown if maxstay~.+ |motorcar=yes |hgv=yes |bus=yes)" }, { "key": "maxstay", - "description": "Layer 'Charging stations' shows maxstay=unlimited with a fixed text, namely 'No timelimit on leaving your vehicle here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if maxstay~.+|motorcar=yes|hgv=yes|bus=yes)", + "description": "Layer 'Charging stations' shows maxstay=unlimited with a fixed text, namely 'No timelimit on leaving your vehicle here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if maxstay~.+ |motorcar=yes |hgv=yes |bus=yes)", "value": "unlimited" }, { @@ -1169,27 +1169,27 @@ }, { "key": "planned:amenity", - "description": "Layer 'Charging stations' shows operational_status=broken&amenity=charging_station with a fixed text, namely 'This charging station is broken' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') Picking this answer will delete the key planned:amenity.", + "description": "Layer 'Charging stations' shows operational_status=broken &amenity=charging_station with a fixed text, namely 'This charging station is broken' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') Picking this answer will delete the key planned:amenity.", "value": "" }, { "key": "construction:amenity", - "description": "Layer 'Charging stations' shows operational_status=broken&amenity=charging_station with a fixed text, namely 'This charging station is broken' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') Picking this answer will delete the key construction:amenity.", + "description": "Layer 'Charging stations' shows operational_status=broken &amenity=charging_station with a fixed text, namely 'This charging station is broken' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') Picking this answer will delete the key construction:amenity.", "value": "" }, { "key": "disused:amenity", - "description": "Layer 'Charging stations' shows operational_status=broken&amenity=charging_station with a fixed text, namely 'This charging station is broken' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') Picking this answer will delete the key disused:amenity.", + "description": "Layer 'Charging stations' shows operational_status=broken &amenity=charging_station with a fixed text, namely 'This charging station is broken' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') Picking this answer will delete the key disused:amenity.", "value": "" }, { "key": "operational_status", - "description": "Layer 'Charging stations' shows operational_status=broken&amenity=charging_station with a fixed text, namely 'This charging station is broken' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations')", + "description": "Layer 'Charging stations' shows operational_status=broken &amenity=charging_station with a fixed text, namely 'This charging station is broken' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations')", "value": "broken" }, { "key": "amenity", - "description": "Layer 'Charging stations' shows operational_status=broken&amenity=charging_station with a fixed text, namely 'This charging station is broken' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations')", + "description": "Layer 'Charging stations' shows operational_status=broken &amenity=charging_station with a fixed text, namely 'This charging station is broken' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations')", "value": "charging_station" }, { @@ -1269,12 +1269,12 @@ }, { "key": "parking:fee", - "description": "Layer 'Charging stations' shows parking:fee=no with a fixed text, namely 'No additional parking cost while charging' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if motor_vehicle=yes|hgv=yes|bus=yes|bicycle=no|)", + "description": "Layer 'Charging stations' shows parking:fee=no with a fixed text, namely 'No additional parking cost while charging' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if motor_vehicle=yes |hgv=yes |bus=yes |bicycle=no |)", "value": "no" }, { "key": "parking:fee", - "description": "Layer 'Charging stations' shows parking:fee=yes with a fixed text, namely 'An additional parking fee should be paid while charging' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if motor_vehicle=yes|hgv=yes|bus=yes|bicycle=no|)", + "description": "Layer 'Charging stations' shows parking:fee=yes with a fixed text, namely 'An additional parking fee should be paid while charging' and allows to pick this as a default answer (in the mapcomplete.org theme 'Charging stations') (This is only shown if motor_vehicle=yes |hgv=yes |bus=yes |bicycle=no |)", "value": "yes" } ] diff --git a/Docs/TagInfo/mapcomplete_climbing.json b/Docs/TagInfo/mapcomplete_climbing.json index 997838666..f1656434c 100644 --- a/Docs/TagInfo/mapcomplete_climbing.json +++ b/Docs/TagInfo/mapcomplete_climbing.json @@ -30,7 +30,7 @@ }, { "key": "id", - "description": "Layer 'Climbing club' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Climbing club' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "name", @@ -66,27 +66,27 @@ }, { "key": "access", - "description": "Layer 'Climbing club' shows access=yes with a fixed text, namely 'Publicly accessible to anyone' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if access~.+|)", + "description": "Layer 'Climbing club' shows access=yes with a fixed text, namely 'Publicly accessible to anyone' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if access~.+ |)", "value": "yes" }, { "key": "access", - "description": "Layer 'Climbing club' shows access=permit with a fixed text, namely 'You need a permit to access here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if access~.+|)", + "description": "Layer 'Climbing club' shows access=permit with a fixed text, namely 'You need a permit to access here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if access~.+ |)", "value": "permit" }, { "key": "access", - "description": "Layer 'Climbing club' shows access=customers with a fixed text, namely 'Only customers' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if access~.+|)", + "description": "Layer 'Climbing club' shows access=customers with a fixed text, namely 'Only customers' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if access~.+ |)", "value": "customers" }, { "key": "access", - "description": "Layer 'Climbing club' shows access=members with a fixed text, namely 'Only club members' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if access~.+|)", + "description": "Layer 'Climbing club' shows access=members with a fixed text, namely 'Only club members' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if access~.+ |)", "value": "members" }, { "key": "access", - "description": "Layer 'Climbing club' shows access=no with a fixed text, namely 'Not accessible' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if access~.+|)", + "description": "Layer 'Climbing club' shows access=no with a fixed text, namely 'Not accessible' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if access~.+ |)", "value": "no" }, { @@ -105,7 +105,7 @@ }, { "key": "id", - "description": "Layer 'Climbing gyms' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Climbing gyms' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -191,31 +191,31 @@ }, { "key": "service:climbing_shoes:rental", - "description": "Layer 'Climbing gyms' shows service:climbing_shoes:rental=yes&service:climbing_shoes:rental:fee=no with a fixed text, namely 'Climbing shoes can be borrowed for free here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", + "description": "Layer 'Climbing gyms' shows service:climbing_shoes:rental=yes &service:climbing_shoes:rental:fee=no with a fixed text, namely 'Climbing shoes can be borrowed for free here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", "value": "yes" }, { "key": "service:climbing_shoes:rental:fee", - "description": "Layer 'Climbing gyms' shows service:climbing_shoes:rental=yes&service:climbing_shoes:rental:fee=no with a fixed text, namely 'Climbing shoes can be borrowed for free here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", + "description": "Layer 'Climbing gyms' shows service:climbing_shoes:rental=yes &service:climbing_shoes:rental:fee=no with a fixed text, namely 'Climbing shoes can be borrowed for free here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", "value": "no" }, { "key": "service:climbing_shoes:rental", - "description": "Layer 'Climbing gyms' shows service:climbing_shoes:rental=yes&service:climbing_shoes:rental:charge~.+ with a fixed text, namely 'Climbing shoes can be rented here for {service:climbing_shoes:rental:charge}' (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", + "description": "Layer 'Climbing gyms' shows service:climbing_shoes:rental=yes &service:climbing_shoes:rental:charge~.+ with a fixed text, namely 'Climbing shoes can be rented here for {service:climbing_shoes:rental:charge}' (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", "value": "yes" }, { "key": "service:climbing_shoes:rental:charge", - "description": "Layer 'Climbing gyms' shows service:climbing_shoes:rental=yes&service:climbing_shoes:rental:charge~.+ with a fixed text, namely 'Climbing shoes can be rented here for {service:climbing_shoes:rental:charge}' (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')" + "description": "Layer 'Climbing gyms' shows service:climbing_shoes:rental=yes &service:climbing_shoes:rental:charge~.+ with a fixed text, namely 'Climbing shoes can be rented here for {service:climbing_shoes:rental:charge}' (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')" }, { "key": "service:climbing_shoes:rental", - "description": "Layer 'Climbing gyms' shows service:climbing_shoes:rental=yes&service:climbing_shoes:rental:fee=yes with a fixed text, namely 'Climbing shoes can be rented here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", + "description": "Layer 'Climbing gyms' shows service:climbing_shoes:rental=yes &service:climbing_shoes:rental:fee=yes with a fixed text, namely 'Climbing shoes can be rented here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", "value": "yes" }, { "key": "service:climbing_shoes:rental:fee", - "description": "Layer 'Climbing gyms' shows service:climbing_shoes:rental=yes&service:climbing_shoes:rental:fee=yes with a fixed text, namely 'Climbing shoes can be rented here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", + "description": "Layer 'Climbing gyms' shows service:climbing_shoes:rental=yes &service:climbing_shoes:rental:fee=yes with a fixed text, namely 'Climbing shoes can be rented here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", "value": "yes" }, { @@ -225,85 +225,85 @@ }, { "key": "service:climbing_harness:rental", - "description": "Layer 'Climbing gyms' shows service:climbing_harness:rental=yes&service:climbing_harness:rental:fee=no with a fixed text, namely 'A climbing harness can be borrowed for free here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if climbing:sport!=no|climbing:toprope!=no)", + "description": "Layer 'Climbing gyms' shows service:climbing_harness:rental=yes &service:climbing_harness:rental:fee=no with a fixed text, namely 'A climbing harness can be borrowed for free here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if climbing:sport!=no |climbing:toprope!=no)", "value": "yes" }, { "key": "service:climbing_harness:rental:fee", - "description": "Layer 'Climbing gyms' shows service:climbing_harness:rental=yes&service:climbing_harness:rental:fee=no with a fixed text, namely 'A climbing harness can be borrowed for free here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if climbing:sport!=no|climbing:toprope!=no)", + "description": "Layer 'Climbing gyms' shows service:climbing_harness:rental=yes &service:climbing_harness:rental:fee=no with a fixed text, namely 'A climbing harness can be borrowed for free here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if climbing:sport!=no |climbing:toprope!=no)", "value": "no" }, { "key": "service:climbing_harness:rental", - "description": "Layer 'Climbing gyms' shows service:climbing_harness:rental=yes&service:climbing_harness:rental:charge~.+ with a fixed text, namely 'A climbing harness can be rented here for {service:climbing_harness:rental:charge}' (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if climbing:sport!=no|climbing:toprope!=no)", + "description": "Layer 'Climbing gyms' shows service:climbing_harness:rental=yes &service:climbing_harness:rental:charge~.+ with a fixed text, namely 'A climbing harness can be rented here for {service:climbing_harness:rental:charge}' (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if climbing:sport!=no |climbing:toprope!=no)", "value": "yes" }, { "key": "service:climbing_harness:rental:charge", - "description": "Layer 'Climbing gyms' shows service:climbing_harness:rental=yes&service:climbing_harness:rental:charge~.+ with a fixed text, namely 'A climbing harness can be rented here for {service:climbing_harness:rental:charge}' (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if climbing:sport!=no|climbing:toprope!=no)" + "description": "Layer 'Climbing gyms' shows service:climbing_harness:rental=yes &service:climbing_harness:rental:charge~.+ with a fixed text, namely 'A climbing harness can be rented here for {service:climbing_harness:rental:charge}' (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if climbing:sport!=no |climbing:toprope!=no)" }, { "key": "service:climbing_harness:rental", - "description": "Layer 'Climbing gyms' shows service:climbing_harness:rental=yes with a fixed text, namely 'A climbing harness can be rented here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if climbing:sport!=no|climbing:toprope!=no)", + "description": "Layer 'Climbing gyms' shows service:climbing_harness:rental=yes with a fixed text, namely 'A climbing harness can be rented here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if climbing:sport!=no |climbing:toprope!=no)", "value": "yes" }, { "key": "service:climbing_harness:rental", - "description": "Layer 'Climbing gyms' shows service:climbing_harness:rental=no with a fixed text, namely 'A climbing harness can not be rented here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if climbing:sport!=no|climbing:toprope!=no)", + "description": "Layer 'Climbing gyms' shows service:climbing_harness:rental=no with a fixed text, namely 'A climbing harness can not be rented here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if climbing:sport!=no |climbing:toprope!=no)", "value": "no" }, { "key": "service:climbing_belay_device:provided_at_each_rope", - "description": "Layer 'Climbing gyms' shows service:climbing_belay_device:provided_at_each_rope=yes with a fixed text, namely 'Belay devices are provided at each rope' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if climbing:sport!=no|climbing:toprope!=no)", + "description": "Layer 'Climbing gyms' shows service:climbing_belay_device:provided_at_each_rope=yes with a fixed text, namely 'Belay devices are provided at each rope' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if climbing:sport!=no |climbing:toprope!=no)", "value": "yes" }, { "key": "service:climbing_belay_device:rental", - "description": "Layer 'Climbing gyms' shows service:climbing_belay_device:rental=yes&service:climbing_belay_device:rental:fee=no with a fixed text, namely 'A belay device can be borrowed for free here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if climbing:sport!=no|climbing:toprope!=no)", + "description": "Layer 'Climbing gyms' shows service:climbing_belay_device:rental=yes &service:climbing_belay_device:rental:fee=no with a fixed text, namely 'A belay device can be borrowed for free here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if climbing:sport!=no |climbing:toprope!=no)", "value": "yes" }, { "key": "service:climbing_belay_device:rental:fee", - "description": "Layer 'Climbing gyms' shows service:climbing_belay_device:rental=yes&service:climbing_belay_device:rental:fee=no with a fixed text, namely 'A belay device can be borrowed for free here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if climbing:sport!=no|climbing:toprope!=no)", + "description": "Layer 'Climbing gyms' shows service:climbing_belay_device:rental=yes &service:climbing_belay_device:rental:fee=no with a fixed text, namely 'A belay device can be borrowed for free here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if climbing:sport!=no |climbing:toprope!=no)", "value": "no" }, { "key": "service:climbing_belay_device:rental", - "description": "Layer 'Climbing gyms' shows service:climbing_belay_device:rental=yes&service:climbing_belay_device:rental:charge~.+ with a fixed text, namely 'A belay device can be rented here for {service:climbing_belay_device:rental:charge}' (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if climbing:sport!=no|climbing:toprope!=no)", + "description": "Layer 'Climbing gyms' shows service:climbing_belay_device:rental=yes &service:climbing_belay_device:rental:charge~.+ with a fixed text, namely 'A belay device can be rented here for {service:climbing_belay_device:rental:charge}' (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if climbing:sport!=no |climbing:toprope!=no)", "value": "yes" }, { "key": "service:climbing_belay_device:rental:charge", - "description": "Layer 'Climbing gyms' shows service:climbing_belay_device:rental=yes&service:climbing_belay_device:rental:charge~.+ with a fixed text, namely 'A belay device can be rented here for {service:climbing_belay_device:rental:charge}' (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if climbing:sport!=no|climbing:toprope!=no)" + "description": "Layer 'Climbing gyms' shows service:climbing_belay_device:rental=yes &service:climbing_belay_device:rental:charge~.+ with a fixed text, namely 'A belay device can be rented here for {service:climbing_belay_device:rental:charge}' (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if climbing:sport!=no |climbing:toprope!=no)" }, { "key": "service:climbing_belay_device:rental", - "description": "Layer 'Climbing gyms' shows service:climbing_belay_device:rental=yes with a fixed text, namely 'A belay device can be rented here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if climbing:sport!=no|climbing:toprope!=no)", + "description": "Layer 'Climbing gyms' shows service:climbing_belay_device:rental=yes with a fixed text, namely 'A belay device can be rented here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if climbing:sport!=no |climbing:toprope!=no)", "value": "yes" }, { "key": "service:climbing_belay_device:rental", - "description": "Layer 'Climbing gyms' shows service:climbing_belay_device:rental=no with a fixed text, namely 'A belay device can not be rented here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if climbing:sport!=no|climbing:toprope!=no)", + "description": "Layer 'Climbing gyms' shows service:climbing_belay_device:rental=no with a fixed text, namely 'A belay device can not be rented here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if climbing:sport!=no |climbing:toprope!=no)", "value": "no" }, { "key": "service:climbing_rope:rental", - "description": "Layer 'Climbing gyms' shows service:climbing_rope:rental=yes&service:climbing_rope:rental:fee=no with a fixed text, namely 'A climbing rope can be borrowed for free here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if climbing:sport!=no)", + "description": "Layer 'Climbing gyms' shows service:climbing_rope:rental=yes &service:climbing_rope:rental:fee=no with a fixed text, namely 'A climbing rope can be borrowed for free here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if climbing:sport!=no)", "value": "yes" }, { "key": "service:climbing_rope:rental:fee", - "description": "Layer 'Climbing gyms' shows service:climbing_rope:rental=yes&service:climbing_rope:rental:fee=no with a fixed text, namely 'A climbing rope can be borrowed for free here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if climbing:sport!=no)", + "description": "Layer 'Climbing gyms' shows service:climbing_rope:rental=yes &service:climbing_rope:rental:fee=no with a fixed text, namely 'A climbing rope can be borrowed for free here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if climbing:sport!=no)", "value": "no" }, { "key": "service:climbing_rope:rental", - "description": "Layer 'Climbing gyms' shows service:climbing_rope:rental=yes&service:climbing_rope:rental:charge~.+ with a fixed text, namely 'A climbing rope can be rented here for {service:climbing_rope:rental:charge}' (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if climbing:sport!=no)", + "description": "Layer 'Climbing gyms' shows service:climbing_rope:rental=yes &service:climbing_rope:rental:charge~.+ with a fixed text, namely 'A climbing rope can be rented here for {service:climbing_rope:rental:charge}' (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if climbing:sport!=no)", "value": "yes" }, { "key": "service:climbing_rope:rental:charge", - "description": "Layer 'Climbing gyms' shows service:climbing_rope:rental=yes&service:climbing_rope:rental:charge~.+ with a fixed text, namely 'A climbing rope can be rented here for {service:climbing_rope:rental:charge}' (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if climbing:sport!=no)" + "description": "Layer 'Climbing gyms' shows service:climbing_rope:rental=yes &service:climbing_rope:rental:charge~.+ with a fixed text, namely 'A climbing rope can be rented here for {service:climbing_rope:rental:charge}' (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if climbing:sport!=no)" }, { "key": "service:climbing_rope:rental", @@ -364,7 +364,7 @@ }, { "key": "climbing:length", - "description": "Layer 'Climbing gyms' shows and asks freeform values for key 'climbing:length' (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if climbing:sport!=no|climbing:toprope!=no)" + "description": "Layer 'Climbing gyms' shows and asks freeform values for key 'climbing:length' (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if climbing:sport!=no |climbing:toprope!=no)" }, { "key": "climbing:grade:french:min", @@ -372,7 +372,7 @@ }, { "key": "climbing:grade:french:max", - "description": "Layer 'Climbing gyms' shows and asks freeform values for key 'climbing:grade:french:max' (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if climbing!~^(route)$&climbing:sport=yes|sport=climbing)" + "description": "Layer 'Climbing gyms' shows and asks freeform values for key 'climbing:grade:french:max' (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if climbing!~^(route)$ &climbing:sport=yes |sport=climbing)" }, { "key": "climbing:bolts:max", @@ -419,17 +419,17 @@ }, { "key": "internet_access:fee", - "description": "Layer 'Climbing gyms' shows internet_access:fee=yes with a fixed text, namely 'There is a fee for the internet access at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if internet_access!=no&internet_access~.+)", + "description": "Layer 'Climbing gyms' shows internet_access:fee=yes with a fixed text, namely 'There is a fee for the internet access at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if internet_access!=no &internet_access~.+)", "value": "yes" }, { "key": "internet_access:fee", - "description": "Layer 'Climbing gyms' shows internet_access:fee=no with a fixed text, namely 'Internet access is free at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if internet_access!=no&internet_access~.+)", + "description": "Layer 'Climbing gyms' shows internet_access:fee=no with a fixed text, namely 'Internet access is free at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if internet_access!=no &internet_access~.+)", "value": "no" }, { "key": "internet_access:fee", - "description": "Layer 'Climbing gyms' shows internet_access:fee=customers with a fixed text, namely 'Internet access is free at this place, for customers only' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if internet_access!=no&internet_access~.+)", + "description": "Layer 'Climbing gyms' shows internet_access:fee=customers with a fixed text, namely 'Internet access is free at this place, for customers only' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if internet_access!=no &internet_access~.+)", "value": "customers" }, { @@ -443,27 +443,27 @@ }, { "key": "access", - "description": "Layer 'Climbing gyms' shows access=yes with a fixed text, namely 'Publicly accessible to anyone' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if access~.+|)", + "description": "Layer 'Climbing gyms' shows access=yes with a fixed text, namely 'Publicly accessible to anyone' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if access~.+ |)", "value": "yes" }, { "key": "access", - "description": "Layer 'Climbing gyms' shows access=permit with a fixed text, namely 'You need a permit to access here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if access~.+|)", + "description": "Layer 'Climbing gyms' shows access=permit with a fixed text, namely 'You need a permit to access here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if access~.+ |)", "value": "permit" }, { "key": "access", - "description": "Layer 'Climbing gyms' shows access=customers with a fixed text, namely 'Only customers' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if access~.+|)", + "description": "Layer 'Climbing gyms' shows access=customers with a fixed text, namely 'Only customers' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if access~.+ |)", "value": "customers" }, { "key": "access", - "description": "Layer 'Climbing gyms' shows access=members with a fixed text, namely 'Only club members' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if access~.+|)", + "description": "Layer 'Climbing gyms' shows access=members with a fixed text, namely 'Only club members' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if access~.+ |)", "value": "members" }, { "key": "access", - "description": "Layer 'Climbing gyms' shows access=no with a fixed text, namely 'Not accessible' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if access~.+|)", + "description": "Layer 'Climbing gyms' shows access=no with a fixed text, namely 'Not accessible' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if access~.+ |)", "value": "no" }, { @@ -477,7 +477,7 @@ }, { "key": "id", - "description": "Layer 'Climbing routes' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Climbing routes' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -532,27 +532,27 @@ }, { "key": "access", - "description": "Layer 'Climbing routes' shows access=yes with a fixed text, namely 'Publicly accessible to anyone' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if access~.+|)", + "description": "Layer 'Climbing routes' shows access=yes with a fixed text, namely 'Publicly accessible to anyone' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if access~.+ |)", "value": "yes" }, { "key": "access", - "description": "Layer 'Climbing routes' shows access=permit with a fixed text, namely 'You need a permit to access here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if access~.+|)", + "description": "Layer 'Climbing routes' shows access=permit with a fixed text, namely 'You need a permit to access here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if access~.+ |)", "value": "permit" }, { "key": "access", - "description": "Layer 'Climbing routes' shows access=customers with a fixed text, namely 'Only customers' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if access~.+|)", + "description": "Layer 'Climbing routes' shows access=customers with a fixed text, namely 'Only customers' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if access~.+ |)", "value": "customers" }, { "key": "access", - "description": "Layer 'Climbing routes' shows access=members with a fixed text, namely 'Only club members' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if access~.+|)", + "description": "Layer 'Climbing routes' shows access=members with a fixed text, namely 'Only club members' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if access~.+ |)", "value": "members" }, { "key": "access", - "description": "Layer 'Climbing routes' shows access=no with a fixed text, namely 'Not accessible' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if access~.+|)", + "description": "Layer 'Climbing routes' shows access=no with a fixed text, namely 'Not accessible' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if access~.+ |)", "value": "no" }, { @@ -566,7 +566,7 @@ }, { "key": "id", - "description": "Layer 'Climbing opportunities' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Climbing opportunities' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -615,16 +615,16 @@ }, { "key": "rock", - "description": "Layer 'Climbing opportunities' shows and asks freeform values for key 'rock' (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if climbing=crag|natural=cliff|natural=bare_rock)" + "description": "Layer 'Climbing opportunities' shows and asks freeform values for key 'rock' (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if climbing=crag |natural=cliff |natural=bare_rock)" }, { "key": "rock", - "description": "Layer 'Climbing opportunities' shows rock=limestone with a fixed text, namely 'Limestone' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if climbing=crag|natural=cliff|natural=bare_rock)", + "description": "Layer 'Climbing opportunities' shows rock=limestone with a fixed text, namely 'Limestone' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if climbing=crag |natural=cliff |natural=bare_rock)", "value": "limestone" }, { "key": "url", - "description": "Layer 'Climbing opportunities' shows and asks freeform values for key 'url' (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if leisure!~^(sports_centre)$&sport=climbing)" + "description": "Layer 'Climbing opportunities' shows and asks freeform values for key 'url' (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if leisure!~^(sports_centre)$ &sport=climbing)" }, { "key": "charge", @@ -666,27 +666,27 @@ }, { "key": "access", - "description": "Layer 'Climbing opportunities' shows access=yes with a fixed text, namely 'Publicly accessible to anyone' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if access~.+|)", + "description": "Layer 'Climbing opportunities' shows access=yes with a fixed text, namely 'Publicly accessible to anyone' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if access~.+ |)", "value": "yes" }, { "key": "access", - "description": "Layer 'Climbing opportunities' shows access=permit with a fixed text, namely 'You need a permit to access here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if access~.+|)", + "description": "Layer 'Climbing opportunities' shows access=permit with a fixed text, namely 'You need a permit to access here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if access~.+ |)", "value": "permit" }, { "key": "access", - "description": "Layer 'Climbing opportunities' shows access=customers with a fixed text, namely 'Only customers' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if access~.+|)", + "description": "Layer 'Climbing opportunities' shows access=customers with a fixed text, namely 'Only customers' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if access~.+ |)", "value": "customers" }, { "key": "access", - "description": "Layer 'Climbing opportunities' shows access=members with a fixed text, namely 'Only club members' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if access~.+|)", + "description": "Layer 'Climbing opportunities' shows access=members with a fixed text, namely 'Only club members' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if access~.+ |)", "value": "members" }, { "key": "access", - "description": "Layer 'Climbing opportunities' shows access=no with a fixed text, namely 'Not accessible' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if access~.+|)", + "description": "Layer 'Climbing opportunities' shows access=no with a fixed text, namely 'Not accessible' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if access~.+ |)", "value": "no" }, { @@ -730,7 +730,7 @@ }, { "key": "id", - "description": "Layer 'Climbing opportunities?' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Climbing opportunities?' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "sport", @@ -744,27 +744,27 @@ }, { "key": "access", - "description": "Layer 'Climbing opportunities?' shows access=yes with a fixed text, namely 'Publicly accessible to anyone' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if access~.+|)", + "description": "Layer 'Climbing opportunities?' shows access=yes with a fixed text, namely 'Publicly accessible to anyone' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if access~.+ |)", "value": "yes" }, { "key": "access", - "description": "Layer 'Climbing opportunities?' shows access=permit with a fixed text, namely 'You need a permit to access here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if access~.+|)", + "description": "Layer 'Climbing opportunities?' shows access=permit with a fixed text, namely 'You need a permit to access here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if access~.+ |)", "value": "permit" }, { "key": "access", - "description": "Layer 'Climbing opportunities?' shows access=customers with a fixed text, namely 'Only customers' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if access~.+|)", + "description": "Layer 'Climbing opportunities?' shows access=customers with a fixed text, namely 'Only customers' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if access~.+ |)", "value": "customers" }, { "key": "access", - "description": "Layer 'Climbing opportunities?' shows access=members with a fixed text, namely 'Only club members' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if access~.+|)", + "description": "Layer 'Climbing opportunities?' shows access=members with a fixed text, namely 'Only club members' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if access~.+ |)", "value": "members" }, { "key": "access", - "description": "Layer 'Climbing opportunities?' shows access=no with a fixed text, namely 'Not accessible' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if access~.+|)", + "description": "Layer 'Climbing opportunities?' shows access=no with a fixed text, namely 'Not accessible' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if access~.+ |)", "value": "no" }, { @@ -798,7 +798,7 @@ }, { "key": "id", - "description": "Layer 'Shop' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Shop' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -824,6 +824,11 @@ "key": "shop", "description": "Layer 'Shop' shows and asks freeform values for key 'shop' (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')" }, + { + "key": "shop", + "description": "Layer 'Shop' shows shop=vacant with a fixed text, namely 'Vacant Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", + "value": "vacant" + }, { "key": "shop", "description": "Layer 'Shop' shows shop=agrarian with a fixed text, namely 'Farm Supply Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", @@ -841,7 +846,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=antiques with a fixed text, namely 'Antiques Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", + "description": "Layer 'Shop' shows shop=antiques with a fixed text, namely 'Antique Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", "value": "antiques" }, { @@ -906,7 +911,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=books with a fixed text, namely 'Book Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", + "description": "Layer 'Shop' shows shop=books with a fixed text, namely 'Bookstore' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", "value": "books" }, { @@ -1026,7 +1031,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=country_store with a fixed text, namely 'Country Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", + "description": "Layer 'Shop' shows shop=country_store with a fixed text, namely 'Rural Supplies Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", "value": "country_store" }, { @@ -1046,7 +1051,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=deli with a fixed text, namely 'Deli' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", + "description": "Layer 'Shop' shows shop=deli with a fixed text, namely 'Delicatessen' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", "value": "deli" }, { @@ -1196,7 +1201,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=health_food with a fixed text, namely 'Health Food Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", + "description": "Layer 'Shop' shows shop=health_food with a fixed text, namely 'Health Food Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", "value": "health_food" }, { @@ -1216,8 +1221,8 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=hobby with a fixed text, namely 'Hobby Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", - "value": "hobby" + "description": "Layer 'Shop' shows shop=honey with a fixed text, namely 'Honey Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", + "value": "honey" }, { "key": "shop", @@ -1336,7 +1341,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=newsagent with a fixed text, namely 'Newspaper/Magazine Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", + "description": "Layer 'Shop' shows shop=newsagent with a fixed text, namely 'Newsstand' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", "value": "newsagent" }, { @@ -1344,6 +1349,11 @@ "description": "Layer 'Shop' shows shop=nutrition_supplements with a fixed text, namely 'Nutrition Supplements Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", "value": "nutrition_supplements" }, + { + "key": "shop", + "description": "Layer 'Shop' shows shop=nuts with a fixed text, namely 'Nuts Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", + "value": "nuts" + }, { "key": "shop", "description": "Layer 'Shop' shows shop=optician with a fixed text, namely 'Optician' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", @@ -1369,6 +1379,11 @@ "description": "Layer 'Shop' shows shop=party with a fixed text, namely 'Party Supply Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", "value": "party" }, + { + "key": "shop", + "description": "Layer 'Shop' shows shop=pasta with a fixed text, namely 'Pasta Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", + "value": "pasta" + }, { "key": "shop", "description": "Layer 'Shop' shows shop=pastry with a fixed text, namely 'Pastry Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", @@ -1376,7 +1391,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=pawnbroker with a fixed text, namely 'Pawn Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", + "description": "Layer 'Shop' shows shop=pawnbroker with a fixed text, namely 'Pawnshop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", "value": "pawnbroker" }, { @@ -1391,7 +1406,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=pet_grooming with a fixed text, namely 'Pet Grooming Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", + "description": "Layer 'Shop' shows shop=pet_grooming with a fixed text, namely 'Pet Groomer' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", "value": "pet_grooming" }, { @@ -1439,6 +1454,11 @@ "description": "Layer 'Shop' shows shop=repair with a fixed text, namely 'Repair Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", "value": "repair" }, + { + "key": "shop", + "description": "Layer 'Shop' shows shop=rice with a fixed text, namely 'Rice Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", + "value": "rice" + }, { "key": "shop", "description": "Layer 'Shop' shows shop=scuba_diving with a fixed text, namely 'Scuba Diving Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", @@ -1451,7 +1471,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=second_hand with a fixed text, namely 'Consignment/Thrift Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", + "description": "Layer 'Shop' shows shop=second_hand with a fixed text, namely 'Thrift Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", "value": "second_hand" }, { @@ -1571,7 +1591,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=variety_store with a fixed text, namely 'Variety Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", + "description": "Layer 'Shop' shows shop=variety_store with a fixed text, namely 'Discount Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", "value": "variety_store" }, { @@ -1626,17 +1646,17 @@ }, { "key": "second_hand", - "description": "Layer 'Shop' shows second_hand=only with a fixed text, namely 'This shop sells second-hand items only' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=clothes|shop=car|shop=books|shop=charity|shop=car_repair|shop=furniture|shop=bicycle|shop=bicycle|shop=mobile_phone|shop=computer|shop=toys)", + "description": "Layer 'Shop' shows second_hand=only with a fixed text, namely 'This shop sells second-hand items only' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=clothes |shop=car |shop=books |shop=charity |shop=car_repair |shop=furniture |shop=bicycle |shop=bicycle |shop=mobile_phone |shop=computer |shop=toys)", "value": "only" }, { "key": "second_hand", - "description": "Layer 'Shop' shows second_hand=yes with a fixed text, namely 'This shop sells second-hand items along with new items' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=clothes|shop=car|shop=books|shop=charity|shop=car_repair|shop=furniture|shop=bicycle|shop=bicycle|shop=mobile_phone|shop=computer|shop=toys)", + "description": "Layer 'Shop' shows second_hand=yes with a fixed text, namely 'This shop sells second-hand items along with new items' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=clothes |shop=car |shop=books |shop=charity |shop=car_repair |shop=furniture |shop=bicycle |shop=bicycle |shop=mobile_phone |shop=computer |shop=toys)", "value": "yes" }, { "key": "second_hand", - "description": "Layer 'Shop' shows second_hand=no with a fixed text, namely 'This shop only sells brand-new items' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=clothes|shop=car|shop=books|shop=charity|shop=car_repair|shop=furniture|shop=bicycle|shop=bicycle|shop=mobile_phone|shop=computer|shop=toys)", + "description": "Layer 'Shop' shows second_hand=no with a fixed text, namely 'This shop only sells brand-new items' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=clothes |shop=car |shop=books |shop=charity |shop=car_repair |shop=furniture |shop=bicycle |shop=bicycle |shop=mobile_phone |shop=computer |shop=toys)", "value": "no" }, { @@ -1713,29 +1733,49 @@ }, { "key": "service:print:A4", - "description": "Layer 'Shop' shows service:print:A4=yes with a fixed text, namely 'This shop can print on papers of size A4' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop~^(.*copyshop.*)$|shop~^(.*stationery.*)$|service:print=yes)", + "description": "Layer 'Shop' shows service:print:A4=yes with a fixed text, namely 'This shop can print on papers of size A4' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop~^(.*copyshop.*)$ |shop~^(.*stationery.*)$ |service:print=yes)", "value": "yes" }, { "key": "service:print:A3", - "description": "Layer 'Shop' shows service:print:A3=yes with a fixed text, namely 'This shop can print on papers of size A3' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop~^(.*copyshop.*)$|shop~^(.*stationery.*)$|service:print=yes)", + "description": "Layer 'Shop' shows service:print:A3=yes with a fixed text, namely 'This shop can print on papers of size A3' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop~^(.*copyshop.*)$ |shop~^(.*stationery.*)$ |service:print=yes)", "value": "yes" }, { "key": "service:print:A2", - "description": "Layer 'Shop' shows service:print:A2=yes with a fixed text, namely 'This shop can print on papers of size A2' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop~^(.*copyshop.*)$|shop~^(.*stationery.*)$|service:print=yes)", + "description": "Layer 'Shop' shows service:print:A2=yes with a fixed text, namely 'This shop can print on papers of size A2' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop~^(.*copyshop.*)$ |shop~^(.*stationery.*)$ |service:print=yes)", "value": "yes" }, { "key": "service:print:A1", - "description": "Layer 'Shop' shows service:print:A1=yes with a fixed text, namely 'This shop can print on papers of size A1' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop~^(.*copyshop.*)$|shop~^(.*stationery.*)$|service:print=yes)", + "description": "Layer 'Shop' shows service:print:A1=yes with a fixed text, namely 'This shop can print on papers of size A1' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop~^(.*copyshop.*)$ |shop~^(.*stationery.*)$ |service:print=yes)", "value": "yes" }, { "key": "service:print:A0", - "description": "Layer 'Shop' shows service:print:A0=yes with a fixed text, namely 'This shop can print on papers of size A0' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop~^(.*copyshop.*)$|shop~^(.*stationery.*)$|service:print=yes)", + "description": "Layer 'Shop' shows service:print:A0=yes with a fixed text, namely 'This shop can print on papers of size A0' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop~^(.*copyshop.*)$ |shop~^(.*stationery.*)$ |service:print=yes)", "value": "yes" }, + { + "key": "craft", + "description": "Layer 'Shop' shows craft=key_cutter with a fixed text, namely 'This shop is also specialized in key cutting' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=shoe_repair |service:key_cutting~.+ |craft=key_cutting |shop=diy |shop=doityourself |shop=home_improvement |shop=hardware |shop=locksmith |shop=repair)", + "value": "key_cutter" + }, + { + "key": "service:key_cutting", + "description": "Layer 'Shop' shows service:key_cutting=yes with a fixed text, namely 'This shop offers key cutting as a service' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=shoe_repair |service:key_cutting~.+ |craft=key_cutting |shop=diy |shop=doityourself |shop=home_improvement |shop=hardware |shop=locksmith |shop=repair)", + "value": "yes" + }, + { + "key": "craft", + "description": "Layer 'Shop' shows service:key_cutting=no with a fixed text, namely 'This shops does not offer key cutting as a service' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') Picking this answer will delete the key craft. (This is only shown if shop=shoe_repair |service:key_cutting~.+ |craft=key_cutting |shop=diy |shop=doityourself |shop=home_improvement |shop=hardware |shop=locksmith |shop=repair)", + "value": "" + }, + { + "key": "service:key_cutting", + "description": "Layer 'Shop' shows service:key_cutting=no with a fixed text, namely 'This shops does not offer key cutting as a service' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=shoe_repair |service:key_cutting~.+ |craft=key_cutting |shop=diy |shop=doityourself |shop=home_improvement |shop=hardware |shop=locksmith |shop=repair)", + "value": "no" + }, { "key": "internet_access", "description": "Layer 'Shop' shows internet_access=wlan with a fixed text, namely 'This place offers wireless internet access' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", @@ -1763,17 +1803,17 @@ }, { "key": "internet_access:fee", - "description": "Layer 'Shop' shows internet_access:fee=yes with a fixed text, namely 'There is a fee for the internet access at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if internet_access!=no&internet_access~.+)", + "description": "Layer 'Shop' shows internet_access:fee=yes with a fixed text, namely 'There is a fee for the internet access at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if internet_access!=no &internet_access~.+)", "value": "yes" }, { "key": "internet_access:fee", - "description": "Layer 'Shop' shows internet_access:fee=no with a fixed text, namely 'Internet access is free at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if internet_access!=no&internet_access~.+)", + "description": "Layer 'Shop' shows internet_access:fee=no with a fixed text, namely 'Internet access is free at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if internet_access!=no &internet_access~.+)", "value": "no" }, { "key": "internet_access:fee", - "description": "Layer 'Shop' shows internet_access:fee=customers with a fixed text, namely 'Internet access is free at this place, for customers only' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if internet_access!=no&internet_access~.+)", + "description": "Layer 'Shop' shows internet_access:fee=customers with a fixed text, namely 'Internet access is free at this place, for customers only' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if internet_access!=no &internet_access~.+)", "value": "customers" }, { @@ -1787,77 +1827,77 @@ }, { "key": "organic", - "description": "Layer 'Shop' shows organic=yes with a fixed text, namely 'This shop offers organic products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=clothes|shop=shoes|shop=butcher|shop=cosmetics|shop=deli|shop=bakery|shop=alcohol|shop=seafood|shop=beverages|shop=florist)", + "description": "Layer 'Shop' shows organic=yes with a fixed text, namely 'This shop offers organic products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=clothes |shop=shoes |shop=butcher |shop=cosmetics |shop=deli |shop=bakery |shop=alcohol |shop=seafood |shop=beverages |shop=florist)", "value": "yes" }, { "key": "organic", - "description": "Layer 'Shop' shows organic=only with a fixed text, namely 'This shop only offers organic products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=clothes|shop=shoes|shop=butcher|shop=cosmetics|shop=deli|shop=bakery|shop=alcohol|shop=seafood|shop=beverages|shop=florist)", + "description": "Layer 'Shop' shows organic=only with a fixed text, namely 'This shop only offers organic products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=clothes |shop=shoes |shop=butcher |shop=cosmetics |shop=deli |shop=bakery |shop=alcohol |shop=seafood |shop=beverages |shop=florist)", "value": "only" }, { "key": "organic", - "description": "Layer 'Shop' shows organic=no with a fixed text, namely 'This shop does not offer organic products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=clothes|shop=shoes|shop=butcher|shop=cosmetics|shop=deli|shop=bakery|shop=alcohol|shop=seafood|shop=beverages|shop=florist)", + "description": "Layer 'Shop' shows organic=no with a fixed text, namely 'This shop does not offer organic products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=clothes |shop=shoes |shop=butcher |shop=cosmetics |shop=deli |shop=bakery |shop=alcohol |shop=seafood |shop=beverages |shop=florist)", "value": "no" }, { "key": "diet:sugar_free", - "description": "Layer 'Shop' shows diet:sugar_free=only with a fixed text, namely 'This shop only sells sugar free products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:sugar_free=only with a fixed text, namely 'This shop only sells sugar free products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "only" }, { "key": "diet:sugar_free", - "description": "Layer 'Shop' shows diet:sugar_free=yes with a fixed text, namely 'This shop has a big sugar free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:sugar_free=yes with a fixed text, namely 'This shop has a big sugar free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "yes" }, { "key": "diet:sugar_free", - "description": "Layer 'Shop' shows diet:sugar_free=limited with a fixed text, namely 'This shop has a limited sugar free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:sugar_free=limited with a fixed text, namely 'This shop has a limited sugar free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "limited" }, { "key": "diet:sugar_free", - "description": "Layer 'Shop' shows diet:sugar_free=no with a fixed text, namely 'This shop has no sugar free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:sugar_free=no with a fixed text, namely 'This shop has no sugar free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "no" }, { "key": "diet:gluten_free", - "description": "Layer 'Shop' shows diet:gluten_free=only with a fixed text, namely 'This shop only sells gluten free products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:gluten_free=only with a fixed text, namely 'This shop only sells gluten free products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "only" }, { "key": "diet:gluten_free", - "description": "Layer 'Shop' shows diet:gluten_free=yes with a fixed text, namely 'This shop has a big gluten free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:gluten_free=yes with a fixed text, namely 'This shop has a big gluten free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "yes" }, { "key": "diet:gluten_free", - "description": "Layer 'Shop' shows diet:gluten_free=limited with a fixed text, namely 'This shop has a limited gluten free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:gluten_free=limited with a fixed text, namely 'This shop has a limited gluten free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "limited" }, { "key": "diet:gluten_free", - "description": "Layer 'Shop' shows diet:gluten_free=no with a fixed text, namely 'This shop has no gluten free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:gluten_free=no with a fixed text, namely 'This shop has no gluten free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "no" }, { "key": "diet:lactose_free", - "description": "Layer 'Shop' shows diet:lactose_free=only with a fixed text, namely 'Only sells lactose free products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:lactose_free=only with a fixed text, namely 'Only sells lactose free products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "only" }, { "key": "diet:lactose_free", - "description": "Layer 'Shop' shows diet:lactose_free=yes with a fixed text, namely 'Big lactose free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:lactose_free=yes with a fixed text, namely 'Big lactose free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "yes" }, { "key": "diet:lactose_free", - "description": "Layer 'Shop' shows diet:lactose_free=limited with a fixed text, namely 'Limited lactose free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:lactose_free=limited with a fixed text, namely 'Limited lactose free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "limited" }, { "key": "diet:lactose_free", - "description": "Layer 'Shop' shows diet:lactose_free=no with a fixed text, namely 'No lactose free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:lactose_free=no with a fixed text, namely 'No lactose free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "no" }, { @@ -1886,7 +1926,7 @@ }, { "key": "id", - "description": "Layer 'Shop' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Shop' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -1912,6 +1952,11 @@ "key": "shop", "description": "Layer 'Shop' shows and asks freeform values for key 'shop' (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')" }, + { + "key": "shop", + "description": "Layer 'Shop' shows shop=vacant with a fixed text, namely 'Vacant Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", + "value": "vacant" + }, { "key": "shop", "description": "Layer 'Shop' shows shop=agrarian with a fixed text, namely 'Farm Supply Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", @@ -1929,7 +1974,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=antiques with a fixed text, namely 'Antiques Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", + "description": "Layer 'Shop' shows shop=antiques with a fixed text, namely 'Antique Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", "value": "antiques" }, { @@ -1994,7 +2039,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=books with a fixed text, namely 'Book Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", + "description": "Layer 'Shop' shows shop=books with a fixed text, namely 'Bookstore' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", "value": "books" }, { @@ -2114,7 +2159,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=country_store with a fixed text, namely 'Country Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", + "description": "Layer 'Shop' shows shop=country_store with a fixed text, namely 'Rural Supplies Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", "value": "country_store" }, { @@ -2134,7 +2179,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=deli with a fixed text, namely 'Deli' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", + "description": "Layer 'Shop' shows shop=deli with a fixed text, namely 'Delicatessen' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", "value": "deli" }, { @@ -2284,7 +2329,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=health_food with a fixed text, namely 'Health Food Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", + "description": "Layer 'Shop' shows shop=health_food with a fixed text, namely 'Health Food Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", "value": "health_food" }, { @@ -2304,8 +2349,8 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=hobby with a fixed text, namely 'Hobby Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", - "value": "hobby" + "description": "Layer 'Shop' shows shop=honey with a fixed text, namely 'Honey Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", + "value": "honey" }, { "key": "shop", @@ -2424,7 +2469,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=newsagent with a fixed text, namely 'Newspaper/Magazine Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", + "description": "Layer 'Shop' shows shop=newsagent with a fixed text, namely 'Newsstand' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", "value": "newsagent" }, { @@ -2432,6 +2477,11 @@ "description": "Layer 'Shop' shows shop=nutrition_supplements with a fixed text, namely 'Nutrition Supplements Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", "value": "nutrition_supplements" }, + { + "key": "shop", + "description": "Layer 'Shop' shows shop=nuts with a fixed text, namely 'Nuts Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", + "value": "nuts" + }, { "key": "shop", "description": "Layer 'Shop' shows shop=optician with a fixed text, namely 'Optician' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", @@ -2457,6 +2507,11 @@ "description": "Layer 'Shop' shows shop=party with a fixed text, namely 'Party Supply Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", "value": "party" }, + { + "key": "shop", + "description": "Layer 'Shop' shows shop=pasta with a fixed text, namely 'Pasta Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", + "value": "pasta" + }, { "key": "shop", "description": "Layer 'Shop' shows shop=pastry with a fixed text, namely 'Pastry Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", @@ -2464,7 +2519,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=pawnbroker with a fixed text, namely 'Pawn Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", + "description": "Layer 'Shop' shows shop=pawnbroker with a fixed text, namely 'Pawnshop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", "value": "pawnbroker" }, { @@ -2479,7 +2534,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=pet_grooming with a fixed text, namely 'Pet Grooming Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", + "description": "Layer 'Shop' shows shop=pet_grooming with a fixed text, namely 'Pet Groomer' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", "value": "pet_grooming" }, { @@ -2527,6 +2582,11 @@ "description": "Layer 'Shop' shows shop=repair with a fixed text, namely 'Repair Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", "value": "repair" }, + { + "key": "shop", + "description": "Layer 'Shop' shows shop=rice with a fixed text, namely 'Rice Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", + "value": "rice" + }, { "key": "shop", "description": "Layer 'Shop' shows shop=scuba_diving with a fixed text, namely 'Scuba Diving Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", @@ -2539,7 +2599,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=second_hand with a fixed text, namely 'Consignment/Thrift Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", + "description": "Layer 'Shop' shows shop=second_hand with a fixed text, namely 'Thrift Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", "value": "second_hand" }, { @@ -2659,7 +2719,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=variety_store with a fixed text, namely 'Variety Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", + "description": "Layer 'Shop' shows shop=variety_store with a fixed text, namely 'Discount Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", "value": "variety_store" }, { @@ -2714,17 +2774,17 @@ }, { "key": "second_hand", - "description": "Layer 'Shop' shows second_hand=only with a fixed text, namely 'This shop sells second-hand items only' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=clothes|shop=car|shop=books|shop=charity|shop=car_repair|shop=furniture|shop=bicycle|shop=bicycle|shop=mobile_phone|shop=computer|shop=toys)", + "description": "Layer 'Shop' shows second_hand=only with a fixed text, namely 'This shop sells second-hand items only' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=clothes |shop=car |shop=books |shop=charity |shop=car_repair |shop=furniture |shop=bicycle |shop=bicycle |shop=mobile_phone |shop=computer |shop=toys)", "value": "only" }, { "key": "second_hand", - "description": "Layer 'Shop' shows second_hand=yes with a fixed text, namely 'This shop sells second-hand items along with new items' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=clothes|shop=car|shop=books|shop=charity|shop=car_repair|shop=furniture|shop=bicycle|shop=bicycle|shop=mobile_phone|shop=computer|shop=toys)", + "description": "Layer 'Shop' shows second_hand=yes with a fixed text, namely 'This shop sells second-hand items along with new items' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=clothes |shop=car |shop=books |shop=charity |shop=car_repair |shop=furniture |shop=bicycle |shop=bicycle |shop=mobile_phone |shop=computer |shop=toys)", "value": "yes" }, { "key": "second_hand", - "description": "Layer 'Shop' shows second_hand=no with a fixed text, namely 'This shop only sells brand-new items' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=clothes|shop=car|shop=books|shop=charity|shop=car_repair|shop=furniture|shop=bicycle|shop=bicycle|shop=mobile_phone|shop=computer|shop=toys)", + "description": "Layer 'Shop' shows second_hand=no with a fixed text, namely 'This shop only sells brand-new items' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=clothes |shop=car |shop=books |shop=charity |shop=car_repair |shop=furniture |shop=bicycle |shop=bicycle |shop=mobile_phone |shop=computer |shop=toys)", "value": "no" }, { @@ -2801,29 +2861,49 @@ }, { "key": "service:print:A4", - "description": "Layer 'Shop' shows service:print:A4=yes with a fixed text, namely 'This shop can print on papers of size A4' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop~^(.*copyshop.*)$|shop~^(.*stationery.*)$|service:print=yes)", + "description": "Layer 'Shop' shows service:print:A4=yes with a fixed text, namely 'This shop can print on papers of size A4' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop~^(.*copyshop.*)$ |shop~^(.*stationery.*)$ |service:print=yes)", "value": "yes" }, { "key": "service:print:A3", - "description": "Layer 'Shop' shows service:print:A3=yes with a fixed text, namely 'This shop can print on papers of size A3' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop~^(.*copyshop.*)$|shop~^(.*stationery.*)$|service:print=yes)", + "description": "Layer 'Shop' shows service:print:A3=yes with a fixed text, namely 'This shop can print on papers of size A3' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop~^(.*copyshop.*)$ |shop~^(.*stationery.*)$ |service:print=yes)", "value": "yes" }, { "key": "service:print:A2", - "description": "Layer 'Shop' shows service:print:A2=yes with a fixed text, namely 'This shop can print on papers of size A2' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop~^(.*copyshop.*)$|shop~^(.*stationery.*)$|service:print=yes)", + "description": "Layer 'Shop' shows service:print:A2=yes with a fixed text, namely 'This shop can print on papers of size A2' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop~^(.*copyshop.*)$ |shop~^(.*stationery.*)$ |service:print=yes)", "value": "yes" }, { "key": "service:print:A1", - "description": "Layer 'Shop' shows service:print:A1=yes with a fixed text, namely 'This shop can print on papers of size A1' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop~^(.*copyshop.*)$|shop~^(.*stationery.*)$|service:print=yes)", + "description": "Layer 'Shop' shows service:print:A1=yes with a fixed text, namely 'This shop can print on papers of size A1' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop~^(.*copyshop.*)$ |shop~^(.*stationery.*)$ |service:print=yes)", "value": "yes" }, { "key": "service:print:A0", - "description": "Layer 'Shop' shows service:print:A0=yes with a fixed text, namely 'This shop can print on papers of size A0' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop~^(.*copyshop.*)$|shop~^(.*stationery.*)$|service:print=yes)", + "description": "Layer 'Shop' shows service:print:A0=yes with a fixed text, namely 'This shop can print on papers of size A0' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop~^(.*copyshop.*)$ |shop~^(.*stationery.*)$ |service:print=yes)", "value": "yes" }, + { + "key": "craft", + "description": "Layer 'Shop' shows craft=key_cutter with a fixed text, namely 'This shop is also specialized in key cutting' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=shoe_repair |service:key_cutting~.+ |craft=key_cutting |shop=diy |shop=doityourself |shop=home_improvement |shop=hardware |shop=locksmith |shop=repair)", + "value": "key_cutter" + }, + { + "key": "service:key_cutting", + "description": "Layer 'Shop' shows service:key_cutting=yes with a fixed text, namely 'This shop offers key cutting as a service' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=shoe_repair |service:key_cutting~.+ |craft=key_cutting |shop=diy |shop=doityourself |shop=home_improvement |shop=hardware |shop=locksmith |shop=repair)", + "value": "yes" + }, + { + "key": "craft", + "description": "Layer 'Shop' shows service:key_cutting=no with a fixed text, namely 'This shops does not offer key cutting as a service' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') Picking this answer will delete the key craft. (This is only shown if shop=shoe_repair |service:key_cutting~.+ |craft=key_cutting |shop=diy |shop=doityourself |shop=home_improvement |shop=hardware |shop=locksmith |shop=repair)", + "value": "" + }, + { + "key": "service:key_cutting", + "description": "Layer 'Shop' shows service:key_cutting=no with a fixed text, namely 'This shops does not offer key cutting as a service' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=shoe_repair |service:key_cutting~.+ |craft=key_cutting |shop=diy |shop=doityourself |shop=home_improvement |shop=hardware |shop=locksmith |shop=repair)", + "value": "no" + }, { "key": "internet_access", "description": "Layer 'Shop' shows internet_access=wlan with a fixed text, namely 'This place offers wireless internet access' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", @@ -2851,17 +2931,17 @@ }, { "key": "internet_access:fee", - "description": "Layer 'Shop' shows internet_access:fee=yes with a fixed text, namely 'There is a fee for the internet access at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if internet_access!=no&internet_access~.+)", + "description": "Layer 'Shop' shows internet_access:fee=yes with a fixed text, namely 'There is a fee for the internet access at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if internet_access!=no &internet_access~.+)", "value": "yes" }, { "key": "internet_access:fee", - "description": "Layer 'Shop' shows internet_access:fee=no with a fixed text, namely 'Internet access is free at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if internet_access!=no&internet_access~.+)", + "description": "Layer 'Shop' shows internet_access:fee=no with a fixed text, namely 'Internet access is free at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if internet_access!=no &internet_access~.+)", "value": "no" }, { "key": "internet_access:fee", - "description": "Layer 'Shop' shows internet_access:fee=customers with a fixed text, namely 'Internet access is free at this place, for customers only' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if internet_access!=no&internet_access~.+)", + "description": "Layer 'Shop' shows internet_access:fee=customers with a fixed text, namely 'Internet access is free at this place, for customers only' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if internet_access!=no &internet_access~.+)", "value": "customers" }, { @@ -2875,77 +2955,77 @@ }, { "key": "organic", - "description": "Layer 'Shop' shows organic=yes with a fixed text, namely 'This shop offers organic products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=clothes|shop=shoes|shop=butcher|shop=cosmetics|shop=deli|shop=bakery|shop=alcohol|shop=seafood|shop=beverages|shop=florist)", + "description": "Layer 'Shop' shows organic=yes with a fixed text, namely 'This shop offers organic products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=clothes |shop=shoes |shop=butcher |shop=cosmetics |shop=deli |shop=bakery |shop=alcohol |shop=seafood |shop=beverages |shop=florist)", "value": "yes" }, { "key": "organic", - "description": "Layer 'Shop' shows organic=only with a fixed text, namely 'This shop only offers organic products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=clothes|shop=shoes|shop=butcher|shop=cosmetics|shop=deli|shop=bakery|shop=alcohol|shop=seafood|shop=beverages|shop=florist)", + "description": "Layer 'Shop' shows organic=only with a fixed text, namely 'This shop only offers organic products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=clothes |shop=shoes |shop=butcher |shop=cosmetics |shop=deli |shop=bakery |shop=alcohol |shop=seafood |shop=beverages |shop=florist)", "value": "only" }, { "key": "organic", - "description": "Layer 'Shop' shows organic=no with a fixed text, namely 'This shop does not offer organic products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=clothes|shop=shoes|shop=butcher|shop=cosmetics|shop=deli|shop=bakery|shop=alcohol|shop=seafood|shop=beverages|shop=florist)", + "description": "Layer 'Shop' shows organic=no with a fixed text, namely 'This shop does not offer organic products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=clothes |shop=shoes |shop=butcher |shop=cosmetics |shop=deli |shop=bakery |shop=alcohol |shop=seafood |shop=beverages |shop=florist)", "value": "no" }, { "key": "diet:sugar_free", - "description": "Layer 'Shop' shows diet:sugar_free=only with a fixed text, namely 'This shop only sells sugar free products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:sugar_free=only with a fixed text, namely 'This shop only sells sugar free products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "only" }, { "key": "diet:sugar_free", - "description": "Layer 'Shop' shows diet:sugar_free=yes with a fixed text, namely 'This shop has a big sugar free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:sugar_free=yes with a fixed text, namely 'This shop has a big sugar free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "yes" }, { "key": "diet:sugar_free", - "description": "Layer 'Shop' shows diet:sugar_free=limited with a fixed text, namely 'This shop has a limited sugar free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:sugar_free=limited with a fixed text, namely 'This shop has a limited sugar free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "limited" }, { "key": "diet:sugar_free", - "description": "Layer 'Shop' shows diet:sugar_free=no with a fixed text, namely 'This shop has no sugar free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:sugar_free=no with a fixed text, namely 'This shop has no sugar free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "no" }, { "key": "diet:gluten_free", - "description": "Layer 'Shop' shows diet:gluten_free=only with a fixed text, namely 'This shop only sells gluten free products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:gluten_free=only with a fixed text, namely 'This shop only sells gluten free products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "only" }, { "key": "diet:gluten_free", - "description": "Layer 'Shop' shows diet:gluten_free=yes with a fixed text, namely 'This shop has a big gluten free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:gluten_free=yes with a fixed text, namely 'This shop has a big gluten free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "yes" }, { "key": "diet:gluten_free", - "description": "Layer 'Shop' shows diet:gluten_free=limited with a fixed text, namely 'This shop has a limited gluten free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:gluten_free=limited with a fixed text, namely 'This shop has a limited gluten free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "limited" }, { "key": "diet:gluten_free", - "description": "Layer 'Shop' shows diet:gluten_free=no with a fixed text, namely 'This shop has no gluten free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:gluten_free=no with a fixed text, namely 'This shop has no gluten free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "no" }, { "key": "diet:lactose_free", - "description": "Layer 'Shop' shows diet:lactose_free=only with a fixed text, namely 'Only sells lactose free products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:lactose_free=only with a fixed text, namely 'Only sells lactose free products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "only" }, { "key": "diet:lactose_free", - "description": "Layer 'Shop' shows diet:lactose_free=yes with a fixed text, namely 'Big lactose free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:lactose_free=yes with a fixed text, namely 'Big lactose free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "yes" }, { "key": "diet:lactose_free", - "description": "Layer 'Shop' shows diet:lactose_free=limited with a fixed text, namely 'Limited lactose free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:lactose_free=limited with a fixed text, namely 'Limited lactose free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "limited" }, { "key": "diet:lactose_free", - "description": "Layer 'Shop' shows diet:lactose_free=no with a fixed text, namely 'No lactose free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:lactose_free=no with a fixed text, namely 'No lactose free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "no" }, { @@ -2955,7 +3035,7 @@ }, { "key": "id", - "description": "Layer 'Toilets' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Toilets' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -3106,7 +3186,7 @@ }, { "key": "door:width", - "description": "Layer 'Toilets' shows and asks freeform values for key 'door:width' (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if wheelchair=yes|wheelchair=designated)" + "description": "Layer 'Toilets' shows and asks freeform values for key 'door:width' (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if wheelchair=yes |wheelchair=designated)" }, { "key": "toilets:position", @@ -3198,7 +3278,7 @@ }, { "key": "id", - "description": "Layer 'Drinking water' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Drinking water' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -3252,7 +3332,7 @@ }, { "key": "id", - "description": "Layer 'Guideposts' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Guideposts' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Climbing gyms, clubs and spots') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -3269,6 +3349,31 @@ { "key": "wikipedia", "description": "The layer 'Guideposts allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" + }, + { + "key": "bicycle", + "description": "Layer 'Guideposts' shows bicycle=yes with a fixed text, namely 'This guidepost shows bicycle routes' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", + "value": "yes" + }, + { + "key": "hiking", + "description": "Layer 'Guideposts' shows hiking=yes with a fixed text, namely 'This guidepost shows hiking routes' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", + "value": "yes" + }, + { + "key": "mtb", + "description": "Layer 'Guideposts' shows mtb=yes with a fixed text, namely 'This guidepost shows mountain bike routes' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", + "value": "yes" + }, + { + "key": "horse", + "description": "Layer 'Guideposts' shows horse=yes with a fixed text, namely 'This guidepost shows horse riding routes' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", + "value": "yes" + }, + { + "key": "ski", + "description": "Layer 'Guideposts' shows ski=yes with a fixed text, namely 'This guidepost shows ski routes' and allows to pick this as a default answer (in the mapcomplete.org theme 'Climbing gyms, clubs and spots')", + "value": "yes" } ] } \ No newline at end of file diff --git a/Docs/TagInfo/mapcomplete_clock.json b/Docs/TagInfo/mapcomplete_clock.json index b512a7f6f..a12b8f336 100644 --- a/Docs/TagInfo/mapcomplete_clock.json +++ b/Docs/TagInfo/mapcomplete_clock.json @@ -17,7 +17,7 @@ }, { "key": "id", - "description": "Layer 'Clocks' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Clocks') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Clocks' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Clocks') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", diff --git a/Docs/TagInfo/mapcomplete_cycle_infra.json b/Docs/TagInfo/mapcomplete_cycle_infra.json index 9a1f68a17..237bd2909 100644 --- a/Docs/TagInfo/mapcomplete_cycle_infra.json +++ b/Docs/TagInfo/mapcomplete_cycle_infra.json @@ -107,36 +107,36 @@ }, { "key": "id", - "description": "Layer 'Cycleways and roads' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Cycleways and roads' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "cycleway", - "description": "Layer 'Cycleways and roads' shows cycleway=shared_lane with a fixed text, namely 'There is a shared lane' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if highway!=cycleway&highway!=path&highway!=footway&highway!=pedestrian)", + "description": "Layer 'Cycleways and roads' shows cycleway=shared_lane with a fixed text, namely 'There is a shared lane' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if highway!=cycleway &highway!=path &highway!=footway &highway!=pedestrian)", "value": "shared_lane" }, { "key": "cycleway", - "description": "Layer 'Cycleways and roads' shows cycleway=lane with a fixed text, namely 'There is a lane next to the road (separated with paint)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if highway!=cycleway&highway!=path&highway!=footway&highway!=pedestrian)", + "description": "Layer 'Cycleways and roads' shows cycleway=lane with a fixed text, namely 'There is a lane next to the road (separated with paint)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if highway!=cycleway &highway!=path &highway!=footway &highway!=pedestrian)", "value": "lane" }, { "key": "cycleway", - "description": "Layer 'Cycleways and roads' shows cycleway=track with a fixed text, namely 'There is a track, but no cycleway drawn separately from this road on the map.' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if highway!=cycleway&highway!=path&highway!=footway&highway!=pedestrian)", + "description": "Layer 'Cycleways and roads' shows cycleway=track with a fixed text, namely 'There is a track, but no cycleway drawn separately from this road on the map.' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if highway!=cycleway &highway!=path &highway!=footway &highway!=pedestrian)", "value": "track" }, { "key": "cycleway", - "description": "Layer 'Cycleways and roads' shows cycleway=separate with a fixed text, namely 'There is a separately drawn cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if highway!=cycleway&highway!=path&highway!=footway&highway!=pedestrian)", + "description": "Layer 'Cycleways and roads' shows cycleway=separate with a fixed text, namely 'There is a separately drawn cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if highway!=cycleway &highway!=path &highway!=footway &highway!=pedestrian)", "value": "separate" }, { "key": "cycleway", - "description": "Layer 'Cycleways and roads' shows cycleway=no with a fixed text, namely 'There is no cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if highway!=cycleway&highway!=path&highway!=footway&highway!=pedestrian)", + "description": "Layer 'Cycleways and roads' shows cycleway=no with a fixed text, namely 'There is no cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if highway!=cycleway &highway!=path &highway!=footway &highway!=pedestrian)", "value": "no" }, { "key": "cycleway", - "description": "Layer 'Cycleways and roads' shows cycleway=no with a fixed text, namely 'There is no cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if highway!=cycleway&highway!=path&highway!=footway&highway!=pedestrian)", + "description": "Layer 'Cycleways and roads' shows cycleway=no with a fixed text, namely 'There is no cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if highway!=cycleway &highway!=path &highway!=footway &highway!=pedestrian)", "value": "no" }, { @@ -161,155 +161,155 @@ }, { "key": "cyclestreet", - "description": "Layer 'Cycleways and roads' shows cyclestreet=yes with a fixed text, namely 'This is a cyclestreet, and a 30km/h zone.' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if highway!=cycleway&highway!=path&highway!=footway)", + "description": "Layer 'Cycleways and roads' shows cyclestreet=yes with a fixed text, namely 'This is a cyclestreet, and a 30km/h zone.' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if highway!=cycleway &highway!=path &highway!=footway)", "value": "yes" }, { "key": "cyclestreet", - "description": "Layer 'Cycleways and roads' shows cyclestreet=yes with a fixed text, namely 'This is a cyclestreet' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if highway!=cycleway&highway!=path&highway!=footway)", + "description": "Layer 'Cycleways and roads' shows cyclestreet=yes with a fixed text, namely 'This is a cyclestreet' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if highway!=cycleway &highway!=path &highway!=footway)", "value": "yes" }, { "key": "cyclestreet", - "description": "Layer 'Cycleways and roads' shows with a fixed text, namely 'This is not a cyclestreet.' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') Picking this answer will delete the key cyclestreet. (This is only shown if highway!=cycleway&highway!=path&highway!=footway)", + "description": "Layer 'Cycleways and roads' shows with a fixed text, namely 'This is not a cyclestreet.' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') Picking this answer will delete the key cyclestreet. (This is only shown if highway!=cycleway &highway!=path &highway!=footway)", "value": "" }, { "key": "maxspeed", - "description": "Layer 'Cycleways and roads' shows and asks freeform values for key 'maxspeed' (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if highway!=cycleway&highway!=path&highway!=footway&highway!=pedestrian)" + "description": "Layer 'Cycleways and roads' shows and asks freeform values for key 'maxspeed' (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if highway!=cycleway &highway!=path &highway!=footway &highway!=pedestrian)" }, { "key": "maxspeed", - "description": "Layer 'Cycleways and roads' shows maxspeed=20 with a fixed text, namely 'The maximum speed is 20 km/h' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if highway!=cycleway&highway!=path&highway!=footway&highway!=pedestrian)", + "description": "Layer 'Cycleways and roads' shows maxspeed=20 with a fixed text, namely 'The maximum speed is 20 km/h' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if highway!=cycleway &highway!=path &highway!=footway &highway!=pedestrian)", "value": "20" }, { "key": "maxspeed", - "description": "Layer 'Cycleways and roads' shows maxspeed=30 with a fixed text, namely 'The maximum speed is 30 km/h' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if highway!=cycleway&highway!=path&highway!=footway&highway!=pedestrian)", + "description": "Layer 'Cycleways and roads' shows maxspeed=30 with a fixed text, namely 'The maximum speed is 30 km/h' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if highway!=cycleway &highway!=path &highway!=footway &highway!=pedestrian)", "value": "30" }, { "key": "maxspeed", - "description": "Layer 'Cycleways and roads' shows maxspeed=50 with a fixed text, namely 'The maximum speed is 50 km/h' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if highway!=cycleway&highway!=path&highway!=footway&highway!=pedestrian)", + "description": "Layer 'Cycleways and roads' shows maxspeed=50 with a fixed text, namely 'The maximum speed is 50 km/h' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if highway!=cycleway &highway!=path &highway!=footway &highway!=pedestrian)", "value": "50" }, { "key": "maxspeed", - "description": "Layer 'Cycleways and roads' shows maxspeed=70 with a fixed text, namely 'The maximum speed is 70 km/h' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if highway!=cycleway&highway!=path&highway!=footway&highway!=pedestrian)", + "description": "Layer 'Cycleways and roads' shows maxspeed=70 with a fixed text, namely 'The maximum speed is 70 km/h' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if highway!=cycleway &highway!=path &highway!=footway &highway!=pedestrian)", "value": "70" }, { "key": "maxspeed", - "description": "Layer 'Cycleways and roads' shows maxspeed=90 with a fixed text, namely 'The maximum speed is 90 km/h' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if highway!=cycleway&highway!=path&highway!=footway&highway!=pedestrian)", + "description": "Layer 'Cycleways and roads' shows maxspeed=90 with a fixed text, namely 'The maximum speed is 90 km/h' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if highway!=cycleway &highway!=path &highway!=footway &highway!=pedestrian)", "value": "90" }, { "key": "cycleway:surface", - "description": "Layer 'Cycleways and roads' shows and asks freeform values for key 'cycleway:surface' (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)" + "description": "Layer 'Cycleways and roads' shows and asks freeform values for key 'cycleway:surface' (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)" }, { "key": "cycleway:surface", - "description": "Layer 'Cycleways and roads' shows cycleway:surface=unpaved with a fixed text, namely 'This cycleway is unpaved' (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:surface=unpaved with a fixed text, namely 'This cycleway is unpaved' (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "unpaved" }, { "key": "cycleway:surface", - "description": "Layer 'Cycleways and roads' shows cycleway:surface=paved with a fixed text, namely 'This cycleway is paved' (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:surface=paved with a fixed text, namely 'This cycleway is paved' (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "paved" }, { "key": "cycleway:surface", - "description": "Layer 'Cycleways and roads' shows cycleway:surface=asphalt with a fixed text, namely 'This cycleway is made of asphalt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:surface=asphalt with a fixed text, namely 'This cycleway is made of asphalt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "asphalt" }, { "key": "cycleway:surface", - "description": "Layer 'Cycleways and roads' shows cycleway:surface=paving_stones with a fixed text, namely 'This cycleway is made of smooth paving stones' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:surface=paving_stones with a fixed text, namely 'This cycleway is made of smooth paving stones' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "paving_stones" }, { "key": "cycleway:surface", - "description": "Layer 'Cycleways and roads' shows cycleway:surface=concrete with a fixed text, namely 'This cycleway is made of concrete' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:surface=concrete with a fixed text, namely 'This cycleway is made of concrete' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "concrete" }, { "key": "cycleway:surface", - "description": "Layer 'Cycleways and roads' shows cycleway:surface=cobblestone with a fixed text, namely 'This cycleway is made of cobblestone (unhewn or sett)' (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:surface=cobblestone with a fixed text, namely 'This cycleway is made of cobblestone (unhewn or sett)' (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "cobblestone" }, { "key": "cycleway:surface", - "description": "Layer 'Cycleways and roads' shows cycleway:surface=unhewn_cobblestone with a fixed text, namely 'This cycleway is made of raw, natural cobblestone' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:surface=unhewn_cobblestone with a fixed text, namely 'This cycleway is made of raw, natural cobblestone' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "unhewn_cobblestone" }, { "key": "cycleway:surface", - "description": "Layer 'Cycleways and roads' shows cycleway:surface=sett with a fixed text, namely 'This cycleway is made of flat, square cobblestone' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:surface=sett with a fixed text, namely 'This cycleway is made of flat, square cobblestone' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "sett" }, { "key": "cycleway:surface", - "description": "Layer 'Cycleways and roads' shows cycleway:surface=wood with a fixed text, namely 'This cycleway is made of wood' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:surface=wood with a fixed text, namely 'This cycleway is made of wood' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "wood" }, { "key": "cycleway:surface", - "description": "Layer 'Cycleways and roads' shows cycleway:surface=gravel with a fixed text, namely 'This cycleway is made of gravel' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:surface=gravel with a fixed text, namely 'This cycleway is made of gravel' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "gravel" }, { "key": "cycleway:surface", - "description": "Layer 'Cycleways and roads' shows cycleway:surface=fine_gravel with a fixed text, namely 'This cycleway is made of fine gravel' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:surface=fine_gravel with a fixed text, namely 'This cycleway is made of fine gravel' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "fine_gravel" }, { "key": "cycleway:surface", - "description": "Layer 'Cycleways and roads' shows cycleway:surface=pebblestone with a fixed text, namely 'This cycleway is made of pebblestone' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:surface=pebblestone with a fixed text, namely 'This cycleway is made of pebblestone' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "pebblestone" }, { "key": "cycleway:surface", - "description": "Layer 'Cycleways and roads' shows cycleway:surface=ground with a fixed text, namely 'This cycleway is made from raw ground' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:surface=ground with a fixed text, namely 'This cycleway is made from raw ground' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "ground" }, { "key": "cycleway:smoothness", - "description": "Layer 'Cycleways and roads' shows cycleway:smoothness=excellent with a fixed text, namely 'Usable for thin rollers: rollerblade, skateboard' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:smoothness=excellent with a fixed text, namely 'Usable for thin rollers: rollerblade, skateboard' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "excellent" }, { "key": "cycleway:smoothness", - "description": "Layer 'Cycleways and roads' shows cycleway:smoothness=good with a fixed text, namely 'Usable for thin wheels: racing bike' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:smoothness=good with a fixed text, namely 'Usable for thin wheels: racing bike' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "good" }, { "key": "cycleway:smoothness", - "description": "Layer 'Cycleways and roads' shows cycleway:smoothness=intermediate with a fixed text, namely 'Usable for normal wheels: city bike, wheelchair, scooter' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:smoothness=intermediate with a fixed text, namely 'Usable for normal wheels: city bike, wheelchair, scooter' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "intermediate" }, { "key": "cycleway:smoothness", - "description": "Layer 'Cycleways and roads' shows cycleway:smoothness=bad with a fixed text, namely 'Usable for robust wheels: trekking bike, car, rickshaw' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:smoothness=bad with a fixed text, namely 'Usable for robust wheels: trekking bike, car, rickshaw' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "bad" }, { "key": "cycleway:smoothness", - "description": "Layer 'Cycleways and roads' shows cycleway:smoothness=very_bad with a fixed text, namely 'Usable for vehicles with high clearance: light duty off-road vehicle' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:smoothness=very_bad with a fixed text, namely 'Usable for vehicles with high clearance: light duty off-road vehicle' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "very_bad" }, { "key": "cycleway:smoothness", - "description": "Layer 'Cycleways and roads' shows cycleway:smoothness=horrible with a fixed text, namely 'Usable for off-road vehicles: heavy duty off-road vehicle' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:smoothness=horrible with a fixed text, namely 'Usable for off-road vehicles: heavy duty off-road vehicle' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "horrible" }, { "key": "cycleway:smoothness", - "description": "Layer 'Cycleways and roads' shows cycleway:smoothness=very_horrible with a fixed text, namely 'Usable for specialized off-road vehicles: tractor, ATV' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:smoothness=very_horrible with a fixed text, namely 'Usable for specialized off-road vehicles: tractor, ATV' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "very_horrible" }, { "key": "cycleway:smoothness", - "description": "Layer 'Cycleways and roads' shows cycleway:smoothness=impassable with a fixed text, namely 'Impassable / No wheeled vehicle' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:smoothness=impassable with a fixed text, namely 'Impassable / No wheeled vehicle' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "impassable" }, { @@ -383,188 +383,188 @@ }, { "key": "smoothness", - "description": "Layer 'Cycleways and roads' shows smoothness=excellent with a fixed text, namely 'Usable for thin rollers: rollerblade, skateboard' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=no|highway=cycleway)", + "description": "Layer 'Cycleways and roads' shows smoothness=excellent with a fixed text, namely 'Usable for thin rollers: rollerblade, skateboard' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=no |highway=cycleway)", "value": "excellent" }, { "key": "smoothness", - "description": "Layer 'Cycleways and roads' shows smoothness=good with a fixed text, namely 'Usable for thin wheels: racing bike' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=no|highway=cycleway)", + "description": "Layer 'Cycleways and roads' shows smoothness=good with a fixed text, namely 'Usable for thin wheels: racing bike' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=no |highway=cycleway)", "value": "good" }, { "key": "smoothness", - "description": "Layer 'Cycleways and roads' shows smoothness=intermediate with a fixed text, namely 'Usable for normal wheels: city bike, wheelchair, scooter' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=no|highway=cycleway)", + "description": "Layer 'Cycleways and roads' shows smoothness=intermediate with a fixed text, namely 'Usable for normal wheels: city bike, wheelchair, scooter' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=no |highway=cycleway)", "value": "intermediate" }, { "key": "smoothness", - "description": "Layer 'Cycleways and roads' shows smoothness=bad with a fixed text, namely 'Usable for robust wheels: trekking bike, car, rickshaw' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=no|highway=cycleway)", + "description": "Layer 'Cycleways and roads' shows smoothness=bad with a fixed text, namely 'Usable for robust wheels: trekking bike, car, rickshaw' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=no |highway=cycleway)", "value": "bad" }, { "key": "smoothness", - "description": "Layer 'Cycleways and roads' shows smoothness=very_bad with a fixed text, namely 'Usable for vehicles with high clearance: light duty off-road vehicle' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=no|highway=cycleway)", + "description": "Layer 'Cycleways and roads' shows smoothness=very_bad with a fixed text, namely 'Usable for vehicles with high clearance: light duty off-road vehicle' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=no |highway=cycleway)", "value": "very_bad" }, { "key": "smoothness", - "description": "Layer 'Cycleways and roads' shows smoothness=horrible with a fixed text, namely 'Usable for off-road vehicles: heavy duty off-road vehicle' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=no|highway=cycleway)", + "description": "Layer 'Cycleways and roads' shows smoothness=horrible with a fixed text, namely 'Usable for off-road vehicles: heavy duty off-road vehicle' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=no |highway=cycleway)", "value": "horrible" }, { "key": "smoothness", - "description": "Layer 'Cycleways and roads' shows smoothness=very_horrible with a fixed text, namely 'Usable for specialized off-road vehicles: tractor, ATV' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=no|highway=cycleway)", + "description": "Layer 'Cycleways and roads' shows smoothness=very_horrible with a fixed text, namely 'Usable for specialized off-road vehicles: tractor, ATV' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=no |highway=cycleway)", "value": "very_horrible" }, { "key": "smoothness", - "description": "Layer 'Cycleways and roads' shows smoothness=impassable with a fixed text, namely 'Impassable / No wheeled vehicle' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=no|highway=cycleway)", + "description": "Layer 'Cycleways and roads' shows smoothness=impassable with a fixed text, namely 'Impassable / No wheeled vehicle' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=no |highway=cycleway)", "value": "impassable" }, { "key": "width:carriageway", - "description": "Layer 'Cycleways and roads' shows and asks freeform values for key 'width:carriageway' (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if highway!=cycleway&highway!=path&highway!=footway)" + "description": "Layer 'Cycleways and roads' shows and asks freeform values for key 'width:carriageway' (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if highway!=cycleway &highway!=path &highway!=footway)" }, { "key": "cycleway:traffic_sign", - "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7 with a fixed text, namely 'Compulsory cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=lane|cycleway=track&_country=be)", + "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7 with a fixed text, namely 'Compulsory cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=lane |cycleway=track &_country=be)", "value": "BE:D7" }, { "key": "cycleway:traffic_sign", - "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign~^(BE:D7;.*)$ with a fixed text, namely 'Compulsory cycleway (with supplementary sign)
' (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=lane|cycleway=track&_country=be)" + "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign~^(BE:D7;.*)$ with a fixed text, namely 'Compulsory cycleway (with supplementary sign)
' (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=lane |cycleway=track &_country=be)" }, { "key": "cycleway:traffic_sign", - "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D9 with a fixed text, namely 'Segregated foot/cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=lane|cycleway=track&_country=be)", + "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D9 with a fixed text, namely 'Segregated foot/cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=lane |cycleway=track &_country=be)", "value": "BE:D9" }, { "key": "cycleway:traffic_sign", - "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D10 with a fixed text, namely 'Unsegregated foot/cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=lane|cycleway=track&_country=be)", + "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D10 with a fixed text, namely 'Unsegregated foot/cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=lane |cycleway=track &_country=be)", "value": "BE:D10" }, { "key": "cycleway:traffic_sign", - "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=none with a fixed text, namely 'No traffic sign present' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=lane|cycleway=track&_country=be)", + "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=none with a fixed text, namely 'No traffic sign present' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=lane |cycleway=track &_country=be)", "value": "none" }, { "key": "traffic_sign", - "description": "Layer 'Cycleways and roads' shows traffic_sign=BE:D7 with a fixed text, namely 'Compulsory cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if highway=cycleway|highway=path&_country=be|_country=nl)", + "description": "Layer 'Cycleways and roads' shows traffic_sign=BE:D7 with a fixed text, namely 'Compulsory cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if highway=cycleway |highway=path &_country=be |_country=nl)", "value": "BE:D7" }, { "key": "traffic_sign", - "description": "Layer 'Cycleways and roads' shows traffic_sign~^(BE:D7;.*)$ with a fixed text, namely 'Compulsory cycleway (with supplementary sign)
' (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if highway=cycleway|highway=path&_country=be|_country=nl)" + "description": "Layer 'Cycleways and roads' shows traffic_sign~^(BE:D7;.*)$ with a fixed text, namely 'Compulsory cycleway (with supplementary sign)
' (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if highway=cycleway |highway=path &_country=be |_country=nl)" }, { "key": "traffic_sign", - "description": "Layer 'Cycleways and roads' shows traffic_sign=BE:D9 with a fixed text, namely 'Segregated foot/cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if highway=cycleway|highway=path&_country=be|_country=nl)", + "description": "Layer 'Cycleways and roads' shows traffic_sign=BE:D9 with a fixed text, namely 'Segregated foot/cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if highway=cycleway |highway=path &_country=be |_country=nl)", "value": "BE:D9" }, { "key": "traffic_sign", - "description": "Layer 'Cycleways and roads' shows traffic_sign=BE:D10 with a fixed text, namely 'Unsegregated foot/cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if highway=cycleway|highway=path&_country=be|_country=nl)", + "description": "Layer 'Cycleways and roads' shows traffic_sign=BE:D10 with a fixed text, namely 'Unsegregated foot/cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if highway=cycleway |highway=path &_country=be |_country=nl)", "value": "BE:D10" }, { "key": "traffic_sign", - "description": "Layer 'Cycleways and roads' shows traffic_sign=NL:G11 with a fixed text, namely 'Compulsory cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if highway=cycleway|highway=path&_country=be|_country=nl)", + "description": "Layer 'Cycleways and roads' shows traffic_sign=NL:G11 with a fixed text, namely 'Compulsory cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if highway=cycleway |highway=path &_country=be |_country=nl)", "value": "NL:G11" }, { "key": "traffic_sign", - "description": "Layer 'Cycleways and roads' shows traffic_sign=NL:G12a with a fixed text, namely 'Compulsory (moped)cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if highway=cycleway|highway=path&_country=be|_country=nl)", + "description": "Layer 'Cycleways and roads' shows traffic_sign=NL:G12a with a fixed text, namely 'Compulsory (moped)cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if highway=cycleway |highway=path &_country=be |_country=nl)", "value": "NL:G12a" }, { "key": "traffic_sign", - "description": "Layer 'Cycleways and roads' shows traffic_sign=NL:G13 with a fixed text, namely 'Non-compulsory cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if highway=cycleway|highway=path&_country=be|_country=nl)", + "description": "Layer 'Cycleways and roads' shows traffic_sign=NL:G13 with a fixed text, namely 'Non-compulsory cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if highway=cycleway |highway=path &_country=be |_country=nl)", "value": "NL:G13" }, { "key": "traffic_sign", - "description": "Layer 'Cycleways and roads' shows traffic_sign=none with a fixed text, namely 'No traffic sign present' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if highway=cycleway|highway=path&_country=be|_country=nl)", + "description": "Layer 'Cycleways and roads' shows traffic_sign=none with a fixed text, namely 'No traffic sign present' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if highway=cycleway |highway=path &_country=be |_country=nl)", "value": "none" }, { "key": "cycleway:traffic_sign", - "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7;BE:M6 with a fixed text, namely 'Mopeds must use the cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway:traffic_sign=BE:D7|cycleway:traffic_sign~^(BE:D7;.*)$)", + "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7;BE:M6 with a fixed text, namely 'Mopeds must use the cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway:traffic_sign=BE:D7 |cycleway:traffic_sign~^(BE:D7;.*)$)", "value": "BE:D7;BE:M6" }, { "key": "cycleway:traffic_sign", - "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7;BE:M13 with a fixed text, namely 'Speedpedelecs must use the cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway:traffic_sign=BE:D7|cycleway:traffic_sign~^(BE:D7;.*)$)", + "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7;BE:M13 with a fixed text, namely 'Speedpedelecs must use the cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway:traffic_sign=BE:D7 |cycleway:traffic_sign~^(BE:D7;.*)$)", "value": "BE:D7;BE:M13" }, { "key": "cycleway:traffic_sign", - "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7;BE:M14 with a fixed text, namely 'Mopeds and speedpedelecs must use the cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway:traffic_sign=BE:D7|cycleway:traffic_sign~^(BE:D7;.*)$)", + "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7;BE:M14 with a fixed text, namely 'Mopeds and speedpedelecs must use the cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway:traffic_sign=BE:D7 |cycleway:traffic_sign~^(BE:D7;.*)$)", "value": "BE:D7;BE:M14" }, { "key": "cycleway:traffic_sign", - "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7;BE:M7 with a fixed text, namely 'Mopeds are not allowed' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway:traffic_sign=BE:D7|cycleway:traffic_sign~^(BE:D7;.*)$)", + "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7;BE:M7 with a fixed text, namely 'Mopeds are not allowed' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway:traffic_sign=BE:D7 |cycleway:traffic_sign~^(BE:D7;.*)$)", "value": "BE:D7;BE:M7" }, { "key": "cycleway:traffic_sign", - "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7;BE:M15 with a fixed text, namely 'Speedpedelecs are not allowed' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway:traffic_sign=BE:D7|cycleway:traffic_sign~^(BE:D7;.*)$)", + "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7;BE:M15 with a fixed text, namely 'Speedpedelecs are not allowed' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway:traffic_sign=BE:D7 |cycleway:traffic_sign~^(BE:D7;.*)$)", "value": "BE:D7;BE:M15" }, { "key": "cycleway:traffic_sign", - "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7;BE:M16 with a fixed text, namely 'Mopeds and speedpedelecs are not allowed' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway:traffic_sign=BE:D7|cycleway:traffic_sign~^(BE:D7;.*)$)", + "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7;BE:M16 with a fixed text, namely 'Mopeds and speedpedelecs are not allowed' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway:traffic_sign=BE:D7 |cycleway:traffic_sign~^(BE:D7;.*)$)", "value": "BE:D7;BE:M16" }, { "key": "cycleway:traffic_sign:supplementary", - "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign:supplementary=none with a fixed text, namely 'No supplementary traffic sign present' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway:traffic_sign=BE:D7|cycleway:traffic_sign~^(BE:D7;.*)$)", + "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign:supplementary=none with a fixed text, namely 'No supplementary traffic sign present' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway:traffic_sign=BE:D7 |cycleway:traffic_sign~^(BE:D7;.*)$)", "value": "none" }, { "key": "cycleway:buffer", - "description": "Layer 'Cycleways and roads' shows and asks freeform values for key 'cycleway:buffer' (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=track|cycleway=lane)" + "description": "Layer 'Cycleways and roads' shows and asks freeform values for key 'cycleway:buffer' (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=track |cycleway=lane)" }, { "key": "cycleway:separation", - "description": "Layer 'Cycleways and roads' shows cycleway:separation=dashed_line with a fixed text, namely 'This cycleway is separated by a dashed line' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=track|cycleway=lane)", + "description": "Layer 'Cycleways and roads' shows cycleway:separation=dashed_line with a fixed text, namely 'This cycleway is separated by a dashed line' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=track |cycleway=lane)", "value": "dashed_line" }, { "key": "cycleway:separation", - "description": "Layer 'Cycleways and roads' shows cycleway:separation=solid_line with a fixed text, namely 'This cycleway is separated by a solid line' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=track|cycleway=lane)", + "description": "Layer 'Cycleways and roads' shows cycleway:separation=solid_line with a fixed text, namely 'This cycleway is separated by a solid line' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=track |cycleway=lane)", "value": "solid_line" }, { "key": "cycleway:separation", - "description": "Layer 'Cycleways and roads' shows cycleway:separation=parking_lane with a fixed text, namely 'This cycleway is separated by a parking lane' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=track|cycleway=lane)", + "description": "Layer 'Cycleways and roads' shows cycleway:separation=parking_lane with a fixed text, namely 'This cycleway is separated by a parking lane' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=track |cycleway=lane)", "value": "parking_lane" }, { "key": "cycleway:separation", - "description": "Layer 'Cycleways and roads' shows cycleway:separation=kerb with a fixed text, namely 'This cycleway is separated by a kerb' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=track|cycleway=lane)", + "description": "Layer 'Cycleways and roads' shows cycleway:separation=kerb with a fixed text, namely 'This cycleway is separated by a kerb' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycleway=track |cycleway=lane)", "value": "kerb" }, { "key": "separation", - "description": "Layer 'Cycleways and roads' shows separation=dashed_line with a fixed text, namely 'This cycleway is separated by a dashed line' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if highway=cycleway|highway=path)", + "description": "Layer 'Cycleways and roads' shows separation=dashed_line with a fixed text, namely 'This cycleway is separated by a dashed line' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if highway=cycleway |highway=path)", "value": "dashed_line" }, { "key": "separation", - "description": "Layer 'Cycleways and roads' shows separation=solid_line with a fixed text, namely 'This cycleway is separated by a solid line' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if highway=cycleway|highway=path)", + "description": "Layer 'Cycleways and roads' shows separation=solid_line with a fixed text, namely 'This cycleway is separated by a solid line' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if highway=cycleway |highway=path)", "value": "solid_line" }, { "key": "separation", - "description": "Layer 'Cycleways and roads' shows separation=parking_lane with a fixed text, namely 'This cycleway is separated by a parking lane' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if highway=cycleway|highway=path)", + "description": "Layer 'Cycleways and roads' shows separation=parking_lane with a fixed text, namely 'This cycleway is separated by a parking lane' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if highway=cycleway |highway=path)", "value": "parking_lane" }, { "key": "separation", - "description": "Layer 'Cycleways and roads' shows separation=kerb with a fixed text, namely 'This cycleway is separated by a kerb' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if highway=cycleway|highway=path)", + "description": "Layer 'Cycleways and roads' shows separation=kerb with a fixed text, namely 'This cycleway is separated by a kerb' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if highway=cycleway |highway=path)", "value": "kerb" }, { @@ -579,7 +579,7 @@ }, { "key": "id", - "description": "Layer 'Barriers' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Barriers' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -664,19 +664,19 @@ }, { "key": "maxwidth:physical", - "description": "Layer 'Barriers' shows and asks freeform values for key 'maxwidth:physical' (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycle_barrier!=double&cycle_barrier!=triple&_referencing_ways~.+)" + "description": "Layer 'Barriers' shows and asks freeform values for key 'maxwidth:physical' (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycle_barrier!=double &cycle_barrier!=triple &_referencing_ways~.+)" }, { "key": "width:separation", - "description": "Layer 'Barriers' shows and asks freeform values for key 'width:separation' (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycle_barrier=double|cycle_barrier=triple)" + "description": "Layer 'Barriers' shows and asks freeform values for key 'width:separation' (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycle_barrier=double |cycle_barrier=triple)" }, { "key": "width:opening", - "description": "Layer 'Barriers' shows and asks freeform values for key 'width:opening' (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycle_barrier=double|cycle_barrier=triple)" + "description": "Layer 'Barriers' shows and asks freeform values for key 'width:opening' (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycle_barrier=double |cycle_barrier=triple)" }, { "key": "overlap", - "description": "Layer 'Barriers' shows and asks freeform values for key 'overlap' (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycle_barrier=double|cycle_barrier=triple)" + "description": "Layer 'Barriers' shows and asks freeform values for key 'overlap' (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if cycle_barrier=double |cycle_barrier=triple)" }, { "key": "highway", @@ -690,7 +690,7 @@ }, { "key": "id", - "description": "Layer 'Crossings' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Crossings' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -775,12 +775,12 @@ }, { "key": "button_operated", - "description": "Layer 'Crossings' shows button_operated=yes with a fixed text, namely 'This traffic light has a button to request green light' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if highway=traffic_signals|crossing=traffic_signals)", + "description": "Layer 'Crossings' shows button_operated=yes with a fixed text, namely 'This traffic light has a button to request green light' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if highway=traffic_signals |crossing=traffic_signals)", "value": "yes" }, { "key": "button_operated", - "description": "Layer 'Crossings' shows button_operated=no with a fixed text, namely 'This traffic light does not have a button to request green light' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if highway=traffic_signals|crossing=traffic_signals)", + "description": "Layer 'Crossings' shows button_operated=no with a fixed text, namely 'This traffic light does not have a button to request green light' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if highway=traffic_signals |crossing=traffic_signals)", "value": "no" }, { @@ -805,12 +805,12 @@ }, { "key": "traffic_signals:vibration", - "description": "Layer 'Crossings' shows traffic_signals:vibration=yes with a fixed text, namely 'The button for this traffic light has a vibration signal to indicate that it is safe to cross.' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if crossing=traffic_signals&button_operated=yes)", + "description": "Layer 'Crossings' shows traffic_signals:vibration=yes with a fixed text, namely 'The button for this traffic light has a vibration signal to indicate that it is safe to cross.' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if crossing=traffic_signals &button_operated=yes)", "value": "yes" }, { "key": "traffic_signals:vibration", - "description": "Layer 'Crossings' shows traffic_signals:vibration=no with a fixed text, namely 'The button for this traffic light does not have a vibration signal to indicate that it is safe to cross.' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if crossing=traffic_signals&button_operated=yes)", + "description": "Layer 'Crossings' shows traffic_signals:vibration=no with a fixed text, namely 'The button for this traffic light does not have a vibration signal to indicate that it is safe to cross.' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bicycle infrastructure') (This is only shown if crossing=traffic_signals &button_operated=yes)", "value": "no" }, { diff --git a/Docs/TagInfo/mapcomplete_cyclestreets.json b/Docs/TagInfo/mapcomplete_cyclestreets.json index 06409341a..49dd998cc 100644 --- a/Docs/TagInfo/mapcomplete_cyclestreets.json +++ b/Docs/TagInfo/mapcomplete_cyclestreets.json @@ -22,22 +22,22 @@ }, { "key": "cyclestreet", - "description": "Layer 'Cyclestreets' shows cyclestreet=yes&maxspeed=30&overtaking:motor_vehicle=no with a fixed text, namely 'This street is a cyclestreet (and has a speed limit of 30 km/h)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets')", + "description": "Layer 'Cyclestreets' shows cyclestreet=yes &maxspeed=30 &overtaking:motor_vehicle=no with a fixed text, namely 'This street is a cyclestreet (and has a speed limit of 30 km/h)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets')", "value": "yes" }, { "key": "maxspeed", - "description": "Layer 'Cyclestreets' shows cyclestreet=yes&maxspeed=30&overtaking:motor_vehicle=no with a fixed text, namely 'This street is a cyclestreet (and has a speed limit of 30 km/h)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets')", + "description": "Layer 'Cyclestreets' shows cyclestreet=yes &maxspeed=30 &overtaking:motor_vehicle=no with a fixed text, namely 'This street is a cyclestreet (and has a speed limit of 30 km/h)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets')", "value": "30" }, { "key": "overtaking:motor_vehicle", - "description": "Layer 'Cyclestreets' shows cyclestreet=yes&maxspeed=30&overtaking:motor_vehicle=no with a fixed text, namely 'This street is a cyclestreet (and has a speed limit of 30 km/h)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets')", + "description": "Layer 'Cyclestreets' shows cyclestreet=yes &maxspeed=30 &overtaking:motor_vehicle=no with a fixed text, namely 'This street is a cyclestreet (and has a speed limit of 30 km/h)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets')", "value": "no" }, { "key": "proposed:cyclestreet", - "description": "Layer 'Cyclestreets' shows cyclestreet=yes&maxspeed=30&overtaking:motor_vehicle=no with a fixed text, namely 'This street is a cyclestreet (and has a speed limit of 30 km/h)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets') Picking this answer will delete the key proposed:cyclestreet.", + "description": "Layer 'Cyclestreets' shows cyclestreet=yes &maxspeed=30 &overtaking:motor_vehicle=no with a fixed text, namely 'This street is a cyclestreet (and has a speed limit of 30 km/h)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets') Picking this answer will delete the key proposed:cyclestreet.", "value": "" }, { @@ -47,32 +47,32 @@ }, { "key": "bicycle_road", - "description": "Layer 'Cyclestreets' shows bicycle_road=yes&maxspeed=30&source:maxspeed=DE:bicycle_road&vehicle=no&bicycle=designated with a fixed text, namely 'This street is a bicycle road (has a speed limit of 30 km/h and vehicles are not allowed) (sign will be asked later)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets')", + "description": "Layer 'Cyclestreets' shows bicycle_road=yes &maxspeed=30 &source:maxspeed=DE:bicycle_road &vehicle=no &bicycle=designated with a fixed text, namely 'This street is a bicycle road (has a speed limit of 30 km/h and vehicles are not allowed) (sign will be asked later)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets')", "value": "yes" }, { "key": "proposed:bicycle_road", - "description": "Layer 'Cyclestreets' shows bicycle_road=yes&maxspeed=30&source:maxspeed=DE:bicycle_road&vehicle=no&bicycle=designated with a fixed text, namely 'This street is a bicycle road (has a speed limit of 30 km/h and vehicles are not allowed) (sign will be asked later)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets') Picking this answer will delete the key proposed:bicycle_road.", + "description": "Layer 'Cyclestreets' shows bicycle_road=yes &maxspeed=30 &source:maxspeed=DE:bicycle_road &vehicle=no &bicycle=designated with a fixed text, namely 'This street is a bicycle road (has a speed limit of 30 km/h and vehicles are not allowed) (sign will be asked later)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets') Picking this answer will delete the key proposed:bicycle_road.", "value": "" }, { "key": "maxspeed", - "description": "Layer 'Cyclestreets' shows bicycle_road=yes&maxspeed=30&source:maxspeed=DE:bicycle_road&vehicle=no&bicycle=designated with a fixed text, namely 'This street is a bicycle road (has a speed limit of 30 km/h and vehicles are not allowed) (sign will be asked later)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets')", + "description": "Layer 'Cyclestreets' shows bicycle_road=yes &maxspeed=30 &source:maxspeed=DE:bicycle_road &vehicle=no &bicycle=designated with a fixed text, namely 'This street is a bicycle road (has a speed limit of 30 km/h and vehicles are not allowed) (sign will be asked later)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets')", "value": "30" }, { "key": "source:maxspeed", - "description": "Layer 'Cyclestreets' shows bicycle_road=yes&maxspeed=30&source:maxspeed=DE:bicycle_road&vehicle=no&bicycle=designated with a fixed text, namely 'This street is a bicycle road (has a speed limit of 30 km/h and vehicles are not allowed) (sign will be asked later)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets')", + "description": "Layer 'Cyclestreets' shows bicycle_road=yes &maxspeed=30 &source:maxspeed=DE:bicycle_road &vehicle=no &bicycle=designated with a fixed text, namely 'This street is a bicycle road (has a speed limit of 30 km/h and vehicles are not allowed) (sign will be asked later)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets')", "value": "DE:bicycle_road" }, { "key": "vehicle", - "description": "Layer 'Cyclestreets' shows bicycle_road=yes&maxspeed=30&source:maxspeed=DE:bicycle_road&vehicle=no&bicycle=designated with a fixed text, namely 'This street is a bicycle road (has a speed limit of 30 km/h and vehicles are not allowed) (sign will be asked later)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets')", + "description": "Layer 'Cyclestreets' shows bicycle_road=yes &maxspeed=30 &source:maxspeed=DE:bicycle_road &vehicle=no &bicycle=designated with a fixed text, namely 'This street is a bicycle road (has a speed limit of 30 km/h and vehicles are not allowed) (sign will be asked later)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets')", "value": "no" }, { "key": "bicycle", - "description": "Layer 'Cyclestreets' shows bicycle_road=yes&maxspeed=30&source:maxspeed=DE:bicycle_road&vehicle=no&bicycle=designated with a fixed text, namely 'This street is a bicycle road (has a speed limit of 30 km/h and vehicles are not allowed) (sign will be asked later)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets')", + "description": "Layer 'Cyclestreets' shows bicycle_road=yes &maxspeed=30 &source:maxspeed=DE:bicycle_road &vehicle=no &bicycle=designated with a fixed text, namely 'This street is a bicycle road (has a speed limit of 30 km/h and vehicles are not allowed) (sign will be asked later)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets')", "value": "designated" }, { @@ -132,27 +132,27 @@ }, { "key": "traffic_sign", - "description": "Layer 'Cyclestreets' shows traffic_sign=DE:244.1,1020-30 with a fixed text, namely 'Residents allowed' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets') (This is only shown if bicycle_road=yes&_country=de)", + "description": "Layer 'Cyclestreets' shows traffic_sign=DE:244.1,1020-30 with a fixed text, namely 'Residents allowed' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets') (This is only shown if bicycle_road=yes &_country=de)", "value": "DE:244.1,1020-30" }, { "key": "traffic_sign", - "description": "Layer 'Cyclestreets' shows traffic_sign=DE:244.1,1022-12,1024-10 with a fixed text, namely 'Motor vehicles allowed' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets') (This is only shown if bicycle_road=yes&_country=de)", + "description": "Layer 'Cyclestreets' shows traffic_sign=DE:244.1,1022-12,1024-10 with a fixed text, namely 'Motor vehicles allowed' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets') (This is only shown if bicycle_road=yes &_country=de)", "value": "DE:244.1,1022-12,1024-10" }, { "key": "traffic_sign", - "description": "Layer 'Cyclestreets' shows traffic_sign=DE:244.1,1022-12 with a fixed text, namely 'Motorcycles allowed' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets') (This is only shown if bicycle_road=yes&_country=de)", + "description": "Layer 'Cyclestreets' shows traffic_sign=DE:244.1,1022-12 with a fixed text, namely 'Motorcycles allowed' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets') (This is only shown if bicycle_road=yes &_country=de)", "value": "DE:244.1,1022-12" }, { "key": "traffic_sign", - "description": "Layer 'Cyclestreets' shows traffic_sign=DE:244.1,1024-10 with a fixed text, namely 'Cars allowed' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets') (This is only shown if bicycle_road=yes&_country=de)", + "description": "Layer 'Cyclestreets' shows traffic_sign=DE:244.1,1024-10 with a fixed text, namely 'Cars allowed' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets') (This is only shown if bicycle_road=yes &_country=de)", "value": "DE:244.1,1024-10" }, { "key": "traffic_sign", - "description": "Layer 'Cyclestreets' shows traffic_sign=DE:244.1 with a fixed text, namely 'There are no supplementary signs at this bicycle road.' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets') (This is only shown if bicycle_road=yes&_country=de)", + "description": "Layer 'Cyclestreets' shows traffic_sign=DE:244.1 with a fixed text, namely 'There are no supplementary signs at this bicycle road.' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets') (This is only shown if bicycle_road=yes &_country=de)", "value": "DE:244.1" }, { @@ -161,7 +161,7 @@ }, { "key": "id", - "description": "Layer 'Cyclestreets' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Cyclestreets') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Cyclestreets' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Cyclestreets') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -191,22 +191,22 @@ }, { "key": "cyclestreet", - "description": "Layer 'Future cyclestreet' shows cyclestreet=yes&maxspeed=30&overtaking:motor_vehicle=no with a fixed text, namely 'This street is a cyclestreet (and has a speed limit of 30 km/h)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets')", + "description": "Layer 'Future cyclestreet' shows cyclestreet=yes &maxspeed=30 &overtaking:motor_vehicle=no with a fixed text, namely 'This street is a cyclestreet (and has a speed limit of 30 km/h)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets')", "value": "yes" }, { "key": "maxspeed", - "description": "Layer 'Future cyclestreet' shows cyclestreet=yes&maxspeed=30&overtaking:motor_vehicle=no with a fixed text, namely 'This street is a cyclestreet (and has a speed limit of 30 km/h)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets')", + "description": "Layer 'Future cyclestreet' shows cyclestreet=yes &maxspeed=30 &overtaking:motor_vehicle=no with a fixed text, namely 'This street is a cyclestreet (and has a speed limit of 30 km/h)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets')", "value": "30" }, { "key": "overtaking:motor_vehicle", - "description": "Layer 'Future cyclestreet' shows cyclestreet=yes&maxspeed=30&overtaking:motor_vehicle=no with a fixed text, namely 'This street is a cyclestreet (and has a speed limit of 30 km/h)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets')", + "description": "Layer 'Future cyclestreet' shows cyclestreet=yes &maxspeed=30 &overtaking:motor_vehicle=no with a fixed text, namely 'This street is a cyclestreet (and has a speed limit of 30 km/h)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets')", "value": "no" }, { "key": "proposed:cyclestreet", - "description": "Layer 'Future cyclestreet' shows cyclestreet=yes&maxspeed=30&overtaking:motor_vehicle=no with a fixed text, namely 'This street is a cyclestreet (and has a speed limit of 30 km/h)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets') Picking this answer will delete the key proposed:cyclestreet.", + "description": "Layer 'Future cyclestreet' shows cyclestreet=yes &maxspeed=30 &overtaking:motor_vehicle=no with a fixed text, namely 'This street is a cyclestreet (and has a speed limit of 30 km/h)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets') Picking this answer will delete the key proposed:cyclestreet.", "value": "" }, { @@ -216,32 +216,32 @@ }, { "key": "bicycle_road", - "description": "Layer 'Future cyclestreet' shows bicycle_road=yes&maxspeed=30&source:maxspeed=DE:bicycle_road&vehicle=no&bicycle=designated with a fixed text, namely 'This street is a bicycle road (has a speed limit of 30 km/h and vehicles are not allowed) (sign will be asked later)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets')", + "description": "Layer 'Future cyclestreet' shows bicycle_road=yes &maxspeed=30 &source:maxspeed=DE:bicycle_road &vehicle=no &bicycle=designated with a fixed text, namely 'This street is a bicycle road (has a speed limit of 30 km/h and vehicles are not allowed) (sign will be asked later)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets')", "value": "yes" }, { "key": "proposed:bicycle_road", - "description": "Layer 'Future cyclestreet' shows bicycle_road=yes&maxspeed=30&source:maxspeed=DE:bicycle_road&vehicle=no&bicycle=designated with a fixed text, namely 'This street is a bicycle road (has a speed limit of 30 km/h and vehicles are not allowed) (sign will be asked later)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets') Picking this answer will delete the key proposed:bicycle_road.", + "description": "Layer 'Future cyclestreet' shows bicycle_road=yes &maxspeed=30 &source:maxspeed=DE:bicycle_road &vehicle=no &bicycle=designated with a fixed text, namely 'This street is a bicycle road (has a speed limit of 30 km/h and vehicles are not allowed) (sign will be asked later)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets') Picking this answer will delete the key proposed:bicycle_road.", "value": "" }, { "key": "maxspeed", - "description": "Layer 'Future cyclestreet' shows bicycle_road=yes&maxspeed=30&source:maxspeed=DE:bicycle_road&vehicle=no&bicycle=designated with a fixed text, namely 'This street is a bicycle road (has a speed limit of 30 km/h and vehicles are not allowed) (sign will be asked later)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets')", + "description": "Layer 'Future cyclestreet' shows bicycle_road=yes &maxspeed=30 &source:maxspeed=DE:bicycle_road &vehicle=no &bicycle=designated with a fixed text, namely 'This street is a bicycle road (has a speed limit of 30 km/h and vehicles are not allowed) (sign will be asked later)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets')", "value": "30" }, { "key": "source:maxspeed", - "description": "Layer 'Future cyclestreet' shows bicycle_road=yes&maxspeed=30&source:maxspeed=DE:bicycle_road&vehicle=no&bicycle=designated with a fixed text, namely 'This street is a bicycle road (has a speed limit of 30 km/h and vehicles are not allowed) (sign will be asked later)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets')", + "description": "Layer 'Future cyclestreet' shows bicycle_road=yes &maxspeed=30 &source:maxspeed=DE:bicycle_road &vehicle=no &bicycle=designated with a fixed text, namely 'This street is a bicycle road (has a speed limit of 30 km/h and vehicles are not allowed) (sign will be asked later)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets')", "value": "DE:bicycle_road" }, { "key": "vehicle", - "description": "Layer 'Future cyclestreet' shows bicycle_road=yes&maxspeed=30&source:maxspeed=DE:bicycle_road&vehicle=no&bicycle=designated with a fixed text, namely 'This street is a bicycle road (has a speed limit of 30 km/h and vehicles are not allowed) (sign will be asked later)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets')", + "description": "Layer 'Future cyclestreet' shows bicycle_road=yes &maxspeed=30 &source:maxspeed=DE:bicycle_road &vehicle=no &bicycle=designated with a fixed text, namely 'This street is a bicycle road (has a speed limit of 30 km/h and vehicles are not allowed) (sign will be asked later)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets')", "value": "no" }, { "key": "bicycle", - "description": "Layer 'Future cyclestreet' shows bicycle_road=yes&maxspeed=30&source:maxspeed=DE:bicycle_road&vehicle=no&bicycle=designated with a fixed text, namely 'This street is a bicycle road (has a speed limit of 30 km/h and vehicles are not allowed) (sign will be asked later)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets')", + "description": "Layer 'Future cyclestreet' shows bicycle_road=yes &maxspeed=30 &source:maxspeed=DE:bicycle_road &vehicle=no &bicycle=designated with a fixed text, namely 'This street is a bicycle road (has a speed limit of 30 km/h and vehicles are not allowed) (sign will be asked later)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets')", "value": "designated" }, { @@ -301,27 +301,27 @@ }, { "key": "traffic_sign", - "description": "Layer 'Future cyclestreet' shows traffic_sign=DE:244.1,1020-30 with a fixed text, namely 'Residents allowed' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets') (This is only shown if bicycle_road=yes&_country=de)", + "description": "Layer 'Future cyclestreet' shows traffic_sign=DE:244.1,1020-30 with a fixed text, namely 'Residents allowed' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets') (This is only shown if bicycle_road=yes &_country=de)", "value": "DE:244.1,1020-30" }, { "key": "traffic_sign", - "description": "Layer 'Future cyclestreet' shows traffic_sign=DE:244.1,1022-12,1024-10 with a fixed text, namely 'Motor vehicles allowed' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets') (This is only shown if bicycle_road=yes&_country=de)", + "description": "Layer 'Future cyclestreet' shows traffic_sign=DE:244.1,1022-12,1024-10 with a fixed text, namely 'Motor vehicles allowed' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets') (This is only shown if bicycle_road=yes &_country=de)", "value": "DE:244.1,1022-12,1024-10" }, { "key": "traffic_sign", - "description": "Layer 'Future cyclestreet' shows traffic_sign=DE:244.1,1022-12 with a fixed text, namely 'Motorcycles allowed' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets') (This is only shown if bicycle_road=yes&_country=de)", + "description": "Layer 'Future cyclestreet' shows traffic_sign=DE:244.1,1022-12 with a fixed text, namely 'Motorcycles allowed' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets') (This is only shown if bicycle_road=yes &_country=de)", "value": "DE:244.1,1022-12" }, { "key": "traffic_sign", - "description": "Layer 'Future cyclestreet' shows traffic_sign=DE:244.1,1024-10 with a fixed text, namely 'Cars allowed' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets') (This is only shown if bicycle_road=yes&_country=de)", + "description": "Layer 'Future cyclestreet' shows traffic_sign=DE:244.1,1024-10 with a fixed text, namely 'Cars allowed' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets') (This is only shown if bicycle_road=yes &_country=de)", "value": "DE:244.1,1024-10" }, { "key": "traffic_sign", - "description": "Layer 'Future cyclestreet' shows traffic_sign=DE:244.1 with a fixed text, namely 'There are no supplementary signs at this bicycle road.' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets') (This is only shown if bicycle_road=yes&_country=de)", + "description": "Layer 'Future cyclestreet' shows traffic_sign=DE:244.1 with a fixed text, namely 'There are no supplementary signs at this bicycle road.' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets') (This is only shown if bicycle_road=yes &_country=de)", "value": "DE:244.1" }, { @@ -330,7 +330,7 @@ }, { "key": "id", - "description": "Layer 'Future cyclestreet' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Cyclestreets') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Future cyclestreet' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Cyclestreets') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -365,22 +365,22 @@ }, { "key": "cyclestreet", - "description": "Layer 'All streets' shows cyclestreet=yes&maxspeed=30&overtaking:motor_vehicle=no with a fixed text, namely 'This street is a cyclestreet (and has a speed limit of 30 km/h)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets')", + "description": "Layer 'All streets' shows cyclestreet=yes &maxspeed=30 &overtaking:motor_vehicle=no with a fixed text, namely 'This street is a cyclestreet (and has a speed limit of 30 km/h)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets')", "value": "yes" }, { "key": "maxspeed", - "description": "Layer 'All streets' shows cyclestreet=yes&maxspeed=30&overtaking:motor_vehicle=no with a fixed text, namely 'This street is a cyclestreet (and has a speed limit of 30 km/h)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets')", + "description": "Layer 'All streets' shows cyclestreet=yes &maxspeed=30 &overtaking:motor_vehicle=no with a fixed text, namely 'This street is a cyclestreet (and has a speed limit of 30 km/h)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets')", "value": "30" }, { "key": "overtaking:motor_vehicle", - "description": "Layer 'All streets' shows cyclestreet=yes&maxspeed=30&overtaking:motor_vehicle=no with a fixed text, namely 'This street is a cyclestreet (and has a speed limit of 30 km/h)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets')", + "description": "Layer 'All streets' shows cyclestreet=yes &maxspeed=30 &overtaking:motor_vehicle=no with a fixed text, namely 'This street is a cyclestreet (and has a speed limit of 30 km/h)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets')", "value": "no" }, { "key": "proposed:cyclestreet", - "description": "Layer 'All streets' shows cyclestreet=yes&maxspeed=30&overtaking:motor_vehicle=no with a fixed text, namely 'This street is a cyclestreet (and has a speed limit of 30 km/h)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets') Picking this answer will delete the key proposed:cyclestreet.", + "description": "Layer 'All streets' shows cyclestreet=yes &maxspeed=30 &overtaking:motor_vehicle=no with a fixed text, namely 'This street is a cyclestreet (and has a speed limit of 30 km/h)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets') Picking this answer will delete the key proposed:cyclestreet.", "value": "" }, { @@ -390,32 +390,32 @@ }, { "key": "bicycle_road", - "description": "Layer 'All streets' shows bicycle_road=yes&maxspeed=30&source:maxspeed=DE:bicycle_road&vehicle=no&bicycle=designated with a fixed text, namely 'This street is a bicycle road (has a speed limit of 30 km/h and vehicles are not allowed) (sign will be asked later)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets')", + "description": "Layer 'All streets' shows bicycle_road=yes &maxspeed=30 &source:maxspeed=DE:bicycle_road &vehicle=no &bicycle=designated with a fixed text, namely 'This street is a bicycle road (has a speed limit of 30 km/h and vehicles are not allowed) (sign will be asked later)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets')", "value": "yes" }, { "key": "proposed:bicycle_road", - "description": "Layer 'All streets' shows bicycle_road=yes&maxspeed=30&source:maxspeed=DE:bicycle_road&vehicle=no&bicycle=designated with a fixed text, namely 'This street is a bicycle road (has a speed limit of 30 km/h and vehicles are not allowed) (sign will be asked later)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets') Picking this answer will delete the key proposed:bicycle_road.", + "description": "Layer 'All streets' shows bicycle_road=yes &maxspeed=30 &source:maxspeed=DE:bicycle_road &vehicle=no &bicycle=designated with a fixed text, namely 'This street is a bicycle road (has a speed limit of 30 km/h and vehicles are not allowed) (sign will be asked later)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets') Picking this answer will delete the key proposed:bicycle_road.", "value": "" }, { "key": "maxspeed", - "description": "Layer 'All streets' shows bicycle_road=yes&maxspeed=30&source:maxspeed=DE:bicycle_road&vehicle=no&bicycle=designated with a fixed text, namely 'This street is a bicycle road (has a speed limit of 30 km/h and vehicles are not allowed) (sign will be asked later)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets')", + "description": "Layer 'All streets' shows bicycle_road=yes &maxspeed=30 &source:maxspeed=DE:bicycle_road &vehicle=no &bicycle=designated with a fixed text, namely 'This street is a bicycle road (has a speed limit of 30 km/h and vehicles are not allowed) (sign will be asked later)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets')", "value": "30" }, { "key": "source:maxspeed", - "description": "Layer 'All streets' shows bicycle_road=yes&maxspeed=30&source:maxspeed=DE:bicycle_road&vehicle=no&bicycle=designated with a fixed text, namely 'This street is a bicycle road (has a speed limit of 30 km/h and vehicles are not allowed) (sign will be asked later)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets')", + "description": "Layer 'All streets' shows bicycle_road=yes &maxspeed=30 &source:maxspeed=DE:bicycle_road &vehicle=no &bicycle=designated with a fixed text, namely 'This street is a bicycle road (has a speed limit of 30 km/h and vehicles are not allowed) (sign will be asked later)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets')", "value": "DE:bicycle_road" }, { "key": "vehicle", - "description": "Layer 'All streets' shows bicycle_road=yes&maxspeed=30&source:maxspeed=DE:bicycle_road&vehicle=no&bicycle=designated with a fixed text, namely 'This street is a bicycle road (has a speed limit of 30 km/h and vehicles are not allowed) (sign will be asked later)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets')", + "description": "Layer 'All streets' shows bicycle_road=yes &maxspeed=30 &source:maxspeed=DE:bicycle_road &vehicle=no &bicycle=designated with a fixed text, namely 'This street is a bicycle road (has a speed limit of 30 km/h and vehicles are not allowed) (sign will be asked later)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets')", "value": "no" }, { "key": "bicycle", - "description": "Layer 'All streets' shows bicycle_road=yes&maxspeed=30&source:maxspeed=DE:bicycle_road&vehicle=no&bicycle=designated with a fixed text, namely 'This street is a bicycle road (has a speed limit of 30 km/h and vehicles are not allowed) (sign will be asked later)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets')", + "description": "Layer 'All streets' shows bicycle_road=yes &maxspeed=30 &source:maxspeed=DE:bicycle_road &vehicle=no &bicycle=designated with a fixed text, namely 'This street is a bicycle road (has a speed limit of 30 km/h and vehicles are not allowed) (sign will be asked later)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets')", "value": "designated" }, { @@ -475,27 +475,27 @@ }, { "key": "traffic_sign", - "description": "Layer 'All streets' shows traffic_sign=DE:244.1,1020-30 with a fixed text, namely 'Residents allowed' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets') (This is only shown if bicycle_road=yes&_country=de)", + "description": "Layer 'All streets' shows traffic_sign=DE:244.1,1020-30 with a fixed text, namely 'Residents allowed' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets') (This is only shown if bicycle_road=yes &_country=de)", "value": "DE:244.1,1020-30" }, { "key": "traffic_sign", - "description": "Layer 'All streets' shows traffic_sign=DE:244.1,1022-12,1024-10 with a fixed text, namely 'Motor vehicles allowed' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets') (This is only shown if bicycle_road=yes&_country=de)", + "description": "Layer 'All streets' shows traffic_sign=DE:244.1,1022-12,1024-10 with a fixed text, namely 'Motor vehicles allowed' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets') (This is only shown if bicycle_road=yes &_country=de)", "value": "DE:244.1,1022-12,1024-10" }, { "key": "traffic_sign", - "description": "Layer 'All streets' shows traffic_sign=DE:244.1,1022-12 with a fixed text, namely 'Motorcycles allowed' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets') (This is only shown if bicycle_road=yes&_country=de)", + "description": "Layer 'All streets' shows traffic_sign=DE:244.1,1022-12 with a fixed text, namely 'Motorcycles allowed' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets') (This is only shown if bicycle_road=yes &_country=de)", "value": "DE:244.1,1022-12" }, { "key": "traffic_sign", - "description": "Layer 'All streets' shows traffic_sign=DE:244.1,1024-10 with a fixed text, namely 'Cars allowed' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets') (This is only shown if bicycle_road=yes&_country=de)", + "description": "Layer 'All streets' shows traffic_sign=DE:244.1,1024-10 with a fixed text, namely 'Cars allowed' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets') (This is only shown if bicycle_road=yes &_country=de)", "value": "DE:244.1,1024-10" }, { "key": "traffic_sign", - "description": "Layer 'All streets' shows traffic_sign=DE:244.1 with a fixed text, namely 'There are no supplementary signs at this bicycle road.' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets') (This is only shown if bicycle_road=yes&_country=de)", + "description": "Layer 'All streets' shows traffic_sign=DE:244.1 with a fixed text, namely 'There are no supplementary signs at this bicycle road.' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclestreets') (This is only shown if bicycle_road=yes &_country=de)", "value": "DE:244.1" }, { @@ -504,7 +504,7 @@ }, { "key": "id", - "description": "Layer 'All streets' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Cyclestreets') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'All streets' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Cyclestreets') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", diff --git a/Docs/TagInfo/mapcomplete_cyclofix.json b/Docs/TagInfo/mapcomplete_cyclofix.json index 4a050062c..36d270ac2 100644 --- a/Docs/TagInfo/mapcomplete_cyclofix.json +++ b/Docs/TagInfo/mapcomplete_cyclofix.json @@ -52,7 +52,7 @@ }, { "key": "id", - "description": "Layer 'Bike cafe' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Bike cafe' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -159,7 +159,7 @@ }, { "key": "id", - "description": "Layer 'Bike repair/shop' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Bike repair/shop' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -179,7 +179,7 @@ }, { "key": "shop", - "description": "Layer 'Bike repair/shop' shows shop=rental with a fixed text, namely 'This business focuses on rental' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if shop~.+&shop!~^(bicycle)$&shop!~^(sports)$)", + "description": "Layer 'Bike repair/shop' shows shop=rental with a fixed text, namely 'This business focuses on rental' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if shop~.+ &shop!~^(bicycle)$ &shop!~^(sports)$)", "value": "rental" }, { @@ -304,31 +304,31 @@ }, { "key": "capacity:city_bike", - "description": "Layer 'Bike repair/shop' shows and asks freeform values for key 'capacity:city_bike' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if rental~^(.*city_bike.*)$&service:bicycle:rental=yes)" + "description": "Layer 'Bike repair/shop' shows and asks freeform values for key 'capacity:city_bike' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if rental~^(.*city_bike.*)$ &service:bicycle:rental=yes)" }, { "key": "capacity:ebike", - "description": "Layer 'Bike repair/shop' shows and asks freeform values for key 'capacity:ebike' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if rental~^(.*ebike.*)$&service:bicycle:rental=yes)" + "description": "Layer 'Bike repair/shop' shows and asks freeform values for key 'capacity:ebike' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if rental~^(.*ebike.*)$ &service:bicycle:rental=yes)" }, { "key": "capacity:kid_bike", - "description": "Layer 'Bike repair/shop' shows and asks freeform values for key 'capacity:kid_bike' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if rental~^(.*kid_bike.*)$&service:bicycle:rental=yes)" + "description": "Layer 'Bike repair/shop' shows and asks freeform values for key 'capacity:kid_bike' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if rental~^(.*kid_bike.*)$ &service:bicycle:rental=yes)" }, { "key": "capacity:bmx", - "description": "Layer 'Bike repair/shop' shows and asks freeform values for key 'capacity:bmx' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if rental~^(.*bmx.*)$&service:bicycle:rental=yes)" + "description": "Layer 'Bike repair/shop' shows and asks freeform values for key 'capacity:bmx' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if rental~^(.*bmx.*)$ &service:bicycle:rental=yes)" }, { "key": "capacity:mtb", - "description": "Layer 'Bike repair/shop' shows and asks freeform values for key 'capacity:mtb' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if rental~^(.*mtb.*)$&service:bicycle:rental=yes)" + "description": "Layer 'Bike repair/shop' shows and asks freeform values for key 'capacity:mtb' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if rental~^(.*mtb.*)$ &service:bicycle:rental=yes)" }, { "key": "capacity:bicycle_pannier", - "description": "Layer 'Bike repair/shop' shows and asks freeform values for key 'capacity:bicycle_pannier' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if rental~^(.*bicycle_pannier.*)$&service:bicycle:rental=yes)" + "description": "Layer 'Bike repair/shop' shows and asks freeform values for key 'capacity:bicycle_pannier' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if rental~^(.*bicycle_pannier.*)$ &service:bicycle:rental=yes)" }, { "key": "capacity:tandem_bicycle", - "description": "Layer 'Bike repair/shop' shows and asks freeform values for key 'capacity:tandem_bicycle' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if rental~^(.*tandem_bicycle.*)$&service:bicycle:rental=yes)" + "description": "Layer 'Bike repair/shop' shows and asks freeform values for key 'capacity:tandem_bicycle' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if rental~^(.*tandem_bicycle.*)$ &service:bicycle:rental=yes)" }, { "key": "service:bicycle:second_hand", @@ -392,21 +392,21 @@ }, { "key": "service:bicycle:cleaning:charge", - "description": "Layer 'Bike repair/shop' shows and asks freeform values for key 'service:bicycle:cleaning:charge' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if amenity!=bike_wash&amenity!=bicycle_wash)" + "description": "Layer 'Bike repair/shop' shows and asks freeform values for key 'service:bicycle:cleaning:charge' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if amenity!=bike_wash &amenity!=bicycle_wash)" }, { "key": "service:bicycle:cleaning:fee", - "description": "Layer 'Bike repair/shop' shows service:bicycle:cleaning:fee=no with a fixed text, namely 'The cleaning service is free to use' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if amenity!=bike_wash&amenity!=bicycle_wash)", + "description": "Layer 'Bike repair/shop' shows service:bicycle:cleaning:fee=no with a fixed text, namely 'The cleaning service is free to use' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if amenity!=bike_wash &amenity!=bicycle_wash)", "value": "no" }, { "key": "service:bicycle:cleaning:fee", - "description": "Layer 'Bike repair/shop' shows service:bicycle:cleaning:fee=yes with a fixed text, namely 'Free to use' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if amenity!=bike_wash&amenity!=bicycle_wash)", + "description": "Layer 'Bike repair/shop' shows service:bicycle:cleaning:fee=yes with a fixed text, namely 'Free to use' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if amenity!=bike_wash &amenity!=bicycle_wash)", "value": "yes" }, { "key": "service:bicycle:cleaning:charge", - "description": "Layer 'Bike repair/shop' shows service:bicycle:cleaning:fee=yes with a fixed text, namely 'Free to use' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') Picking this answer will delete the key service:bicycle:cleaning:charge. (This is only shown if amenity!=bike_wash&amenity!=bicycle_wash)", + "description": "Layer 'Bike repair/shop' shows service:bicycle:cleaning:fee=yes with a fixed text, namely 'Free to use' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') Picking this answer will delete the key service:bicycle:cleaning:charge. (This is only shown if amenity!=bike_wash &amenity!=bicycle_wash)", "value": "" }, { @@ -433,7 +433,7 @@ }, { "key": "id", - "description": "Layer 'Bicycle rental' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Bicycle rental' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -453,12 +453,12 @@ }, { "key": "shop", - "description": "Layer 'Bicycle rental' shows shop=rental&bicycle_rental=shop with a fixed text, namely 'This is a shop whose main focus is bicycle rental' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if amenity=bicycle_rental)", + "description": "Layer 'Bicycle rental' shows shop=rental &bicycle_rental=shop with a fixed text, namely 'This is a shop whose main focus is bicycle rental' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if amenity=bicycle_rental)", "value": "rental" }, { "key": "bicycle_rental", - "description": "Layer 'Bicycle rental' shows shop=rental&bicycle_rental=shop with a fixed text, namely 'This is a shop whose main focus is bicycle rental' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if amenity=bicycle_rental)", + "description": "Layer 'Bicycle rental' shows shop=rental &bicycle_rental=shop with a fixed text, namely 'This is a shop whose main focus is bicycle rental' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if amenity=bicycle_rental)", "value": "shop" }, { @@ -468,12 +468,12 @@ }, { "key": "service:bicycle:rental", - "description": "Layer 'Bicycle rental' shows service:bicycle:rental=yes&shop=bicycle with a fixed text, namely 'This is a shop which sells or repairs bicycles, but also rents out bicycles' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if amenity=bicycle_rental)", + "description": "Layer 'Bicycle rental' shows service:bicycle:rental=yes &shop=bicycle with a fixed text, namely 'This is a shop which sells or repairs bicycles, but also rents out bicycles' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if amenity=bicycle_rental)", "value": "yes" }, { "key": "shop", - "description": "Layer 'Bicycle rental' shows service:bicycle:rental=yes&shop=bicycle with a fixed text, namely 'This is a shop which sells or repairs bicycles, but also rents out bicycles' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if amenity=bicycle_rental)", + "description": "Layer 'Bicycle rental' shows service:bicycle:rental=yes &shop=bicycle with a fixed text, namely 'This is a shop which sells or repairs bicycles, but also rents out bicycles' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if amenity=bicycle_rental)", "value": "bicycle" }, { @@ -517,7 +517,7 @@ }, { "key": "opening_hours", - "description": "Layer 'Bicycle rental' shows and asks freeform values for key 'opening_hours' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if shop~.+|opening_hours~.+)" + "description": "Layer 'Bicycle rental' shows and asks freeform values for key 'opening_hours' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if shop~.+ |opening_hours~.+)" }, { "key": "payment:cash", @@ -638,7 +638,7 @@ }, { "key": "id", - "description": "Layer 'Bicycle library' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Bicycle library' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -704,12 +704,12 @@ }, { "key": "fee", - "description": "Layer 'Bicycle library' shows fee=yes&charge=€20warranty + €20/year with a fixed text, namely 'Lending a bicycle costs €20/year and €20 warranty' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')", + "description": "Layer 'Bicycle library' shows fee=yes &charge=€20warranty + €20/year with a fixed text, namely 'Lending a bicycle costs €20/year and €20 warranty' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')", "value": "yes" }, { "key": "charge", - "description": "Layer 'Bicycle library' shows fee=yes&charge=€20warranty + €20/year with a fixed text, namely 'Lending a bicycle costs €20/year and €20 warranty' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')", + "description": "Layer 'Bicycle library' shows fee=yes &charge=€20warranty + €20/year with a fixed text, namely 'Lending a bicycle costs €20/year and €20 warranty' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')", "value": "€20warranty + €20/year" }, { @@ -738,7 +738,7 @@ }, { "key": "id", - "description": "Layer 'Bicycle pump and repair' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Bicycle pump and repair' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -758,32 +758,32 @@ }, { "key": "service:bicycle:tools", - "description": "Layer 'Bicycle pump and repair' shows service:bicycle:tools=no&service:bicycle:pump=yes with a fixed text, namely 'There is only a pump present' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')", + "description": "Layer 'Bicycle pump and repair' shows service:bicycle:tools=no &service:bicycle:pump=yes with a fixed text, namely 'There is only a pump present' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')", "value": "no" }, { "key": "service:bicycle:pump", - "description": "Layer 'Bicycle pump and repair' shows service:bicycle:tools=no&service:bicycle:pump=yes with a fixed text, namely 'There is only a pump present' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')", + "description": "Layer 'Bicycle pump and repair' shows service:bicycle:tools=no &service:bicycle:pump=yes with a fixed text, namely 'There is only a pump present' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')", "value": "yes" }, { "key": "service:bicycle:tools", - "description": "Layer 'Bicycle pump and repair' shows service:bicycle:tools=yes&service:bicycle:pump=no with a fixed text, namely 'There are only tools (screwdrivers, pliers, …) present' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')", + "description": "Layer 'Bicycle pump and repair' shows service:bicycle:tools=yes &service:bicycle:pump=no with a fixed text, namely 'There are only tools (screwdrivers, pliers, …) present' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')", "value": "yes" }, { "key": "service:bicycle:pump", - "description": "Layer 'Bicycle pump and repair' shows service:bicycle:tools=yes&service:bicycle:pump=no with a fixed text, namely 'There are only tools (screwdrivers, pliers, …) present' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')", + "description": "Layer 'Bicycle pump and repair' shows service:bicycle:tools=yes &service:bicycle:pump=no with a fixed text, namely 'There are only tools (screwdrivers, pliers, …) present' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')", "value": "no" }, { "key": "service:bicycle:tools", - "description": "Layer 'Bicycle pump and repair' shows service:bicycle:tools=yes&service:bicycle:pump=yes with a fixed text, namely 'There are both tools and a pump present' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')", + "description": "Layer 'Bicycle pump and repair' shows service:bicycle:tools=yes &service:bicycle:pump=yes with a fixed text, namely 'There are both tools and a pump present' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')", "value": "yes" }, { "key": "service:bicycle:pump", - "description": "Layer 'Bicycle pump and repair' shows service:bicycle:tools=yes&service:bicycle:pump=yes with a fixed text, namely 'There are both tools and a pump present' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')", + "description": "Layer 'Bicycle pump and repair' shows service:bicycle:tools=yes &service:bicycle:pump=yes with a fixed text, namely 'There are both tools and a pump present' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')", "value": "yes" }, { @@ -946,7 +946,7 @@ }, { "key": "id", - "description": "Layer 'Bicycle tube vending machine' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Bicycle tube vending machine' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -1092,7 +1092,7 @@ }, { "key": "id", - "description": "Layer 'Drinking water' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Drinking water' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -1186,7 +1186,7 @@ }, { "key": "id", - "description": "Layer 'Bike-related object' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Bike-related object' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -1258,7 +1258,7 @@ }, { "key": "id", - "description": "Layer 'Bike cleaning service' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Bike cleaning service' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -1278,35 +1278,35 @@ }, { "key": "service:bicycle:cleaning:charge", - "description": "Layer 'Bike cleaning service' shows and asks freeform values for key 'service:bicycle:cleaning:charge' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if amenity!=bike_wash&amenity!=bicycle_wash)" + "description": "Layer 'Bike cleaning service' shows and asks freeform values for key 'service:bicycle:cleaning:charge' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if amenity!=bike_wash &amenity!=bicycle_wash)" }, { "key": "service:bicycle:cleaning:fee", - "description": "Layer 'Bike cleaning service' shows service:bicycle:cleaning:fee=no with a fixed text, namely 'The cleaning service is free to use' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if amenity!=bike_wash&amenity!=bicycle_wash)", + "description": "Layer 'Bike cleaning service' shows service:bicycle:cleaning:fee=no with a fixed text, namely 'The cleaning service is free to use' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if amenity!=bike_wash &amenity!=bicycle_wash)", "value": "no" }, { "key": "service:bicycle:cleaning:fee", - "description": "Layer 'Bike cleaning service' shows service:bicycle:cleaning:fee=yes with a fixed text, namely 'Free to use' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if amenity!=bike_wash&amenity!=bicycle_wash)", + "description": "Layer 'Bike cleaning service' shows service:bicycle:cleaning:fee=yes with a fixed text, namely 'Free to use' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if amenity!=bike_wash &amenity!=bicycle_wash)", "value": "yes" }, { "key": "service:bicycle:cleaning:charge", - "description": "Layer 'Bike cleaning service' shows service:bicycle:cleaning:fee=yes with a fixed text, namely 'Free to use' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') Picking this answer will delete the key service:bicycle:cleaning:charge. (This is only shown if amenity!=bike_wash&amenity!=bicycle_wash)", + "description": "Layer 'Bike cleaning service' shows service:bicycle:cleaning:fee=yes with a fixed text, namely 'Free to use' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') Picking this answer will delete the key service:bicycle:cleaning:charge. (This is only shown if amenity!=bike_wash &amenity!=bicycle_wash)", "value": "" }, { "key": "charge", - "description": "Layer 'Bike cleaning service' shows and asks freeform values for key 'charge' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if amenity=bike_wash|amenity=bicycle_wash)" + "description": "Layer 'Bike cleaning service' shows and asks freeform values for key 'charge' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if amenity=bike_wash |amenity=bicycle_wash)" }, { "key": "fee", - "description": "Layer 'Bike cleaning service' shows fee=no with a fixed text, namely 'This cleaning service is free to use' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if amenity=bike_wash|amenity=bicycle_wash)", + "description": "Layer 'Bike cleaning service' shows fee=no with a fixed text, namely 'This cleaning service is free to use' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if amenity=bike_wash |amenity=bicycle_wash)", "value": "no" }, { "key": "fee", - "description": "Layer 'Bike cleaning service' shows fee=yes with a fixed text, namely 'There is a fee to use this cleaning service' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if amenity=bike_wash|amenity=bicycle_wash)", + "description": "Layer 'Bike cleaning service' shows fee=yes with a fixed text, namely 'There is a fee to use this cleaning service' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if amenity=bike_wash |amenity=bicycle_wash)", "value": "yes" }, { @@ -1316,7 +1316,7 @@ }, { "key": "id", - "description": "Layer 'Bike parking' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Bike parking' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -1400,12 +1400,12 @@ }, { "key": "covered", - "description": "Layer 'Bike parking' shows covered=yes with a fixed text, namely 'This parking is covered (it has a roof)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if bicycle_parking!=shed&location!=underground)", + "description": "Layer 'Bike parking' shows covered=yes with a fixed text, namely 'This parking is covered (it has a roof)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if bicycle_parking!=shed &location!=underground)", "value": "yes" }, { "key": "covered", - "description": "Layer 'Bike parking' shows covered=no with a fixed text, namely 'This parking is not covered' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if bicycle_parking!=shed&location!=underground)", + "description": "Layer 'Bike parking' shows covered=no with a fixed text, namely 'This parking is not covered' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if bicycle_parking!=shed &location!=underground)", "value": "no" }, { @@ -1477,7 +1477,7 @@ }, { "key": "id", - "description": "Layer 'Charging stations' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Charging stations' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -1565,7 +1565,7 @@ }, { "key": "socket:schuko", - "description": "Layer 'Charging stations' shows socket:schuko~.+&socket:schuko!=1 with a fixed text, namely 'Schuko wall plug without ground pin (CEE7/4 type F)' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')" + "description": "Layer 'Charging stations' shows socket:schuko~.+ &socket:schuko!=1 with a fixed text, namely 'Schuko wall plug without ground pin (CEE7/4 type F)' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')" }, { "key": "socket:typee", @@ -1574,7 +1574,7 @@ }, { "key": "socket:typee", - "description": "Layer 'Charging stations' shows socket:typee~.+&socket:typee!=1 with a fixed text, namely 'European wall plug with ground pin (CEE7/4 type E)' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')" + "description": "Layer 'Charging stations' shows socket:typee~.+ &socket:typee!=1 with a fixed text, namely 'European wall plug with ground pin (CEE7/4 type E)' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')" }, { "key": "socket:chademo", @@ -1583,7 +1583,7 @@ }, { "key": "socket:chademo", - "description": "Layer 'Charging stations' shows socket:chademo~.+&socket:chademo!=1 with a fixed text, namely 'Chademo' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')" + "description": "Layer 'Charging stations' shows socket:chademo~.+ &socket:chademo!=1 with a fixed text, namely 'Chademo' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')" }, { "key": "socket:type1_cable", @@ -1592,7 +1592,7 @@ }, { "key": "socket:type1_cable", - "description": "Layer 'Charging stations' shows socket:type1_cable~.+&socket:type1_cable!=1 with a fixed text, namely 'Type 1 with cable (J1772)' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')" + "description": "Layer 'Charging stations' shows socket:type1_cable~.+ &socket:type1_cable!=1 with a fixed text, namely 'Type 1 with cable (J1772)' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')" }, { "key": "socket:type1", @@ -1601,7 +1601,7 @@ }, { "key": "socket:type1", - "description": "Layer 'Charging stations' shows socket:type1~.+&socket:type1!=1 with a fixed text, namely 'Type 1 without cable (J1772)' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')" + "description": "Layer 'Charging stations' shows socket:type1~.+ &socket:type1!=1 with a fixed text, namely 'Type 1 without cable (J1772)' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')" }, { "key": "socket:type1_combo", @@ -1610,7 +1610,7 @@ }, { "key": "socket:type1_combo", - "description": "Layer 'Charging stations' shows socket:type1_combo~.+&socket:type1_combo!=1 with a fixed text, namely 'Type 1 CCS (aka Type 1 Combo)' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')" + "description": "Layer 'Charging stations' shows socket:type1_combo~.+ &socket:type1_combo!=1 with a fixed text, namely 'Type 1 CCS (aka Type 1 Combo)' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')" }, { "key": "socket:tesla_supercharger", @@ -1619,7 +1619,7 @@ }, { "key": "socket:tesla_supercharger", - "description": "Layer 'Charging stations' shows socket:tesla_supercharger~.+&socket:tesla_supercharger!=1 with a fixed text, namely 'Tesla Supercharger' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')" + "description": "Layer 'Charging stations' shows socket:tesla_supercharger~.+ &socket:tesla_supercharger!=1 with a fixed text, namely 'Tesla Supercharger' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')" }, { "key": "socket:type2", @@ -1628,7 +1628,7 @@ }, { "key": "socket:type2", - "description": "Layer 'Charging stations' shows socket:type2~.+&socket:type2!=1 with a fixed text, namely 'Type 2 (mennekes)' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')" + "description": "Layer 'Charging stations' shows socket:type2~.+ &socket:type2!=1 with a fixed text, namely 'Type 2 (mennekes)' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')" }, { "key": "socket:type2_combo", @@ -1637,7 +1637,7 @@ }, { "key": "socket:type2_combo", - "description": "Layer 'Charging stations' shows socket:type2_combo~.+&socket:type2_combo!=1 with a fixed text, namely 'Type 2 CCS (mennekes)' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')" + "description": "Layer 'Charging stations' shows socket:type2_combo~.+ &socket:type2_combo!=1 with a fixed text, namely 'Type 2 CCS (mennekes)' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')" }, { "key": "socket:type2_cable", @@ -1646,7 +1646,7 @@ }, { "key": "socket:type2_cable", - "description": "Layer 'Charging stations' shows socket:type2_cable~.+&socket:type2_cable!=1 with a fixed text, namely 'Type 2 with cable (mennekes)' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')" + "description": "Layer 'Charging stations' shows socket:type2_cable~.+ &socket:type2_cable!=1 with a fixed text, namely 'Type 2 with cable (mennekes)' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')" }, { "key": "socket:tesla_supercharger_ccs", @@ -1655,7 +1655,7 @@ }, { "key": "socket:tesla_supercharger_ccs", - "description": "Layer 'Charging stations' shows socket:tesla_supercharger_ccs~.+&socket:tesla_supercharger_ccs!=1 with a fixed text, namely 'Tesla Supercharger CCS (a branded type2_css)' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')" + "description": "Layer 'Charging stations' shows socket:tesla_supercharger_ccs~.+ &socket:tesla_supercharger_ccs!=1 with a fixed text, namely 'Tesla Supercharger CCS (a branded type2_css)' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')" }, { "key": "socket:tesla_destination", @@ -1664,7 +1664,7 @@ }, { "key": "socket:tesla_destination", - "description": "Layer 'Charging stations' shows socket:tesla_destination~.+&socket:tesla_destination!=1&_country=us with a fixed text, namely 'Tesla Supercharger (destination)' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')" + "description": "Layer 'Charging stations' shows socket:tesla_destination~.+ &socket:tesla_destination!=1 &_country=us with a fixed text, namely 'Tesla Supercharger (destination)' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')" }, { "key": "socket:tesla_destination", @@ -1673,7 +1673,7 @@ }, { "key": "socket:tesla_destination", - "description": "Layer 'Charging stations' shows socket:tesla_destination~.+&socket:tesla_destination!=1&_country!=us with a fixed text, namely 'Tesla supercharger (destination) (A Type 2 with cable branded as tesla)' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')" + "description": "Layer 'Charging stations' shows socket:tesla_destination~.+ &socket:tesla_destination!=1 &_country!=us with a fixed text, namely 'Tesla supercharger (destination) (A Type 2 with cable branded as tesla)' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')" }, { "key": "socket:USB-A", @@ -1682,7 +1682,7 @@ }, { "key": "socket:USB-A", - "description": "Layer 'Charging stations' shows socket:USB-A~.+&socket:USB-A!=1 with a fixed text, namely 'USB to charge phones and small electronics' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')" + "description": "Layer 'Charging stations' shows socket:USB-A~.+ &socket:USB-A!=1 with a fixed text, namely 'USB to charge phones and small electronics' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')" }, { "key": "socket:bosch_3pin", @@ -1691,7 +1691,7 @@ }, { "key": "socket:bosch_3pin", - "description": "Layer 'Charging stations' shows socket:bosch_3pin~.+&socket:bosch_3pin!=1 with a fixed text, namely 'Bosch Active Connect with 3 pins and cable' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')" + "description": "Layer 'Charging stations' shows socket:bosch_3pin~.+ &socket:bosch_3pin!=1 with a fixed text, namely 'Bosch Active Connect with 3 pins and cable' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')" }, { "key": "socket:bosch_5pin", @@ -1700,638 +1700,638 @@ }, { "key": "socket:bosch_5pin", - "description": "Layer 'Charging stations' shows socket:bosch_5pin~.+&socket:bosch_5pin!=1 with a fixed text, namely 'Bosch Active Connect with 5 pins and cable' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')" + "description": "Layer 'Charging stations' shows socket:bosch_5pin~.+ &socket:bosch_5pin!=1 with a fixed text, namely 'Bosch Active Connect with 5 pins and cable' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')" }, { "key": "socket:schuko", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:schuko' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:schuko~.+&socket:schuko!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:schuko' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:schuko~.+ &socket:schuko!=0)" }, { "key": "socket:typee", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:typee' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:typee~.+&socket:typee!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:typee' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:typee~.+ &socket:typee!=0)" }, { "key": "socket:chademo", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:chademo' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:chademo~.+&socket:chademo!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:chademo' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:chademo~.+ &socket:chademo!=0)" }, { "key": "socket:type1_cable", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1_cable' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type1_cable~.+&socket:type1_cable!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1_cable' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type1_cable~.+ &socket:type1_cable!=0)" }, { "key": "socket:type1", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type1~.+&socket:type1!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type1~.+ &socket:type1!=0)" }, { "key": "socket:type1_combo", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1_combo' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type1_combo~.+&socket:type1_combo!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1_combo' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type1_combo~.+ &socket:type1_combo!=0)" }, { "key": "socket:tesla_supercharger", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_supercharger' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_supercharger~.+&socket:tesla_supercharger!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_supercharger' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_supercharger~.+ &socket:tesla_supercharger!=0)" }, { "key": "socket:type2", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type2~.+&socket:type2!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type2~.+ &socket:type2!=0)" }, { "key": "socket:type2_combo", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2_combo' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type2_combo~.+&socket:type2_combo!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2_combo' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type2_combo~.+ &socket:type2_combo!=0)" }, { "key": "socket:type2_cable", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2_cable' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type2_cable~.+&socket:type2_cable!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2_cable' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type2_cable~.+ &socket:type2_cable!=0)" }, { "key": "socket:tesla_supercharger_ccs", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_supercharger_ccs' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_supercharger_ccs~.+&socket:tesla_supercharger_ccs!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_supercharger_ccs' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_supercharger_ccs~.+ &socket:tesla_supercharger_ccs!=0)" }, { "key": "socket:tesla_destination", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_destination' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_destination~.+&socket:tesla_destination!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_destination' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_destination~.+ &socket:tesla_destination!=0)" }, { "key": "socket:tesla_destination", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_destination' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_destination~.+&socket:tesla_destination!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_destination' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_destination~.+ &socket:tesla_destination!=0)" }, { "key": "socket:USB-A", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:USB-A' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:USB-A~.+&socket:USB-A!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:USB-A' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:USB-A~.+ &socket:USB-A!=0)" }, { "key": "socket:bosch_3pin", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:bosch_3pin' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:bosch_3pin~.+&socket:bosch_3pin!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:bosch_3pin' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:bosch_3pin~.+ &socket:bosch_3pin!=0)" }, { "key": "socket:bosch_5pin", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:bosch_5pin' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:bosch_5pin~.+&socket:bosch_5pin!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:bosch_5pin' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:bosch_5pin~.+ &socket:bosch_5pin!=0)" }, { "key": "socket:schuko:voltage", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:schuko:voltage' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:schuko~.+&socket:schuko!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:schuko:voltage' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:schuko~.+ &socket:schuko!=0)" }, { "key": "socket:schuko:voltage", - "description": "Layer 'Charging stations' shows socket:schuko:voltage=230 V with a fixed text, namely 'Schuko wall plug without ground pin (CEE7/4 type F) outputs 230 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:schuko~.+&socket:schuko!=0)", + "description": "Layer 'Charging stations' shows socket:schuko:voltage=230 V with a fixed text, namely 'Schuko wall plug without ground pin (CEE7/4 type F) outputs 230 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:schuko~.+ &socket:schuko!=0)", "value": "230 V" }, { "key": "socket:schuko:current", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:schuko:current' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:schuko~.+&socket:schuko!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:schuko:current' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:schuko~.+ &socket:schuko!=0)" }, { "key": "socket:schuko:current", - "description": "Layer 'Charging stations' shows socket:schuko:current=16 A with a fixed text, namely 'Schuko wall plug without ground pin (CEE7/4 type F) outputs at most 16 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:schuko~.+&socket:schuko!=0)", + "description": "Layer 'Charging stations' shows socket:schuko:current=16 A with a fixed text, namely 'Schuko wall plug without ground pin (CEE7/4 type F) outputs at most 16 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:schuko~.+ &socket:schuko!=0)", "value": "16 A" }, { "key": "socket:schuko:output", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:schuko:output' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:schuko~.+&socket:schuko!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:schuko:output' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:schuko~.+ &socket:schuko!=0)" }, { "key": "socket:schuko:output", - "description": "Layer 'Charging stations' shows socket:schuko:output=3.6 kW with a fixed text, namely 'Schuko wall plug without ground pin (CEE7/4 type F) outputs at most 3.6 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:schuko~.+&socket:schuko!=0)", + "description": "Layer 'Charging stations' shows socket:schuko:output=3.6 kW with a fixed text, namely 'Schuko wall plug without ground pin (CEE7/4 type F) outputs at most 3.6 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:schuko~.+ &socket:schuko!=0)", "value": "3.6 kW" }, { "key": "socket:typee:voltage", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:typee:voltage' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:typee~.+&socket:typee!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:typee:voltage' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:typee~.+ &socket:typee!=0)" }, { "key": "socket:typee:voltage", - "description": "Layer 'Charging stations' shows socket:typee:voltage=230 V with a fixed text, namely 'European wall plug with ground pin (CEE7/4 type E) outputs 230 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:typee~.+&socket:typee!=0)", + "description": "Layer 'Charging stations' shows socket:typee:voltage=230 V with a fixed text, namely 'European wall plug with ground pin (CEE7/4 type E) outputs 230 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:typee~.+ &socket:typee!=0)", "value": "230 V" }, { "key": "socket:typee:current", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:typee:current' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:typee~.+&socket:typee!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:typee:current' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:typee~.+ &socket:typee!=0)" }, { "key": "socket:typee:current", - "description": "Layer 'Charging stations' shows socket:typee:current=16 A with a fixed text, namely 'European wall plug with ground pin (CEE7/4 type E) outputs at most 16 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:typee~.+&socket:typee!=0)", + "description": "Layer 'Charging stations' shows socket:typee:current=16 A with a fixed text, namely 'European wall plug with ground pin (CEE7/4 type E) outputs at most 16 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:typee~.+ &socket:typee!=0)", "value": "16 A" }, { "key": "socket:typee:output", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:typee:output' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:typee~.+&socket:typee!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:typee:output' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:typee~.+ &socket:typee!=0)" }, { "key": "socket:typee:output", - "description": "Layer 'Charging stations' shows socket:typee:output=3 kW with a fixed text, namely 'European wall plug with ground pin (CEE7/4 type E) outputs at most 3 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:typee~.+&socket:typee!=0)", + "description": "Layer 'Charging stations' shows socket:typee:output=3 kW with a fixed text, namely 'European wall plug with ground pin (CEE7/4 type E) outputs at most 3 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:typee~.+ &socket:typee!=0)", "value": "3 kW" }, { "key": "socket:typee:output", - "description": "Layer 'Charging stations' shows socket:typee:output=22 kW with a fixed text, namely 'European wall plug with ground pin (CEE7/4 type E) outputs at most 22 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:typee~.+&socket:typee!=0)", + "description": "Layer 'Charging stations' shows socket:typee:output=22 kW with a fixed text, namely 'European wall plug with ground pin (CEE7/4 type E) outputs at most 22 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:typee~.+ &socket:typee!=0)", "value": "22 kW" }, { "key": "socket:chademo:voltage", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:chademo:voltage' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:chademo~.+&socket:chademo!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:chademo:voltage' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:chademo~.+ &socket:chademo!=0)" }, { "key": "socket:chademo:voltage", - "description": "Layer 'Charging stations' shows socket:chademo:voltage=500 V with a fixed text, namely 'Chademo outputs 500 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:chademo~.+&socket:chademo!=0)", + "description": "Layer 'Charging stations' shows socket:chademo:voltage=500 V with a fixed text, namely 'Chademo outputs 500 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:chademo~.+ &socket:chademo!=0)", "value": "500 V" }, { "key": "socket:chademo:current", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:chademo:current' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:chademo~.+&socket:chademo!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:chademo:current' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:chademo~.+ &socket:chademo!=0)" }, { "key": "socket:chademo:current", - "description": "Layer 'Charging stations' shows socket:chademo:current=120 A with a fixed text, namely 'Chademo outputs at most 120 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:chademo~.+&socket:chademo!=0)", + "description": "Layer 'Charging stations' shows socket:chademo:current=120 A with a fixed text, namely 'Chademo outputs at most 120 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:chademo~.+ &socket:chademo!=0)", "value": "120 A" }, { "key": "socket:chademo:output", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:chademo:output' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:chademo~.+&socket:chademo!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:chademo:output' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:chademo~.+ &socket:chademo!=0)" }, { "key": "socket:chademo:output", - "description": "Layer 'Charging stations' shows socket:chademo:output=50 kW with a fixed text, namely 'Chademo outputs at most 50 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:chademo~.+&socket:chademo!=0)", + "description": "Layer 'Charging stations' shows socket:chademo:output=50 kW with a fixed text, namely 'Chademo outputs at most 50 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:chademo~.+ &socket:chademo!=0)", "value": "50 kW" }, { "key": "socket:type1_cable:voltage", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1_cable:voltage' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type1_cable~.+&socket:type1_cable!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1_cable:voltage' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type1_cable~.+ &socket:type1_cable!=0)" }, { "key": "socket:type1_cable:voltage", - "description": "Layer 'Charging stations' shows socket:type1_cable:voltage=200 V with a fixed text, namely 'Type 1 with cable (J1772) outputs 200 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type1_cable~.+&socket:type1_cable!=0)", + "description": "Layer 'Charging stations' shows socket:type1_cable:voltage=200 V with a fixed text, namely 'Type 1 with cable (J1772) outputs 200 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type1_cable~.+ &socket:type1_cable!=0)", "value": "200 V" }, { "key": "socket:type1_cable:voltage", - "description": "Layer 'Charging stations' shows socket:type1_cable:voltage=240 V with a fixed text, namely 'Type 1 with cable (J1772) outputs 240 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type1_cable~.+&socket:type1_cable!=0)", + "description": "Layer 'Charging stations' shows socket:type1_cable:voltage=240 V with a fixed text, namely 'Type 1 with cable (J1772) outputs 240 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type1_cable~.+ &socket:type1_cable!=0)", "value": "240 V" }, { "key": "socket:type1_cable:current", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1_cable:current' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type1_cable~.+&socket:type1_cable!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1_cable:current' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type1_cable~.+ &socket:type1_cable!=0)" }, { "key": "socket:type1_cable:current", - "description": "Layer 'Charging stations' shows socket:type1_cable:current=32 A with a fixed text, namely 'Type 1 with cable (J1772) outputs at most 32 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type1_cable~.+&socket:type1_cable!=0)", + "description": "Layer 'Charging stations' shows socket:type1_cable:current=32 A with a fixed text, namely 'Type 1 with cable (J1772) outputs at most 32 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type1_cable~.+ &socket:type1_cable!=0)", "value": "32 A" }, { "key": "socket:type1_cable:output", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1_cable:output' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type1_cable~.+&socket:type1_cable!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1_cable:output' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type1_cable~.+ &socket:type1_cable!=0)" }, { "key": "socket:type1_cable:output", - "description": "Layer 'Charging stations' shows socket:type1_cable:output=3.7 kW with a fixed text, namely 'Type 1 with cable (J1772) outputs at most 3.7 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type1_cable~.+&socket:type1_cable!=0)", + "description": "Layer 'Charging stations' shows socket:type1_cable:output=3.7 kW with a fixed text, namely 'Type 1 with cable (J1772) outputs at most 3.7 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type1_cable~.+ &socket:type1_cable!=0)", "value": "3.7 kW" }, { "key": "socket:type1_cable:output", - "description": "Layer 'Charging stations' shows socket:type1_cable:output=7 kW with a fixed text, namely 'Type 1 with cable (J1772) outputs at most 7 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type1_cable~.+&socket:type1_cable!=0)", + "description": "Layer 'Charging stations' shows socket:type1_cable:output=7 kW with a fixed text, namely 'Type 1 with cable (J1772) outputs at most 7 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type1_cable~.+ &socket:type1_cable!=0)", "value": "7 kW" }, { "key": "socket:type1:voltage", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1:voltage' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type1~.+&socket:type1!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1:voltage' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type1~.+ &socket:type1!=0)" }, { "key": "socket:type1:voltage", - "description": "Layer 'Charging stations' shows socket:type1:voltage=200 V with a fixed text, namely 'Type 1 without cable (J1772) outputs 200 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type1~.+&socket:type1!=0)", + "description": "Layer 'Charging stations' shows socket:type1:voltage=200 V with a fixed text, namely 'Type 1 without cable (J1772) outputs 200 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type1~.+ &socket:type1!=0)", "value": "200 V" }, { "key": "socket:type1:voltage", - "description": "Layer 'Charging stations' shows socket:type1:voltage=240 V with a fixed text, namely 'Type 1 without cable (J1772) outputs 240 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type1~.+&socket:type1!=0)", + "description": "Layer 'Charging stations' shows socket:type1:voltage=240 V with a fixed text, namely 'Type 1 without cable (J1772) outputs 240 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type1~.+ &socket:type1!=0)", "value": "240 V" }, { "key": "socket:type1:current", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1:current' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type1~.+&socket:type1!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1:current' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type1~.+ &socket:type1!=0)" }, { "key": "socket:type1:current", - "description": "Layer 'Charging stations' shows socket:type1:current=32 A with a fixed text, namely 'Type 1 without cable (J1772) outputs at most 32 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type1~.+&socket:type1!=0)", + "description": "Layer 'Charging stations' shows socket:type1:current=32 A with a fixed text, namely 'Type 1 without cable (J1772) outputs at most 32 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type1~.+ &socket:type1!=0)", "value": "32 A" }, { "key": "socket:type1:output", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1:output' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type1~.+&socket:type1!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1:output' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type1~.+ &socket:type1!=0)" }, { "key": "socket:type1:output", - "description": "Layer 'Charging stations' shows socket:type1:output=3.7 kW with a fixed text, namely 'Type 1 without cable (J1772) outputs at most 3.7 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type1~.+&socket:type1!=0)", + "description": "Layer 'Charging stations' shows socket:type1:output=3.7 kW with a fixed text, namely 'Type 1 without cable (J1772) outputs at most 3.7 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type1~.+ &socket:type1!=0)", "value": "3.7 kW" }, { "key": "socket:type1:output", - "description": "Layer 'Charging stations' shows socket:type1:output=6.6 kW with a fixed text, namely 'Type 1 without cable (J1772) outputs at most 6.6 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type1~.+&socket:type1!=0)", + "description": "Layer 'Charging stations' shows socket:type1:output=6.6 kW with a fixed text, namely 'Type 1 without cable (J1772) outputs at most 6.6 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type1~.+ &socket:type1!=0)", "value": "6.6 kW" }, { "key": "socket:type1:output", - "description": "Layer 'Charging stations' shows socket:type1:output=7 kW with a fixed text, namely 'Type 1 without cable (J1772) outputs at most 7 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type1~.+&socket:type1!=0)", + "description": "Layer 'Charging stations' shows socket:type1:output=7 kW with a fixed text, namely 'Type 1 without cable (J1772) outputs at most 7 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type1~.+ &socket:type1!=0)", "value": "7 kW" }, { "key": "socket:type1:output", - "description": "Layer 'Charging stations' shows socket:type1:output=7.2 kW with a fixed text, namely 'Type 1 without cable (J1772) outputs at most 7.2 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type1~.+&socket:type1!=0)", + "description": "Layer 'Charging stations' shows socket:type1:output=7.2 kW with a fixed text, namely 'Type 1 without cable (J1772) outputs at most 7.2 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type1~.+ &socket:type1!=0)", "value": "7.2 kW" }, { "key": "socket:type1_combo:voltage", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1_combo:voltage' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type1_combo~.+&socket:type1_combo!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1_combo:voltage' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type1_combo~.+ &socket:type1_combo!=0)" }, { "key": "socket:type1_combo:voltage", - "description": "Layer 'Charging stations' shows socket:type1_combo:voltage=400 V with a fixed text, namely 'Type 1 CCS (aka Type 1 Combo) outputs 400 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type1_combo~.+&socket:type1_combo!=0)", + "description": "Layer 'Charging stations' shows socket:type1_combo:voltage=400 V with a fixed text, namely 'Type 1 CCS (aka Type 1 Combo) outputs 400 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type1_combo~.+ &socket:type1_combo!=0)", "value": "400 V" }, { "key": "socket:type1_combo:voltage", - "description": "Layer 'Charging stations' shows socket:type1_combo:voltage=1000 V with a fixed text, namely 'Type 1 CCS (aka Type 1 Combo) outputs 1000 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type1_combo~.+&socket:type1_combo!=0)", + "description": "Layer 'Charging stations' shows socket:type1_combo:voltage=1000 V with a fixed text, namely 'Type 1 CCS (aka Type 1 Combo) outputs 1000 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type1_combo~.+ &socket:type1_combo!=0)", "value": "1000 V" }, { "key": "socket:type1_combo:current", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1_combo:current' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type1_combo~.+&socket:type1_combo!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1_combo:current' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type1_combo~.+ &socket:type1_combo!=0)" }, { "key": "socket:type1_combo:current", - "description": "Layer 'Charging stations' shows socket:type1_combo:current=50 A with a fixed text, namely 'Type 1 CCS (aka Type 1 Combo) outputs at most 50 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type1_combo~.+&socket:type1_combo!=0)", + "description": "Layer 'Charging stations' shows socket:type1_combo:current=50 A with a fixed text, namely 'Type 1 CCS (aka Type 1 Combo) outputs at most 50 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type1_combo~.+ &socket:type1_combo!=0)", "value": "50 A" }, { "key": "socket:type1_combo:current", - "description": "Layer 'Charging stations' shows socket:type1_combo:current=125 A with a fixed text, namely 'Type 1 CCS (aka Type 1 Combo) outputs at most 125 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type1_combo~.+&socket:type1_combo!=0)", + "description": "Layer 'Charging stations' shows socket:type1_combo:current=125 A with a fixed text, namely 'Type 1 CCS (aka Type 1 Combo) outputs at most 125 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type1_combo~.+ &socket:type1_combo!=0)", "value": "125 A" }, { "key": "socket:type1_combo:output", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1_combo:output' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type1_combo~.+&socket:type1_combo!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1_combo:output' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type1_combo~.+ &socket:type1_combo!=0)" }, { "key": "socket:type1_combo:output", - "description": "Layer 'Charging stations' shows socket:type1_combo:output=50 kW with a fixed text, namely 'Type 1 CCS (aka Type 1 Combo) outputs at most 50 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type1_combo~.+&socket:type1_combo!=0)", + "description": "Layer 'Charging stations' shows socket:type1_combo:output=50 kW with a fixed text, namely 'Type 1 CCS (aka Type 1 Combo) outputs at most 50 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type1_combo~.+ &socket:type1_combo!=0)", "value": "50 kW" }, { "key": "socket:type1_combo:output", - "description": "Layer 'Charging stations' shows socket:type1_combo:output=62.5 kW with a fixed text, namely 'Type 1 CCS (aka Type 1 Combo) outputs at most 62.5 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type1_combo~.+&socket:type1_combo!=0)", + "description": "Layer 'Charging stations' shows socket:type1_combo:output=62.5 kW with a fixed text, namely 'Type 1 CCS (aka Type 1 Combo) outputs at most 62.5 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type1_combo~.+ &socket:type1_combo!=0)", "value": "62.5 kW" }, { "key": "socket:type1_combo:output", - "description": "Layer 'Charging stations' shows socket:type1_combo:output=150 kW with a fixed text, namely 'Type 1 CCS (aka Type 1 Combo) outputs at most 150 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type1_combo~.+&socket:type1_combo!=0)", + "description": "Layer 'Charging stations' shows socket:type1_combo:output=150 kW with a fixed text, namely 'Type 1 CCS (aka Type 1 Combo) outputs at most 150 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type1_combo~.+ &socket:type1_combo!=0)", "value": "150 kW" }, { "key": "socket:type1_combo:output", - "description": "Layer 'Charging stations' shows socket:type1_combo:output=350 kW with a fixed text, namely 'Type 1 CCS (aka Type 1 Combo) outputs at most 350 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type1_combo~.+&socket:type1_combo!=0)", + "description": "Layer 'Charging stations' shows socket:type1_combo:output=350 kW with a fixed text, namely 'Type 1 CCS (aka Type 1 Combo) outputs at most 350 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type1_combo~.+ &socket:type1_combo!=0)", "value": "350 kW" }, { "key": "socket:tesla_supercharger:voltage", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_supercharger:voltage' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_supercharger~.+&socket:tesla_supercharger!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_supercharger:voltage' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_supercharger~.+ &socket:tesla_supercharger!=0)" }, { "key": "socket:tesla_supercharger:voltage", - "description": "Layer 'Charging stations' shows socket:tesla_supercharger:voltage=480 V with a fixed text, namely 'Tesla Supercharger outputs 480 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_supercharger~.+&socket:tesla_supercharger!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_supercharger:voltage=480 V with a fixed text, namely 'Tesla Supercharger outputs 480 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_supercharger~.+ &socket:tesla_supercharger!=0)", "value": "480 V" }, { "key": "socket:tesla_supercharger:current", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_supercharger:current' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_supercharger~.+&socket:tesla_supercharger!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_supercharger:current' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_supercharger~.+ &socket:tesla_supercharger!=0)" }, { "key": "socket:tesla_supercharger:current", - "description": "Layer 'Charging stations' shows socket:tesla_supercharger:current=125 A with a fixed text, namely 'Tesla Supercharger outputs at most 125 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_supercharger~.+&socket:tesla_supercharger!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_supercharger:current=125 A with a fixed text, namely 'Tesla Supercharger outputs at most 125 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_supercharger~.+ &socket:tesla_supercharger!=0)", "value": "125 A" }, { "key": "socket:tesla_supercharger:current", - "description": "Layer 'Charging stations' shows socket:tesla_supercharger:current=350 A with a fixed text, namely 'Tesla Supercharger outputs at most 350 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_supercharger~.+&socket:tesla_supercharger!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_supercharger:current=350 A with a fixed text, namely 'Tesla Supercharger outputs at most 350 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_supercharger~.+ &socket:tesla_supercharger!=0)", "value": "350 A" }, { "key": "socket:tesla_supercharger:output", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_supercharger:output' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_supercharger~.+&socket:tesla_supercharger!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_supercharger:output' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_supercharger~.+ &socket:tesla_supercharger!=0)" }, { "key": "socket:tesla_supercharger:output", - "description": "Layer 'Charging stations' shows socket:tesla_supercharger:output=120 kW with a fixed text, namely 'Tesla Supercharger outputs at most 120 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_supercharger~.+&socket:tesla_supercharger!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_supercharger:output=120 kW with a fixed text, namely 'Tesla Supercharger outputs at most 120 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_supercharger~.+ &socket:tesla_supercharger!=0)", "value": "120 kW" }, { "key": "socket:tesla_supercharger:output", - "description": "Layer 'Charging stations' shows socket:tesla_supercharger:output=150 kW with a fixed text, namely 'Tesla Supercharger outputs at most 150 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_supercharger~.+&socket:tesla_supercharger!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_supercharger:output=150 kW with a fixed text, namely 'Tesla Supercharger outputs at most 150 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_supercharger~.+ &socket:tesla_supercharger!=0)", "value": "150 kW" }, { "key": "socket:tesla_supercharger:output", - "description": "Layer 'Charging stations' shows socket:tesla_supercharger:output=250 kW with a fixed text, namely 'Tesla Supercharger outputs at most 250 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_supercharger~.+&socket:tesla_supercharger!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_supercharger:output=250 kW with a fixed text, namely 'Tesla Supercharger outputs at most 250 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_supercharger~.+ &socket:tesla_supercharger!=0)", "value": "250 kW" }, { "key": "socket:type2:voltage", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2:voltage' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type2~.+&socket:type2!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2:voltage' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type2~.+ &socket:type2!=0)" }, { "key": "socket:type2:voltage", - "description": "Layer 'Charging stations' shows socket:type2:voltage=230 V with a fixed text, namely 'Type 2 (mennekes) outputs 230 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type2~.+&socket:type2!=0)", + "description": "Layer 'Charging stations' shows socket:type2:voltage=230 V with a fixed text, namely 'Type 2 (mennekes) outputs 230 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type2~.+ &socket:type2!=0)", "value": "230 V" }, { "key": "socket:type2:voltage", - "description": "Layer 'Charging stations' shows socket:type2:voltage=400 V with a fixed text, namely 'Type 2 (mennekes) outputs 400 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type2~.+&socket:type2!=0)", + "description": "Layer 'Charging stations' shows socket:type2:voltage=400 V with a fixed text, namely 'Type 2 (mennekes) outputs 400 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type2~.+ &socket:type2!=0)", "value": "400 V" }, { "key": "socket:type2:current", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2:current' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type2~.+&socket:type2!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2:current' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type2~.+ &socket:type2!=0)" }, { "key": "socket:type2:current", - "description": "Layer 'Charging stations' shows socket:type2:current=16 A with a fixed text, namely 'Type 2 (mennekes) outputs at most 16 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type2~.+&socket:type2!=0)", + "description": "Layer 'Charging stations' shows socket:type2:current=16 A with a fixed text, namely 'Type 2 (mennekes) outputs at most 16 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type2~.+ &socket:type2!=0)", "value": "16 A" }, { "key": "socket:type2:current", - "description": "Layer 'Charging stations' shows socket:type2:current=32 A with a fixed text, namely 'Type 2 (mennekes) outputs at most 32 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type2~.+&socket:type2!=0)", + "description": "Layer 'Charging stations' shows socket:type2:current=32 A with a fixed text, namely 'Type 2 (mennekes) outputs at most 32 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type2~.+ &socket:type2!=0)", "value": "32 A" }, { "key": "socket:type2:output", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2:output' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type2~.+&socket:type2!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2:output' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type2~.+ &socket:type2!=0)" }, { "key": "socket:type2:output", - "description": "Layer 'Charging stations' shows socket:type2:output=11 kW with a fixed text, namely 'Type 2 (mennekes) outputs at most 11 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type2~.+&socket:type2!=0)", + "description": "Layer 'Charging stations' shows socket:type2:output=11 kW with a fixed text, namely 'Type 2 (mennekes) outputs at most 11 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type2~.+ &socket:type2!=0)", "value": "11 kW" }, { "key": "socket:type2:output", - "description": "Layer 'Charging stations' shows socket:type2:output=22 kW with a fixed text, namely 'Type 2 (mennekes) outputs at most 22 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type2~.+&socket:type2!=0)", + "description": "Layer 'Charging stations' shows socket:type2:output=22 kW with a fixed text, namely 'Type 2 (mennekes) outputs at most 22 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type2~.+ &socket:type2!=0)", "value": "22 kW" }, { "key": "socket:type2_combo:voltage", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2_combo:voltage' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type2_combo~.+&socket:type2_combo!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2_combo:voltage' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type2_combo~.+ &socket:type2_combo!=0)" }, { "key": "socket:type2_combo:voltage", - "description": "Layer 'Charging stations' shows socket:type2_combo:voltage=500 V with a fixed text, namely 'Type 2 CCS (mennekes) outputs 500 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type2_combo~.+&socket:type2_combo!=0)", + "description": "Layer 'Charging stations' shows socket:type2_combo:voltage=500 V with a fixed text, namely 'Type 2 CCS (mennekes) outputs 500 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type2_combo~.+ &socket:type2_combo!=0)", "value": "500 V" }, { "key": "socket:type2_combo:voltage", - "description": "Layer 'Charging stations' shows socket:type2_combo:voltage=920 V with a fixed text, namely 'Type 2 CCS (mennekes) outputs 920 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type2_combo~.+&socket:type2_combo!=0)", + "description": "Layer 'Charging stations' shows socket:type2_combo:voltage=920 V with a fixed text, namely 'Type 2 CCS (mennekes) outputs 920 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type2_combo~.+ &socket:type2_combo!=0)", "value": "920 V" }, { "key": "socket:type2_combo:current", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2_combo:current' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type2_combo~.+&socket:type2_combo!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2_combo:current' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type2_combo~.+ &socket:type2_combo!=0)" }, { "key": "socket:type2_combo:current", - "description": "Layer 'Charging stations' shows socket:type2_combo:current=125 A with a fixed text, namely 'Type 2 CCS (mennekes) outputs at most 125 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type2_combo~.+&socket:type2_combo!=0)", + "description": "Layer 'Charging stations' shows socket:type2_combo:current=125 A with a fixed text, namely 'Type 2 CCS (mennekes) outputs at most 125 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type2_combo~.+ &socket:type2_combo!=0)", "value": "125 A" }, { "key": "socket:type2_combo:current", - "description": "Layer 'Charging stations' shows socket:type2_combo:current=350 A with a fixed text, namely 'Type 2 CCS (mennekes) outputs at most 350 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type2_combo~.+&socket:type2_combo!=0)", + "description": "Layer 'Charging stations' shows socket:type2_combo:current=350 A with a fixed text, namely 'Type 2 CCS (mennekes) outputs at most 350 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type2_combo~.+ &socket:type2_combo!=0)", "value": "350 A" }, { "key": "socket:type2_combo:output", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2_combo:output' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type2_combo~.+&socket:type2_combo!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2_combo:output' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type2_combo~.+ &socket:type2_combo!=0)" }, { "key": "socket:type2_combo:output", - "description": "Layer 'Charging stations' shows socket:type2_combo:output=50 kW with a fixed text, namely 'Type 2 CCS (mennekes) outputs at most 50 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type2_combo~.+&socket:type2_combo!=0)", + "description": "Layer 'Charging stations' shows socket:type2_combo:output=50 kW with a fixed text, namely 'Type 2 CCS (mennekes) outputs at most 50 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type2_combo~.+ &socket:type2_combo!=0)", "value": "50 kW" }, { "key": "socket:type2_cable:voltage", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2_cable:voltage' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type2_cable~.+&socket:type2_cable!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2_cable:voltage' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type2_cable~.+ &socket:type2_cable!=0)" }, { "key": "socket:type2_cable:voltage", - "description": "Layer 'Charging stations' shows socket:type2_cable:voltage=230 V with a fixed text, namely 'Type 2 with cable (mennekes) outputs 230 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type2_cable~.+&socket:type2_cable!=0)", + "description": "Layer 'Charging stations' shows socket:type2_cable:voltage=230 V with a fixed text, namely 'Type 2 with cable (mennekes) outputs 230 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type2_cable~.+ &socket:type2_cable!=0)", "value": "230 V" }, { "key": "socket:type2_cable:voltage", - "description": "Layer 'Charging stations' shows socket:type2_cable:voltage=400 V with a fixed text, namely 'Type 2 with cable (mennekes) outputs 400 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type2_cable~.+&socket:type2_cable!=0)", + "description": "Layer 'Charging stations' shows socket:type2_cable:voltage=400 V with a fixed text, namely 'Type 2 with cable (mennekes) outputs 400 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type2_cable~.+ &socket:type2_cable!=0)", "value": "400 V" }, { "key": "socket:type2_cable:current", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2_cable:current' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type2_cable~.+&socket:type2_cable!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2_cable:current' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type2_cable~.+ &socket:type2_cable!=0)" }, { "key": "socket:type2_cable:current", - "description": "Layer 'Charging stations' shows socket:type2_cable:current=16 A with a fixed text, namely 'Type 2 with cable (mennekes) outputs at most 16 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type2_cable~.+&socket:type2_cable!=0)", + "description": "Layer 'Charging stations' shows socket:type2_cable:current=16 A with a fixed text, namely 'Type 2 with cable (mennekes) outputs at most 16 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type2_cable~.+ &socket:type2_cable!=0)", "value": "16 A" }, { "key": "socket:type2_cable:current", - "description": "Layer 'Charging stations' shows socket:type2_cable:current=32 A with a fixed text, namely 'Type 2 with cable (mennekes) outputs at most 32 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type2_cable~.+&socket:type2_cable!=0)", + "description": "Layer 'Charging stations' shows socket:type2_cable:current=32 A with a fixed text, namely 'Type 2 with cable (mennekes) outputs at most 32 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type2_cable~.+ &socket:type2_cable!=0)", "value": "32 A" }, { "key": "socket:type2_cable:output", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2_cable:output' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type2_cable~.+&socket:type2_cable!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2_cable:output' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type2_cable~.+ &socket:type2_cable!=0)" }, { "key": "socket:type2_cable:output", - "description": "Layer 'Charging stations' shows socket:type2_cable:output=11 kW with a fixed text, namely 'Type 2 with cable (mennekes) outputs at most 11 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type2_cable~.+&socket:type2_cable!=0)", + "description": "Layer 'Charging stations' shows socket:type2_cable:output=11 kW with a fixed text, namely 'Type 2 with cable (mennekes) outputs at most 11 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type2_cable~.+ &socket:type2_cable!=0)", "value": "11 kW" }, { "key": "socket:type2_cable:output", - "description": "Layer 'Charging stations' shows socket:type2_cable:output=22 kW with a fixed text, namely 'Type 2 with cable (mennekes) outputs at most 22 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type2_cable~.+&socket:type2_cable!=0)", + "description": "Layer 'Charging stations' shows socket:type2_cable:output=22 kW with a fixed text, namely 'Type 2 with cable (mennekes) outputs at most 22 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:type2_cable~.+ &socket:type2_cable!=0)", "value": "22 kW" }, { "key": "socket:tesla_supercharger_ccs:voltage", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_supercharger_ccs:voltage' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_supercharger_ccs~.+&socket:tesla_supercharger_ccs!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_supercharger_ccs:voltage' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_supercharger_ccs~.+ &socket:tesla_supercharger_ccs!=0)" }, { "key": "socket:tesla_supercharger_ccs:voltage", - "description": "Layer 'Charging stations' shows socket:tesla_supercharger_ccs:voltage=500 V with a fixed text, namely 'Tesla Supercharger CCS (a branded Type 2 CSS) outputs 500 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_supercharger_ccs~.+&socket:tesla_supercharger_ccs!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_supercharger_ccs:voltage=500 V with a fixed text, namely 'Tesla Supercharger CCS (a branded Type 2 CSS) outputs 500 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_supercharger_ccs~.+ &socket:tesla_supercharger_ccs!=0)", "value": "500 V" }, { "key": "socket:tesla_supercharger_ccs:voltage", - "description": "Layer 'Charging stations' shows socket:tesla_supercharger_ccs:voltage=920 V with a fixed text, namely 'Tesla Supercharger CCS (a branded Type 2 CSS) outputs 920 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_supercharger_ccs~.+&socket:tesla_supercharger_ccs!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_supercharger_ccs:voltage=920 V with a fixed text, namely 'Tesla Supercharger CCS (a branded Type 2 CSS) outputs 920 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_supercharger_ccs~.+ &socket:tesla_supercharger_ccs!=0)", "value": "920 V" }, { "key": "socket:tesla_supercharger_ccs:current", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_supercharger_ccs:current' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_supercharger_ccs~.+&socket:tesla_supercharger_ccs!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_supercharger_ccs:current' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_supercharger_ccs~.+ &socket:tesla_supercharger_ccs!=0)" }, { "key": "socket:tesla_supercharger_ccs:current", - "description": "Layer 'Charging stations' shows socket:tesla_supercharger_ccs:current=125 A with a fixed text, namely 'Tesla Supercharger CCS (a branded type2_css) outputs at most 125 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_supercharger_ccs~.+&socket:tesla_supercharger_ccs!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_supercharger_ccs:current=125 A with a fixed text, namely 'Tesla Supercharger CCS (a branded type2_css) outputs at most 125 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_supercharger_ccs~.+ &socket:tesla_supercharger_ccs!=0)", "value": "125 A" }, { "key": "socket:tesla_supercharger_ccs:current", - "description": "Layer 'Charging stations' shows socket:tesla_supercharger_ccs:current=350 A with a fixed text, namely 'Tesla Supercharger CCS (a branded type2_css) outputs at most 350 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_supercharger_ccs~.+&socket:tesla_supercharger_ccs!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_supercharger_ccs:current=350 A with a fixed text, namely 'Tesla Supercharger CCS (a branded type2_css) outputs at most 350 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_supercharger_ccs~.+ &socket:tesla_supercharger_ccs!=0)", "value": "350 A" }, { "key": "socket:tesla_supercharger_ccs:output", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_supercharger_ccs:output' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_supercharger_ccs~.+&socket:tesla_supercharger_ccs!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_supercharger_ccs:output' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_supercharger_ccs~.+ &socket:tesla_supercharger_ccs!=0)" }, { "key": "socket:tesla_supercharger_ccs:output", - "description": "Layer 'Charging stations' shows socket:tesla_supercharger_ccs:output=50 kW with a fixed text, namely 'Tesla Supercharger CCS (a branded Type 2 CSS) outputs at most 50 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_supercharger_ccs~.+&socket:tesla_supercharger_ccs!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_supercharger_ccs:output=50 kW with a fixed text, namely 'Tesla Supercharger CCS (a branded Type 2 CSS) outputs at most 50 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_supercharger_ccs~.+ &socket:tesla_supercharger_ccs!=0)", "value": "50 kW" }, { "key": "socket:tesla_destination:voltage", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_destination:voltage' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_destination~.+&socket:tesla_destination!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_destination:voltage' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_destination~.+ &socket:tesla_destination!=0)" }, { "key": "socket:tesla_destination:voltage", - "description": "Layer 'Charging stations' shows socket:tesla_destination:voltage=480 V with a fixed text, namely 'Tesla Supercharger (Destination) outputs 480 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_destination~.+&socket:tesla_destination!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_destination:voltage=480 V with a fixed text, namely 'Tesla Supercharger (Destination) outputs 480 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_destination~.+ &socket:tesla_destination!=0)", "value": "480 V" }, { "key": "socket:tesla_destination:current", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_destination:current' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_destination~.+&socket:tesla_destination!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_destination:current' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_destination~.+ &socket:tesla_destination!=0)" }, { "key": "socket:tesla_destination:current", - "description": "Layer 'Charging stations' shows socket:tesla_destination:current=125 A with a fixed text, namely 'Tesla Supercharger (Destination) outputs at most 125 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_destination~.+&socket:tesla_destination!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_destination:current=125 A with a fixed text, namely 'Tesla Supercharger (Destination) outputs at most 125 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_destination~.+ &socket:tesla_destination!=0)", "value": "125 A" }, { "key": "socket:tesla_destination:current", - "description": "Layer 'Charging stations' shows socket:tesla_destination:current=350 A with a fixed text, namely 'Tesla Supercharger (Destination) outputs at most 350 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_destination~.+&socket:tesla_destination!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_destination:current=350 A with a fixed text, namely 'Tesla Supercharger (Destination) outputs at most 350 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_destination~.+ &socket:tesla_destination!=0)", "value": "350 A" }, { "key": "socket:tesla_destination:output", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_destination:output' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_destination~.+&socket:tesla_destination!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_destination:output' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_destination~.+ &socket:tesla_destination!=0)" }, { "key": "socket:tesla_destination:output", - "description": "Layer 'Charging stations' shows socket:tesla_destination:output=120 kW with a fixed text, namely 'Tesla Supercharger (Destination) outputs at most 120 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_destination~.+&socket:tesla_destination!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_destination:output=120 kW with a fixed text, namely 'Tesla Supercharger (Destination) outputs at most 120 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_destination~.+ &socket:tesla_destination!=0)", "value": "120 kW" }, { "key": "socket:tesla_destination:output", - "description": "Layer 'Charging stations' shows socket:tesla_destination:output=150 kW with a fixed text, namely 'Tesla Supercharger (Destination) outputs at most 150 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_destination~.+&socket:tesla_destination!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_destination:output=150 kW with a fixed text, namely 'Tesla Supercharger (Destination) outputs at most 150 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_destination~.+ &socket:tesla_destination!=0)", "value": "150 kW" }, { "key": "socket:tesla_destination:output", - "description": "Layer 'Charging stations' shows socket:tesla_destination:output=250 kW with a fixed text, namely 'Tesla Supercharger (Destination) outputs at most 250 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_destination~.+&socket:tesla_destination!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_destination:output=250 kW with a fixed text, namely 'Tesla Supercharger (Destination) outputs at most 250 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_destination~.+ &socket:tesla_destination!=0)", "value": "250 kW" }, { "key": "socket:tesla_destination:voltage", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_destination:voltage' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_destination~.+&socket:tesla_destination!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_destination:voltage' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_destination~.+ &socket:tesla_destination!=0)" }, { "key": "socket:tesla_destination:voltage", - "description": "Layer 'Charging stations' shows socket:tesla_destination:voltage=230 V with a fixed text, namely 'Tesla Supercharger (Destination) (A Type 2 with cable branded as Tesla) outputs 230 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_destination~.+&socket:tesla_destination!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_destination:voltage=230 V with a fixed text, namely 'Tesla Supercharger (Destination) (A Type 2 with cable branded as Tesla) outputs 230 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_destination~.+ &socket:tesla_destination!=0)", "value": "230 V" }, { "key": "socket:tesla_destination:voltage", - "description": "Layer 'Charging stations' shows socket:tesla_destination:voltage=400 V with a fixed text, namely 'Tesla Supercharger (Destination) (A Type 2 with cable branded as Tesla) outputs 400 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_destination~.+&socket:tesla_destination!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_destination:voltage=400 V with a fixed text, namely 'Tesla Supercharger (Destination) (A Type 2 with cable branded as Tesla) outputs 400 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_destination~.+ &socket:tesla_destination!=0)", "value": "400 V" }, { "key": "socket:tesla_destination:current", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_destination:current' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_destination~.+&socket:tesla_destination!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_destination:current' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_destination~.+ &socket:tesla_destination!=0)" }, { "key": "socket:tesla_destination:current", - "description": "Layer 'Charging stations' shows socket:tesla_destination:current=16 A with a fixed text, namely 'Tesla Supercharger (Destination) (A Type 2 with cable branded as tesla) outputs at most 16 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_destination~.+&socket:tesla_destination!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_destination:current=16 A with a fixed text, namely 'Tesla Supercharger (Destination) (A Type 2 with cable branded as tesla) outputs at most 16 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_destination~.+ &socket:tesla_destination!=0)", "value": "16 A" }, { "key": "socket:tesla_destination:current", - "description": "Layer 'Charging stations' shows socket:tesla_destination:current=32 A with a fixed text, namely 'Tesla Supercharger (Destination) (A Type 2 with cable branded as Tesla) outputs at most 32 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_destination~.+&socket:tesla_destination!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_destination:current=32 A with a fixed text, namely 'Tesla Supercharger (Destination) (A Type 2 with cable branded as Tesla) outputs at most 32 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_destination~.+ &socket:tesla_destination!=0)", "value": "32 A" }, { "key": "socket:tesla_destination:output", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_destination:output' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_destination~.+&socket:tesla_destination!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_destination:output' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_destination~.+ &socket:tesla_destination!=0)" }, { "key": "socket:tesla_destination:output", - "description": "Layer 'Charging stations' shows socket:tesla_destination:output=11 kW with a fixed text, namely 'Tesla Supercharger (Destination) (A Type 2 with cable branded as Tesla) outputs at most 11 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_destination~.+&socket:tesla_destination!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_destination:output=11 kW with a fixed text, namely 'Tesla Supercharger (Destination) (A Type 2 with cable branded as Tesla) outputs at most 11 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_destination~.+ &socket:tesla_destination!=0)", "value": "11 kW" }, { "key": "socket:tesla_destination:output", - "description": "Layer 'Charging stations' shows socket:tesla_destination:output=22 kW with a fixed text, namely 'Tesla Supercharger (Destination) (A Type 2 with cable branded as Tesla) outputs at most 22 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_destination~.+&socket:tesla_destination!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_destination:output=22 kW with a fixed text, namely 'Tesla Supercharger (Destination) (A Type 2 with cable branded as Tesla) outputs at most 22 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:tesla_destination~.+ &socket:tesla_destination!=0)", "value": "22 kW" }, { "key": "socket:USB-A:voltage", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:USB-A:voltage' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:USB-A~.+&socket:USB-A!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:USB-A:voltage' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:USB-A~.+ &socket:USB-A!=0)" }, { "key": "socket:USB-A:voltage", - "description": "Layer 'Charging stations' shows socket:USB-A:voltage=5 V with a fixed text, namely 'USB to charge phones and small electronics outputs 5 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:USB-A~.+&socket:USB-A!=0)", + "description": "Layer 'Charging stations' shows socket:USB-A:voltage=5 V with a fixed text, namely 'USB to charge phones and small electronics outputs 5 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:USB-A~.+ &socket:USB-A!=0)", "value": "5 V" }, { "key": "socket:USB-A:current", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:USB-A:current' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:USB-A~.+&socket:USB-A!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:USB-A:current' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:USB-A~.+ &socket:USB-A!=0)" }, { "key": "socket:USB-A:current", - "description": "Layer 'Charging stations' shows socket:USB-A:current=1 A with a fixed text, namely 'USB to charge phones and small electronics outputs at most 1 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:USB-A~.+&socket:USB-A!=0)", + "description": "Layer 'Charging stations' shows socket:USB-A:current=1 A with a fixed text, namely 'USB to charge phones and small electronics outputs at most 1 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:USB-A~.+ &socket:USB-A!=0)", "value": "1 A" }, { "key": "socket:USB-A:current", - "description": "Layer 'Charging stations' shows socket:USB-A:current=2 A with a fixed text, namely 'USB to charge phones and small electronics outputs at most 2 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:USB-A~.+&socket:USB-A!=0)", + "description": "Layer 'Charging stations' shows socket:USB-A:current=2 A with a fixed text, namely 'USB to charge phones and small electronics outputs at most 2 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:USB-A~.+ &socket:USB-A!=0)", "value": "2 A" }, { "key": "socket:USB-A:output", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:USB-A:output' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:USB-A~.+&socket:USB-A!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:USB-A:output' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:USB-A~.+ &socket:USB-A!=0)" }, { "key": "socket:USB-A:output", - "description": "Layer 'Charging stations' shows socket:USB-A:output=5W with a fixed text, namely 'USB to charge phones and small electronics outputs at most 5w A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:USB-A~.+&socket:USB-A!=0)", + "description": "Layer 'Charging stations' shows socket:USB-A:output=5W with a fixed text, namely 'USB to charge phones and small electronics outputs at most 5w A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:USB-A~.+ &socket:USB-A!=0)", "value": "5W" }, { "key": "socket:USB-A:output", - "description": "Layer 'Charging stations' shows socket:USB-A:output=10W with a fixed text, namely 'USB to charge phones and small electronics outputs at most 10w A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:USB-A~.+&socket:USB-A!=0)", + "description": "Layer 'Charging stations' shows socket:USB-A:output=10W with a fixed text, namely 'USB to charge phones and small electronics outputs at most 10w A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:USB-A~.+ &socket:USB-A!=0)", "value": "10W" }, { "key": "socket:bosch_3pin:voltage", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:bosch_3pin:voltage' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:bosch_3pin~.+&socket:bosch_3pin!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:bosch_3pin:voltage' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:bosch_3pin~.+ &socket:bosch_3pin!=0)" }, { "key": "socket:bosch_3pin:current", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:bosch_3pin:current' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:bosch_3pin~.+&socket:bosch_3pin!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:bosch_3pin:current' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:bosch_3pin~.+ &socket:bosch_3pin!=0)" }, { "key": "socket:bosch_3pin:output", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:bosch_3pin:output' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:bosch_3pin~.+&socket:bosch_3pin!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:bosch_3pin:output' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:bosch_3pin~.+ &socket:bosch_3pin!=0)" }, { "key": "socket:bosch_5pin:voltage", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:bosch_5pin:voltage' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:bosch_5pin~.+&socket:bosch_5pin!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:bosch_5pin:voltage' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:bosch_5pin~.+ &socket:bosch_5pin!=0)" }, { "key": "socket:bosch_5pin:current", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:bosch_5pin:current' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:bosch_5pin~.+&socket:bosch_5pin!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:bosch_5pin:current' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:bosch_5pin~.+ &socket:bosch_5pin!=0)" }, { "key": "socket:bosch_5pin:output", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:bosch_5pin:output' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:bosch_5pin~.+&socket:bosch_5pin!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:bosch_5pin:output' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if socket:bosch_5pin~.+ &socket:bosch_5pin!=0)" }, { "key": "opening_hours", @@ -2344,42 +2344,42 @@ }, { "key": "fee", - "description": "Layer 'Charging stations' shows fee=no&authentication:none=yes with a fixed text, namely 'Free to use (without authenticating)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')", + "description": "Layer 'Charging stations' shows fee=no &authentication:none=yes with a fixed text, namely 'Free to use (without authenticating)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')", "value": "no" }, { "key": "fee:conditional", - "description": "Layer 'Charging stations' shows fee=no&authentication:none=yes with a fixed text, namely 'Free to use (without authenticating)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') Picking this answer will delete the key fee:conditional.", + "description": "Layer 'Charging stations' shows fee=no &authentication:none=yes with a fixed text, namely 'Free to use (without authenticating)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') Picking this answer will delete the key fee:conditional.", "value": "" }, { "key": "charge", - "description": "Layer 'Charging stations' shows fee=no&authentication:none=yes with a fixed text, namely 'Free to use (without authenticating)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') Picking this answer will delete the key charge.", + "description": "Layer 'Charging stations' shows fee=no &authentication:none=yes with a fixed text, namely 'Free to use (without authenticating)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') Picking this answer will delete the key charge.", "value": "" }, { "key": "authentication:none", - "description": "Layer 'Charging stations' shows fee=no&authentication:none=yes with a fixed text, namely 'Free to use (without authenticating)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')", + "description": "Layer 'Charging stations' shows fee=no &authentication:none=yes with a fixed text, namely 'Free to use (without authenticating)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')", "value": "yes" }, { "key": "fee", - "description": "Layer 'Charging stations' shows fee=no&authentication:none=no with a fixed text, namely 'Free to use, but one has to authenticate' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')", + "description": "Layer 'Charging stations' shows fee=no &authentication:none=no with a fixed text, namely 'Free to use, but one has to authenticate' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')", "value": "no" }, { "key": "fee:conditional", - "description": "Layer 'Charging stations' shows fee=no&authentication:none=no with a fixed text, namely 'Free to use, but one has to authenticate' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') Picking this answer will delete the key fee:conditional.", + "description": "Layer 'Charging stations' shows fee=no &authentication:none=no with a fixed text, namely 'Free to use, but one has to authenticate' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') Picking this answer will delete the key fee:conditional.", "value": "" }, { "key": "charge", - "description": "Layer 'Charging stations' shows fee=no&authentication:none=no with a fixed text, namely 'Free to use, but one has to authenticate' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') Picking this answer will delete the key charge.", + "description": "Layer 'Charging stations' shows fee=no &authentication:none=no with a fixed text, namely 'Free to use, but one has to authenticate' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') Picking this answer will delete the key charge.", "value": "" }, { "key": "authentication:none", - "description": "Layer 'Charging stations' shows fee=no&authentication:none=no with a fixed text, namely 'Free to use, but one has to authenticate' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')", + "description": "Layer 'Charging stations' shows fee=no &authentication:none=no with a fixed text, namely 'Free to use, but one has to authenticate' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')", "value": "no" }, { @@ -2389,12 +2389,12 @@ }, { "key": "fee", - "description": "Layer 'Charging stations' shows fee=yes&fee:conditional=no @ customers with a fixed text, namely 'Paid use, but free for customers of the hotel/pub/hospital/… who operates the charging station' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')", + "description": "Layer 'Charging stations' shows fee=yes &fee:conditional=no @ customers with a fixed text, namely 'Paid use, but free for customers of the hotel/pub/hospital/… who operates the charging station' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')", "value": "yes" }, { "key": "fee:conditional", - "description": "Layer 'Charging stations' shows fee=yes&fee:conditional=no @ customers with a fixed text, namely 'Paid use, but free for customers of the hotel/pub/hospital/… who operates the charging station' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')", + "description": "Layer 'Charging stations' shows fee=yes &fee:conditional=no @ customers with a fixed text, namely 'Paid use, but free for customers of the hotel/pub/hospital/… who operates the charging station' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')", "value": "no @ customers" }, { @@ -2413,80 +2413,80 @@ }, { "key": "payment:cash", - "description": "Layer 'Charging stations' shows payment:cash=yes with a fixed text, namely 'Cash is accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if fee=yes|charge~.+)", + "description": "Layer 'Charging stations' shows payment:cash=yes with a fixed text, namely 'Cash is accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if fee=yes |charge~.+)", "value": "yes" }, { "key": "payment:cards", - "description": "Layer 'Charging stations' shows payment:cards=yes with a fixed text, namely 'Payment cards are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if fee=yes|charge~.+)", + "description": "Layer 'Charging stations' shows payment:cards=yes with a fixed text, namely 'Payment cards are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if fee=yes |charge~.+)", "value": "yes" }, { "key": "payment:qr_code", - "description": "Layer 'Charging stations' shows payment:qr_code=yes with a fixed text, namely 'Payment by QR-code is possible here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if fee=yes|charge~.+)", + "description": "Layer 'Charging stations' shows payment:qr_code=yes with a fixed text, namely 'Payment by QR-code is possible here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if fee=yes |charge~.+)", "value": "yes" }, { "key": "payment:app", - "description": "Layer 'Charging stations' shows payment:app=yes with a fixed text, namely 'Payment is done using a dedicated app' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if fee=yes|charge~.+)", + "description": "Layer 'Charging stations' shows payment:app=yes with a fixed text, namely 'Payment is done using a dedicated app' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if fee=yes |charge~.+)", "value": "yes" }, { "key": "payment:membership_card", - "description": "Layer 'Charging stations' shows payment:membership_card=yes with a fixed text, namely 'Payment is done using a membership card' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if fee=yes|charge~.+)", + "description": "Layer 'Charging stations' shows payment:membership_card=yes with a fixed text, namely 'Payment is done using a membership card' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if fee=yes |charge~.+)", "value": "yes" }, { "key": "authentication:membership_card", - "description": "Layer 'Charging stations' shows authentication:membership_card=yes with a fixed text, namely 'Authentication by a membership card' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if fee=no|)", + "description": "Layer 'Charging stations' shows authentication:membership_card=yes with a fixed text, namely 'Authentication by a membership card' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if fee=no |)", "value": "yes" }, { "key": "authentication:app", - "description": "Layer 'Charging stations' shows authentication:app=yes with a fixed text, namely 'Authentication by an app' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if fee=no|)", + "description": "Layer 'Charging stations' shows authentication:app=yes with a fixed text, namely 'Authentication by an app' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if fee=no |)", "value": "yes" }, { "key": "authentication:phone_call", - "description": "Layer 'Charging stations' shows authentication:phone_call=yes with a fixed text, namely 'Authentication via phone call is available' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if fee=no|)", + "description": "Layer 'Charging stations' shows authentication:phone_call=yes with a fixed text, namely 'Authentication via phone call is available' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if fee=no |)", "value": "yes" }, { "key": "authentication:short_message", - "description": "Layer 'Charging stations' shows authentication:short_message=yes with a fixed text, namely 'Authentication via SMS is available' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if fee=no|)", + "description": "Layer 'Charging stations' shows authentication:short_message=yes with a fixed text, namely 'Authentication via SMS is available' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if fee=no |)", "value": "yes" }, { "key": "authentication:nfc", - "description": "Layer 'Charging stations' shows authentication:nfc=yes with a fixed text, namely 'Authentication via NFC is available' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if fee=no|)", + "description": "Layer 'Charging stations' shows authentication:nfc=yes with a fixed text, namely 'Authentication via NFC is available' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if fee=no |)", "value": "yes" }, { "key": "authentication:money_card", - "description": "Layer 'Charging stations' shows authentication:money_card=yes with a fixed text, namely 'Authentication via Money Card is available' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if fee=no|)", + "description": "Layer 'Charging stations' shows authentication:money_card=yes with a fixed text, namely 'Authentication via Money Card is available' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if fee=no |)", "value": "yes" }, { "key": "authentication:debit_card", - "description": "Layer 'Charging stations' shows authentication:debit_card=yes with a fixed text, namely 'Authentication via debit card is available' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if fee=no|)", + "description": "Layer 'Charging stations' shows authentication:debit_card=yes with a fixed text, namely 'Authentication via debit card is available' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if fee=no |)", "value": "yes" }, { "key": "authentication:none", - "description": "Layer 'Charging stations' shows authentication:none=yes with a fixed text, namely 'Charging here is (also) possible without authentication' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if fee=no|)", + "description": "Layer 'Charging stations' shows authentication:none=yes with a fixed text, namely 'Charging here is (also) possible without authentication' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if fee=no |)", "value": "yes" }, { "key": "authentication:phone_call:number", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'authentication:phone_call:number' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if authentication:phone_call=yes|authentication:short_message=yes)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'authentication:phone_call:number' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if authentication:phone_call=yes |authentication:short_message=yes)" }, { "key": "maxstay", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'maxstay' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if maxstay~.+|motorcar=yes|hgv=yes|bus=yes)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'maxstay' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if maxstay~.+ |motorcar=yes |hgv=yes |bus=yes)" }, { "key": "maxstay", - "description": "Layer 'Charging stations' shows maxstay=unlimited with a fixed text, namely 'No timelimit on leaving your vehicle here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if maxstay~.+|motorcar=yes|hgv=yes|bus=yes)", + "description": "Layer 'Charging stations' shows maxstay=unlimited with a fixed text, namely 'No timelimit on leaving your vehicle here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if maxstay~.+ |motorcar=yes |hgv=yes |bus=yes)", "value": "unlimited" }, { @@ -2614,27 +2614,27 @@ }, { "key": "planned:amenity", - "description": "Layer 'Charging stations' shows operational_status=broken&amenity=charging_station with a fixed text, namely 'This charging station is broken' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') Picking this answer will delete the key planned:amenity.", + "description": "Layer 'Charging stations' shows operational_status=broken &amenity=charging_station with a fixed text, namely 'This charging station is broken' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') Picking this answer will delete the key planned:amenity.", "value": "" }, { "key": "construction:amenity", - "description": "Layer 'Charging stations' shows operational_status=broken&amenity=charging_station with a fixed text, namely 'This charging station is broken' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') Picking this answer will delete the key construction:amenity.", + "description": "Layer 'Charging stations' shows operational_status=broken &amenity=charging_station with a fixed text, namely 'This charging station is broken' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') Picking this answer will delete the key construction:amenity.", "value": "" }, { "key": "disused:amenity", - "description": "Layer 'Charging stations' shows operational_status=broken&amenity=charging_station with a fixed text, namely 'This charging station is broken' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') Picking this answer will delete the key disused:amenity.", + "description": "Layer 'Charging stations' shows operational_status=broken &amenity=charging_station with a fixed text, namely 'This charging station is broken' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') Picking this answer will delete the key disused:amenity.", "value": "" }, { "key": "operational_status", - "description": "Layer 'Charging stations' shows operational_status=broken&amenity=charging_station with a fixed text, namely 'This charging station is broken' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')", + "description": "Layer 'Charging stations' shows operational_status=broken &amenity=charging_station with a fixed text, namely 'This charging station is broken' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')", "value": "broken" }, { "key": "amenity", - "description": "Layer 'Charging stations' shows operational_status=broken&amenity=charging_station with a fixed text, namely 'This charging station is broken' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')", + "description": "Layer 'Charging stations' shows operational_status=broken &amenity=charging_station with a fixed text, namely 'This charging station is broken' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')", "value": "charging_station" }, { @@ -2714,12 +2714,12 @@ }, { "key": "parking:fee", - "description": "Layer 'Charging stations' shows parking:fee=no with a fixed text, namely 'No additional parking cost while charging' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if motor_vehicle=yes|hgv=yes|bus=yes|bicycle=no|)", + "description": "Layer 'Charging stations' shows parking:fee=no with a fixed text, namely 'No additional parking cost while charging' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if motor_vehicle=yes |hgv=yes |bus=yes |bicycle=no |)", "value": "no" }, { "key": "parking:fee", - "description": "Layer 'Charging stations' shows parking:fee=yes with a fixed text, namely 'An additional parking fee should be paid while charging' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if motor_vehicle=yes|hgv=yes|bus=yes|bicycle=no|)", + "description": "Layer 'Charging stations' shows parking:fee=yes with a fixed text, namely 'An additional parking fee should be paid while charging' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists') (This is only shown if motor_vehicle=yes |hgv=yes |bus=yes |bicycle=no |)", "value": "yes" } ] diff --git a/Docs/TagInfo/mapcomplete_drinking_water.json b/Docs/TagInfo/mapcomplete_drinking_water.json index f5e76f1c0..2aaa83e82 100644 --- a/Docs/TagInfo/mapcomplete_drinking_water.json +++ b/Docs/TagInfo/mapcomplete_drinking_water.json @@ -22,7 +22,7 @@ }, { "key": "id", - "description": "Layer 'Drinking water' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Drinking Water') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Drinking water' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Drinking Water') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", diff --git a/Docs/TagInfo/mapcomplete_education.json b/Docs/TagInfo/mapcomplete_education.json index 867661812..bf3657b33 100644 --- a/Docs/TagInfo/mapcomplete_education.json +++ b/Docs/TagInfo/mapcomplete_education.json @@ -35,7 +35,7 @@ }, { "key": "id", - "description": "Layer 'Colleges and universities' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Education') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Colleges and universities' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Education') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "amenity", @@ -117,7 +117,7 @@ }, { "key": "id", - "description": "Layer 'Primary and secondary schools' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Education') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Primary and secondary schools' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Education') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "name", @@ -272,7 +272,7 @@ }, { "key": "id", - "description": "Layer 'Kindergartens and childcare' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Education') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Kindergartens and childcare' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Education') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "amenity", diff --git a/Docs/TagInfo/mapcomplete_elongated_coin.json b/Docs/TagInfo/mapcomplete_elongated_coin.json index 2db149d70..730736c4f 100644 --- a/Docs/TagInfo/mapcomplete_elongated_coin.json +++ b/Docs/TagInfo/mapcomplete_elongated_coin.json @@ -22,7 +22,7 @@ }, { "key": "id", - "description": "Layer 'Penny Presses' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Penny Presses') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Penny Presses' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Penny Presses') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -90,37 +90,37 @@ }, { "key": "payment:cash", - "description": "Layer 'Penny Presses' shows payment:cash=yes with a fixed text, namely 'Cash is accepted here' (in the mapcomplete.org theme 'Penny Presses') (This is only shown if fee=yes|)", + "description": "Layer 'Penny Presses' shows payment:cash=yes with a fixed text, namely 'Cash is accepted here' (in the mapcomplete.org theme 'Penny Presses') (This is only shown if fee=yes |)", "value": "yes" }, { "key": "payment:cards", - "description": "Layer 'Penny Presses' shows payment:cards=yes with a fixed text, namely 'Payment cards are accepted here' (in the mapcomplete.org theme 'Penny Presses') (This is only shown if fee=yes|)", + "description": "Layer 'Penny Presses' shows payment:cards=yes with a fixed text, namely 'Payment cards are accepted here' (in the mapcomplete.org theme 'Penny Presses') (This is only shown if fee=yes |)", "value": "yes" }, { "key": "payment:qr_code", - "description": "Layer 'Penny Presses' shows payment:qr_code=yes with a fixed text, namely 'Payment by QR-code is possible here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Penny Presses') (This is only shown if fee=yes|)", + "description": "Layer 'Penny Presses' shows payment:qr_code=yes with a fixed text, namely 'Payment by QR-code is possible here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Penny Presses') (This is only shown if fee=yes |)", "value": "yes" }, { "key": "payment:coins", - "description": "Layer 'Penny Presses' shows payment:coins=yes with a fixed text, namely 'Coins are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Penny Presses') (This is only shown if fee=yes|)", + "description": "Layer 'Penny Presses' shows payment:coins=yes with a fixed text, namely 'Coins are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Penny Presses') (This is only shown if fee=yes |)", "value": "yes" }, { "key": "payment:notes", - "description": "Layer 'Penny Presses' shows payment:notes=yes with a fixed text, namely 'Bank notes are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Penny Presses') (This is only shown if fee=yes|)", + "description": "Layer 'Penny Presses' shows payment:notes=yes with a fixed text, namely 'Bank notes are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Penny Presses') (This is only shown if fee=yes |)", "value": "yes" }, { "key": "payment:debit_cards", - "description": "Layer 'Penny Presses' shows payment:debit_cards=yes with a fixed text, namely 'Debit cards are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Penny Presses') (This is only shown if fee=yes|)", + "description": "Layer 'Penny Presses' shows payment:debit_cards=yes with a fixed text, namely 'Debit cards are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Penny Presses') (This is only shown if fee=yes |)", "value": "yes" }, { "key": "payment:credit_cards", - "description": "Layer 'Penny Presses' shows payment:credit_cards=yes with a fixed text, namely 'Credit cards are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Penny Presses') (This is only shown if fee=yes|)", + "description": "Layer 'Penny Presses' shows payment:credit_cards=yes with a fixed text, namely 'Credit cards are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Penny Presses') (This is only shown if fee=yes |)", "value": "yes" }, { @@ -172,101 +172,101 @@ }, { "key": "charge", - "description": "Layer 'Penny Presses' shows and asks freeform values for key 'charge' (in the mapcomplete.org theme 'Penny Presses') (This is only shown if fee=yes|)" + "description": "Layer 'Penny Presses' shows and asks freeform values for key 'charge' (in the mapcomplete.org theme 'Penny Presses') (This is only shown if fee=yes |)" }, { "key": "charge", - "description": "Layer 'Penny Presses' shows charge=1 EUR with a fixed text, namely 'It costs 1 euro to press a penny.' and allows to pick this as a default answer (in the mapcomplete.org theme 'Penny Presses') (This is only shown if fee=yes|)", + "description": "Layer 'Penny Presses' shows charge=1 EUR with a fixed text, namely 'It costs 1 euro to press a penny.' and allows to pick this as a default answer (in the mapcomplete.org theme 'Penny Presses') (This is only shown if fee=yes |)", "value": "1 EUR" }, { "key": "charge", - "description": "Layer 'Penny Presses' shows charge=2 EUR with a fixed text, namely 'It costs 2 euros to press a penny.' and allows to pick this as a default answer (in the mapcomplete.org theme 'Penny Presses') (This is only shown if fee=yes|)", + "description": "Layer 'Penny Presses' shows charge=2 EUR with a fixed text, namely 'It costs 2 euros to press a penny.' and allows to pick this as a default answer (in the mapcomplete.org theme 'Penny Presses') (This is only shown if fee=yes |)", "value": "2 EUR" }, { "key": "charge", - "description": "Layer 'Penny Presses' shows charge=2 CHF with a fixed text, namely 'It costs 2 Swiss francs to press a penny.' and allows to pick this as a default answer (in the mapcomplete.org theme 'Penny Presses') (This is only shown if fee=yes|)", + "description": "Layer 'Penny Presses' shows charge=2 CHF with a fixed text, namely 'It costs 2 Swiss francs to press a penny.' and allows to pick this as a default answer (in the mapcomplete.org theme 'Penny Presses') (This is only shown if fee=yes |)", "value": "2 CHF" }, { "key": "charge", - "description": "Layer 'Penny Presses' shows charge=1 CHF with a fixed text, namely 'It costs 1 Swiss franc to press a penny.' and allows to pick this as a default answer (in the mapcomplete.org theme 'Penny Presses') (This is only shown if fee=yes|)", + "description": "Layer 'Penny Presses' shows charge=1 CHF with a fixed text, namely 'It costs 1 Swiss franc to press a penny.' and allows to pick this as a default answer (in the mapcomplete.org theme 'Penny Presses') (This is only shown if fee=yes |)", "value": "1 CHF" }, { "key": "payment:coins:denominations", - "description": "Layer 'Penny Presses' shows payment:coins:denominations=0.01 EUR with a fixed text, namely '1 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Penny Presses') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Penny Presses' shows payment:coins:denominations=0.01 EUR with a fixed text, namely '1 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Penny Presses') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.01 EUR" }, { "key": "payment:coins:denominations", - "description": "Layer 'Penny Presses' shows payment:coins:denominations=0.02 EUR with a fixed text, namely '2 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Penny Presses') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Penny Presses' shows payment:coins:denominations=0.02 EUR with a fixed text, namely '2 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Penny Presses') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.02 EUR" }, { "key": "payment:coins:denominations", - "description": "Layer 'Penny Presses' shows payment:coins:denominations=0.05 EUR with a fixed text, namely '5 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Penny Presses') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Penny Presses' shows payment:coins:denominations=0.05 EUR with a fixed text, namely '5 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Penny Presses') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.05 EUR" }, { "key": "payment:coins:denominations", - "description": "Layer 'Penny Presses' shows payment:coins:denominations=0.10 EUR with a fixed text, namely '10 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Penny Presses') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Penny Presses' shows payment:coins:denominations=0.10 EUR with a fixed text, namely '10 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Penny Presses') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.10 EUR" }, { "key": "payment:coins:denominations", - "description": "Layer 'Penny Presses' shows payment:coins:denominations=0.20 EUR with a fixed text, namely '20 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Penny Presses') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Penny Presses' shows payment:coins:denominations=0.20 EUR with a fixed text, namely '20 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Penny Presses') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.20 EUR" }, { "key": "payment:coins:denominations", - "description": "Layer 'Penny Presses' shows payment:coins:denominations=0.50 EUR with a fixed text, namely '50 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Penny Presses') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Penny Presses' shows payment:coins:denominations=0.50 EUR with a fixed text, namely '50 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Penny Presses') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.50 EUR" }, { "key": "payment:coins:denominations", - "description": "Layer 'Penny Presses' shows payment:coins:denominations=1 EUR with a fixed text, namely '1 euro coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Penny Presses') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Penny Presses' shows payment:coins:denominations=1 EUR with a fixed text, namely '1 euro coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Penny Presses') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "1 EUR" }, { "key": "payment:coins:denominations", - "description": "Layer 'Penny Presses' shows payment:coins:denominations=2 EUR with a fixed text, namely '2 euro coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Penny Presses') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Penny Presses' shows payment:coins:denominations=2 EUR with a fixed text, namely '2 euro coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Penny Presses') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "2 EUR" }, { "key": "payment:coins:denominations", - "description": "Layer 'Penny Presses' shows payment:coins:denominations=0.05 CHF with a fixed text, namely '5 centimes coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Penny Presses') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Penny Presses' shows payment:coins:denominations=0.05 CHF with a fixed text, namely '5 centimes coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Penny Presses') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.05 CHF" }, { "key": "payment:coins:denominations", - "description": "Layer 'Penny Presses' shows payment:coins:denominations=0.10 CHF with a fixed text, namely '10 centimes coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Penny Presses') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Penny Presses' shows payment:coins:denominations=0.10 CHF with a fixed text, namely '10 centimes coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Penny Presses') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.10 CHF" }, { "key": "payment:coins:denominations", - "description": "Layer 'Penny Presses' shows payment:coins:denominations=0.20 CHF with a fixed text, namely '20 centimes coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Penny Presses') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Penny Presses' shows payment:coins:denominations=0.20 CHF with a fixed text, namely '20 centimes coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Penny Presses') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.20 CHF" }, { "key": "payment:coins:denominations", - "description": "Layer 'Penny Presses' shows payment:coins:denominations=0.50 CHF with a fixed text, namely '½ franc coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Penny Presses') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Penny Presses' shows payment:coins:denominations=0.50 CHF with a fixed text, namely '½ franc coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Penny Presses') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.50 CHF" }, { "key": "payment:coins:denominations", - "description": "Layer 'Penny Presses' shows payment:coins:denominations=1 CHF with a fixed text, namely '1 franc coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Penny Presses') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Penny Presses' shows payment:coins:denominations=1 CHF with a fixed text, namely '1 franc coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Penny Presses') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "1 CHF" }, { "key": "payment:coins:denominations", - "description": "Layer 'Penny Presses' shows payment:coins:denominations=2 CHF with a fixed text, namely '2 francs coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Penny Presses') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Penny Presses' shows payment:coins:denominations=2 CHF with a fixed text, namely '2 francs coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Penny Presses') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "2 CHF" }, { "key": "payment:coins:denominations", - "description": "Layer 'Penny Presses' shows payment:coins:denominations=5 CHF with a fixed text, namely '5 francs coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Penny Presses') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Penny Presses' shows payment:coins:denominations=5 CHF with a fixed text, namely '5 francs coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Penny Presses') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "5 CHF" }, { diff --git a/Docs/TagInfo/mapcomplete_etymology.json b/Docs/TagInfo/mapcomplete_etymology.json index fe621e174..ae811887f 100644 --- a/Docs/TagInfo/mapcomplete_etymology.json +++ b/Docs/TagInfo/mapcomplete_etymology.json @@ -20,7 +20,7 @@ }, { "key": "id", - "description": "Layer 'Has etymology' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Etymology - what is a street named after?') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Has etymology' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Etymology - what is a street named after?') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -44,11 +44,11 @@ }, { "key": "name:etymology", - "description": "Layer 'Has etymology' shows and asks freeform values for key 'name:etymology' (in the mapcomplete.org theme 'Etymology - what is a street named after?') (This is only shown if name:etymology~.+|)" + "description": "Layer 'Has etymology' shows and asks freeform values for key 'name:etymology' (in the mapcomplete.org theme 'Etymology - what is a street named after?') (This is only shown if name:etymology~.+ |)" }, { "key": "name:etymology", - "description": "Layer 'Has etymology' shows name:etymology=unknown with a fixed text, namely 'The origin of this name is unknown in all literature' and allows to pick this as a default answer (in the mapcomplete.org theme 'Etymology - what is a street named after?') (This is only shown if name:etymology~.+|)", + "description": "Layer 'Has etymology' shows name:etymology=unknown with a fixed text, namely 'The origin of this name is unknown in all literature' and allows to pick this as a default answer (in the mapcomplete.org theme 'Etymology - what is a street named after?') (This is only shown if name:etymology~.+ |)", "value": "unknown" }, { @@ -77,7 +77,7 @@ }, { "key": "id", - "description": "Layer 'Streets without etymology information' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Etymology - what is a street named after?') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Streets without etymology information' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Etymology - what is a street named after?') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -101,11 +101,11 @@ }, { "key": "name:etymology", - "description": "Layer 'Streets without etymology information' shows and asks freeform values for key 'name:etymology' (in the mapcomplete.org theme 'Etymology - what is a street named after?') (This is only shown if name:etymology~.+|)" + "description": "Layer 'Streets without etymology information' shows and asks freeform values for key 'name:etymology' (in the mapcomplete.org theme 'Etymology - what is a street named after?') (This is only shown if name:etymology~.+ |)" }, { "key": "name:etymology", - "description": "Layer 'Streets without etymology information' shows name:etymology=unknown with a fixed text, namely 'The origin of this name is unknown in all literature' and allows to pick this as a default answer (in the mapcomplete.org theme 'Etymology - what is a street named after?') (This is only shown if name:etymology~.+|)", + "description": "Layer 'Streets without etymology information' shows name:etymology=unknown with a fixed text, namely 'The origin of this name is unknown in all literature' and allows to pick this as a default answer (in the mapcomplete.org theme 'Etymology - what is a street named after?') (This is only shown if name:etymology~.+ |)", "value": "unknown" }, { @@ -140,7 +140,7 @@ }, { "key": "id", - "description": "Layer 'Parks and forests without etymology information' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Etymology - what is a street named after?') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Parks and forests without etymology information' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Etymology - what is a street named after?') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -164,11 +164,11 @@ }, { "key": "name:etymology", - "description": "Layer 'Parks and forests without etymology information' shows and asks freeform values for key 'name:etymology' (in the mapcomplete.org theme 'Etymology - what is a street named after?') (This is only shown if name:etymology~.+|)" + "description": "Layer 'Parks and forests without etymology information' shows and asks freeform values for key 'name:etymology' (in the mapcomplete.org theme 'Etymology - what is a street named after?') (This is only shown if name:etymology~.+ |)" }, { "key": "name:etymology", - "description": "Layer 'Parks and forests without etymology information' shows name:etymology=unknown with a fixed text, namely 'The origin of this name is unknown in all literature' and allows to pick this as a default answer (in the mapcomplete.org theme 'Etymology - what is a street named after?') (This is only shown if name:etymology~.+|)", + "description": "Layer 'Parks and forests without etymology information' shows name:etymology=unknown with a fixed text, namely 'The origin of this name is unknown in all literature' and allows to pick this as a default answer (in the mapcomplete.org theme 'Etymology - what is a street named after?') (This is only shown if name:etymology~.+ |)", "value": "unknown" }, { @@ -218,7 +218,7 @@ }, { "key": "id", - "description": "Layer 'Education institutions without etymology information' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Etymology - what is a street named after?') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Education institutions without etymology information' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Etymology - what is a street named after?') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -242,11 +242,11 @@ }, { "key": "name:etymology", - "description": "Layer 'Education institutions without etymology information' shows and asks freeform values for key 'name:etymology' (in the mapcomplete.org theme 'Etymology - what is a street named after?') (This is only shown if name:etymology~.+|)" + "description": "Layer 'Education institutions without etymology information' shows and asks freeform values for key 'name:etymology' (in the mapcomplete.org theme 'Etymology - what is a street named after?') (This is only shown if name:etymology~.+ |)" }, { "key": "name:etymology", - "description": "Layer 'Education institutions without etymology information' shows name:etymology=unknown with a fixed text, namely 'The origin of this name is unknown in all literature' and allows to pick this as a default answer (in the mapcomplete.org theme 'Etymology - what is a street named after?') (This is only shown if name:etymology~.+|)", + "description": "Layer 'Education institutions without etymology information' shows name:etymology=unknown with a fixed text, namely 'The origin of this name is unknown in all literature' and allows to pick this as a default answer (in the mapcomplete.org theme 'Etymology - what is a street named after?') (This is only shown if name:etymology~.+ |)", "value": "unknown" }, { @@ -296,7 +296,7 @@ }, { "key": "id", - "description": "Layer 'Cultural places without etymology information' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Etymology - what is a street named after?') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Cultural places without etymology information' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Etymology - what is a street named after?') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -320,11 +320,11 @@ }, { "key": "name:etymology", - "description": "Layer 'Cultural places without etymology information' shows and asks freeform values for key 'name:etymology' (in the mapcomplete.org theme 'Etymology - what is a street named after?') (This is only shown if name:etymology~.+|)" + "description": "Layer 'Cultural places without etymology information' shows and asks freeform values for key 'name:etymology' (in the mapcomplete.org theme 'Etymology - what is a street named after?') (This is only shown if name:etymology~.+ |)" }, { "key": "name:etymology", - "description": "Layer 'Cultural places without etymology information' shows name:etymology=unknown with a fixed text, namely 'The origin of this name is unknown in all literature' and allows to pick this as a default answer (in the mapcomplete.org theme 'Etymology - what is a street named after?') (This is only shown if name:etymology~.+|)", + "description": "Layer 'Cultural places without etymology information' shows name:etymology=unknown with a fixed text, namely 'The origin of this name is unknown in all literature' and allows to pick this as a default answer (in the mapcomplete.org theme 'Etymology - what is a street named after?') (This is only shown if name:etymology~.+ |)", "value": "unknown" }, { @@ -369,7 +369,7 @@ }, { "key": "id", - "description": "Layer 'Toursistic places without etymology information' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Etymology - what is a street named after?') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Toursistic places without etymology information' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Etymology - what is a street named after?') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -393,11 +393,11 @@ }, { "key": "name:etymology", - "description": "Layer 'Toursistic places without etymology information' shows and asks freeform values for key 'name:etymology' (in the mapcomplete.org theme 'Etymology - what is a street named after?') (This is only shown if name:etymology~.+|)" + "description": "Layer 'Toursistic places without etymology information' shows and asks freeform values for key 'name:etymology' (in the mapcomplete.org theme 'Etymology - what is a street named after?') (This is only shown if name:etymology~.+ |)" }, { "key": "name:etymology", - "description": "Layer 'Toursistic places without etymology information' shows name:etymology=unknown with a fixed text, namely 'The origin of this name is unknown in all literature' and allows to pick this as a default answer (in the mapcomplete.org theme 'Etymology - what is a street named after?') (This is only shown if name:etymology~.+|)", + "description": "Layer 'Toursistic places without etymology information' shows name:etymology=unknown with a fixed text, namely 'The origin of this name is unknown in all literature' and allows to pick this as a default answer (in the mapcomplete.org theme 'Etymology - what is a street named after?') (This is only shown if name:etymology~.+ |)", "value": "unknown" }, { @@ -437,7 +437,7 @@ }, { "key": "id", - "description": "Layer 'Health and social places without etymology information' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Etymology - what is a street named after?') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Health and social places without etymology information' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Etymology - what is a street named after?') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -461,11 +461,11 @@ }, { "key": "name:etymology", - "description": "Layer 'Health and social places without etymology information' shows and asks freeform values for key 'name:etymology' (in the mapcomplete.org theme 'Etymology - what is a street named after?') (This is only shown if name:etymology~.+|)" + "description": "Layer 'Health and social places without etymology information' shows and asks freeform values for key 'name:etymology' (in the mapcomplete.org theme 'Etymology - what is a street named after?') (This is only shown if name:etymology~.+ |)" }, { "key": "name:etymology", - "description": "Layer 'Health and social places without etymology information' shows name:etymology=unknown with a fixed text, namely 'The origin of this name is unknown in all literature' and allows to pick this as a default answer (in the mapcomplete.org theme 'Etymology - what is a street named after?') (This is only shown if name:etymology~.+|)", + "description": "Layer 'Health and social places without etymology information' shows name:etymology=unknown with a fixed text, namely 'The origin of this name is unknown in all literature' and allows to pick this as a default answer (in the mapcomplete.org theme 'Etymology - what is a street named after?') (This is only shown if name:etymology~.+ |)", "value": "unknown" }, { @@ -505,7 +505,7 @@ }, { "key": "id", - "description": "Layer 'Sport places without etymology information' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Etymology - what is a street named after?') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Sport places without etymology information' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Etymology - what is a street named after?') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -529,11 +529,11 @@ }, { "key": "name:etymology", - "description": "Layer 'Sport places without etymology information' shows and asks freeform values for key 'name:etymology' (in the mapcomplete.org theme 'Etymology - what is a street named after?') (This is only shown if name:etymology~.+|)" + "description": "Layer 'Sport places without etymology information' shows and asks freeform values for key 'name:etymology' (in the mapcomplete.org theme 'Etymology - what is a street named after?') (This is only shown if name:etymology~.+ |)" }, { "key": "name:etymology", - "description": "Layer 'Sport places without etymology information' shows name:etymology=unknown with a fixed text, namely 'The origin of this name is unknown in all literature' and allows to pick this as a default answer (in the mapcomplete.org theme 'Etymology - what is a street named after?') (This is only shown if name:etymology~.+|)", + "description": "Layer 'Sport places without etymology information' shows name:etymology=unknown with a fixed text, namely 'The origin of this name is unknown in all literature' and allows to pick this as a default answer (in the mapcomplete.org theme 'Etymology - what is a street named after?') (This is only shown if name:etymology~.+ |)", "value": "unknown" }, { diff --git a/Docs/TagInfo/mapcomplete_facadegardens.json b/Docs/TagInfo/mapcomplete_facadegardens.json index fa6524902..e68e402eb 100644 --- a/Docs/TagInfo/mapcomplete_facadegardens.json +++ b/Docs/TagInfo/mapcomplete_facadegardens.json @@ -22,7 +22,7 @@ }, { "key": "id", - "description": "Layer 'Facade gardens' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Facade gardens') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Facade gardens' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Facade gardens') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", diff --git a/Docs/TagInfo/mapcomplete_food.json b/Docs/TagInfo/mapcomplete_food.json index 88c5fba3b..ac0eb8706 100644 --- a/Docs/TagInfo/mapcomplete_food.json +++ b/Docs/TagInfo/mapcomplete_food.json @@ -22,7 +22,7 @@ }, { "key": "id", - "description": "Layer 'Restaurants and fast food' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Restaurants and fast food') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Restaurants and fast food' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Restaurants and fast food') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -542,17 +542,17 @@ }, { "key": "internet_access:fee", - "description": "Layer 'Restaurants and fast food' shows internet_access:fee=yes with a fixed text, namely 'There is a fee for the internet access at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Restaurants and fast food') (This is only shown if internet_access!=no&internet_access~.+)", + "description": "Layer 'Restaurants and fast food' shows internet_access:fee=yes with a fixed text, namely 'There is a fee for the internet access at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Restaurants and fast food') (This is only shown if internet_access!=no &internet_access~.+)", "value": "yes" }, { "key": "internet_access:fee", - "description": "Layer 'Restaurants and fast food' shows internet_access:fee=no with a fixed text, namely 'Internet access is free at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Restaurants and fast food') (This is only shown if internet_access!=no&internet_access~.+)", + "description": "Layer 'Restaurants and fast food' shows internet_access:fee=no with a fixed text, namely 'Internet access is free at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Restaurants and fast food') (This is only shown if internet_access!=no &internet_access~.+)", "value": "no" }, { "key": "internet_access:fee", - "description": "Layer 'Restaurants and fast food' shows internet_access:fee=customers with a fixed text, namely 'Internet access is free at this place, for customers only' and allows to pick this as a default answer (in the mapcomplete.org theme 'Restaurants and fast food') (This is only shown if internet_access!=no&internet_access~.+)", + "description": "Layer 'Restaurants and fast food' shows internet_access:fee=customers with a fixed text, namely 'Internet access is free at this place, for customers only' and allows to pick this as a default answer (in the mapcomplete.org theme 'Restaurants and fast food') (This is only shown if internet_access!=no &internet_access~.+)", "value": "customers" }, { diff --git a/Docs/TagInfo/mapcomplete_fritures.json b/Docs/TagInfo/mapcomplete_fritures.json index d85d9b6f2..eb52a958c 100644 --- a/Docs/TagInfo/mapcomplete_fritures.json +++ b/Docs/TagInfo/mapcomplete_fritures.json @@ -26,7 +26,7 @@ }, { "key": "id", - "description": "Layer 'Fries shop' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Fries shops') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Fries shop' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Fries shops') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -546,17 +546,17 @@ }, { "key": "internet_access:fee", - "description": "Layer 'Fries shop' shows internet_access:fee=yes with a fixed text, namely 'There is a fee for the internet access at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Fries shops') (This is only shown if internet_access!=no&internet_access~.+)", + "description": "Layer 'Fries shop' shows internet_access:fee=yes with a fixed text, namely 'There is a fee for the internet access at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Fries shops') (This is only shown if internet_access!=no &internet_access~.+)", "value": "yes" }, { "key": "internet_access:fee", - "description": "Layer 'Fries shop' shows internet_access:fee=no with a fixed text, namely 'Internet access is free at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Fries shops') (This is only shown if internet_access!=no&internet_access~.+)", + "description": "Layer 'Fries shop' shows internet_access:fee=no with a fixed text, namely 'Internet access is free at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Fries shops') (This is only shown if internet_access!=no &internet_access~.+)", "value": "no" }, { "key": "internet_access:fee", - "description": "Layer 'Fries shop' shows internet_access:fee=customers with a fixed text, namely 'Internet access is free at this place, for customers only' and allows to pick this as a default answer (in the mapcomplete.org theme 'Fries shops') (This is only shown if internet_access!=no&internet_access~.+)", + "description": "Layer 'Fries shop' shows internet_access:fee=customers with a fixed text, namely 'Internet access is free at this place, for customers only' and allows to pick this as a default answer (in the mapcomplete.org theme 'Fries shops') (This is only shown if internet_access!=no &internet_access~.+)", "value": "customers" }, { diff --git a/Docs/TagInfo/mapcomplete_ghostbikes.json b/Docs/TagInfo/mapcomplete_ghostbikes.json index f2a4a8c45..d5e759c52 100644 --- a/Docs/TagInfo/mapcomplete_ghostbikes.json +++ b/Docs/TagInfo/mapcomplete_ghostbikes.json @@ -17,7 +17,7 @@ }, { "key": "id", - "description": "Layer 'Ghost bikes' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Ghost bikes') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Ghost bikes' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Ghost bikes') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", diff --git a/Docs/TagInfo/mapcomplete_guideposts.json b/Docs/TagInfo/mapcomplete_guideposts.json index 58ec548d1..d06260665 100644 --- a/Docs/TagInfo/mapcomplete_guideposts.json +++ b/Docs/TagInfo/mapcomplete_guideposts.json @@ -17,7 +17,7 @@ }, { "key": "id", - "description": "Layer 'Guideposts' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Guideposts') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Guideposts' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Guideposts') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -34,6 +34,31 @@ { "key": "wikipedia", "description": "The layer 'Guideposts allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" + }, + { + "key": "bicycle", + "description": "Layer 'Guideposts' shows bicycle=yes with a fixed text, namely 'This guidepost shows bicycle routes' and allows to pick this as a default answer (in the mapcomplete.org theme 'Guideposts')", + "value": "yes" + }, + { + "key": "hiking", + "description": "Layer 'Guideposts' shows hiking=yes with a fixed text, namely 'This guidepost shows hiking routes' and allows to pick this as a default answer (in the mapcomplete.org theme 'Guideposts')", + "value": "yes" + }, + { + "key": "mtb", + "description": "Layer 'Guideposts' shows mtb=yes with a fixed text, namely 'This guidepost shows mountain bike routes' and allows to pick this as a default answer (in the mapcomplete.org theme 'Guideposts')", + "value": "yes" + }, + { + "key": "horse", + "description": "Layer 'Guideposts' shows horse=yes with a fixed text, namely 'This guidepost shows horse riding routes' and allows to pick this as a default answer (in the mapcomplete.org theme 'Guideposts')", + "value": "yes" + }, + { + "key": "ski", + "description": "Layer 'Guideposts' shows ski=yes with a fixed text, namely 'This guidepost shows ski routes' and allows to pick this as a default answer (in the mapcomplete.org theme 'Guideposts')", + "value": "yes" } ] } \ No newline at end of file diff --git a/Docs/TagInfo/mapcomplete_hackerspaces.json b/Docs/TagInfo/mapcomplete_hackerspaces.json index 4e06af13f..69284ab03 100644 --- a/Docs/TagInfo/mapcomplete_hackerspaces.json +++ b/Docs/TagInfo/mapcomplete_hackerspaces.json @@ -17,7 +17,7 @@ }, { "key": "id", - "description": "Layer 'Hackerspace' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Hackerspaces') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Hackerspace' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Hackerspaces') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", diff --git a/Docs/TagInfo/mapcomplete_hailhydrant.json b/Docs/TagInfo/mapcomplete_hailhydrant.json index a7618976a..59665211a 100644 --- a/Docs/TagInfo/mapcomplete_hailhydrant.json +++ b/Docs/TagInfo/mapcomplete_hailhydrant.json @@ -17,7 +17,7 @@ }, { "key": "id", - "description": "Layer 'Map of hydrants' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Map of hydrants' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "colour", @@ -136,7 +136,7 @@ }, { "key": "id", - "description": "Layer 'Map of fire extinguishers' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Map of fire extinguishers' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "location", @@ -175,7 +175,7 @@ }, { "key": "id", - "description": "Layer 'Map of fire stations' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Map of fire stations' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "name", @@ -195,12 +195,12 @@ }, { "key": "operator", - "description": "Layer 'Map of fire stations' shows operator=Bureau of Fire Protection&operator:type=government with a fixed text, namely 'Bureau of Fire Protection' and allows to pick this as a default answer (in the mapcomplete.org theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations')", + "description": "Layer 'Map of fire stations' shows operator=Bureau of Fire Protection &operator:type=government with a fixed text, namely 'Bureau of Fire Protection' and allows to pick this as a default answer (in the mapcomplete.org theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations')", "value": "Bureau of Fire Protection" }, { "key": "operator:type", - "description": "Layer 'Map of fire stations' shows operator=Bureau of Fire Protection&operator:type=government with a fixed text, namely 'Bureau of Fire Protection' and allows to pick this as a default answer (in the mapcomplete.org theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations')", + "description": "Layer 'Map of fire stations' shows operator=Bureau of Fire Protection &operator:type=government with a fixed text, namely 'Bureau of Fire Protection' and allows to pick this as a default answer (in the mapcomplete.org theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations')", "value": "government" }, { @@ -250,7 +250,7 @@ }, { "key": "id", - "description": "Layer 'Map of ambulance stations' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Map of ambulance stations' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "name", diff --git a/Docs/TagInfo/mapcomplete_healthcare.json b/Docs/TagInfo/mapcomplete_healthcare.json index b8733d1bd..6c61a62aa 100644 --- a/Docs/TagInfo/mapcomplete_healthcare.json +++ b/Docs/TagInfo/mapcomplete_healthcare.json @@ -17,7 +17,7 @@ }, { "key": "id", - "description": "Layer 'Doctors' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Healthcare') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Doctors' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Healthcare') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -107,7 +107,7 @@ }, { "key": "id", - "description": "Layer 'Physiotherapist' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Healthcare') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Physiotherapist' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Healthcare') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -173,7 +173,7 @@ }, { "key": "id", - "description": "Layer 'Dentist' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Healthcare') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Dentist' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Healthcare') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -235,7 +235,7 @@ }, { "key": "id", - "description": "Layer 'Hospitals' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Healthcare') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Hospitals' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Healthcare') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "name", @@ -286,7 +286,7 @@ }, { "key": "id", - "description": "Layer 'Pharmacies' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Healthcare') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Pharmacies' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Healthcare') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -382,7 +382,7 @@ }, { "key": "id", - "description": "Layer 'Shop' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Healthcare') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Shop' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Healthcare') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -408,6 +408,11 @@ "key": "shop", "description": "Layer 'Shop' shows and asks freeform values for key 'shop' (in the mapcomplete.org theme 'Healthcare')" }, + { + "key": "shop", + "description": "Layer 'Shop' shows shop=vacant with a fixed text, namely 'Vacant Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", + "value": "vacant" + }, { "key": "shop", "description": "Layer 'Shop' shows shop=agrarian with a fixed text, namely 'Farm Supply Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", @@ -425,7 +430,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=antiques with a fixed text, namely 'Antiques Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", + "description": "Layer 'Shop' shows shop=antiques with a fixed text, namely 'Antique Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", "value": "antiques" }, { @@ -490,7 +495,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=books with a fixed text, namely 'Book Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", + "description": "Layer 'Shop' shows shop=books with a fixed text, namely 'Bookstore' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", "value": "books" }, { @@ -610,7 +615,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=country_store with a fixed text, namely 'Country Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", + "description": "Layer 'Shop' shows shop=country_store with a fixed text, namely 'Rural Supplies Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", "value": "country_store" }, { @@ -630,7 +635,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=deli with a fixed text, namely 'Deli' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", + "description": "Layer 'Shop' shows shop=deli with a fixed text, namely 'Delicatessen' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", "value": "deli" }, { @@ -780,7 +785,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=health_food with a fixed text, namely 'Health Food Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", + "description": "Layer 'Shop' shows shop=health_food with a fixed text, namely 'Health Food Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", "value": "health_food" }, { @@ -800,8 +805,8 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=hobby with a fixed text, namely 'Hobby Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", - "value": "hobby" + "description": "Layer 'Shop' shows shop=honey with a fixed text, namely 'Honey Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", + "value": "honey" }, { "key": "shop", @@ -920,7 +925,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=newsagent with a fixed text, namely 'Newspaper/Magazine Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", + "description": "Layer 'Shop' shows shop=newsagent with a fixed text, namely 'Newsstand' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", "value": "newsagent" }, { @@ -928,6 +933,11 @@ "description": "Layer 'Shop' shows shop=nutrition_supplements with a fixed text, namely 'Nutrition Supplements Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", "value": "nutrition_supplements" }, + { + "key": "shop", + "description": "Layer 'Shop' shows shop=nuts with a fixed text, namely 'Nuts Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", + "value": "nuts" + }, { "key": "shop", "description": "Layer 'Shop' shows shop=optician with a fixed text, namely 'Optician' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", @@ -953,6 +963,11 @@ "description": "Layer 'Shop' shows shop=party with a fixed text, namely 'Party Supply Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", "value": "party" }, + { + "key": "shop", + "description": "Layer 'Shop' shows shop=pasta with a fixed text, namely 'Pasta Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", + "value": "pasta" + }, { "key": "shop", "description": "Layer 'Shop' shows shop=pastry with a fixed text, namely 'Pastry Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", @@ -960,7 +975,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=pawnbroker with a fixed text, namely 'Pawn Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", + "description": "Layer 'Shop' shows shop=pawnbroker with a fixed text, namely 'Pawnshop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", "value": "pawnbroker" }, { @@ -975,7 +990,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=pet_grooming with a fixed text, namely 'Pet Grooming Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", + "description": "Layer 'Shop' shows shop=pet_grooming with a fixed text, namely 'Pet Groomer' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", "value": "pet_grooming" }, { @@ -1023,6 +1038,11 @@ "description": "Layer 'Shop' shows shop=repair with a fixed text, namely 'Repair Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", "value": "repair" }, + { + "key": "shop", + "description": "Layer 'Shop' shows shop=rice with a fixed text, namely 'Rice Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", + "value": "rice" + }, { "key": "shop", "description": "Layer 'Shop' shows shop=scuba_diving with a fixed text, namely 'Scuba Diving Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", @@ -1035,7 +1055,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=second_hand with a fixed text, namely 'Consignment/Thrift Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", + "description": "Layer 'Shop' shows shop=second_hand with a fixed text, namely 'Thrift Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", "value": "second_hand" }, { @@ -1155,7 +1175,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=variety_store with a fixed text, namely 'Variety Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", + "description": "Layer 'Shop' shows shop=variety_store with a fixed text, namely 'Discount Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", "value": "variety_store" }, { @@ -1210,17 +1230,17 @@ }, { "key": "second_hand", - "description": "Layer 'Shop' shows second_hand=only with a fixed text, namely 'This shop sells second-hand items only' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=clothes|shop=car|shop=books|shop=charity|shop=car_repair|shop=furniture|shop=bicycle|shop=bicycle|shop=mobile_phone|shop=computer|shop=toys)", + "description": "Layer 'Shop' shows second_hand=only with a fixed text, namely 'This shop sells second-hand items only' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=clothes |shop=car |shop=books |shop=charity |shop=car_repair |shop=furniture |shop=bicycle |shop=bicycle |shop=mobile_phone |shop=computer |shop=toys)", "value": "only" }, { "key": "second_hand", - "description": "Layer 'Shop' shows second_hand=yes with a fixed text, namely 'This shop sells second-hand items along with new items' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=clothes|shop=car|shop=books|shop=charity|shop=car_repair|shop=furniture|shop=bicycle|shop=bicycle|shop=mobile_phone|shop=computer|shop=toys)", + "description": "Layer 'Shop' shows second_hand=yes with a fixed text, namely 'This shop sells second-hand items along with new items' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=clothes |shop=car |shop=books |shop=charity |shop=car_repair |shop=furniture |shop=bicycle |shop=bicycle |shop=mobile_phone |shop=computer |shop=toys)", "value": "yes" }, { "key": "second_hand", - "description": "Layer 'Shop' shows second_hand=no with a fixed text, namely 'This shop only sells brand-new items' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=clothes|shop=car|shop=books|shop=charity|shop=car_repair|shop=furniture|shop=bicycle|shop=bicycle|shop=mobile_phone|shop=computer|shop=toys)", + "description": "Layer 'Shop' shows second_hand=no with a fixed text, namely 'This shop only sells brand-new items' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=clothes |shop=car |shop=books |shop=charity |shop=car_repair |shop=furniture |shop=bicycle |shop=bicycle |shop=mobile_phone |shop=computer |shop=toys)", "value": "no" }, { @@ -1297,29 +1317,49 @@ }, { "key": "service:print:A4", - "description": "Layer 'Shop' shows service:print:A4=yes with a fixed text, namely 'This shop can print on papers of size A4' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop~^(.*copyshop.*)$|shop~^(.*stationery.*)$|service:print=yes)", + "description": "Layer 'Shop' shows service:print:A4=yes with a fixed text, namely 'This shop can print on papers of size A4' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop~^(.*copyshop.*)$ |shop~^(.*stationery.*)$ |service:print=yes)", "value": "yes" }, { "key": "service:print:A3", - "description": "Layer 'Shop' shows service:print:A3=yes with a fixed text, namely 'This shop can print on papers of size A3' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop~^(.*copyshop.*)$|shop~^(.*stationery.*)$|service:print=yes)", + "description": "Layer 'Shop' shows service:print:A3=yes with a fixed text, namely 'This shop can print on papers of size A3' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop~^(.*copyshop.*)$ |shop~^(.*stationery.*)$ |service:print=yes)", "value": "yes" }, { "key": "service:print:A2", - "description": "Layer 'Shop' shows service:print:A2=yes with a fixed text, namely 'This shop can print on papers of size A2' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop~^(.*copyshop.*)$|shop~^(.*stationery.*)$|service:print=yes)", + "description": "Layer 'Shop' shows service:print:A2=yes with a fixed text, namely 'This shop can print on papers of size A2' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop~^(.*copyshop.*)$ |shop~^(.*stationery.*)$ |service:print=yes)", "value": "yes" }, { "key": "service:print:A1", - "description": "Layer 'Shop' shows service:print:A1=yes with a fixed text, namely 'This shop can print on papers of size A1' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop~^(.*copyshop.*)$|shop~^(.*stationery.*)$|service:print=yes)", + "description": "Layer 'Shop' shows service:print:A1=yes with a fixed text, namely 'This shop can print on papers of size A1' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop~^(.*copyshop.*)$ |shop~^(.*stationery.*)$ |service:print=yes)", "value": "yes" }, { "key": "service:print:A0", - "description": "Layer 'Shop' shows service:print:A0=yes with a fixed text, namely 'This shop can print on papers of size A0' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop~^(.*copyshop.*)$|shop~^(.*stationery.*)$|service:print=yes)", + "description": "Layer 'Shop' shows service:print:A0=yes with a fixed text, namely 'This shop can print on papers of size A0' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop~^(.*copyshop.*)$ |shop~^(.*stationery.*)$ |service:print=yes)", "value": "yes" }, + { + "key": "craft", + "description": "Layer 'Shop' shows craft=key_cutter with a fixed text, namely 'This shop is also specialized in key cutting' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=shoe_repair |service:key_cutting~.+ |craft=key_cutting |shop=diy |shop=doityourself |shop=home_improvement |shop=hardware |shop=locksmith |shop=repair)", + "value": "key_cutter" + }, + { + "key": "service:key_cutting", + "description": "Layer 'Shop' shows service:key_cutting=yes with a fixed text, namely 'This shop offers key cutting as a service' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=shoe_repair |service:key_cutting~.+ |craft=key_cutting |shop=diy |shop=doityourself |shop=home_improvement |shop=hardware |shop=locksmith |shop=repair)", + "value": "yes" + }, + { + "key": "craft", + "description": "Layer 'Shop' shows service:key_cutting=no with a fixed text, namely 'This shops does not offer key cutting as a service' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') Picking this answer will delete the key craft. (This is only shown if shop=shoe_repair |service:key_cutting~.+ |craft=key_cutting |shop=diy |shop=doityourself |shop=home_improvement |shop=hardware |shop=locksmith |shop=repair)", + "value": "" + }, + { + "key": "service:key_cutting", + "description": "Layer 'Shop' shows service:key_cutting=no with a fixed text, namely 'This shops does not offer key cutting as a service' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=shoe_repair |service:key_cutting~.+ |craft=key_cutting |shop=diy |shop=doityourself |shop=home_improvement |shop=hardware |shop=locksmith |shop=repair)", + "value": "no" + }, { "key": "internet_access", "description": "Layer 'Shop' shows internet_access=wlan with a fixed text, namely 'This place offers wireless internet access' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", @@ -1347,17 +1387,17 @@ }, { "key": "internet_access:fee", - "description": "Layer 'Shop' shows internet_access:fee=yes with a fixed text, namely 'There is a fee for the internet access at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if internet_access!=no&internet_access~.+)", + "description": "Layer 'Shop' shows internet_access:fee=yes with a fixed text, namely 'There is a fee for the internet access at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if internet_access!=no &internet_access~.+)", "value": "yes" }, { "key": "internet_access:fee", - "description": "Layer 'Shop' shows internet_access:fee=no with a fixed text, namely 'Internet access is free at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if internet_access!=no&internet_access~.+)", + "description": "Layer 'Shop' shows internet_access:fee=no with a fixed text, namely 'Internet access is free at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if internet_access!=no &internet_access~.+)", "value": "no" }, { "key": "internet_access:fee", - "description": "Layer 'Shop' shows internet_access:fee=customers with a fixed text, namely 'Internet access is free at this place, for customers only' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if internet_access!=no&internet_access~.+)", + "description": "Layer 'Shop' shows internet_access:fee=customers with a fixed text, namely 'Internet access is free at this place, for customers only' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if internet_access!=no &internet_access~.+)", "value": "customers" }, { @@ -1371,77 +1411,77 @@ }, { "key": "organic", - "description": "Layer 'Shop' shows organic=yes with a fixed text, namely 'This shop offers organic products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=clothes|shop=shoes|shop=butcher|shop=cosmetics|shop=deli|shop=bakery|shop=alcohol|shop=seafood|shop=beverages|shop=florist)", + "description": "Layer 'Shop' shows organic=yes with a fixed text, namely 'This shop offers organic products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=clothes |shop=shoes |shop=butcher |shop=cosmetics |shop=deli |shop=bakery |shop=alcohol |shop=seafood |shop=beverages |shop=florist)", "value": "yes" }, { "key": "organic", - "description": "Layer 'Shop' shows organic=only with a fixed text, namely 'This shop only offers organic products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=clothes|shop=shoes|shop=butcher|shop=cosmetics|shop=deli|shop=bakery|shop=alcohol|shop=seafood|shop=beverages|shop=florist)", + "description": "Layer 'Shop' shows organic=only with a fixed text, namely 'This shop only offers organic products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=clothes |shop=shoes |shop=butcher |shop=cosmetics |shop=deli |shop=bakery |shop=alcohol |shop=seafood |shop=beverages |shop=florist)", "value": "only" }, { "key": "organic", - "description": "Layer 'Shop' shows organic=no with a fixed text, namely 'This shop does not offer organic products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=clothes|shop=shoes|shop=butcher|shop=cosmetics|shop=deli|shop=bakery|shop=alcohol|shop=seafood|shop=beverages|shop=florist)", + "description": "Layer 'Shop' shows organic=no with a fixed text, namely 'This shop does not offer organic products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=clothes |shop=shoes |shop=butcher |shop=cosmetics |shop=deli |shop=bakery |shop=alcohol |shop=seafood |shop=beverages |shop=florist)", "value": "no" }, { "key": "diet:sugar_free", - "description": "Layer 'Shop' shows diet:sugar_free=only with a fixed text, namely 'This shop only sells sugar free products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:sugar_free=only with a fixed text, namely 'This shop only sells sugar free products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "only" }, { "key": "diet:sugar_free", - "description": "Layer 'Shop' shows diet:sugar_free=yes with a fixed text, namely 'This shop has a big sugar free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:sugar_free=yes with a fixed text, namely 'This shop has a big sugar free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "yes" }, { "key": "diet:sugar_free", - "description": "Layer 'Shop' shows diet:sugar_free=limited with a fixed text, namely 'This shop has a limited sugar free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:sugar_free=limited with a fixed text, namely 'This shop has a limited sugar free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "limited" }, { "key": "diet:sugar_free", - "description": "Layer 'Shop' shows diet:sugar_free=no with a fixed text, namely 'This shop has no sugar free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:sugar_free=no with a fixed text, namely 'This shop has no sugar free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "no" }, { "key": "diet:gluten_free", - "description": "Layer 'Shop' shows diet:gluten_free=only with a fixed text, namely 'This shop only sells gluten free products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:gluten_free=only with a fixed text, namely 'This shop only sells gluten free products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "only" }, { "key": "diet:gluten_free", - "description": "Layer 'Shop' shows diet:gluten_free=yes with a fixed text, namely 'This shop has a big gluten free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:gluten_free=yes with a fixed text, namely 'This shop has a big gluten free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "yes" }, { "key": "diet:gluten_free", - "description": "Layer 'Shop' shows diet:gluten_free=limited with a fixed text, namely 'This shop has a limited gluten free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:gluten_free=limited with a fixed text, namely 'This shop has a limited gluten free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "limited" }, { "key": "diet:gluten_free", - "description": "Layer 'Shop' shows diet:gluten_free=no with a fixed text, namely 'This shop has no gluten free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:gluten_free=no with a fixed text, namely 'This shop has no gluten free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "no" }, { "key": "diet:lactose_free", - "description": "Layer 'Shop' shows diet:lactose_free=only with a fixed text, namely 'Only sells lactose free products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:lactose_free=only with a fixed text, namely 'Only sells lactose free products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "only" }, { "key": "diet:lactose_free", - "description": "Layer 'Shop' shows diet:lactose_free=yes with a fixed text, namely 'Big lactose free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:lactose_free=yes with a fixed text, namely 'Big lactose free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "yes" }, { "key": "diet:lactose_free", - "description": "Layer 'Shop' shows diet:lactose_free=limited with a fixed text, namely 'Limited lactose free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:lactose_free=limited with a fixed text, namely 'Limited lactose free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "limited" }, { "key": "diet:lactose_free", - "description": "Layer 'Shop' shows diet:lactose_free=no with a fixed text, namely 'No lactose free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:lactose_free=no with a fixed text, namely 'No lactose free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "no" }, { @@ -1460,7 +1500,7 @@ }, { "key": "id", - "description": "Layer 'Shop' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Healthcare') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Shop' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Healthcare') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -1486,6 +1526,11 @@ "key": "shop", "description": "Layer 'Shop' shows and asks freeform values for key 'shop' (in the mapcomplete.org theme 'Healthcare')" }, + { + "key": "shop", + "description": "Layer 'Shop' shows shop=vacant with a fixed text, namely 'Vacant Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", + "value": "vacant" + }, { "key": "shop", "description": "Layer 'Shop' shows shop=agrarian with a fixed text, namely 'Farm Supply Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", @@ -1503,7 +1548,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=antiques with a fixed text, namely 'Antiques Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", + "description": "Layer 'Shop' shows shop=antiques with a fixed text, namely 'Antique Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", "value": "antiques" }, { @@ -1568,7 +1613,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=books with a fixed text, namely 'Book Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", + "description": "Layer 'Shop' shows shop=books with a fixed text, namely 'Bookstore' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", "value": "books" }, { @@ -1688,7 +1733,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=country_store with a fixed text, namely 'Country Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", + "description": "Layer 'Shop' shows shop=country_store with a fixed text, namely 'Rural Supplies Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", "value": "country_store" }, { @@ -1708,7 +1753,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=deli with a fixed text, namely 'Deli' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", + "description": "Layer 'Shop' shows shop=deli with a fixed text, namely 'Delicatessen' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", "value": "deli" }, { @@ -1858,7 +1903,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=health_food with a fixed text, namely 'Health Food Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", + "description": "Layer 'Shop' shows shop=health_food with a fixed text, namely 'Health Food Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", "value": "health_food" }, { @@ -1878,8 +1923,8 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=hobby with a fixed text, namely 'Hobby Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", - "value": "hobby" + "description": "Layer 'Shop' shows shop=honey with a fixed text, namely 'Honey Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", + "value": "honey" }, { "key": "shop", @@ -1998,7 +2043,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=newsagent with a fixed text, namely 'Newspaper/Magazine Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", + "description": "Layer 'Shop' shows shop=newsagent with a fixed text, namely 'Newsstand' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", "value": "newsagent" }, { @@ -2006,6 +2051,11 @@ "description": "Layer 'Shop' shows shop=nutrition_supplements with a fixed text, namely 'Nutrition Supplements Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", "value": "nutrition_supplements" }, + { + "key": "shop", + "description": "Layer 'Shop' shows shop=nuts with a fixed text, namely 'Nuts Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", + "value": "nuts" + }, { "key": "shop", "description": "Layer 'Shop' shows shop=optician with a fixed text, namely 'Optician' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", @@ -2031,6 +2081,11 @@ "description": "Layer 'Shop' shows shop=party with a fixed text, namely 'Party Supply Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", "value": "party" }, + { + "key": "shop", + "description": "Layer 'Shop' shows shop=pasta with a fixed text, namely 'Pasta Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", + "value": "pasta" + }, { "key": "shop", "description": "Layer 'Shop' shows shop=pastry with a fixed text, namely 'Pastry Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", @@ -2038,7 +2093,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=pawnbroker with a fixed text, namely 'Pawn Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", + "description": "Layer 'Shop' shows shop=pawnbroker with a fixed text, namely 'Pawnshop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", "value": "pawnbroker" }, { @@ -2053,7 +2108,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=pet_grooming with a fixed text, namely 'Pet Grooming Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", + "description": "Layer 'Shop' shows shop=pet_grooming with a fixed text, namely 'Pet Groomer' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", "value": "pet_grooming" }, { @@ -2101,6 +2156,11 @@ "description": "Layer 'Shop' shows shop=repair with a fixed text, namely 'Repair Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", "value": "repair" }, + { + "key": "shop", + "description": "Layer 'Shop' shows shop=rice with a fixed text, namely 'Rice Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", + "value": "rice" + }, { "key": "shop", "description": "Layer 'Shop' shows shop=scuba_diving with a fixed text, namely 'Scuba Diving Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", @@ -2113,7 +2173,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=second_hand with a fixed text, namely 'Consignment/Thrift Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", + "description": "Layer 'Shop' shows shop=second_hand with a fixed text, namely 'Thrift Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", "value": "second_hand" }, { @@ -2233,7 +2293,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=variety_store with a fixed text, namely 'Variety Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", + "description": "Layer 'Shop' shows shop=variety_store with a fixed text, namely 'Discount Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", "value": "variety_store" }, { @@ -2288,17 +2348,17 @@ }, { "key": "second_hand", - "description": "Layer 'Shop' shows second_hand=only with a fixed text, namely 'This shop sells second-hand items only' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=clothes|shop=car|shop=books|shop=charity|shop=car_repair|shop=furniture|shop=bicycle|shop=bicycle|shop=mobile_phone|shop=computer|shop=toys)", + "description": "Layer 'Shop' shows second_hand=only with a fixed text, namely 'This shop sells second-hand items only' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=clothes |shop=car |shop=books |shop=charity |shop=car_repair |shop=furniture |shop=bicycle |shop=bicycle |shop=mobile_phone |shop=computer |shop=toys)", "value": "only" }, { "key": "second_hand", - "description": "Layer 'Shop' shows second_hand=yes with a fixed text, namely 'This shop sells second-hand items along with new items' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=clothes|shop=car|shop=books|shop=charity|shop=car_repair|shop=furniture|shop=bicycle|shop=bicycle|shop=mobile_phone|shop=computer|shop=toys)", + "description": "Layer 'Shop' shows second_hand=yes with a fixed text, namely 'This shop sells second-hand items along with new items' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=clothes |shop=car |shop=books |shop=charity |shop=car_repair |shop=furniture |shop=bicycle |shop=bicycle |shop=mobile_phone |shop=computer |shop=toys)", "value": "yes" }, { "key": "second_hand", - "description": "Layer 'Shop' shows second_hand=no with a fixed text, namely 'This shop only sells brand-new items' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=clothes|shop=car|shop=books|shop=charity|shop=car_repair|shop=furniture|shop=bicycle|shop=bicycle|shop=mobile_phone|shop=computer|shop=toys)", + "description": "Layer 'Shop' shows second_hand=no with a fixed text, namely 'This shop only sells brand-new items' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=clothes |shop=car |shop=books |shop=charity |shop=car_repair |shop=furniture |shop=bicycle |shop=bicycle |shop=mobile_phone |shop=computer |shop=toys)", "value": "no" }, { @@ -2375,29 +2435,49 @@ }, { "key": "service:print:A4", - "description": "Layer 'Shop' shows service:print:A4=yes with a fixed text, namely 'This shop can print on papers of size A4' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop~^(.*copyshop.*)$|shop~^(.*stationery.*)$|service:print=yes)", + "description": "Layer 'Shop' shows service:print:A4=yes with a fixed text, namely 'This shop can print on papers of size A4' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop~^(.*copyshop.*)$ |shop~^(.*stationery.*)$ |service:print=yes)", "value": "yes" }, { "key": "service:print:A3", - "description": "Layer 'Shop' shows service:print:A3=yes with a fixed text, namely 'This shop can print on papers of size A3' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop~^(.*copyshop.*)$|shop~^(.*stationery.*)$|service:print=yes)", + "description": "Layer 'Shop' shows service:print:A3=yes with a fixed text, namely 'This shop can print on papers of size A3' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop~^(.*copyshop.*)$ |shop~^(.*stationery.*)$ |service:print=yes)", "value": "yes" }, { "key": "service:print:A2", - "description": "Layer 'Shop' shows service:print:A2=yes with a fixed text, namely 'This shop can print on papers of size A2' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop~^(.*copyshop.*)$|shop~^(.*stationery.*)$|service:print=yes)", + "description": "Layer 'Shop' shows service:print:A2=yes with a fixed text, namely 'This shop can print on papers of size A2' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop~^(.*copyshop.*)$ |shop~^(.*stationery.*)$ |service:print=yes)", "value": "yes" }, { "key": "service:print:A1", - "description": "Layer 'Shop' shows service:print:A1=yes with a fixed text, namely 'This shop can print on papers of size A1' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop~^(.*copyshop.*)$|shop~^(.*stationery.*)$|service:print=yes)", + "description": "Layer 'Shop' shows service:print:A1=yes with a fixed text, namely 'This shop can print on papers of size A1' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop~^(.*copyshop.*)$ |shop~^(.*stationery.*)$ |service:print=yes)", "value": "yes" }, { "key": "service:print:A0", - "description": "Layer 'Shop' shows service:print:A0=yes with a fixed text, namely 'This shop can print on papers of size A0' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop~^(.*copyshop.*)$|shop~^(.*stationery.*)$|service:print=yes)", + "description": "Layer 'Shop' shows service:print:A0=yes with a fixed text, namely 'This shop can print on papers of size A0' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop~^(.*copyshop.*)$ |shop~^(.*stationery.*)$ |service:print=yes)", "value": "yes" }, + { + "key": "craft", + "description": "Layer 'Shop' shows craft=key_cutter with a fixed text, namely 'This shop is also specialized in key cutting' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=shoe_repair |service:key_cutting~.+ |craft=key_cutting |shop=diy |shop=doityourself |shop=home_improvement |shop=hardware |shop=locksmith |shop=repair)", + "value": "key_cutter" + }, + { + "key": "service:key_cutting", + "description": "Layer 'Shop' shows service:key_cutting=yes with a fixed text, namely 'This shop offers key cutting as a service' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=shoe_repair |service:key_cutting~.+ |craft=key_cutting |shop=diy |shop=doityourself |shop=home_improvement |shop=hardware |shop=locksmith |shop=repair)", + "value": "yes" + }, + { + "key": "craft", + "description": "Layer 'Shop' shows service:key_cutting=no with a fixed text, namely 'This shops does not offer key cutting as a service' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') Picking this answer will delete the key craft. (This is only shown if shop=shoe_repair |service:key_cutting~.+ |craft=key_cutting |shop=diy |shop=doityourself |shop=home_improvement |shop=hardware |shop=locksmith |shop=repair)", + "value": "" + }, + { + "key": "service:key_cutting", + "description": "Layer 'Shop' shows service:key_cutting=no with a fixed text, namely 'This shops does not offer key cutting as a service' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=shoe_repair |service:key_cutting~.+ |craft=key_cutting |shop=diy |shop=doityourself |shop=home_improvement |shop=hardware |shop=locksmith |shop=repair)", + "value": "no" + }, { "key": "internet_access", "description": "Layer 'Shop' shows internet_access=wlan with a fixed text, namely 'This place offers wireless internet access' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare')", @@ -2425,17 +2505,17 @@ }, { "key": "internet_access:fee", - "description": "Layer 'Shop' shows internet_access:fee=yes with a fixed text, namely 'There is a fee for the internet access at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if internet_access!=no&internet_access~.+)", + "description": "Layer 'Shop' shows internet_access:fee=yes with a fixed text, namely 'There is a fee for the internet access at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if internet_access!=no &internet_access~.+)", "value": "yes" }, { "key": "internet_access:fee", - "description": "Layer 'Shop' shows internet_access:fee=no with a fixed text, namely 'Internet access is free at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if internet_access!=no&internet_access~.+)", + "description": "Layer 'Shop' shows internet_access:fee=no with a fixed text, namely 'Internet access is free at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if internet_access!=no &internet_access~.+)", "value": "no" }, { "key": "internet_access:fee", - "description": "Layer 'Shop' shows internet_access:fee=customers with a fixed text, namely 'Internet access is free at this place, for customers only' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if internet_access!=no&internet_access~.+)", + "description": "Layer 'Shop' shows internet_access:fee=customers with a fixed text, namely 'Internet access is free at this place, for customers only' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if internet_access!=no &internet_access~.+)", "value": "customers" }, { @@ -2449,77 +2529,77 @@ }, { "key": "organic", - "description": "Layer 'Shop' shows organic=yes with a fixed text, namely 'This shop offers organic products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=clothes|shop=shoes|shop=butcher|shop=cosmetics|shop=deli|shop=bakery|shop=alcohol|shop=seafood|shop=beverages|shop=florist)", + "description": "Layer 'Shop' shows organic=yes with a fixed text, namely 'This shop offers organic products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=clothes |shop=shoes |shop=butcher |shop=cosmetics |shop=deli |shop=bakery |shop=alcohol |shop=seafood |shop=beverages |shop=florist)", "value": "yes" }, { "key": "organic", - "description": "Layer 'Shop' shows organic=only with a fixed text, namely 'This shop only offers organic products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=clothes|shop=shoes|shop=butcher|shop=cosmetics|shop=deli|shop=bakery|shop=alcohol|shop=seafood|shop=beverages|shop=florist)", + "description": "Layer 'Shop' shows organic=only with a fixed text, namely 'This shop only offers organic products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=clothes |shop=shoes |shop=butcher |shop=cosmetics |shop=deli |shop=bakery |shop=alcohol |shop=seafood |shop=beverages |shop=florist)", "value": "only" }, { "key": "organic", - "description": "Layer 'Shop' shows organic=no with a fixed text, namely 'This shop does not offer organic products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=clothes|shop=shoes|shop=butcher|shop=cosmetics|shop=deli|shop=bakery|shop=alcohol|shop=seafood|shop=beverages|shop=florist)", + "description": "Layer 'Shop' shows organic=no with a fixed text, namely 'This shop does not offer organic products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=clothes |shop=shoes |shop=butcher |shop=cosmetics |shop=deli |shop=bakery |shop=alcohol |shop=seafood |shop=beverages |shop=florist)", "value": "no" }, { "key": "diet:sugar_free", - "description": "Layer 'Shop' shows diet:sugar_free=only with a fixed text, namely 'This shop only sells sugar free products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:sugar_free=only with a fixed text, namely 'This shop only sells sugar free products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "only" }, { "key": "diet:sugar_free", - "description": "Layer 'Shop' shows diet:sugar_free=yes with a fixed text, namely 'This shop has a big sugar free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:sugar_free=yes with a fixed text, namely 'This shop has a big sugar free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "yes" }, { "key": "diet:sugar_free", - "description": "Layer 'Shop' shows diet:sugar_free=limited with a fixed text, namely 'This shop has a limited sugar free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:sugar_free=limited with a fixed text, namely 'This shop has a limited sugar free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "limited" }, { "key": "diet:sugar_free", - "description": "Layer 'Shop' shows diet:sugar_free=no with a fixed text, namely 'This shop has no sugar free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:sugar_free=no with a fixed text, namely 'This shop has no sugar free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "no" }, { "key": "diet:gluten_free", - "description": "Layer 'Shop' shows diet:gluten_free=only with a fixed text, namely 'This shop only sells gluten free products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:gluten_free=only with a fixed text, namely 'This shop only sells gluten free products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "only" }, { "key": "diet:gluten_free", - "description": "Layer 'Shop' shows diet:gluten_free=yes with a fixed text, namely 'This shop has a big gluten free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:gluten_free=yes with a fixed text, namely 'This shop has a big gluten free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "yes" }, { "key": "diet:gluten_free", - "description": "Layer 'Shop' shows diet:gluten_free=limited with a fixed text, namely 'This shop has a limited gluten free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:gluten_free=limited with a fixed text, namely 'This shop has a limited gluten free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "limited" }, { "key": "diet:gluten_free", - "description": "Layer 'Shop' shows diet:gluten_free=no with a fixed text, namely 'This shop has no gluten free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:gluten_free=no with a fixed text, namely 'This shop has no gluten free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "no" }, { "key": "diet:lactose_free", - "description": "Layer 'Shop' shows diet:lactose_free=only with a fixed text, namely 'Only sells lactose free products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:lactose_free=only with a fixed text, namely 'Only sells lactose free products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "only" }, { "key": "diet:lactose_free", - "description": "Layer 'Shop' shows diet:lactose_free=yes with a fixed text, namely 'Big lactose free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:lactose_free=yes with a fixed text, namely 'Big lactose free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "yes" }, { "key": "diet:lactose_free", - "description": "Layer 'Shop' shows diet:lactose_free=limited with a fixed text, namely 'Limited lactose free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:lactose_free=limited with a fixed text, namely 'Limited lactose free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "limited" }, { "key": "diet:lactose_free", - "description": "Layer 'Shop' shows diet:lactose_free=no with a fixed text, namely 'No lactose free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:lactose_free=no with a fixed text, namely 'No lactose free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Healthcare') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "no" } ] diff --git a/Docs/TagInfo/mapcomplete_hotels.json b/Docs/TagInfo/mapcomplete_hotels.json index f77384909..d1b97daac 100644 --- a/Docs/TagInfo/mapcomplete_hotels.json +++ b/Docs/TagInfo/mapcomplete_hotels.json @@ -17,7 +17,7 @@ }, { "key": "id", - "description": "Layer 'Hotels' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Hotels') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Hotels' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Hotels') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -110,17 +110,17 @@ }, { "key": "internet_access:fee", - "description": "Layer 'Hotels' shows internet_access:fee=yes with a fixed text, namely 'There is a fee for the internet access at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Hotels') (This is only shown if internet_access!=no&internet_access~.+)", + "description": "Layer 'Hotels' shows internet_access:fee=yes with a fixed text, namely 'There is a fee for the internet access at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Hotels') (This is only shown if internet_access!=no &internet_access~.+)", "value": "yes" }, { "key": "internet_access:fee", - "description": "Layer 'Hotels' shows internet_access:fee=no with a fixed text, namely 'Internet access is free at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Hotels') (This is only shown if internet_access!=no&internet_access~.+)", + "description": "Layer 'Hotels' shows internet_access:fee=no with a fixed text, namely 'Internet access is free at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Hotels') (This is only shown if internet_access!=no &internet_access~.+)", "value": "no" }, { "key": "internet_access:fee", - "description": "Layer 'Hotels' shows internet_access:fee=customers with a fixed text, namely 'Internet access is free at this place, for customers only' and allows to pick this as a default answer (in the mapcomplete.org theme 'Hotels') (This is only shown if internet_access!=no&internet_access~.+)", + "description": "Layer 'Hotels' shows internet_access:fee=customers with a fixed text, namely 'Internet access is free at this place, for customers only' and allows to pick this as a default answer (in the mapcomplete.org theme 'Hotels') (This is only shown if internet_access!=no &internet_access~.+)", "value": "customers" }, { diff --git a/Docs/TagInfo/mapcomplete_icecream.json b/Docs/TagInfo/mapcomplete_icecream.json new file mode 100644 index 000000000..d02619675 --- /dev/null +++ b/Docs/TagInfo/mapcomplete_icecream.json @@ -0,0 +1,166 @@ +{ + "data_format": 1, + "project": { + "name": "MapComplete Icecream", + "description": "A map showing ice cream parlors and ice cream vending machines", + "project_url": "https://mapcomplete.org/icecream", + "doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/", + "icon_url": "https://mapcomplete.org/assets/layers/ice_cream/ice_cream.svg", + "contact_name": "Pieter Vander Vennet", + "contact_email": "pietervdvn@posteo.net" + }, + "tags": [ + { + "key": "amenity", + "description": "The MapComplete theme Icecream has a layer Ice cream parlors showing features with this tag", + "value": "ice_cream" + }, + { + "key": "id", + "description": "Layer 'Ice cream parlors' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Icecream') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" + }, + { + "key": "image", + "description": "The layer 'Ice cream parlors allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" + }, + { + "key": "mapillary", + "description": "The layer 'Ice cream parlors allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" + }, + { + "key": "wikidata", + "description": "The layer 'Ice cream parlors allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" + }, + { + "key": "wikipedia", + "description": "The layer 'Ice cream parlors allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" + }, + { + "key": "name", + "description": "Layer 'Ice cream parlors' shows and asks freeform values for key 'name' (in the mapcomplete.org theme 'Icecream')" + }, + { + "key": "opening_hours", + "description": "Layer 'Ice cream parlors' shows and asks freeform values for key 'opening_hours' (in the mapcomplete.org theme 'Icecream')" + }, + { + "key": "phone", + "description": "Layer 'Ice cream parlors' shows and asks freeform values for key 'phone' (in the mapcomplete.org theme 'Icecream')" + }, + { + "key": "contact:phone", + "description": "Layer 'Ice cream parlors' shows contact:phone~.+ with a fixed text, namely '{contact:phone}' (in the mapcomplete.org theme 'Icecream')" + }, + { + "key": "email", + "description": "Layer 'Ice cream parlors' shows and asks freeform values for key 'email' (in the mapcomplete.org theme 'Icecream')" + }, + { + "key": "contact:email", + "description": "Layer 'Ice cream parlors' shows contact:email~.+ with a fixed text, namely '{contact:email}' (in the mapcomplete.org theme 'Icecream')" + }, + { + "key": "website", + "description": "Layer 'Ice cream parlors' shows and asks freeform values for key 'website' (in the mapcomplete.org theme 'Icecream')" + }, + { + "key": "contact:website", + "description": "Layer 'Ice cream parlors' shows contact:website~.+ with a fixed text, namely '{contact:website}' (in the mapcomplete.org theme 'Icecream')" + }, + { + "key": "diet:sugar_free", + "description": "Layer 'Ice cream parlors' shows diet:sugar_free=only with a fixed text, namely 'This shop only sells sugar free products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Icecream')", + "value": "only" + }, + { + "key": "diet:sugar_free", + "description": "Layer 'Ice cream parlors' shows diet:sugar_free=yes with a fixed text, namely 'This shop has a big sugar free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Icecream')", + "value": "yes" + }, + { + "key": "diet:sugar_free", + "description": "Layer 'Ice cream parlors' shows diet:sugar_free=limited with a fixed text, namely 'This shop has a limited sugar free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Icecream')", + "value": "limited" + }, + { + "key": "diet:sugar_free", + "description": "Layer 'Ice cream parlors' shows diet:sugar_free=no with a fixed text, namely 'This shop has no sugar free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Icecream')", + "value": "no" + }, + { + "key": "diet:lactose_free", + "description": "Layer 'Ice cream parlors' shows diet:lactose_free=only with a fixed text, namely 'Only sells lactose free products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Icecream')", + "value": "only" + }, + { + "key": "diet:lactose_free", + "description": "Layer 'Ice cream parlors' shows diet:lactose_free=yes with a fixed text, namely 'Big lactose free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Icecream')", + "value": "yes" + }, + { + "key": "diet:lactose_free", + "description": "Layer 'Ice cream parlors' shows diet:lactose_free=limited with a fixed text, namely 'Limited lactose free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Icecream')", + "value": "limited" + }, + { + "key": "diet:lactose_free", + "description": "Layer 'Ice cream parlors' shows diet:lactose_free=no with a fixed text, namely 'No lactose free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Icecream')", + "value": "no" + }, + { + "key": "diet:gluten_free", + "description": "Layer 'Ice cream parlors' shows diet:gluten_free=only with a fixed text, namely 'This shop only sells gluten free products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Icecream')", + "value": "only" + }, + { + "key": "diet:gluten_free", + "description": "Layer 'Ice cream parlors' shows diet:gluten_free=yes with a fixed text, namely 'This shop has a big gluten free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Icecream')", + "value": "yes" + }, + { + "key": "diet:gluten_free", + "description": "Layer 'Ice cream parlors' shows diet:gluten_free=limited with a fixed text, namely 'This shop has a limited gluten free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Icecream')", + "value": "limited" + }, + { + "key": "diet:gluten_free", + "description": "Layer 'Ice cream parlors' shows diet:gluten_free=no with a fixed text, namely 'This shop has no gluten free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Icecream')", + "value": "no" + }, + { + "key": "payment:cash", + "description": "Layer 'Ice cream parlors' shows payment:cash=yes with a fixed text, namely 'Cash is accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Icecream')", + "value": "yes" + }, + { + "key": "payment:cards", + "description": "Layer 'Ice cream parlors' shows payment:cards=yes with a fixed text, namely 'Payment cards are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Icecream')", + "value": "yes" + }, + { + "key": "payment:qr_code", + "description": "Layer 'Ice cream parlors' shows payment:qr_code=yes with a fixed text, namely 'Payment by QR-code is possible here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Icecream')", + "value": "yes" + }, + { + "key": "wheelchair", + "description": "Layer 'Ice cream parlors' shows wheelchair=designated with a fixed text, namely 'This place is specially adapted for wheelchair users' and allows to pick this as a default answer (in the mapcomplete.org theme 'Icecream')", + "value": "designated" + }, + { + "key": "wheelchair", + "description": "Layer 'Ice cream parlors' shows wheelchair=yes with a fixed text, namely 'This place is easily reachable with a wheelchair' and allows to pick this as a default answer (in the mapcomplete.org theme 'Icecream')", + "value": "yes" + }, + { + "key": "wheelchair", + "description": "Layer 'Ice cream parlors' shows wheelchair=limited with a fixed text, namely 'It is possible to reach this place in a wheelchair, but it is not easy' and allows to pick this as a default answer (in the mapcomplete.org theme 'Icecream')", + "value": "limited" + }, + { + "key": "wheelchair", + "description": "Layer 'Ice cream parlors' shows wheelchair=no with a fixed text, namely 'This place is not reachable with a wheelchair' and allows to pick this as a default answer (in the mapcomplete.org theme 'Icecream')", + "value": "no" + } + ] +} \ No newline at end of file diff --git a/Docs/TagInfo/mapcomplete_indoors.json b/Docs/TagInfo/mapcomplete_indoors.json index bc6b8710b..83044e814 100644 --- a/Docs/TagInfo/mapcomplete_indoors.json +++ b/Docs/TagInfo/mapcomplete_indoors.json @@ -37,7 +37,7 @@ }, { "key": "id", - "description": "Layer 'Indoors' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Indoors') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Indoors' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Indoors') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -86,11 +86,11 @@ }, { "key": "ref", - "description": "Layer 'Indoors' shows and asks freeform values for key 'ref' (in the mapcomplete.org theme 'Indoors') (This is only shown if indoor=room|indoor=area|indoor=corridor)" + "description": "Layer 'Indoors' shows and asks freeform values for key 'ref' (in the mapcomplete.org theme 'Indoors') (This is only shown if indoor=room |indoor=area |indoor=corridor)" }, { "key": "name", - "description": "Layer 'Indoors' shows and asks freeform values for key 'name' (in the mapcomplete.org theme 'Indoors') (This is only shown if indoor=room|indoor=area|indoor=corridor)" + "description": "Layer 'Indoors' shows and asks freeform values for key 'name' (in the mapcomplete.org theme 'Indoors') (This is only shown if indoor=room |indoor=area |indoor=corridor)" }, { "key": "room", @@ -209,7 +209,7 @@ }, { "key": "capacity", - "description": "Layer 'Indoors' shows and asks freeform values for key 'capacity' (in the mapcomplete.org theme 'Indoors') (This is only shown if room=waiting|room=restaurant|room=office|room=nursery|room=conference|room=auditorium|room=chapel|room=bedroom|room=classroom)" + "description": "Layer 'Indoors' shows and asks freeform values for key 'capacity' (in the mapcomplete.org theme 'Indoors') (This is only shown if room=waiting |room=restaurant |room=office |room=nursery |room=conference |room=auditorium |room=chapel |room=bedroom |room=classroom)" }, { "key": "name:etymology:wikidata", @@ -246,60 +246,60 @@ }, { "key": "fee", - "description": "Layer 'Indoors' shows fee=yes with a fixed text, namely 'These are paid toilets' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets&access!=no)", + "description": "Layer 'Indoors' shows fee=yes with a fixed text, namely 'These are paid toilets' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets &access!=no)", "value": "yes" }, { "key": "fee", - "description": "Layer 'Indoors' shows fee=no with a fixed text, namely 'Free to use' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets&access!=no)", + "description": "Layer 'Indoors' shows fee=no with a fixed text, namely 'Free to use' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets &access!=no)", "value": "no" }, { "key": "charge", - "description": "Layer 'Indoors' shows and asks freeform values for key 'charge' (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets&fee=yes)" + "description": "Layer 'Indoors' shows and asks freeform values for key 'charge' (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets &fee=yes)" }, { "key": "payment:cash", - "description": "Layer 'Indoors' shows payment:cash=yes with a fixed text, namely 'Cash is accepted here' (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets&fee=yes)", + "description": "Layer 'Indoors' shows payment:cash=yes with a fixed text, namely 'Cash is accepted here' (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets &fee=yes)", "value": "yes" }, { "key": "payment:cards", - "description": "Layer 'Indoors' shows payment:cards=yes with a fixed text, namely 'Payment cards are accepted here' (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets&fee=yes)", + "description": "Layer 'Indoors' shows payment:cards=yes with a fixed text, namely 'Payment cards are accepted here' (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets &fee=yes)", "value": "yes" }, { "key": "payment:qr_code", - "description": "Layer 'Indoors' shows payment:qr_code=yes with a fixed text, namely 'Payment by QR-code is possible here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets&fee=yes)", + "description": "Layer 'Indoors' shows payment:qr_code=yes with a fixed text, namely 'Payment by QR-code is possible here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets &fee=yes)", "value": "yes" }, { "key": "payment:coins", - "description": "Layer 'Indoors' shows payment:coins=yes with a fixed text, namely 'Coins are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets&fee=yes)", + "description": "Layer 'Indoors' shows payment:coins=yes with a fixed text, namely 'Coins are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets &fee=yes)", "value": "yes" }, { "key": "payment:notes", - "description": "Layer 'Indoors' shows payment:notes=yes with a fixed text, namely 'Bank notes are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets&fee=yes)", + "description": "Layer 'Indoors' shows payment:notes=yes with a fixed text, namely 'Bank notes are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets &fee=yes)", "value": "yes" }, { "key": "payment:debit_cards", - "description": "Layer 'Indoors' shows payment:debit_cards=yes with a fixed text, namely 'Debit cards are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets&fee=yes)", + "description": "Layer 'Indoors' shows payment:debit_cards=yes with a fixed text, namely 'Debit cards are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets &fee=yes)", "value": "yes" }, { "key": "payment:credit_cards", - "description": "Layer 'Indoors' shows payment:credit_cards=yes with a fixed text, namely 'Credit cards are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets&fee=yes)", + "description": "Layer 'Indoors' shows payment:credit_cards=yes with a fixed text, namely 'Credit cards are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets &fee=yes)", "value": "yes" }, { "key": "opening_hours", - "description": "Layer 'Indoors' shows and asks freeform values for key 'opening_hours' (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets&access!=no)" + "description": "Layer 'Indoors' shows and asks freeform values for key 'opening_hours' (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets &access!=no)" }, { "key": "opening_hours", - "description": "Layer 'Indoors' shows opening_hours=24/7 with a fixed text, namely '24/7 opened (including holidays)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets&access!=no)", + "description": "Layer 'Indoors' shows opening_hours=24/7 with a fixed text, namely '24/7 opened (including holidays)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets &access!=no)", "value": "24/7" }, { @@ -319,7 +319,7 @@ }, { "key": "door:width", - "description": "Layer 'Indoors' shows and asks freeform values for key 'door:width' (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets&wheelchair=yes|wheelchair=designated)" + "description": "Layer 'Indoors' shows and asks freeform values for key 'door:width' (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets &wheelchair=yes |wheelchair=designated)" }, { "key": "toilets:position", @@ -353,26 +353,26 @@ }, { "key": "changing_table:location", - "description": "Layer 'Indoors' shows and asks freeform values for key 'changing_table:location' (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets&changing_table=yes)" + "description": "Layer 'Indoors' shows and asks freeform values for key 'changing_table:location' (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets &changing_table=yes)" }, { "key": "changing_table:location", - "description": "Layer 'Indoors' shows changing_table:location=female_toilet with a fixed text, namely 'The changing table is in the toilet for women. ' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets&changing_table=yes)", + "description": "Layer 'Indoors' shows changing_table:location=female_toilet with a fixed text, namely 'The changing table is in the toilet for women. ' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets &changing_table=yes)", "value": "female_toilet" }, { "key": "changing_table:location", - "description": "Layer 'Indoors' shows changing_table:location=male_toilet with a fixed text, namely 'The changing table is in the toilet for men. ' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets&changing_table=yes)", + "description": "Layer 'Indoors' shows changing_table:location=male_toilet with a fixed text, namely 'The changing table is in the toilet for men. ' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets &changing_table=yes)", "value": "male_toilet" }, { "key": "changing_table:location", - "description": "Layer 'Indoors' shows changing_table:location=wheelchair_toilet with a fixed text, namely 'The changing table is in the toilet for wheelchair users. ' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets&changing_table=yes)", + "description": "Layer 'Indoors' shows changing_table:location=wheelchair_toilet with a fixed text, namely 'The changing table is in the toilet for wheelchair users. ' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets &changing_table=yes)", "value": "wheelchair_toilet" }, { "key": "changing_table:location", - "description": "Layer 'Indoors' shows changing_table:location=dedicated_room with a fixed text, namely 'The changing table is in a dedicated room. ' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets&changing_table=yes)", + "description": "Layer 'Indoors' shows changing_table:location=dedicated_room with a fixed text, namely 'The changing table is in a dedicated room. ' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets &changing_table=yes)", "value": "dedicated_room" }, { @@ -387,12 +387,12 @@ }, { "key": "toilets:paper_supplied", - "description": "Layer 'Indoors' shows toilets:paper_supplied=yes with a fixed text, namely 'This toilet is equipped with toilet paper' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets&toilets:position!=urinal)", + "description": "Layer 'Indoors' shows toilets:paper_supplied=yes with a fixed text, namely 'This toilet is equipped with toilet paper' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets &toilets:position!=urinal)", "value": "yes" }, { "key": "toilets:paper_supplied", - "description": "Layer 'Indoors' shows toilets:paper_supplied=no with a fixed text, namely 'You have to bring your own toilet paper to this toilet' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets&toilets:position!=urinal)", + "description": "Layer 'Indoors' shows toilets:paper_supplied=no with a fixed text, namely 'You have to bring your own toilet paper to this toilet' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets &toilets:position!=urinal)", "value": "no" }, { @@ -422,7 +422,7 @@ }, { "key": "id", - "description": "Layer 'Elevator' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Indoors') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Elevator' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Indoors') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -546,7 +546,7 @@ }, { "key": "id", - "description": "Layer 'Entrance' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Indoors') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Entrance' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Indoors') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", diff --git a/Docs/TagInfo/mapcomplete_kerbs_and_crossings.json b/Docs/TagInfo/mapcomplete_kerbs_and_crossings.json index 295bff5a7..865e9e75a 100644 --- a/Docs/TagInfo/mapcomplete_kerbs_and_crossings.json +++ b/Docs/TagInfo/mapcomplete_kerbs_and_crossings.json @@ -107,36 +107,36 @@ }, { "key": "id", - "description": "Layer 'Cycleways and roads' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Cycleways and roads' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "cycleway", - "description": "Layer 'Cycleways and roads' shows cycleway=shared_lane with a fixed text, namely 'There is a shared lane' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if highway!=cycleway&highway!=path&highway!=footway&highway!=pedestrian)", + "description": "Layer 'Cycleways and roads' shows cycleway=shared_lane with a fixed text, namely 'There is a shared lane' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if highway!=cycleway &highway!=path &highway!=footway &highway!=pedestrian)", "value": "shared_lane" }, { "key": "cycleway", - "description": "Layer 'Cycleways and roads' shows cycleway=lane with a fixed text, namely 'There is a lane next to the road (separated with paint)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if highway!=cycleway&highway!=path&highway!=footway&highway!=pedestrian)", + "description": "Layer 'Cycleways and roads' shows cycleway=lane with a fixed text, namely 'There is a lane next to the road (separated with paint)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if highway!=cycleway &highway!=path &highway!=footway &highway!=pedestrian)", "value": "lane" }, { "key": "cycleway", - "description": "Layer 'Cycleways and roads' shows cycleway=track with a fixed text, namely 'There is a track, but no cycleway drawn separately from this road on the map.' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if highway!=cycleway&highway!=path&highway!=footway&highway!=pedestrian)", + "description": "Layer 'Cycleways and roads' shows cycleway=track with a fixed text, namely 'There is a track, but no cycleway drawn separately from this road on the map.' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if highway!=cycleway &highway!=path &highway!=footway &highway!=pedestrian)", "value": "track" }, { "key": "cycleway", - "description": "Layer 'Cycleways and roads' shows cycleway=separate with a fixed text, namely 'There is a separately drawn cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if highway!=cycleway&highway!=path&highway!=footway&highway!=pedestrian)", + "description": "Layer 'Cycleways and roads' shows cycleway=separate with a fixed text, namely 'There is a separately drawn cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if highway!=cycleway &highway!=path &highway!=footway &highway!=pedestrian)", "value": "separate" }, { "key": "cycleway", - "description": "Layer 'Cycleways and roads' shows cycleway=no with a fixed text, namely 'There is no cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if highway!=cycleway&highway!=path&highway!=footway&highway!=pedestrian)", + "description": "Layer 'Cycleways and roads' shows cycleway=no with a fixed text, namely 'There is no cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if highway!=cycleway &highway!=path &highway!=footway &highway!=pedestrian)", "value": "no" }, { "key": "cycleway", - "description": "Layer 'Cycleways and roads' shows cycleway=no with a fixed text, namely 'There is no cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if highway!=cycleway&highway!=path&highway!=footway&highway!=pedestrian)", + "description": "Layer 'Cycleways and roads' shows cycleway=no with a fixed text, namely 'There is no cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if highway!=cycleway &highway!=path &highway!=footway &highway!=pedestrian)", "value": "no" }, { @@ -161,155 +161,155 @@ }, { "key": "cyclestreet", - "description": "Layer 'Cycleways and roads' shows cyclestreet=yes with a fixed text, namely 'This is a cyclestreet, and a 30km/h zone.' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if highway!=cycleway&highway!=path&highway!=footway)", + "description": "Layer 'Cycleways and roads' shows cyclestreet=yes with a fixed text, namely 'This is a cyclestreet, and a 30km/h zone.' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if highway!=cycleway &highway!=path &highway!=footway)", "value": "yes" }, { "key": "cyclestreet", - "description": "Layer 'Cycleways and roads' shows cyclestreet=yes with a fixed text, namely 'This is a cyclestreet' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if highway!=cycleway&highway!=path&highway!=footway)", + "description": "Layer 'Cycleways and roads' shows cyclestreet=yes with a fixed text, namely 'This is a cyclestreet' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if highway!=cycleway &highway!=path &highway!=footway)", "value": "yes" }, { "key": "cyclestreet", - "description": "Layer 'Cycleways and roads' shows with a fixed text, namely 'This is not a cyclestreet.' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') Picking this answer will delete the key cyclestreet. (This is only shown if highway!=cycleway&highway!=path&highway!=footway)", + "description": "Layer 'Cycleways and roads' shows with a fixed text, namely 'This is not a cyclestreet.' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') Picking this answer will delete the key cyclestreet. (This is only shown if highway!=cycleway &highway!=path &highway!=footway)", "value": "" }, { "key": "maxspeed", - "description": "Layer 'Cycleways and roads' shows and asks freeform values for key 'maxspeed' (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if highway!=cycleway&highway!=path&highway!=footway&highway!=pedestrian)" + "description": "Layer 'Cycleways and roads' shows and asks freeform values for key 'maxspeed' (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if highway!=cycleway &highway!=path &highway!=footway &highway!=pedestrian)" }, { "key": "maxspeed", - "description": "Layer 'Cycleways and roads' shows maxspeed=20 with a fixed text, namely 'The maximum speed is 20 km/h' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if highway!=cycleway&highway!=path&highway!=footway&highway!=pedestrian)", + "description": "Layer 'Cycleways and roads' shows maxspeed=20 with a fixed text, namely 'The maximum speed is 20 km/h' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if highway!=cycleway &highway!=path &highway!=footway &highway!=pedestrian)", "value": "20" }, { "key": "maxspeed", - "description": "Layer 'Cycleways and roads' shows maxspeed=30 with a fixed text, namely 'The maximum speed is 30 km/h' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if highway!=cycleway&highway!=path&highway!=footway&highway!=pedestrian)", + "description": "Layer 'Cycleways and roads' shows maxspeed=30 with a fixed text, namely 'The maximum speed is 30 km/h' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if highway!=cycleway &highway!=path &highway!=footway &highway!=pedestrian)", "value": "30" }, { "key": "maxspeed", - "description": "Layer 'Cycleways and roads' shows maxspeed=50 with a fixed text, namely 'The maximum speed is 50 km/h' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if highway!=cycleway&highway!=path&highway!=footway&highway!=pedestrian)", + "description": "Layer 'Cycleways and roads' shows maxspeed=50 with a fixed text, namely 'The maximum speed is 50 km/h' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if highway!=cycleway &highway!=path &highway!=footway &highway!=pedestrian)", "value": "50" }, { "key": "maxspeed", - "description": "Layer 'Cycleways and roads' shows maxspeed=70 with a fixed text, namely 'The maximum speed is 70 km/h' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if highway!=cycleway&highway!=path&highway!=footway&highway!=pedestrian)", + "description": "Layer 'Cycleways and roads' shows maxspeed=70 with a fixed text, namely 'The maximum speed is 70 km/h' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if highway!=cycleway &highway!=path &highway!=footway &highway!=pedestrian)", "value": "70" }, { "key": "maxspeed", - "description": "Layer 'Cycleways and roads' shows maxspeed=90 with a fixed text, namely 'The maximum speed is 90 km/h' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if highway!=cycleway&highway!=path&highway!=footway&highway!=pedestrian)", + "description": "Layer 'Cycleways and roads' shows maxspeed=90 with a fixed text, namely 'The maximum speed is 90 km/h' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if highway!=cycleway &highway!=path &highway!=footway &highway!=pedestrian)", "value": "90" }, { "key": "cycleway:surface", - "description": "Layer 'Cycleways and roads' shows and asks freeform values for key 'cycleway:surface' (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)" + "description": "Layer 'Cycleways and roads' shows and asks freeform values for key 'cycleway:surface' (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)" }, { "key": "cycleway:surface", - "description": "Layer 'Cycleways and roads' shows cycleway:surface=unpaved with a fixed text, namely 'This cycleway is unpaved' (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:surface=unpaved with a fixed text, namely 'This cycleway is unpaved' (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "unpaved" }, { "key": "cycleway:surface", - "description": "Layer 'Cycleways and roads' shows cycleway:surface=paved with a fixed text, namely 'This cycleway is paved' (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:surface=paved with a fixed text, namely 'This cycleway is paved' (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "paved" }, { "key": "cycleway:surface", - "description": "Layer 'Cycleways and roads' shows cycleway:surface=asphalt with a fixed text, namely 'This cycleway is made of asphalt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:surface=asphalt with a fixed text, namely 'This cycleway is made of asphalt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "asphalt" }, { "key": "cycleway:surface", - "description": "Layer 'Cycleways and roads' shows cycleway:surface=paving_stones with a fixed text, namely 'This cycleway is made of smooth paving stones' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:surface=paving_stones with a fixed text, namely 'This cycleway is made of smooth paving stones' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "paving_stones" }, { "key": "cycleway:surface", - "description": "Layer 'Cycleways and roads' shows cycleway:surface=concrete with a fixed text, namely 'This cycleway is made of concrete' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:surface=concrete with a fixed text, namely 'This cycleway is made of concrete' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "concrete" }, { "key": "cycleway:surface", - "description": "Layer 'Cycleways and roads' shows cycleway:surface=cobblestone with a fixed text, namely 'This cycleway is made of cobblestone (unhewn or sett)' (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:surface=cobblestone with a fixed text, namely 'This cycleway is made of cobblestone (unhewn or sett)' (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "cobblestone" }, { "key": "cycleway:surface", - "description": "Layer 'Cycleways and roads' shows cycleway:surface=unhewn_cobblestone with a fixed text, namely 'This cycleway is made of raw, natural cobblestone' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:surface=unhewn_cobblestone with a fixed text, namely 'This cycleway is made of raw, natural cobblestone' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "unhewn_cobblestone" }, { "key": "cycleway:surface", - "description": "Layer 'Cycleways and roads' shows cycleway:surface=sett with a fixed text, namely 'This cycleway is made of flat, square cobblestone' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:surface=sett with a fixed text, namely 'This cycleway is made of flat, square cobblestone' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "sett" }, { "key": "cycleway:surface", - "description": "Layer 'Cycleways and roads' shows cycleway:surface=wood with a fixed text, namely 'This cycleway is made of wood' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:surface=wood with a fixed text, namely 'This cycleway is made of wood' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "wood" }, { "key": "cycleway:surface", - "description": "Layer 'Cycleways and roads' shows cycleway:surface=gravel with a fixed text, namely 'This cycleway is made of gravel' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:surface=gravel with a fixed text, namely 'This cycleway is made of gravel' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "gravel" }, { "key": "cycleway:surface", - "description": "Layer 'Cycleways and roads' shows cycleway:surface=fine_gravel with a fixed text, namely 'This cycleway is made of fine gravel' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:surface=fine_gravel with a fixed text, namely 'This cycleway is made of fine gravel' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "fine_gravel" }, { "key": "cycleway:surface", - "description": "Layer 'Cycleways and roads' shows cycleway:surface=pebblestone with a fixed text, namely 'This cycleway is made of pebblestone' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:surface=pebblestone with a fixed text, namely 'This cycleway is made of pebblestone' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "pebblestone" }, { "key": "cycleway:surface", - "description": "Layer 'Cycleways and roads' shows cycleway:surface=ground with a fixed text, namely 'This cycleway is made from raw ground' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:surface=ground with a fixed text, namely 'This cycleway is made from raw ground' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "ground" }, { "key": "cycleway:smoothness", - "description": "Layer 'Cycleways and roads' shows cycleway:smoothness=excellent with a fixed text, namely 'Usable for thin rollers: rollerblade, skateboard' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:smoothness=excellent with a fixed text, namely 'Usable for thin rollers: rollerblade, skateboard' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "excellent" }, { "key": "cycleway:smoothness", - "description": "Layer 'Cycleways and roads' shows cycleway:smoothness=good with a fixed text, namely 'Usable for thin wheels: racing bike' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:smoothness=good with a fixed text, namely 'Usable for thin wheels: racing bike' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "good" }, { "key": "cycleway:smoothness", - "description": "Layer 'Cycleways and roads' shows cycleway:smoothness=intermediate with a fixed text, namely 'Usable for normal wheels: city bike, wheelchair, scooter' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:smoothness=intermediate with a fixed text, namely 'Usable for normal wheels: city bike, wheelchair, scooter' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "intermediate" }, { "key": "cycleway:smoothness", - "description": "Layer 'Cycleways and roads' shows cycleway:smoothness=bad with a fixed text, namely 'Usable for robust wheels: trekking bike, car, rickshaw' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:smoothness=bad with a fixed text, namely 'Usable for robust wheels: trekking bike, car, rickshaw' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "bad" }, { "key": "cycleway:smoothness", - "description": "Layer 'Cycleways and roads' shows cycleway:smoothness=very_bad with a fixed text, namely 'Usable for vehicles with high clearance: light duty off-road vehicle' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:smoothness=very_bad with a fixed text, namely 'Usable for vehicles with high clearance: light duty off-road vehicle' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "very_bad" }, { "key": "cycleway:smoothness", - "description": "Layer 'Cycleways and roads' shows cycleway:smoothness=horrible with a fixed text, namely 'Usable for off-road vehicles: heavy duty off-road vehicle' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:smoothness=horrible with a fixed text, namely 'Usable for off-road vehicles: heavy duty off-road vehicle' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "horrible" }, { "key": "cycleway:smoothness", - "description": "Layer 'Cycleways and roads' shows cycleway:smoothness=very_horrible with a fixed text, namely 'Usable for specialized off-road vehicles: tractor, ATV' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:smoothness=very_horrible with a fixed text, namely 'Usable for specialized off-road vehicles: tractor, ATV' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "very_horrible" }, { "key": "cycleway:smoothness", - "description": "Layer 'Cycleways and roads' shows cycleway:smoothness=impassable with a fixed text, namely 'Impassable / No wheeled vehicle' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:smoothness=impassable with a fixed text, namely 'Impassable / No wheeled vehicle' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "impassable" }, { @@ -383,188 +383,188 @@ }, { "key": "smoothness", - "description": "Layer 'Cycleways and roads' shows smoothness=excellent with a fixed text, namely 'Usable for thin rollers: rollerblade, skateboard' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=no|highway=cycleway)", + "description": "Layer 'Cycleways and roads' shows smoothness=excellent with a fixed text, namely 'Usable for thin rollers: rollerblade, skateboard' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=no |highway=cycleway)", "value": "excellent" }, { "key": "smoothness", - "description": "Layer 'Cycleways and roads' shows smoothness=good with a fixed text, namely 'Usable for thin wheels: racing bike' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=no|highway=cycleway)", + "description": "Layer 'Cycleways and roads' shows smoothness=good with a fixed text, namely 'Usable for thin wheels: racing bike' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=no |highway=cycleway)", "value": "good" }, { "key": "smoothness", - "description": "Layer 'Cycleways and roads' shows smoothness=intermediate with a fixed text, namely 'Usable for normal wheels: city bike, wheelchair, scooter' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=no|highway=cycleway)", + "description": "Layer 'Cycleways and roads' shows smoothness=intermediate with a fixed text, namely 'Usable for normal wheels: city bike, wheelchair, scooter' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=no |highway=cycleway)", "value": "intermediate" }, { "key": "smoothness", - "description": "Layer 'Cycleways and roads' shows smoothness=bad with a fixed text, namely 'Usable for robust wheels: trekking bike, car, rickshaw' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=no|highway=cycleway)", + "description": "Layer 'Cycleways and roads' shows smoothness=bad with a fixed text, namely 'Usable for robust wheels: trekking bike, car, rickshaw' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=no |highway=cycleway)", "value": "bad" }, { "key": "smoothness", - "description": "Layer 'Cycleways and roads' shows smoothness=very_bad with a fixed text, namely 'Usable for vehicles with high clearance: light duty off-road vehicle' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=no|highway=cycleway)", + "description": "Layer 'Cycleways and roads' shows smoothness=very_bad with a fixed text, namely 'Usable for vehicles with high clearance: light duty off-road vehicle' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=no |highway=cycleway)", "value": "very_bad" }, { "key": "smoothness", - "description": "Layer 'Cycleways and roads' shows smoothness=horrible with a fixed text, namely 'Usable for off-road vehicles: heavy duty off-road vehicle' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=no|highway=cycleway)", + "description": "Layer 'Cycleways and roads' shows smoothness=horrible with a fixed text, namely 'Usable for off-road vehicles: heavy duty off-road vehicle' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=no |highway=cycleway)", "value": "horrible" }, { "key": "smoothness", - "description": "Layer 'Cycleways and roads' shows smoothness=very_horrible with a fixed text, namely 'Usable for specialized off-road vehicles: tractor, ATV' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=no|highway=cycleway)", + "description": "Layer 'Cycleways and roads' shows smoothness=very_horrible with a fixed text, namely 'Usable for specialized off-road vehicles: tractor, ATV' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=no |highway=cycleway)", "value": "very_horrible" }, { "key": "smoothness", - "description": "Layer 'Cycleways and roads' shows smoothness=impassable with a fixed text, namely 'Impassable / No wheeled vehicle' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=no|highway=cycleway)", + "description": "Layer 'Cycleways and roads' shows smoothness=impassable with a fixed text, namely 'Impassable / No wheeled vehicle' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=no |highway=cycleway)", "value": "impassable" }, { "key": "width:carriageway", - "description": "Layer 'Cycleways and roads' shows and asks freeform values for key 'width:carriageway' (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if highway!=cycleway&highway!=path&highway!=footway)" + "description": "Layer 'Cycleways and roads' shows and asks freeform values for key 'width:carriageway' (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if highway!=cycleway &highway!=path &highway!=footway)" }, { "key": "cycleway:traffic_sign", - "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7 with a fixed text, namely 'Compulsory cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=lane|cycleway=track&_country=be)", + "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7 with a fixed text, namely 'Compulsory cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=lane |cycleway=track &_country=be)", "value": "BE:D7" }, { "key": "cycleway:traffic_sign", - "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign~^(BE:D7;.*)$ with a fixed text, namely 'Compulsory cycleway (with supplementary sign)
' (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=lane|cycleway=track&_country=be)" + "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign~^(BE:D7;.*)$ with a fixed text, namely 'Compulsory cycleway (with supplementary sign)
' (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=lane |cycleway=track &_country=be)" }, { "key": "cycleway:traffic_sign", - "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D9 with a fixed text, namely 'Segregated foot/cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=lane|cycleway=track&_country=be)", + "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D9 with a fixed text, namely 'Segregated foot/cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=lane |cycleway=track &_country=be)", "value": "BE:D9" }, { "key": "cycleway:traffic_sign", - "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D10 with a fixed text, namely 'Unsegregated foot/cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=lane|cycleway=track&_country=be)", + "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D10 with a fixed text, namely 'Unsegregated foot/cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=lane |cycleway=track &_country=be)", "value": "BE:D10" }, { "key": "cycleway:traffic_sign", - "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=none with a fixed text, namely 'No traffic sign present' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=lane|cycleway=track&_country=be)", + "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=none with a fixed text, namely 'No traffic sign present' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=lane |cycleway=track &_country=be)", "value": "none" }, { "key": "traffic_sign", - "description": "Layer 'Cycleways and roads' shows traffic_sign=BE:D7 with a fixed text, namely 'Compulsory cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if highway=cycleway|highway=path&_country=be|_country=nl)", + "description": "Layer 'Cycleways and roads' shows traffic_sign=BE:D7 with a fixed text, namely 'Compulsory cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if highway=cycleway |highway=path &_country=be |_country=nl)", "value": "BE:D7" }, { "key": "traffic_sign", - "description": "Layer 'Cycleways and roads' shows traffic_sign~^(BE:D7;.*)$ with a fixed text, namely 'Compulsory cycleway (with supplementary sign)
' (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if highway=cycleway|highway=path&_country=be|_country=nl)" + "description": "Layer 'Cycleways and roads' shows traffic_sign~^(BE:D7;.*)$ with a fixed text, namely 'Compulsory cycleway (with supplementary sign)
' (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if highway=cycleway |highway=path &_country=be |_country=nl)" }, { "key": "traffic_sign", - "description": "Layer 'Cycleways and roads' shows traffic_sign=BE:D9 with a fixed text, namely 'Segregated foot/cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if highway=cycleway|highway=path&_country=be|_country=nl)", + "description": "Layer 'Cycleways and roads' shows traffic_sign=BE:D9 with a fixed text, namely 'Segregated foot/cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if highway=cycleway |highway=path &_country=be |_country=nl)", "value": "BE:D9" }, { "key": "traffic_sign", - "description": "Layer 'Cycleways and roads' shows traffic_sign=BE:D10 with a fixed text, namely 'Unsegregated foot/cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if highway=cycleway|highway=path&_country=be|_country=nl)", + "description": "Layer 'Cycleways and roads' shows traffic_sign=BE:D10 with a fixed text, namely 'Unsegregated foot/cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if highway=cycleway |highway=path &_country=be |_country=nl)", "value": "BE:D10" }, { "key": "traffic_sign", - "description": "Layer 'Cycleways and roads' shows traffic_sign=NL:G11 with a fixed text, namely 'Compulsory cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if highway=cycleway|highway=path&_country=be|_country=nl)", + "description": "Layer 'Cycleways and roads' shows traffic_sign=NL:G11 with a fixed text, namely 'Compulsory cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if highway=cycleway |highway=path &_country=be |_country=nl)", "value": "NL:G11" }, { "key": "traffic_sign", - "description": "Layer 'Cycleways and roads' shows traffic_sign=NL:G12a with a fixed text, namely 'Compulsory (moped)cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if highway=cycleway|highway=path&_country=be|_country=nl)", + "description": "Layer 'Cycleways and roads' shows traffic_sign=NL:G12a with a fixed text, namely 'Compulsory (moped)cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if highway=cycleway |highway=path &_country=be |_country=nl)", "value": "NL:G12a" }, { "key": "traffic_sign", - "description": "Layer 'Cycleways and roads' shows traffic_sign=NL:G13 with a fixed text, namely 'Non-compulsory cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if highway=cycleway|highway=path&_country=be|_country=nl)", + "description": "Layer 'Cycleways and roads' shows traffic_sign=NL:G13 with a fixed text, namely 'Non-compulsory cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if highway=cycleway |highway=path &_country=be |_country=nl)", "value": "NL:G13" }, { "key": "traffic_sign", - "description": "Layer 'Cycleways and roads' shows traffic_sign=none with a fixed text, namely 'No traffic sign present' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if highway=cycleway|highway=path&_country=be|_country=nl)", + "description": "Layer 'Cycleways and roads' shows traffic_sign=none with a fixed text, namely 'No traffic sign present' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if highway=cycleway |highway=path &_country=be |_country=nl)", "value": "none" }, { "key": "cycleway:traffic_sign", - "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7;BE:M6 with a fixed text, namely 'Mopeds must use the cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway:traffic_sign=BE:D7|cycleway:traffic_sign~^(BE:D7;.*)$)", + "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7;BE:M6 with a fixed text, namely 'Mopeds must use the cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway:traffic_sign=BE:D7 |cycleway:traffic_sign~^(BE:D7;.*)$)", "value": "BE:D7;BE:M6" }, { "key": "cycleway:traffic_sign", - "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7;BE:M13 with a fixed text, namely 'Speedpedelecs must use the cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway:traffic_sign=BE:D7|cycleway:traffic_sign~^(BE:D7;.*)$)", + "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7;BE:M13 with a fixed text, namely 'Speedpedelecs must use the cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway:traffic_sign=BE:D7 |cycleway:traffic_sign~^(BE:D7;.*)$)", "value": "BE:D7;BE:M13" }, { "key": "cycleway:traffic_sign", - "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7;BE:M14 with a fixed text, namely 'Mopeds and speedpedelecs must use the cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway:traffic_sign=BE:D7|cycleway:traffic_sign~^(BE:D7;.*)$)", + "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7;BE:M14 with a fixed text, namely 'Mopeds and speedpedelecs must use the cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway:traffic_sign=BE:D7 |cycleway:traffic_sign~^(BE:D7;.*)$)", "value": "BE:D7;BE:M14" }, { "key": "cycleway:traffic_sign", - "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7;BE:M7 with a fixed text, namely 'Mopeds are not allowed' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway:traffic_sign=BE:D7|cycleway:traffic_sign~^(BE:D7;.*)$)", + "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7;BE:M7 with a fixed text, namely 'Mopeds are not allowed' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway:traffic_sign=BE:D7 |cycleway:traffic_sign~^(BE:D7;.*)$)", "value": "BE:D7;BE:M7" }, { "key": "cycleway:traffic_sign", - "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7;BE:M15 with a fixed text, namely 'Speedpedelecs are not allowed' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway:traffic_sign=BE:D7|cycleway:traffic_sign~^(BE:D7;.*)$)", + "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7;BE:M15 with a fixed text, namely 'Speedpedelecs are not allowed' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway:traffic_sign=BE:D7 |cycleway:traffic_sign~^(BE:D7;.*)$)", "value": "BE:D7;BE:M15" }, { "key": "cycleway:traffic_sign", - "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7;BE:M16 with a fixed text, namely 'Mopeds and speedpedelecs are not allowed' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway:traffic_sign=BE:D7|cycleway:traffic_sign~^(BE:D7;.*)$)", + "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7;BE:M16 with a fixed text, namely 'Mopeds and speedpedelecs are not allowed' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway:traffic_sign=BE:D7 |cycleway:traffic_sign~^(BE:D7;.*)$)", "value": "BE:D7;BE:M16" }, { "key": "cycleway:traffic_sign:supplementary", - "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign:supplementary=none with a fixed text, namely 'No supplementary traffic sign present' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway:traffic_sign=BE:D7|cycleway:traffic_sign~^(BE:D7;.*)$)", + "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign:supplementary=none with a fixed text, namely 'No supplementary traffic sign present' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway:traffic_sign=BE:D7 |cycleway:traffic_sign~^(BE:D7;.*)$)", "value": "none" }, { "key": "cycleway:buffer", - "description": "Layer 'Cycleways and roads' shows and asks freeform values for key 'cycleway:buffer' (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=track|cycleway=lane)" + "description": "Layer 'Cycleways and roads' shows and asks freeform values for key 'cycleway:buffer' (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=track |cycleway=lane)" }, { "key": "cycleway:separation", - "description": "Layer 'Cycleways and roads' shows cycleway:separation=dashed_line with a fixed text, namely 'This cycleway is separated by a dashed line' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=track|cycleway=lane)", + "description": "Layer 'Cycleways and roads' shows cycleway:separation=dashed_line with a fixed text, namely 'This cycleway is separated by a dashed line' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=track |cycleway=lane)", "value": "dashed_line" }, { "key": "cycleway:separation", - "description": "Layer 'Cycleways and roads' shows cycleway:separation=solid_line with a fixed text, namely 'This cycleway is separated by a solid line' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=track|cycleway=lane)", + "description": "Layer 'Cycleways and roads' shows cycleway:separation=solid_line with a fixed text, namely 'This cycleway is separated by a solid line' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=track |cycleway=lane)", "value": "solid_line" }, { "key": "cycleway:separation", - "description": "Layer 'Cycleways and roads' shows cycleway:separation=parking_lane with a fixed text, namely 'This cycleway is separated by a parking lane' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=track|cycleway=lane)", + "description": "Layer 'Cycleways and roads' shows cycleway:separation=parking_lane with a fixed text, namely 'This cycleway is separated by a parking lane' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=track |cycleway=lane)", "value": "parking_lane" }, { "key": "cycleway:separation", - "description": "Layer 'Cycleways and roads' shows cycleway:separation=kerb with a fixed text, namely 'This cycleway is separated by a kerb' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=track|cycleway=lane)", + "description": "Layer 'Cycleways and roads' shows cycleway:separation=kerb with a fixed text, namely 'This cycleway is separated by a kerb' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if cycleway=track |cycleway=lane)", "value": "kerb" }, { "key": "separation", - "description": "Layer 'Cycleways and roads' shows separation=dashed_line with a fixed text, namely 'This cycleway is separated by a dashed line' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if highway=cycleway|highway=path)", + "description": "Layer 'Cycleways and roads' shows separation=dashed_line with a fixed text, namely 'This cycleway is separated by a dashed line' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if highway=cycleway |highway=path)", "value": "dashed_line" }, { "key": "separation", - "description": "Layer 'Cycleways and roads' shows separation=solid_line with a fixed text, namely 'This cycleway is separated by a solid line' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if highway=cycleway|highway=path)", + "description": "Layer 'Cycleways and roads' shows separation=solid_line with a fixed text, namely 'This cycleway is separated by a solid line' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if highway=cycleway |highway=path)", "value": "solid_line" }, { "key": "separation", - "description": "Layer 'Cycleways and roads' shows separation=parking_lane with a fixed text, namely 'This cycleway is separated by a parking lane' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if highway=cycleway|highway=path)", + "description": "Layer 'Cycleways and roads' shows separation=parking_lane with a fixed text, namely 'This cycleway is separated by a parking lane' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if highway=cycleway |highway=path)", "value": "parking_lane" }, { "key": "separation", - "description": "Layer 'Cycleways and roads' shows separation=kerb with a fixed text, namely 'This cycleway is separated by a kerb' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if highway=cycleway|highway=path)", + "description": "Layer 'Cycleways and roads' shows separation=kerb with a fixed text, namely 'This cycleway is separated by a kerb' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if highway=cycleway |highway=path)", "value": "kerb" }, { @@ -574,7 +574,7 @@ }, { "key": "id", - "description": "Layer 'Crossings' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Crossings' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -659,12 +659,12 @@ }, { "key": "button_operated", - "description": "Layer 'Crossings' shows button_operated=yes with a fixed text, namely 'This traffic light has a button to request green light' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if highway=traffic_signals|crossing=traffic_signals)", + "description": "Layer 'Crossings' shows button_operated=yes with a fixed text, namely 'This traffic light has a button to request green light' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if highway=traffic_signals |crossing=traffic_signals)", "value": "yes" }, { "key": "button_operated", - "description": "Layer 'Crossings' shows button_operated=no with a fixed text, namely 'This traffic light does not have a button to request green light' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if highway=traffic_signals|crossing=traffic_signals)", + "description": "Layer 'Crossings' shows button_operated=no with a fixed text, namely 'This traffic light does not have a button to request green light' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if highway=traffic_signals |crossing=traffic_signals)", "value": "no" }, { @@ -689,12 +689,12 @@ }, { "key": "traffic_signals:vibration", - "description": "Layer 'Crossings' shows traffic_signals:vibration=yes with a fixed text, namely 'The button for this traffic light has a vibration signal to indicate that it is safe to cross.' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if crossing=traffic_signals&button_operated=yes)", + "description": "Layer 'Crossings' shows traffic_signals:vibration=yes with a fixed text, namely 'The button for this traffic light has a vibration signal to indicate that it is safe to cross.' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if crossing=traffic_signals &button_operated=yes)", "value": "yes" }, { "key": "traffic_signals:vibration", - "description": "Layer 'Crossings' shows traffic_signals:vibration=no with a fixed text, namely 'The button for this traffic light does not have a vibration signal to indicate that it is safe to cross.' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if crossing=traffic_signals&button_operated=yes)", + "description": "Layer 'Crossings' shows traffic_signals:vibration=no with a fixed text, namely 'The button for this traffic light does not have a vibration signal to indicate that it is safe to cross.' and allows to pick this as a default answer (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if crossing=traffic_signals &button_operated=yes)", "value": "no" }, { @@ -754,7 +754,7 @@ }, { "key": "id", - "description": "Layer 'Kerbs' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Kerbs' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Kerbs and crossings') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", diff --git a/Docs/TagInfo/mapcomplete_maps.json b/Docs/TagInfo/mapcomplete_maps.json index 23ce7b2af..2d9e512cf 100644 --- a/Docs/TagInfo/mapcomplete_maps.json +++ b/Docs/TagInfo/mapcomplete_maps.json @@ -22,7 +22,7 @@ }, { "key": "id", - "description": "Layer 'Maps' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'A map of maps') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Maps' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'A map of maps') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -101,27 +101,27 @@ }, { "key": "map_source:attribution", - "description": "Layer 'Maps' shows map_source:attribution=yes with a fixed text, namely 'OpenStreetMap is clearly attributed, including the ODBL-license' and allows to pick this as a default answer (in the mapcomplete.org theme 'A map of maps') (This is only shown if map_source~^((O|)pen(S|s)treet(M|m)ap)$|map_source=osm|map_source=OSM)", + "description": "Layer 'Maps' shows map_source:attribution=yes with a fixed text, namely 'OpenStreetMap is clearly attributed, including the ODBL-license' and allows to pick this as a default answer (in the mapcomplete.org theme 'A map of maps') (This is only shown if map_source~^((O|)pen(S|s)treet(M|m)ap)$ |map_source=osm |map_source=OSM)", "value": "yes" }, { "key": "map_source:attribution", - "description": "Layer 'Maps' shows map_source:attribution=incomplete with a fixed text, namely 'OpenStreetMap is clearly attributed, but the license is not mentioned' and allows to pick this as a default answer (in the mapcomplete.org theme 'A map of maps') (This is only shown if map_source~^((O|)pen(S|s)treet(M|m)ap)$|map_source=osm|map_source=OSM)", + "description": "Layer 'Maps' shows map_source:attribution=incomplete with a fixed text, namely 'OpenStreetMap is clearly attributed, but the license is not mentioned' and allows to pick this as a default answer (in the mapcomplete.org theme 'A map of maps') (This is only shown if map_source~^((O|)pen(S|s)treet(M|m)ap)$ |map_source=osm |map_source=OSM)", "value": "incomplete" }, { "key": "map_source:attribution", - "description": "Layer 'Maps' shows map_source:attribution=sticker with a fixed text, namely 'OpenStreetMap wasn't mentioned, but someone put an OpenStreetMap-sticker on it' and allows to pick this as a default answer (in the mapcomplete.org theme 'A map of maps') (This is only shown if map_source~^((O|)pen(S|s)treet(M|m)ap)$|map_source=osm|map_source=OSM)", + "description": "Layer 'Maps' shows map_source:attribution=sticker with a fixed text, namely 'OpenStreetMap wasn't mentioned, but someone put an OpenStreetMap-sticker on it' and allows to pick this as a default answer (in the mapcomplete.org theme 'A map of maps') (This is only shown if map_source~^((O|)pen(S|s)treet(M|m)ap)$ |map_source=osm |map_source=OSM)", "value": "sticker" }, { "key": "map_source:attribution", - "description": "Layer 'Maps' shows map_source:attribution=none with a fixed text, namely 'There is no attribution at all' and allows to pick this as a default answer (in the mapcomplete.org theme 'A map of maps') (This is only shown if map_source~^((O|)pen(S|s)treet(M|m)ap)$|map_source=osm|map_source=OSM)", + "description": "Layer 'Maps' shows map_source:attribution=none with a fixed text, namely 'There is no attribution at all' and allows to pick this as a default answer (in the mapcomplete.org theme 'A map of maps') (This is only shown if map_source~^((O|)pen(S|s)treet(M|m)ap)$ |map_source=osm |map_source=OSM)", "value": "none" }, { "key": "map_source:attribution", - "description": "Layer 'Maps' shows map_source:attribution=no with a fixed text, namely 'There is no attribution at all' (in the mapcomplete.org theme 'A map of maps') (This is only shown if map_source~^((O|)pen(S|s)treet(M|m)ap)$|map_source=osm|map_source=OSM)", + "description": "Layer 'Maps' shows map_source:attribution=no with a fixed text, namely 'There is no attribution at all' (in the mapcomplete.org theme 'A map of maps') (This is only shown if map_source~^((O|)pen(S|s)treet(M|m)ap)$ |map_source=osm |map_source=OSM)", "value": "no" } ] diff --git a/Docs/TagInfo/mapcomplete_maxspeed.json b/Docs/TagInfo/mapcomplete_maxspeed.json index ebdf844ce..7d0434fe2 100644 --- a/Docs/TagInfo/mapcomplete_maxspeed.json +++ b/Docs/TagInfo/mapcomplete_maxspeed.json @@ -82,7 +82,7 @@ }, { "key": "id", - "description": "Layer 'Maxspeed' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Maxspeed') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Maxspeed' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Maxspeed') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "maxspeed", @@ -100,7 +100,7 @@ }, { "key": "id", - "description": "Layer 'Speed Camera' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Maxspeed') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Speed Camera' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Maxspeed') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "maxspeed", @@ -113,7 +113,7 @@ }, { "key": "id", - "description": "Layer 'Speed Display' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Maxspeed') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Speed Display' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Maxspeed') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "maxspeed", diff --git a/Docs/TagInfo/mapcomplete_nature.json b/Docs/TagInfo/mapcomplete_nature.json index 911b7723c..20ec7766a 100644 --- a/Docs/TagInfo/mapcomplete_nature.json +++ b/Docs/TagInfo/mapcomplete_nature.json @@ -22,7 +22,7 @@ }, { "key": "id", - "description": "Layer 'Drinking water' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Into nature') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Drinking water' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Into nature') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -76,7 +76,7 @@ }, { "key": "id", - "description": "Layer 'Bird watching places' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Into nature') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Bird watching places' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Into nature') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -111,42 +111,42 @@ }, { "key": "amenity", - "description": "Layer 'Bird watching places' shows amenity=shelter&building=yes&shelter=yes with a fixed text, namely 'Bird hide' and allows to pick this as a default answer (in the mapcomplete.org theme 'Into nature')", + "description": "Layer 'Bird watching places' shows amenity=shelter &building=yes &shelter=yes with a fixed text, namely 'Bird hide' and allows to pick this as a default answer (in the mapcomplete.org theme 'Into nature')", "value": "shelter" }, { "key": "building", - "description": "Layer 'Bird watching places' shows amenity=shelter&building=yes&shelter=yes with a fixed text, namely 'Bird hide' and allows to pick this as a default answer (in the mapcomplete.org theme 'Into nature')", + "description": "Layer 'Bird watching places' shows amenity=shelter &building=yes &shelter=yes with a fixed text, namely 'Bird hide' and allows to pick this as a default answer (in the mapcomplete.org theme 'Into nature')", "value": "yes" }, { "key": "shelter", - "description": "Layer 'Bird watching places' shows amenity=shelter&building=yes&shelter=yes with a fixed text, namely 'Bird hide' and allows to pick this as a default answer (in the mapcomplete.org theme 'Into nature')", + "description": "Layer 'Bird watching places' shows amenity=shelter &building=yes &shelter=yes with a fixed text, namely 'Bird hide' and allows to pick this as a default answer (in the mapcomplete.org theme 'Into nature')", "value": "yes" }, { "key": "building", - "description": "Layer 'Bird watching places' shows building=tower&bird_hide=tower with a fixed text, namely 'Bird tower hide' and allows to pick this as a default answer (in the mapcomplete.org theme 'Into nature')", + "description": "Layer 'Bird watching places' shows building=tower &bird_hide=tower with a fixed text, namely 'Bird tower hide' and allows to pick this as a default answer (in the mapcomplete.org theme 'Into nature')", "value": "tower" }, { "key": "bird_hide", - "description": "Layer 'Bird watching places' shows building=tower&bird_hide=tower with a fixed text, namely 'Bird tower hide' and allows to pick this as a default answer (in the mapcomplete.org theme 'Into nature')", + "description": "Layer 'Bird watching places' shows building=tower &bird_hide=tower with a fixed text, namely 'Bird tower hide' and allows to pick this as a default answer (in the mapcomplete.org theme 'Into nature')", "value": "tower" }, { "key": "amenity", - "description": "Layer 'Bird watching places' shows amenity=shelter|building=yes|shelter=yes with a fixed text, namely 'Bird hide shelter' (in the mapcomplete.org theme 'Into nature')", + "description": "Layer 'Bird watching places' shows amenity=shelter |building=yes |shelter=yes with a fixed text, namely 'Bird hide shelter' (in the mapcomplete.org theme 'Into nature')", "value": "shelter" }, { "key": "building", - "description": "Layer 'Bird watching places' shows amenity=shelter|building=yes|shelter=yes with a fixed text, namely 'Bird hide shelter' (in the mapcomplete.org theme 'Into nature')", + "description": "Layer 'Bird watching places' shows amenity=shelter |building=yes |shelter=yes with a fixed text, namely 'Bird hide shelter' (in the mapcomplete.org theme 'Into nature')", "value": "yes" }, { "key": "shelter", - "description": "Layer 'Bird watching places' shows amenity=shelter|building=yes|shelter=yes with a fixed text, namely 'Bird hide shelter' (in the mapcomplete.org theme 'Into nature')", + "description": "Layer 'Bird watching places' shows amenity=shelter |building=yes |shelter=yes with a fixed text, namely 'Bird hide shelter' (in the mapcomplete.org theme 'Into nature')", "value": "yes" }, { @@ -195,7 +195,7 @@ }, { "key": "id", - "description": "Layer 'Nature reserve' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Into nature') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Nature reserve' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Into nature') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -269,12 +269,12 @@ }, { "key": "access", - "description": "Layer 'Nature reserve' shows access=yes&fee=yes with a fixed text, namely 'Accessible with fee' and allows to pick this as a default answer (in the mapcomplete.org theme 'Into nature')", + "description": "Layer 'Nature reserve' shows access=yes &fee=yes with a fixed text, namely 'Accessible with fee' and allows to pick this as a default answer (in the mapcomplete.org theme 'Into nature')", "value": "yes" }, { "key": "fee", - "description": "Layer 'Nature reserve' shows access=yes&fee=yes with a fixed text, namely 'Accessible with fee' and allows to pick this as a default answer (in the mapcomplete.org theme 'Into nature')", + "description": "Layer 'Nature reserve' shows access=yes &fee=yes with a fixed text, namely 'Accessible with fee' and allows to pick this as a default answer (in the mapcomplete.org theme 'Into nature')", "value": "yes" }, { @@ -311,17 +311,17 @@ }, { "key": "dog", - "description": "Layer 'Nature reserve' shows dog=leashed with a fixed text, namely 'Dogs have to be leashed' and allows to pick this as a default answer (in the mapcomplete.org theme 'Into nature') (This is only shown if access=yes|access=permissive|access=guided)", + "description": "Layer 'Nature reserve' shows dog=leashed with a fixed text, namely 'Dogs have to be leashed' and allows to pick this as a default answer (in the mapcomplete.org theme 'Into nature') (This is only shown if access=yes |access=permissive |access=guided)", "value": "leashed" }, { "key": "dog", - "description": "Layer 'Nature reserve' shows dog=no with a fixed text, namely 'No dogs allowed' and allows to pick this as a default answer (in the mapcomplete.org theme 'Into nature') (This is only shown if access=yes|access=permissive|access=guided)", + "description": "Layer 'Nature reserve' shows dog=no with a fixed text, namely 'No dogs allowed' and allows to pick this as a default answer (in the mapcomplete.org theme 'Into nature') (This is only shown if access=yes |access=permissive |access=guided)", "value": "no" }, { "key": "dog", - "description": "Layer 'Nature reserve' shows dog=yes with a fixed text, namely 'Dogs are allowed to roam freely' and allows to pick this as a default answer (in the mapcomplete.org theme 'Into nature') (This is only shown if access=yes|access=permissive|access=guided)", + "description": "Layer 'Nature reserve' shows dog=yes with a fixed text, namely 'Dogs are allowed to roam freely' and allows to pick this as a default answer (in the mapcomplete.org theme 'Into nature') (This is only shown if access=yes |access=permissive |access=guided)", "value": "yes" }, { @@ -377,7 +377,7 @@ }, { "key": "id", - "description": "Layer 'Maps' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Into nature') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Maps' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Into nature') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -456,27 +456,27 @@ }, { "key": "map_source:attribution", - "description": "Layer 'Maps' shows map_source:attribution=yes with a fixed text, namely 'OpenStreetMap is clearly attributed, including the ODBL-license' and allows to pick this as a default answer (in the mapcomplete.org theme 'Into nature') (This is only shown if map_source~^((O|)pen(S|s)treet(M|m)ap)$|map_source=osm|map_source=OSM)", + "description": "Layer 'Maps' shows map_source:attribution=yes with a fixed text, namely 'OpenStreetMap is clearly attributed, including the ODBL-license' and allows to pick this as a default answer (in the mapcomplete.org theme 'Into nature') (This is only shown if map_source~^((O|)pen(S|s)treet(M|m)ap)$ |map_source=osm |map_source=OSM)", "value": "yes" }, { "key": "map_source:attribution", - "description": "Layer 'Maps' shows map_source:attribution=incomplete with a fixed text, namely 'OpenStreetMap is clearly attributed, but the license is not mentioned' and allows to pick this as a default answer (in the mapcomplete.org theme 'Into nature') (This is only shown if map_source~^((O|)pen(S|s)treet(M|m)ap)$|map_source=osm|map_source=OSM)", + "description": "Layer 'Maps' shows map_source:attribution=incomplete with a fixed text, namely 'OpenStreetMap is clearly attributed, but the license is not mentioned' and allows to pick this as a default answer (in the mapcomplete.org theme 'Into nature') (This is only shown if map_source~^((O|)pen(S|s)treet(M|m)ap)$ |map_source=osm |map_source=OSM)", "value": "incomplete" }, { "key": "map_source:attribution", - "description": "Layer 'Maps' shows map_source:attribution=sticker with a fixed text, namely 'OpenStreetMap wasn't mentioned, but someone put an OpenStreetMap-sticker on it' and allows to pick this as a default answer (in the mapcomplete.org theme 'Into nature') (This is only shown if map_source~^((O|)pen(S|s)treet(M|m)ap)$|map_source=osm|map_source=OSM)", + "description": "Layer 'Maps' shows map_source:attribution=sticker with a fixed text, namely 'OpenStreetMap wasn't mentioned, but someone put an OpenStreetMap-sticker on it' and allows to pick this as a default answer (in the mapcomplete.org theme 'Into nature') (This is only shown if map_source~^((O|)pen(S|s)treet(M|m)ap)$ |map_source=osm |map_source=OSM)", "value": "sticker" }, { "key": "map_source:attribution", - "description": "Layer 'Maps' shows map_source:attribution=none with a fixed text, namely 'There is no attribution at all' and allows to pick this as a default answer (in the mapcomplete.org theme 'Into nature') (This is only shown if map_source~^((O|)pen(S|s)treet(M|m)ap)$|map_source=osm|map_source=OSM)", + "description": "Layer 'Maps' shows map_source:attribution=none with a fixed text, namely 'There is no attribution at all' and allows to pick this as a default answer (in the mapcomplete.org theme 'Into nature') (This is only shown if map_source~^((O|)pen(S|s)treet(M|m)ap)$ |map_source=osm |map_source=OSM)", "value": "none" }, { "key": "map_source:attribution", - "description": "Layer 'Maps' shows map_source:attribution=no with a fixed text, namely 'There is no attribution at all' (in the mapcomplete.org theme 'Into nature') (This is only shown if map_source~^((O|)pen(S|s)treet(M|m)ap)$|map_source=osm|map_source=OSM)", + "description": "Layer 'Maps' shows map_source:attribution=no with a fixed text, namely 'There is no attribution at all' (in the mapcomplete.org theme 'Into nature') (This is only shown if map_source~^((O|)pen(S|s)treet(M|m)ap)$ |map_source=osm |map_source=OSM)", "value": "no" }, { @@ -486,7 +486,7 @@ }, { "key": "id", - "description": "Layer 'Information boards' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Into nature') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Information boards' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Into nature') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -511,7 +511,7 @@ }, { "key": "id", - "description": "Layer 'Benches' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Into nature') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Benches' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Into nature') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -531,12 +531,12 @@ }, { "key": "backrest", - "description": "Layer 'Benches' shows backrest=yes&two_sided=yes with a fixed text, namely 'This bench is two-sided and shares the backrest' and allows to pick this as a default answer (in the mapcomplete.org theme 'Into nature')", + "description": "Layer 'Benches' shows backrest=yes &two_sided=yes with a fixed text, namely 'This bench is two-sided and shares the backrest' and allows to pick this as a default answer (in the mapcomplete.org theme 'Into nature')", "value": "yes" }, { "key": "two_sided", - "description": "Layer 'Benches' shows backrest=yes&two_sided=yes with a fixed text, namely 'This bench is two-sided and shares the backrest' and allows to pick this as a default answer (in the mapcomplete.org theme 'Into nature')", + "description": "Layer 'Benches' shows backrest=yes &two_sided=yes with a fixed text, namely 'This bench is two-sided and shares the backrest' and allows to pick this as a default answer (in the mapcomplete.org theme 'Into nature')", "value": "yes" }, { @@ -680,17 +680,17 @@ }, { "key": "historic", - "description": "Layer 'Benches' shows historic=memorial with a fixed text, namely 'This bench is a memorial for someone or something' and allows to pick this as a default answer (in the mapcomplete.org theme 'Into nature') (This is only shown if historic=memorial|inscription~.+|memorial=bench|tourism=artwork)", + "description": "Layer 'Benches' shows historic=memorial with a fixed text, namely 'This bench is a memorial for someone or something' and allows to pick this as a default answer (in the mapcomplete.org theme 'Into nature') (This is only shown if historic=memorial |inscription~.+ |memorial=bench |tourism=artwork)", "value": "memorial" }, { "key": "historic", - "description": "Layer 'Benches' shows not:historic=memorial with a fixed text, namely 'This bench is a not a memorial for someone or something' and allows to pick this as a default answer (in the mapcomplete.org theme 'Into nature') Picking this answer will delete the key historic. (This is only shown if historic=memorial|inscription~.+|memorial=bench|tourism=artwork)", + "description": "Layer 'Benches' shows not:historic=memorial with a fixed text, namely 'This bench is a not a memorial for someone or something' and allows to pick this as a default answer (in the mapcomplete.org theme 'Into nature') Picking this answer will delete the key historic. (This is only shown if historic=memorial |inscription~.+ |memorial=bench |tourism=artwork)", "value": "" }, { "key": "not:historic", - "description": "Layer 'Benches' shows not:historic=memorial with a fixed text, namely 'This bench is a not a memorial for someone or something' and allows to pick this as a default answer (in the mapcomplete.org theme 'Into nature') (This is only shown if historic=memorial|inscription~.+|memorial=bench|tourism=artwork)", + "description": "Layer 'Benches' shows not:historic=memorial with a fixed text, namely 'This bench is a not a memorial for someone or something' and allows to pick this as a default answer (in the mapcomplete.org theme 'Into nature') (This is only shown if historic=memorial |inscription~.+ |memorial=bench |tourism=artwork)", "value": "memorial" }, { @@ -785,7 +785,7 @@ }, { "key": "id", - "description": "Layer 'Picnic tables' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Into nature') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Picnic tables' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Into nature') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -858,7 +858,7 @@ }, { "key": "id", - "description": "Layer 'Toilets' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Into nature') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Toilets' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Into nature') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -1009,7 +1009,7 @@ }, { "key": "door:width", - "description": "Layer 'Toilets' shows and asks freeform values for key 'door:width' (in the mapcomplete.org theme 'Into nature') (This is only shown if wheelchair=yes|wheelchair=designated)" + "description": "Layer 'Toilets' shows and asks freeform values for key 'door:width' (in the mapcomplete.org theme 'Into nature') (This is only shown if wheelchair=yes |wheelchair=designated)" }, { "key": "toilets:position", @@ -1096,7 +1096,7 @@ }, { "key": "id", - "description": "Layer 'Guideposts' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Into nature') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Guideposts' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Into nature') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -1113,6 +1113,31 @@ { "key": "wikipedia", "description": "The layer 'Guideposts allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" + }, + { + "key": "bicycle", + "description": "Layer 'Guideposts' shows bicycle=yes with a fixed text, namely 'This guidepost shows bicycle routes' and allows to pick this as a default answer (in the mapcomplete.org theme 'Into nature')", + "value": "yes" + }, + { + "key": "hiking", + "description": "Layer 'Guideposts' shows hiking=yes with a fixed text, namely 'This guidepost shows hiking routes' and allows to pick this as a default answer (in the mapcomplete.org theme 'Into nature')", + "value": "yes" + }, + { + "key": "mtb", + "description": "Layer 'Guideposts' shows mtb=yes with a fixed text, namely 'This guidepost shows mountain bike routes' and allows to pick this as a default answer (in the mapcomplete.org theme 'Into nature')", + "value": "yes" + }, + { + "key": "horse", + "description": "Layer 'Guideposts' shows horse=yes with a fixed text, namely 'This guidepost shows horse riding routes' and allows to pick this as a default answer (in the mapcomplete.org theme 'Into nature')", + "value": "yes" + }, + { + "key": "ski", + "description": "Layer 'Guideposts' shows ski=yes with a fixed text, namely 'This guidepost shows ski routes' and allows to pick this as a default answer (in the mapcomplete.org theme 'Into nature')", + "value": "yes" } ] } \ No newline at end of file diff --git a/Docs/TagInfo/mapcomplete_notes.json b/Docs/TagInfo/mapcomplete_notes.json index 3b03abd5a..bc0315dee 100644 --- a/Docs/TagInfo/mapcomplete_notes.json +++ b/Docs/TagInfo/mapcomplete_notes.json @@ -20,7 +20,7 @@ }, { "key": "id", - "description": "Layer 'OSM objects with FIXME tags' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Notes on OpenStreetMap') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'OSM objects with FIXME tags' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Notes on OpenStreetMap') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "fixme", diff --git a/Docs/TagInfo/mapcomplete_observation_towers.json b/Docs/TagInfo/mapcomplete_observation_towers.json index 9e0064bd5..d75fb0db9 100644 --- a/Docs/TagInfo/mapcomplete_observation_towers.json +++ b/Docs/TagInfo/mapcomplete_observation_towers.json @@ -17,7 +17,7 @@ }, { "key": "id", - "description": "Layer 'Observation towers' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Observation towers') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Observation towers' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Observation towers') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -60,31 +60,31 @@ }, { "key": "charge", - "description": "Layer 'Observation towers' shows and asks freeform values for key 'charge' (in the mapcomplete.org theme 'Observation towers') (This is only shown if access=yes|access=guided)" + "description": "Layer 'Observation towers' shows and asks freeform values for key 'charge' (in the mapcomplete.org theme 'Observation towers') (This is only shown if access=yes |access=guided)" }, { "key": "fee", - "description": "Layer 'Observation towers' shows fee=no with a fixed text, namely 'Free to visit' and allows to pick this as a default answer (in the mapcomplete.org theme 'Observation towers') (This is only shown if access=yes|access=guided)", + "description": "Layer 'Observation towers' shows fee=no with a fixed text, namely 'Free to visit' and allows to pick this as a default answer (in the mapcomplete.org theme 'Observation towers') (This is only shown if access=yes |access=guided)", "value": "no" }, { "key": "charge", - "description": "Layer 'Observation towers' shows fee=no with a fixed text, namely 'Free to visit' and allows to pick this as a default answer (in the mapcomplete.org theme 'Observation towers') Picking this answer will delete the key charge. (This is only shown if access=yes|access=guided)", + "description": "Layer 'Observation towers' shows fee=no with a fixed text, namely 'Free to visit' and allows to pick this as a default answer (in the mapcomplete.org theme 'Observation towers') Picking this answer will delete the key charge. (This is only shown if access=yes |access=guided)", "value": "" }, { "key": "payment:cash", - "description": "Layer 'Observation towers' shows payment:cash=yes with a fixed text, namely 'Cash is accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Observation towers') (This is only shown if fee=yes|charge~.+)", + "description": "Layer 'Observation towers' shows payment:cash=yes with a fixed text, namely 'Cash is accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Observation towers') (This is only shown if fee=yes |charge~.+)", "value": "yes" }, { "key": "payment:cards", - "description": "Layer 'Observation towers' shows payment:cards=yes with a fixed text, namely 'Payment cards are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Observation towers') (This is only shown if fee=yes|charge~.+)", + "description": "Layer 'Observation towers' shows payment:cards=yes with a fixed text, namely 'Payment cards are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Observation towers') (This is only shown if fee=yes |charge~.+)", "value": "yes" }, { "key": "payment:qr_code", - "description": "Layer 'Observation towers' shows payment:qr_code=yes with a fixed text, namely 'Payment by QR-code is possible here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Observation towers') (This is only shown if fee=yes|charge~.+)", + "description": "Layer 'Observation towers' shows payment:qr_code=yes with a fixed text, namely 'Payment by QR-code is possible here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Observation towers') (This is only shown if fee=yes |charge~.+)", "value": "yes" }, { @@ -97,16 +97,16 @@ }, { "key": "step_count", - "description": "Layer 'Observation towers' shows and asks freeform values for key 'step_count' (in the mapcomplete.org theme 'Observation towers') (This is only shown if access=yes|access=guided)" + "description": "Layer 'Observation towers' shows and asks freeform values for key 'step_count' (in the mapcomplete.org theme 'Observation towers') (This is only shown if access=yes |access=guided)" }, { "key": "elevator", - "description": "Layer 'Observation towers' shows elevator=yes with a fixed text, namely 'This tower has an elevator which takes visitors to the top' and allows to pick this as a default answer (in the mapcomplete.org theme 'Observation towers') (This is only shown if access=yes|access=guided)", + "description": "Layer 'Observation towers' shows elevator=yes with a fixed text, namely 'This tower has an elevator which takes visitors to the top' and allows to pick this as a default answer (in the mapcomplete.org theme 'Observation towers') (This is only shown if access=yes |access=guided)", "value": "yes" }, { "key": "elevator", - "description": "Layer 'Observation towers' shows elevator=no with a fixed text, namely 'This tower does not have an elevator' and allows to pick this as a default answer (in the mapcomplete.org theme 'Observation towers') (This is only shown if access=yes|access=guided)", + "description": "Layer 'Observation towers' shows elevator=no with a fixed text, namely 'This tower does not have an elevator' and allows to pick this as a default answer (in the mapcomplete.org theme 'Observation towers') (This is only shown if access=yes |access=guided)", "value": "no" }, { @@ -115,22 +115,22 @@ }, { "key": "wheelchair", - "description": "Layer 'Observation towers' shows wheelchair=designated with a fixed text, namely 'This place is specially adapted for wheelchair users' and allows to pick this as a default answer (in the mapcomplete.org theme 'Observation towers') (This is only shown if elevator=yes&access=yes|access=guided)", + "description": "Layer 'Observation towers' shows wheelchair=designated with a fixed text, namely 'This place is specially adapted for wheelchair users' and allows to pick this as a default answer (in the mapcomplete.org theme 'Observation towers') (This is only shown if elevator=yes &access=yes |access=guided)", "value": "designated" }, { "key": "wheelchair", - "description": "Layer 'Observation towers' shows wheelchair=yes with a fixed text, namely 'This place is easily reachable with a wheelchair' and allows to pick this as a default answer (in the mapcomplete.org theme 'Observation towers') (This is only shown if elevator=yes&access=yes|access=guided)", + "description": "Layer 'Observation towers' shows wheelchair=yes with a fixed text, namely 'This place is easily reachable with a wheelchair' and allows to pick this as a default answer (in the mapcomplete.org theme 'Observation towers') (This is only shown if elevator=yes &access=yes |access=guided)", "value": "yes" }, { "key": "wheelchair", - "description": "Layer 'Observation towers' shows wheelchair=limited with a fixed text, namely 'It is possible to reach this place in a wheelchair, but it is not easy' and allows to pick this as a default answer (in the mapcomplete.org theme 'Observation towers') (This is only shown if elevator=yes&access=yes|access=guided)", + "description": "Layer 'Observation towers' shows wheelchair=limited with a fixed text, namely 'It is possible to reach this place in a wheelchair, but it is not easy' and allows to pick this as a default answer (in the mapcomplete.org theme 'Observation towers') (This is only shown if elevator=yes &access=yes |access=guided)", "value": "limited" }, { "key": "wheelchair", - "description": "Layer 'Observation towers' shows wheelchair=no with a fixed text, namely 'This place is not reachable with a wheelchair' and allows to pick this as a default answer (in the mapcomplete.org theme 'Observation towers') (This is only shown if elevator=yes&access=yes|access=guided)", + "description": "Layer 'Observation towers' shows wheelchair=no with a fixed text, namely 'This place is not reachable with a wheelchair' and allows to pick this as a default answer (in the mapcomplete.org theme 'Observation towers') (This is only shown if elevator=yes &access=yes |access=guided)", "value": "no" }, { diff --git a/Docs/TagInfo/mapcomplete_onwheels.json b/Docs/TagInfo/mapcomplete_onwheels.json index 153ca2a71..d662e5627 100644 --- a/Docs/TagInfo/mapcomplete_onwheels.json +++ b/Docs/TagInfo/mapcomplete_onwheels.json @@ -37,7 +37,7 @@ }, { "key": "id", - "description": "Layer 'Cafés and pubs' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'OnWheels') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Cafés and pubs' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'OnWheels') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -263,17 +263,17 @@ }, { "key": "internet_access:fee", - "description": "Layer 'Cafés and pubs' shows internet_access:fee=yes with a fixed text, namely 'There is a fee for the internet access at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if internet_access!=no&internet_access~.+)", + "description": "Layer 'Cafés and pubs' shows internet_access:fee=yes with a fixed text, namely 'There is a fee for the internet access at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if internet_access!=no &internet_access~.+)", "value": "yes" }, { "key": "internet_access:fee", - "description": "Layer 'Cafés and pubs' shows internet_access:fee=no with a fixed text, namely 'Internet access is free at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if internet_access!=no&internet_access~.+)", + "description": "Layer 'Cafés and pubs' shows internet_access:fee=no with a fixed text, namely 'Internet access is free at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if internet_access!=no &internet_access~.+)", "value": "no" }, { "key": "internet_access:fee", - "description": "Layer 'Cafés and pubs' shows internet_access:fee=customers with a fixed text, namely 'Internet access is free at this place, for customers only' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if internet_access!=no&internet_access~.+)", + "description": "Layer 'Cafés and pubs' shows internet_access:fee=customers with a fixed text, namely 'Internet access is free at this place, for customers only' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if internet_access!=no &internet_access~.+)", "value": "customers" }, { @@ -300,7 +300,7 @@ }, { "key": "id", - "description": "Layer 'Entrance' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'OnWheels') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Entrance' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'OnWheels') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -532,7 +532,7 @@ }, { "key": "id", - "description": "Layer 'Restaurants and fast food' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'OnWheels') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Restaurants and fast food' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'OnWheels') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -1052,17 +1052,17 @@ }, { "key": "internet_access:fee", - "description": "Layer 'Restaurants and fast food' shows internet_access:fee=yes with a fixed text, namely 'There is a fee for the internet access at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if internet_access!=no&internet_access~.+)", + "description": "Layer 'Restaurants and fast food' shows internet_access:fee=yes with a fixed text, namely 'There is a fee for the internet access at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if internet_access!=no &internet_access~.+)", "value": "yes" }, { "key": "internet_access:fee", - "description": "Layer 'Restaurants and fast food' shows internet_access:fee=no with a fixed text, namely 'Internet access is free at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if internet_access!=no&internet_access~.+)", + "description": "Layer 'Restaurants and fast food' shows internet_access:fee=no with a fixed text, namely 'Internet access is free at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if internet_access!=no &internet_access~.+)", "value": "no" }, { "key": "internet_access:fee", - "description": "Layer 'Restaurants and fast food' shows internet_access:fee=customers with a fixed text, namely 'Internet access is free at this place, for customers only' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if internet_access!=no&internet_access~.+)", + "description": "Layer 'Restaurants and fast food' shows internet_access:fee=customers with a fixed text, namely 'Internet access is free at this place, for customers only' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if internet_access!=no &internet_access~.+)", "value": "customers" }, { @@ -1081,7 +1081,7 @@ }, { "key": "id", - "description": "Layer 'Kerbs' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'OnWheels') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Kerbs' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'OnWheels') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -1155,7 +1155,7 @@ }, { "key": "id", - "description": "Layer 'Parking' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'OnWheels') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Parking' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'OnWheels') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -1282,7 +1282,7 @@ }, { "key": "id", - "description": "Layer 'Disabled parking spaces' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'OnWheels') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Disabled parking spaces' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'OnWheels') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -1316,7 +1316,7 @@ }, { "key": "id", - "description": "Layer 'Shop' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'OnWheels') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Shop' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'OnWheels') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -1342,6 +1342,11 @@ "key": "shop", "description": "Layer 'Shop' shows and asks freeform values for key 'shop' (in the mapcomplete.org theme 'OnWheels')" }, + { + "key": "shop", + "description": "Layer 'Shop' shows shop=vacant with a fixed text, namely 'Vacant Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", + "value": "vacant" + }, { "key": "shop", "description": "Layer 'Shop' shows shop=agrarian with a fixed text, namely 'Farm Supply Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", @@ -1359,7 +1364,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=antiques with a fixed text, namely 'Antiques Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", + "description": "Layer 'Shop' shows shop=antiques with a fixed text, namely 'Antique Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", "value": "antiques" }, { @@ -1424,7 +1429,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=books with a fixed text, namely 'Book Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", + "description": "Layer 'Shop' shows shop=books with a fixed text, namely 'Bookstore' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", "value": "books" }, { @@ -1544,7 +1549,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=country_store with a fixed text, namely 'Country Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", + "description": "Layer 'Shop' shows shop=country_store with a fixed text, namely 'Rural Supplies Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", "value": "country_store" }, { @@ -1564,7 +1569,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=deli with a fixed text, namely 'Deli' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", + "description": "Layer 'Shop' shows shop=deli with a fixed text, namely 'Delicatessen' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", "value": "deli" }, { @@ -1714,7 +1719,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=health_food with a fixed text, namely 'Health Food Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", + "description": "Layer 'Shop' shows shop=health_food with a fixed text, namely 'Health Food Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", "value": "health_food" }, { @@ -1734,8 +1739,8 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=hobby with a fixed text, namely 'Hobby Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", - "value": "hobby" + "description": "Layer 'Shop' shows shop=honey with a fixed text, namely 'Honey Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", + "value": "honey" }, { "key": "shop", @@ -1854,7 +1859,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=newsagent with a fixed text, namely 'Newspaper/Magazine Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", + "description": "Layer 'Shop' shows shop=newsagent with a fixed text, namely 'Newsstand' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", "value": "newsagent" }, { @@ -1862,6 +1867,11 @@ "description": "Layer 'Shop' shows shop=nutrition_supplements with a fixed text, namely 'Nutrition Supplements Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", "value": "nutrition_supplements" }, + { + "key": "shop", + "description": "Layer 'Shop' shows shop=nuts with a fixed text, namely 'Nuts Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", + "value": "nuts" + }, { "key": "shop", "description": "Layer 'Shop' shows shop=optician with a fixed text, namely 'Optician' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", @@ -1887,6 +1897,11 @@ "description": "Layer 'Shop' shows shop=party with a fixed text, namely 'Party Supply Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", "value": "party" }, + { + "key": "shop", + "description": "Layer 'Shop' shows shop=pasta with a fixed text, namely 'Pasta Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", + "value": "pasta" + }, { "key": "shop", "description": "Layer 'Shop' shows shop=pastry with a fixed text, namely 'Pastry Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", @@ -1894,7 +1909,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=pawnbroker with a fixed text, namely 'Pawn Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", + "description": "Layer 'Shop' shows shop=pawnbroker with a fixed text, namely 'Pawnshop' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", "value": "pawnbroker" }, { @@ -1909,7 +1924,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=pet_grooming with a fixed text, namely 'Pet Grooming Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", + "description": "Layer 'Shop' shows shop=pet_grooming with a fixed text, namely 'Pet Groomer' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", "value": "pet_grooming" }, { @@ -1957,6 +1972,11 @@ "description": "Layer 'Shop' shows shop=repair with a fixed text, namely 'Repair Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", "value": "repair" }, + { + "key": "shop", + "description": "Layer 'Shop' shows shop=rice with a fixed text, namely 'Rice Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", + "value": "rice" + }, { "key": "shop", "description": "Layer 'Shop' shows shop=scuba_diving with a fixed text, namely 'Scuba Diving Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", @@ -1969,7 +1989,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=second_hand with a fixed text, namely 'Consignment/Thrift Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", + "description": "Layer 'Shop' shows shop=second_hand with a fixed text, namely 'Thrift Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", "value": "second_hand" }, { @@ -2089,7 +2109,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=variety_store with a fixed text, namely 'Variety Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", + "description": "Layer 'Shop' shows shop=variety_store with a fixed text, namely 'Discount Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", "value": "variety_store" }, { @@ -2144,17 +2164,17 @@ }, { "key": "second_hand", - "description": "Layer 'Shop' shows second_hand=only with a fixed text, namely 'This shop sells second-hand items only' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if shop=clothes|shop=car|shop=books|shop=charity|shop=car_repair|shop=furniture|shop=bicycle|shop=bicycle|shop=mobile_phone|shop=computer|shop=toys)", + "description": "Layer 'Shop' shows second_hand=only with a fixed text, namely 'This shop sells second-hand items only' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if shop=clothes |shop=car |shop=books |shop=charity |shop=car_repair |shop=furniture |shop=bicycle |shop=bicycle |shop=mobile_phone |shop=computer |shop=toys)", "value": "only" }, { "key": "second_hand", - "description": "Layer 'Shop' shows second_hand=yes with a fixed text, namely 'This shop sells second-hand items along with new items' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if shop=clothes|shop=car|shop=books|shop=charity|shop=car_repair|shop=furniture|shop=bicycle|shop=bicycle|shop=mobile_phone|shop=computer|shop=toys)", + "description": "Layer 'Shop' shows second_hand=yes with a fixed text, namely 'This shop sells second-hand items along with new items' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if shop=clothes |shop=car |shop=books |shop=charity |shop=car_repair |shop=furniture |shop=bicycle |shop=bicycle |shop=mobile_phone |shop=computer |shop=toys)", "value": "yes" }, { "key": "second_hand", - "description": "Layer 'Shop' shows second_hand=no with a fixed text, namely 'This shop only sells brand-new items' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if shop=clothes|shop=car|shop=books|shop=charity|shop=car_repair|shop=furniture|shop=bicycle|shop=bicycle|shop=mobile_phone|shop=computer|shop=toys)", + "description": "Layer 'Shop' shows second_hand=no with a fixed text, namely 'This shop only sells brand-new items' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if shop=clothes |shop=car |shop=books |shop=charity |shop=car_repair |shop=furniture |shop=bicycle |shop=bicycle |shop=mobile_phone |shop=computer |shop=toys)", "value": "no" }, { @@ -2231,29 +2251,49 @@ }, { "key": "service:print:A4", - "description": "Layer 'Shop' shows service:print:A4=yes with a fixed text, namely 'This shop can print on papers of size A4' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if shop~^(.*copyshop.*)$|shop~^(.*stationery.*)$|service:print=yes)", + "description": "Layer 'Shop' shows service:print:A4=yes with a fixed text, namely 'This shop can print on papers of size A4' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if shop~^(.*copyshop.*)$ |shop~^(.*stationery.*)$ |service:print=yes)", "value": "yes" }, { "key": "service:print:A3", - "description": "Layer 'Shop' shows service:print:A3=yes with a fixed text, namely 'This shop can print on papers of size A3' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if shop~^(.*copyshop.*)$|shop~^(.*stationery.*)$|service:print=yes)", + "description": "Layer 'Shop' shows service:print:A3=yes with a fixed text, namely 'This shop can print on papers of size A3' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if shop~^(.*copyshop.*)$ |shop~^(.*stationery.*)$ |service:print=yes)", "value": "yes" }, { "key": "service:print:A2", - "description": "Layer 'Shop' shows service:print:A2=yes with a fixed text, namely 'This shop can print on papers of size A2' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if shop~^(.*copyshop.*)$|shop~^(.*stationery.*)$|service:print=yes)", + "description": "Layer 'Shop' shows service:print:A2=yes with a fixed text, namely 'This shop can print on papers of size A2' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if shop~^(.*copyshop.*)$ |shop~^(.*stationery.*)$ |service:print=yes)", "value": "yes" }, { "key": "service:print:A1", - "description": "Layer 'Shop' shows service:print:A1=yes with a fixed text, namely 'This shop can print on papers of size A1' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if shop~^(.*copyshop.*)$|shop~^(.*stationery.*)$|service:print=yes)", + "description": "Layer 'Shop' shows service:print:A1=yes with a fixed text, namely 'This shop can print on papers of size A1' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if shop~^(.*copyshop.*)$ |shop~^(.*stationery.*)$ |service:print=yes)", "value": "yes" }, { "key": "service:print:A0", - "description": "Layer 'Shop' shows service:print:A0=yes with a fixed text, namely 'This shop can print on papers of size A0' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if shop~^(.*copyshop.*)$|shop~^(.*stationery.*)$|service:print=yes)", + "description": "Layer 'Shop' shows service:print:A0=yes with a fixed text, namely 'This shop can print on papers of size A0' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if shop~^(.*copyshop.*)$ |shop~^(.*stationery.*)$ |service:print=yes)", "value": "yes" }, + { + "key": "craft", + "description": "Layer 'Shop' shows craft=key_cutter with a fixed text, namely 'This shop is also specialized in key cutting' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if shop=shoe_repair |service:key_cutting~.+ |craft=key_cutting |shop=diy |shop=doityourself |shop=home_improvement |shop=hardware |shop=locksmith |shop=repair)", + "value": "key_cutter" + }, + { + "key": "service:key_cutting", + "description": "Layer 'Shop' shows service:key_cutting=yes with a fixed text, namely 'This shop offers key cutting as a service' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if shop=shoe_repair |service:key_cutting~.+ |craft=key_cutting |shop=diy |shop=doityourself |shop=home_improvement |shop=hardware |shop=locksmith |shop=repair)", + "value": "yes" + }, + { + "key": "craft", + "description": "Layer 'Shop' shows service:key_cutting=no with a fixed text, namely 'This shops does not offer key cutting as a service' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') Picking this answer will delete the key craft. (This is only shown if shop=shoe_repair |service:key_cutting~.+ |craft=key_cutting |shop=diy |shop=doityourself |shop=home_improvement |shop=hardware |shop=locksmith |shop=repair)", + "value": "" + }, + { + "key": "service:key_cutting", + "description": "Layer 'Shop' shows service:key_cutting=no with a fixed text, namely 'This shops does not offer key cutting as a service' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if shop=shoe_repair |service:key_cutting~.+ |craft=key_cutting |shop=diy |shop=doityourself |shop=home_improvement |shop=hardware |shop=locksmith |shop=repair)", + "value": "no" + }, { "key": "internet_access", "description": "Layer 'Shop' shows internet_access=wlan with a fixed text, namely 'This place offers wireless internet access' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", @@ -2281,17 +2321,17 @@ }, { "key": "internet_access:fee", - "description": "Layer 'Shop' shows internet_access:fee=yes with a fixed text, namely 'There is a fee for the internet access at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if internet_access!=no&internet_access~.+)", + "description": "Layer 'Shop' shows internet_access:fee=yes with a fixed text, namely 'There is a fee for the internet access at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if internet_access!=no &internet_access~.+)", "value": "yes" }, { "key": "internet_access:fee", - "description": "Layer 'Shop' shows internet_access:fee=no with a fixed text, namely 'Internet access is free at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if internet_access!=no&internet_access~.+)", + "description": "Layer 'Shop' shows internet_access:fee=no with a fixed text, namely 'Internet access is free at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if internet_access!=no &internet_access~.+)", "value": "no" }, { "key": "internet_access:fee", - "description": "Layer 'Shop' shows internet_access:fee=customers with a fixed text, namely 'Internet access is free at this place, for customers only' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if internet_access!=no&internet_access~.+)", + "description": "Layer 'Shop' shows internet_access:fee=customers with a fixed text, namely 'Internet access is free at this place, for customers only' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if internet_access!=no &internet_access~.+)", "value": "customers" }, { @@ -2305,77 +2345,77 @@ }, { "key": "organic", - "description": "Layer 'Shop' shows organic=yes with a fixed text, namely 'This shop offers organic products' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=clothes|shop=shoes|shop=butcher|shop=cosmetics|shop=deli|shop=bakery|shop=alcohol|shop=seafood|shop=beverages|shop=florist)", + "description": "Layer 'Shop' shows organic=yes with a fixed text, namely 'This shop offers organic products' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=clothes |shop=shoes |shop=butcher |shop=cosmetics |shop=deli |shop=bakery |shop=alcohol |shop=seafood |shop=beverages |shop=florist)", "value": "yes" }, { "key": "organic", - "description": "Layer 'Shop' shows organic=only with a fixed text, namely 'This shop only offers organic products' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=clothes|shop=shoes|shop=butcher|shop=cosmetics|shop=deli|shop=bakery|shop=alcohol|shop=seafood|shop=beverages|shop=florist)", + "description": "Layer 'Shop' shows organic=only with a fixed text, namely 'This shop only offers organic products' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=clothes |shop=shoes |shop=butcher |shop=cosmetics |shop=deli |shop=bakery |shop=alcohol |shop=seafood |shop=beverages |shop=florist)", "value": "only" }, { "key": "organic", - "description": "Layer 'Shop' shows organic=no with a fixed text, namely 'This shop does not offer organic products' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=clothes|shop=shoes|shop=butcher|shop=cosmetics|shop=deli|shop=bakery|shop=alcohol|shop=seafood|shop=beverages|shop=florist)", + "description": "Layer 'Shop' shows organic=no with a fixed text, namely 'This shop does not offer organic products' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=clothes |shop=shoes |shop=butcher |shop=cosmetics |shop=deli |shop=bakery |shop=alcohol |shop=seafood |shop=beverages |shop=florist)", "value": "no" }, { "key": "diet:sugar_free", - "description": "Layer 'Shop' shows diet:sugar_free=only with a fixed text, namely 'This shop only sells sugar free products' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:sugar_free=only with a fixed text, namely 'This shop only sells sugar free products' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "only" }, { "key": "diet:sugar_free", - "description": "Layer 'Shop' shows diet:sugar_free=yes with a fixed text, namely 'This shop has a big sugar free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:sugar_free=yes with a fixed text, namely 'This shop has a big sugar free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "yes" }, { "key": "diet:sugar_free", - "description": "Layer 'Shop' shows diet:sugar_free=limited with a fixed text, namely 'This shop has a limited sugar free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:sugar_free=limited with a fixed text, namely 'This shop has a limited sugar free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "limited" }, { "key": "diet:sugar_free", - "description": "Layer 'Shop' shows diet:sugar_free=no with a fixed text, namely 'This shop has no sugar free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:sugar_free=no with a fixed text, namely 'This shop has no sugar free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "no" }, { "key": "diet:gluten_free", - "description": "Layer 'Shop' shows diet:gluten_free=only with a fixed text, namely 'This shop only sells gluten free products' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:gluten_free=only with a fixed text, namely 'This shop only sells gluten free products' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "only" }, { "key": "diet:gluten_free", - "description": "Layer 'Shop' shows diet:gluten_free=yes with a fixed text, namely 'This shop has a big gluten free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:gluten_free=yes with a fixed text, namely 'This shop has a big gluten free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "yes" }, { "key": "diet:gluten_free", - "description": "Layer 'Shop' shows diet:gluten_free=limited with a fixed text, namely 'This shop has a limited gluten free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:gluten_free=limited with a fixed text, namely 'This shop has a limited gluten free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "limited" }, { "key": "diet:gluten_free", - "description": "Layer 'Shop' shows diet:gluten_free=no with a fixed text, namely 'This shop has no gluten free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:gluten_free=no with a fixed text, namely 'This shop has no gluten free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "no" }, { "key": "diet:lactose_free", - "description": "Layer 'Shop' shows diet:lactose_free=only with a fixed text, namely 'Only sells lactose free products' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:lactose_free=only with a fixed text, namely 'Only sells lactose free products' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "only" }, { "key": "diet:lactose_free", - "description": "Layer 'Shop' shows diet:lactose_free=yes with a fixed text, namely 'Big lactose free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:lactose_free=yes with a fixed text, namely 'Big lactose free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "yes" }, { "key": "diet:lactose_free", - "description": "Layer 'Shop' shows diet:lactose_free=limited with a fixed text, namely 'Limited lactose free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:lactose_free=limited with a fixed text, namely 'Limited lactose free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "limited" }, { "key": "diet:lactose_free", - "description": "Layer 'Shop' shows diet:lactose_free=no with a fixed text, namely 'No lactose free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:lactose_free=no with a fixed text, namely 'No lactose free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "no" }, { @@ -2385,7 +2425,7 @@ }, { "key": "id", - "description": "Layer 'Toilets' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'OnWheels') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Toilets' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'OnWheels') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -2536,7 +2576,7 @@ }, { "key": "door:width", - "description": "Layer 'Toilets' shows and asks freeform values for key 'door:width' (in the mapcomplete.org theme 'OnWheels') (This is only shown if wheelchair=yes|wheelchair=designated)" + "description": "Layer 'Toilets' shows and asks freeform values for key 'door:width' (in the mapcomplete.org theme 'OnWheels') (This is only shown if wheelchair=yes |wheelchair=designated)" }, { "key": "toilets:position", @@ -2623,7 +2663,7 @@ }, { "key": "id", - "description": "Layer 'Pharmacies' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'OnWheels') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Pharmacies' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'OnWheels') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -2695,7 +2735,7 @@ }, { "key": "id", - "description": "Layer 'Doctors' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'OnWheels') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Doctors' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'OnWheels') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -2790,7 +2830,7 @@ }, { "key": "id", - "description": "Layer 'Hospitals' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'OnWheels') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Hospitals' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'OnWheels') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "name", @@ -2841,7 +2881,7 @@ }, { "key": "id", - "description": "Layer 'Reception desks' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'OnWheels') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Reception desks' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'OnWheels') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -2909,7 +2949,7 @@ }, { "key": "id", - "description": "Layer 'Elevator' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'OnWheels') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Elevator' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'OnWheels') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -3025,7 +3065,7 @@ }, { "key": "id", - "description": "Layer 'Hotels' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'OnWheels') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Hotels' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'OnWheels') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -3118,17 +3158,17 @@ }, { "key": "internet_access:fee", - "description": "Layer 'Hotels' shows internet_access:fee=yes with a fixed text, namely 'There is a fee for the internet access at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if internet_access!=no&internet_access~.+)", + "description": "Layer 'Hotels' shows internet_access:fee=yes with a fixed text, namely 'There is a fee for the internet access at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if internet_access!=no &internet_access~.+)", "value": "yes" }, { "key": "internet_access:fee", - "description": "Layer 'Hotels' shows internet_access:fee=no with a fixed text, namely 'Internet access is free at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if internet_access!=no&internet_access~.+)", + "description": "Layer 'Hotels' shows internet_access:fee=no with a fixed text, namely 'Internet access is free at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if internet_access!=no &internet_access~.+)", "value": "no" }, { "key": "internet_access:fee", - "description": "Layer 'Hotels' shows internet_access:fee=customers with a fixed text, namely 'Internet access is free at this place, for customers only' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if internet_access!=no&internet_access~.+)", + "description": "Layer 'Hotels' shows internet_access:fee=customers with a fixed text, namely 'Internet access is free at this place, for customers only' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if internet_access!=no &internet_access~.+)", "value": "customers" }, { @@ -3147,7 +3187,7 @@ }, { "key": "id", - "description": "Layer 'governments' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'OnWheels') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'governments' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'OnWheels') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", diff --git a/Docs/TagInfo/mapcomplete_openwindpowermap.json b/Docs/TagInfo/mapcomplete_openwindpowermap.json index be55f0463..fb2a15f23 100644 --- a/Docs/TagInfo/mapcomplete_openwindpowermap.json +++ b/Docs/TagInfo/mapcomplete_openwindpowermap.json @@ -17,7 +17,7 @@ }, { "key": "id", - "description": "Layer 'wind turbine' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Wind power generators') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'wind turbine' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Wind power generators') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "generator:output:electricity", diff --git a/Docs/TagInfo/mapcomplete_parkings.json b/Docs/TagInfo/mapcomplete_parkings.json index 901dfe0c2..75be6a32c 100644 --- a/Docs/TagInfo/mapcomplete_parkings.json +++ b/Docs/TagInfo/mapcomplete_parkings.json @@ -17,7 +17,7 @@ }, { "key": "id", - "description": "Layer 'Parking' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Parking') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Parking' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Parking') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -144,7 +144,7 @@ }, { "key": "id", - "description": "Layer 'Parking Spaces' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Parking') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Parking Spaces' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Parking') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -254,7 +254,7 @@ }, { "key": "id", - "description": "Layer 'Parking Ticket Machines' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Parking') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Parking Ticket Machines' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Parking') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -309,142 +309,142 @@ }, { "key": "payment:coins:denominations", - "description": "Layer 'Parking Ticket Machines' shows payment:coins:denominations=0.01 EUR with a fixed text, namely '1 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Parking') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Parking Ticket Machines' shows payment:coins:denominations=0.01 EUR with a fixed text, namely '1 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Parking') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.01 EUR" }, { "key": "payment:coins:denominations", - "description": "Layer 'Parking Ticket Machines' shows payment:coins:denominations=0.02 EUR with a fixed text, namely '2 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Parking') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Parking Ticket Machines' shows payment:coins:denominations=0.02 EUR with a fixed text, namely '2 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Parking') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.02 EUR" }, { "key": "payment:coins:denominations", - "description": "Layer 'Parking Ticket Machines' shows payment:coins:denominations=0.05 EUR with a fixed text, namely '5 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Parking') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Parking Ticket Machines' shows payment:coins:denominations=0.05 EUR with a fixed text, namely '5 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Parking') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.05 EUR" }, { "key": "payment:coins:denominations", - "description": "Layer 'Parking Ticket Machines' shows payment:coins:denominations=0.10 EUR with a fixed text, namely '10 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Parking') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Parking Ticket Machines' shows payment:coins:denominations=0.10 EUR with a fixed text, namely '10 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Parking') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.10 EUR" }, { "key": "payment:coins:denominations", - "description": "Layer 'Parking Ticket Machines' shows payment:coins:denominations=0.20 EUR with a fixed text, namely '20 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Parking') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Parking Ticket Machines' shows payment:coins:denominations=0.20 EUR with a fixed text, namely '20 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Parking') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.20 EUR" }, { "key": "payment:coins:denominations", - "description": "Layer 'Parking Ticket Machines' shows payment:coins:denominations=0.50 EUR with a fixed text, namely '50 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Parking') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Parking Ticket Machines' shows payment:coins:denominations=0.50 EUR with a fixed text, namely '50 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Parking') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.50 EUR" }, { "key": "payment:coins:denominations", - "description": "Layer 'Parking Ticket Machines' shows payment:coins:denominations=1 EUR with a fixed text, namely '1 euro coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Parking') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Parking Ticket Machines' shows payment:coins:denominations=1 EUR with a fixed text, namely '1 euro coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Parking') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "1 EUR" }, { "key": "payment:coins:denominations", - "description": "Layer 'Parking Ticket Machines' shows payment:coins:denominations=2 EUR with a fixed text, namely '2 euro coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Parking') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Parking Ticket Machines' shows payment:coins:denominations=2 EUR with a fixed text, namely '2 euro coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Parking') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "2 EUR" }, { "key": "payment:coins:denominations", - "description": "Layer 'Parking Ticket Machines' shows payment:coins:denominations=0.05 CHF with a fixed text, namely '5 centimes coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Parking') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Parking Ticket Machines' shows payment:coins:denominations=0.05 CHF with a fixed text, namely '5 centimes coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Parking') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.05 CHF" }, { "key": "payment:coins:denominations", - "description": "Layer 'Parking Ticket Machines' shows payment:coins:denominations=0.10 CHF with a fixed text, namely '10 centimes coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Parking') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Parking Ticket Machines' shows payment:coins:denominations=0.10 CHF with a fixed text, namely '10 centimes coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Parking') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.10 CHF" }, { "key": "payment:coins:denominations", - "description": "Layer 'Parking Ticket Machines' shows payment:coins:denominations=0.20 CHF with a fixed text, namely '20 centimes coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Parking') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Parking Ticket Machines' shows payment:coins:denominations=0.20 CHF with a fixed text, namely '20 centimes coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Parking') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.20 CHF" }, { "key": "payment:coins:denominations", - "description": "Layer 'Parking Ticket Machines' shows payment:coins:denominations=0.50 CHF with a fixed text, namely '½ franc coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Parking') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Parking Ticket Machines' shows payment:coins:denominations=0.50 CHF with a fixed text, namely '½ franc coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Parking') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.50 CHF" }, { "key": "payment:coins:denominations", - "description": "Layer 'Parking Ticket Machines' shows payment:coins:denominations=1 CHF with a fixed text, namely '1 franc coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Parking') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Parking Ticket Machines' shows payment:coins:denominations=1 CHF with a fixed text, namely '1 franc coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Parking') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "1 CHF" }, { "key": "payment:coins:denominations", - "description": "Layer 'Parking Ticket Machines' shows payment:coins:denominations=2 CHF with a fixed text, namely '2 francs coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Parking') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Parking Ticket Machines' shows payment:coins:denominations=2 CHF with a fixed text, namely '2 francs coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Parking') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "2 CHF" }, { "key": "payment:coins:denominations", - "description": "Layer 'Parking Ticket Machines' shows payment:coins:denominations=5 CHF with a fixed text, namely '5 francs coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Parking') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Parking Ticket Machines' shows payment:coins:denominations=5 CHF with a fixed text, namely '5 francs coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Parking') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "5 CHF" }, { "key": "payment:notes:denominations", - "description": "Layer 'Parking Ticket Machines' shows payment:notes:denominations=5 EUR with a fixed text, namely '5 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Parking') (This is only shown if payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Parking Ticket Machines' shows payment:notes:denominations=5 EUR with a fixed text, namely '5 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Parking') (This is only shown if payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "5 EUR" }, { "key": "payment:notes:denominations", - "description": "Layer 'Parking Ticket Machines' shows payment:notes:denominations=10 EUR with a fixed text, namely '10 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Parking') (This is only shown if payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Parking Ticket Machines' shows payment:notes:denominations=10 EUR with a fixed text, namely '10 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Parking') (This is only shown if payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "10 EUR" }, { "key": "payment:notes:denominations", - "description": "Layer 'Parking Ticket Machines' shows payment:notes:denominations=20 EUR with a fixed text, namely '20 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Parking') (This is only shown if payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Parking Ticket Machines' shows payment:notes:denominations=20 EUR with a fixed text, namely '20 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Parking') (This is only shown if payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "20 EUR" }, { "key": "payment:notes:denominations", - "description": "Layer 'Parking Ticket Machines' shows payment:notes:denominations=50 EUR with a fixed text, namely '50 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Parking') (This is only shown if payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Parking Ticket Machines' shows payment:notes:denominations=50 EUR with a fixed text, namely '50 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Parking') (This is only shown if payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "50 EUR" }, { "key": "payment:notes:denominations", - "description": "Layer 'Parking Ticket Machines' shows payment:notes:denominations=100 EUR with a fixed text, namely '100 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Parking') (This is only shown if payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Parking Ticket Machines' shows payment:notes:denominations=100 EUR with a fixed text, namely '100 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Parking') (This is only shown if payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "100 EUR" }, { "key": "payment:notes:denominations", - "description": "Layer 'Parking Ticket Machines' shows payment:notes:denominations=200 EUR with a fixed text, namely '200 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Parking') (This is only shown if payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Parking Ticket Machines' shows payment:notes:denominations=200 EUR with a fixed text, namely '200 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Parking') (This is only shown if payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "200 EUR" }, { "key": "payment:notes:denominations", - "description": "Layer 'Parking Ticket Machines' shows payment:notes:denominations=500 EUR with a fixed text, namely '500 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Parking') (This is only shown if payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Parking Ticket Machines' shows payment:notes:denominations=500 EUR with a fixed text, namely '500 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Parking') (This is only shown if payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "500 EUR" }, { "key": "payment:notes:denominations", - "description": "Layer 'Parking Ticket Machines' shows payment:notes:denominations=10 CHF with a fixed text, namely '10 francs notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Parking') (This is only shown if payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Parking Ticket Machines' shows payment:notes:denominations=10 CHF with a fixed text, namely '10 francs notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Parking') (This is only shown if payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "10 CHF" }, { "key": "payment:notes:denominations", - "description": "Layer 'Parking Ticket Machines' shows payment:notes:denominations=20 CHF with a fixed text, namely '20 francs notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Parking') (This is only shown if payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Parking Ticket Machines' shows payment:notes:denominations=20 CHF with a fixed text, namely '20 francs notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Parking') (This is only shown if payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "20 CHF" }, { "key": "payment:notes:denominations", - "description": "Layer 'Parking Ticket Machines' shows payment:notes:denominations=50 CHF with a fixed text, namely '50 francs notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Parking') (This is only shown if payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Parking Ticket Machines' shows payment:notes:denominations=50 CHF with a fixed text, namely '50 francs notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Parking') (This is only shown if payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "50 CHF" }, { "key": "payment:notes:denominations", - "description": "Layer 'Parking Ticket Machines' shows payment:notes:denominations=100 CHF with a fixed text, namely '100 francs notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Parking') (This is only shown if payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Parking Ticket Machines' shows payment:notes:denominations=100 CHF with a fixed text, namely '100 francs notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Parking') (This is only shown if payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "100 CHF" }, { "key": "payment:notes:denominations", - "description": "Layer 'Parking Ticket Machines' shows payment:notes:denominations=200 CHF with a fixed text, namely '200 francs notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Parking') (This is only shown if payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Parking Ticket Machines' shows payment:notes:denominations=200 CHF with a fixed text, namely '200 francs notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Parking') (This is only shown if payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "200 CHF" }, { "key": "payment:notes:denominations", - "description": "Layer 'Parking Ticket Machines' shows payment:notes:denominations=1000 CHF with a fixed text, namely '1000 francs notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Parking') (This is only shown if payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Parking Ticket Machines' shows payment:notes:denominations=1000 CHF with a fixed text, namely '1000 francs notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Parking') (This is only shown if payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "1000 CHF" }, { diff --git a/Docs/TagInfo/mapcomplete_personal.json b/Docs/TagInfo/mapcomplete_personal.json index 70883e1ee..0b96b7f4f 100644 --- a/Docs/TagInfo/mapcomplete_personal.json +++ b/Docs/TagInfo/mapcomplete_personal.json @@ -16,7 +16,7 @@ }, { "key": "id", - "description": "Layer 'Advertise' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Advertise' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -95,27 +95,27 @@ }, { "key": "animated", - "description": "Layer 'Advertise' shows animated=no with a fixed text, namely 'Static, always shows the same message' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if advertising!=screen&advertising!=flag&advertising!=tarp&advertising!=wall_painting&advertising!=sign&advertising!=board)", + "description": "Layer 'Advertise' shows animated=no with a fixed text, namely 'Static, always shows the same message' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if advertising!=screen &advertising!=flag &advertising!=tarp &advertising!=wall_painting &advertising!=sign &advertising!=board)", "value": "no" }, { "key": "animated", - "description": "Layer 'Advertise' shows animated=digital_display with a fixed text, namely 'This object has a built-in digital display to show prices or some other message' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if advertising!=screen&advertising!=flag&advertising!=tarp&advertising!=wall_painting&advertising!=sign&advertising!=board)", + "description": "Layer 'Advertise' shows animated=digital_display with a fixed text, namely 'This object has a built-in digital display to show prices or some other message' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if advertising!=screen &advertising!=flag &advertising!=tarp &advertising!=wall_painting &advertising!=sign &advertising!=board)", "value": "digital_display" }, { "key": "animated", - "description": "Layer 'Advertise' shows animated=trivision_blades with a fixed text, namely 'Trivision - the billboard consists of many triangular prisms which regularly rotate' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if advertising!=screen&advertising!=flag&advertising!=tarp&advertising!=wall_painting&advertising!=sign&advertising!=board)", + "description": "Layer 'Advertise' shows animated=trivision_blades with a fixed text, namely 'Trivision - the billboard consists of many triangular prisms which regularly rotate' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if advertising!=screen &advertising!=flag &advertising!=tarp &advertising!=wall_painting &advertising!=sign &advertising!=board)", "value": "trivision_blades" }, { "key": "animated", - "description": "Layer 'Advertise' shows animated=winding_posters with a fixed text, namely 'Scrolling posters' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if advertising!=screen&advertising!=flag&advertising!=tarp&advertising!=wall_painting&advertising!=sign&advertising!=board)", + "description": "Layer 'Advertise' shows animated=winding_posters with a fixed text, namely 'Scrolling posters' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if advertising!=screen &advertising!=flag &advertising!=tarp &advertising!=wall_painting &advertising!=sign &advertising!=board)", "value": "winding_posters" }, { "key": "animated", - "description": "Layer 'Advertise' shows animated=revolving with a fixed text, namely 'Rotates on itself' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if advertising!=screen&advertising!=flag&advertising!=tarp&advertising!=wall_painting&advertising!=sign&advertising!=board)", + "description": "Layer 'Advertise' shows animated=revolving with a fixed text, namely 'Rotates on itself' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if advertising!=screen &advertising!=flag &advertising!=tarp &advertising!=wall_painting &advertising!=sign &advertising!=board)", "value": "revolving" }, { @@ -125,12 +125,12 @@ }, { "key": "lit", - "description": "Layer 'Advertise' shows lit=yes&luminous=yes with a fixed text, namely 'This object both emits light and is lighted by an external light source' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if advertising!=screen)", + "description": "Layer 'Advertise' shows lit=yes &luminous=yes with a fixed text, namely 'This object both emits light and is lighted by an external light source' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if advertising!=screen)", "value": "yes" }, { "key": "luminous", - "description": "Layer 'Advertise' shows lit=yes&luminous=yes with a fixed text, namely 'This object both emits light and is lighted by an external light source' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if advertising!=screen)", + "description": "Layer 'Advertise' shows lit=yes &luminous=yes with a fixed text, namely 'This object both emits light and is lighted by an external light source' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if advertising!=screen)", "value": "yes" }, { @@ -145,12 +145,12 @@ }, { "key": "lit", - "description": "Layer 'Advertise' shows lit=no&luminous=no with a fixed text, namely 'This object does not emit light and is not lighted by externally' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if advertising!=screen)", + "description": "Layer 'Advertise' shows lit=no &luminous=no with a fixed text, namely 'This object does not emit light and is not lighted by externally' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if advertising!=screen)", "value": "no" }, { "key": "luminous", - "description": "Layer 'Advertise' shows lit=no&luminous=no with a fixed text, namely 'This object does not emit light and is not lighted by externally' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if advertising!=screen)", + "description": "Layer 'Advertise' shows lit=no &luminous=no with a fixed text, namely 'This object does not emit light and is not lighted by externally' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if advertising!=screen)", "value": "no" }, { @@ -209,12 +209,12 @@ }, { "key": "sides", - "description": "Layer 'Advertise' shows sides=1 with a fixed text, namely 'This object has advertisements on a single side' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if advertising=poster_box|advertising=screen|advertising=billboard)", + "description": "Layer 'Advertise' shows sides=1 with a fixed text, namely 'This object has advertisements on a single side' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if advertising=poster_box |advertising=screen |advertising=billboard)", "value": "1" }, { "key": "sides", - "description": "Layer 'Advertise' shows sides=2 with a fixed text, namely 'This object has advertisements on both sides' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if advertising=poster_box|advertising=screen|advertising=billboard)", + "description": "Layer 'Advertise' shows sides=2 with a fixed text, namely 'This object has advertisements on both sides' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if advertising=poster_box |advertising=screen |advertising=billboard)", "value": "2" }, { @@ -228,7 +228,7 @@ }, { "key": "id", - "description": "Layer 'Map of ambulance stations' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Map of ambulance stations' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "name", @@ -293,7 +293,7 @@ }, { "key": "id", - "description": "Layer 'Artworks' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Artworks' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -421,12 +421,12 @@ }, { "key": "backrest", - "description": "Layer 'Artworks' shows backrest=yes&two_sided=yes with a fixed text, namely 'This bench is two-sided and shares the backrest' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=bench)", + "description": "Layer 'Artworks' shows backrest=yes &two_sided=yes with a fixed text, namely 'This bench is two-sided and shares the backrest' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=bench)", "value": "yes" }, { "key": "two_sided", - "description": "Layer 'Artworks' shows backrest=yes&two_sided=yes with a fixed text, namely 'This bench is two-sided and shares the backrest' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=bench)", + "description": "Layer 'Artworks' shows backrest=yes &two_sided=yes with a fixed text, namely 'This bench is two-sided and shares the backrest' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=bench)", "value": "yes" }, { @@ -575,7 +575,7 @@ }, { "key": "id", - "description": "Layer 'ATMs' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'ATMs' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -637,37 +637,37 @@ }, { "key": "cash_out:notes:denominations", - "description": "Layer 'ATMs' shows cash_out:notes:denominations=5 EUR with a fixed text, namely '5 euro notes can be withdrawn' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if |cash_out=yes&|_currency~^(.*EUR.*)$)", + "description": "Layer 'ATMs' shows cash_out:notes:denominations=5 EUR with a fixed text, namely '5 euro notes can be withdrawn' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if |cash_out=yes & |_currency~^(.*EUR.*)$)", "value": "5 EUR" }, { "key": "cash_out:notes:denominations", - "description": "Layer 'ATMs' shows cash_out:notes:denominations=10 EUR with a fixed text, namely '10 euro notes can be withdrawn' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if |cash_out=yes&|_currency~^(.*EUR.*)$)", + "description": "Layer 'ATMs' shows cash_out:notes:denominations=10 EUR with a fixed text, namely '10 euro notes can be withdrawn' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if |cash_out=yes & |_currency~^(.*EUR.*)$)", "value": "10 EUR" }, { "key": "cash_out:notes:denominations", - "description": "Layer 'ATMs' shows cash_out:notes:denominations=20 EUR with a fixed text, namely '20 euro notes can be withdrawn' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if |cash_out=yes&|_currency~^(.*EUR.*)$)", + "description": "Layer 'ATMs' shows cash_out:notes:denominations=20 EUR with a fixed text, namely '20 euro notes can be withdrawn' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if |cash_out=yes & |_currency~^(.*EUR.*)$)", "value": "20 EUR" }, { "key": "cash_out:notes:denominations", - "description": "Layer 'ATMs' shows cash_out:notes:denominations=50 EUR with a fixed text, namely '50 euro notes can be withdrawn' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if |cash_out=yes&|_currency~^(.*EUR.*)$)", + "description": "Layer 'ATMs' shows cash_out:notes:denominations=50 EUR with a fixed text, namely '50 euro notes can be withdrawn' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if |cash_out=yes & |_currency~^(.*EUR.*)$)", "value": "50 EUR" }, { "key": "cash_out:notes:denominations", - "description": "Layer 'ATMs' shows cash_out:notes:denominations=100 EUR with a fixed text, namely '100 euro notes can be withdrawn' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if |cash_out=yes&|_currency~^(.*EUR.*)$)", + "description": "Layer 'ATMs' shows cash_out:notes:denominations=100 EUR with a fixed text, namely '100 euro notes can be withdrawn' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if |cash_out=yes & |_currency~^(.*EUR.*)$)", "value": "100 EUR" }, { "key": "cash_out:notes:denominations", - "description": "Layer 'ATMs' shows cash_out:notes:denominations=200 EUR with a fixed text, namely '200 euro notes can be withdrawn' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if |cash_out=yes&|_currency~^(.*EUR.*)$)", + "description": "Layer 'ATMs' shows cash_out:notes:denominations=200 EUR with a fixed text, namely '200 euro notes can be withdrawn' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if |cash_out=yes & |_currency~^(.*EUR.*)$)", "value": "200 EUR" }, { "key": "cash_out:notes:denominations", - "description": "Layer 'ATMs' shows cash_out:notes:denominations=500 EUR with a fixed text, namely '500 euro notes can be withdrawn' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if |cash_out=yes&|_currency~^(.*EUR.*)$)", + "description": "Layer 'ATMs' shows cash_out:notes:denominations=500 EUR with a fixed text, namely '500 euro notes can be withdrawn' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if |cash_out=yes & |_currency~^(.*EUR.*)$)", "value": "500 EUR" }, { @@ -687,7 +687,7 @@ }, { "key": "id", - "description": "Layer 'Banks' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Banks' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "atm", @@ -716,7 +716,7 @@ }, { "key": "id", - "description": "Layer 'Barriers' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Barriers' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -801,19 +801,19 @@ }, { "key": "maxwidth:physical", - "description": "Layer 'Barriers' shows and asks freeform values for key 'maxwidth:physical' (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycle_barrier!=double&cycle_barrier!=triple&_referencing_ways~.+)" + "description": "Layer 'Barriers' shows and asks freeform values for key 'maxwidth:physical' (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycle_barrier!=double &cycle_barrier!=triple &_referencing_ways~.+)" }, { "key": "width:separation", - "description": "Layer 'Barriers' shows and asks freeform values for key 'width:separation' (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycle_barrier=double|cycle_barrier=triple)" + "description": "Layer 'Barriers' shows and asks freeform values for key 'width:separation' (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycle_barrier=double |cycle_barrier=triple)" }, { "key": "width:opening", - "description": "Layer 'Barriers' shows and asks freeform values for key 'width:opening' (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycle_barrier=double|cycle_barrier=triple)" + "description": "Layer 'Barriers' shows and asks freeform values for key 'width:opening' (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycle_barrier=double |cycle_barrier=triple)" }, { "key": "overlap", - "description": "Layer 'Barriers' shows and asks freeform values for key 'overlap' (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycle_barrier=double|cycle_barrier=triple)" + "description": "Layer 'Barriers' shows and asks freeform values for key 'overlap' (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycle_barrier=double |cycle_barrier=triple)" }, { "key": "amenity", @@ -822,7 +822,7 @@ }, { "key": "id", - "description": "Layer 'Benches' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Benches' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -842,12 +842,12 @@ }, { "key": "backrest", - "description": "Layer 'Benches' shows backrest=yes&two_sided=yes with a fixed text, namely 'This bench is two-sided and shares the backrest' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "description": "Layer 'Benches' shows backrest=yes &two_sided=yes with a fixed text, namely 'This bench is two-sided and shares the backrest' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", "value": "yes" }, { "key": "two_sided", - "description": "Layer 'Benches' shows backrest=yes&two_sided=yes with a fixed text, namely 'This bench is two-sided and shares the backrest' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "description": "Layer 'Benches' shows backrest=yes &two_sided=yes with a fixed text, namely 'This bench is two-sided and shares the backrest' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", "value": "yes" }, { @@ -991,17 +991,17 @@ }, { "key": "historic", - "description": "Layer 'Benches' shows historic=memorial with a fixed text, namely 'This bench is a memorial for someone or something' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if historic=memorial|inscription~.+|memorial=bench|tourism=artwork)", + "description": "Layer 'Benches' shows historic=memorial with a fixed text, namely 'This bench is a memorial for someone or something' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if historic=memorial |inscription~.+ |memorial=bench |tourism=artwork)", "value": "memorial" }, { "key": "historic", - "description": "Layer 'Benches' shows not:historic=memorial with a fixed text, namely 'This bench is a not a memorial for someone or something' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') Picking this answer will delete the key historic. (This is only shown if historic=memorial|inscription~.+|memorial=bench|tourism=artwork)", + "description": "Layer 'Benches' shows not:historic=memorial with a fixed text, namely 'This bench is a not a memorial for someone or something' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') Picking this answer will delete the key historic. (This is only shown if historic=memorial |inscription~.+ |memorial=bench |tourism=artwork)", "value": "" }, { "key": "not:historic", - "description": "Layer 'Benches' shows not:historic=memorial with a fixed text, namely 'This bench is a not a memorial for someone or something' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if historic=memorial|inscription~.+|memorial=bench|tourism=artwork)", + "description": "Layer 'Benches' shows not:historic=memorial with a fixed text, namely 'This bench is a not a memorial for someone or something' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if historic=memorial |inscription~.+ |memorial=bench |tourism=artwork)", "value": "memorial" }, { @@ -1106,7 +1106,7 @@ }, { "key": "id", - "description": "Layer 'Benches at public transport stops' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Benches at public transport stops' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -1150,7 +1150,7 @@ }, { "key": "id", - "description": "Layer 'Bicycle library' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Bicycle library' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -1216,12 +1216,12 @@ }, { "key": "fee", - "description": "Layer 'Bicycle library' shows fee=yes&charge=€20warranty + €20/year with a fixed text, namely 'Lending a bicycle costs €20/year and €20 warranty' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "description": "Layer 'Bicycle library' shows fee=yes &charge=€20warranty + €20/year with a fixed text, namely 'Lending a bicycle costs €20/year and €20 warranty' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", "value": "yes" }, { "key": "charge", - "description": "Layer 'Bicycle library' shows fee=yes&charge=€20warranty + €20/year with a fixed text, namely 'Lending a bicycle costs €20/year and €20 warranty' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "description": "Layer 'Bicycle library' shows fee=yes &charge=€20warranty + €20/year with a fixed text, namely 'Lending a bicycle costs €20/year and €20 warranty' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", "value": "€20warranty + €20/year" }, { @@ -1263,7 +1263,7 @@ }, { "key": "id", - "description": "Layer 'Bicycle rental' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Bicycle rental' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -1283,12 +1283,12 @@ }, { "key": "shop", - "description": "Layer 'Bicycle rental' shows shop=rental&bicycle_rental=shop with a fixed text, namely 'This is a shop whose main focus is bicycle rental' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=bicycle_rental)", + "description": "Layer 'Bicycle rental' shows shop=rental &bicycle_rental=shop with a fixed text, namely 'This is a shop whose main focus is bicycle rental' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=bicycle_rental)", "value": "rental" }, { "key": "bicycle_rental", - "description": "Layer 'Bicycle rental' shows shop=rental&bicycle_rental=shop with a fixed text, namely 'This is a shop whose main focus is bicycle rental' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=bicycle_rental)", + "description": "Layer 'Bicycle rental' shows shop=rental &bicycle_rental=shop with a fixed text, namely 'This is a shop whose main focus is bicycle rental' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=bicycle_rental)", "value": "shop" }, { @@ -1298,12 +1298,12 @@ }, { "key": "service:bicycle:rental", - "description": "Layer 'Bicycle rental' shows service:bicycle:rental=yes&shop=bicycle with a fixed text, namely 'This is a shop which sells or repairs bicycles, but also rents out bicycles' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=bicycle_rental)", + "description": "Layer 'Bicycle rental' shows service:bicycle:rental=yes &shop=bicycle with a fixed text, namely 'This is a shop which sells or repairs bicycles, but also rents out bicycles' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=bicycle_rental)", "value": "yes" }, { "key": "shop", - "description": "Layer 'Bicycle rental' shows service:bicycle:rental=yes&shop=bicycle with a fixed text, namely 'This is a shop which sells or repairs bicycles, but also rents out bicycles' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=bicycle_rental)", + "description": "Layer 'Bicycle rental' shows service:bicycle:rental=yes &shop=bicycle with a fixed text, namely 'This is a shop which sells or repairs bicycles, but also rents out bicycles' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=bicycle_rental)", "value": "bicycle" }, { @@ -1347,7 +1347,7 @@ }, { "key": "opening_hours", - "description": "Layer 'Bicycle rental' shows and asks freeform values for key 'opening_hours' (in the mapcomplete.org theme 'Personal theme') (This is only shown if shop~.+|opening_hours~.+)" + "description": "Layer 'Bicycle rental' shows and asks freeform values for key 'opening_hours' (in the mapcomplete.org theme 'Personal theme') (This is only shown if shop~.+ |opening_hours~.+)" }, { "key": "payment:cash", @@ -1472,7 +1472,7 @@ }, { "key": "id", - "description": "Layer 'Bicycle tube vending machine' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Bicycle tube vending machine' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -1648,7 +1648,7 @@ }, { "key": "id", - "description": "Layer 'Bike cafe' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Bike cafe' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -1750,7 +1750,7 @@ }, { "key": "id", - "description": "Layer 'Bike cleaning service' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Bike cleaning service' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -1770,35 +1770,35 @@ }, { "key": "service:bicycle:cleaning:charge", - "description": "Layer 'Bike cleaning service' shows and asks freeform values for key 'service:bicycle:cleaning:charge' (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity!=bike_wash&amenity!=bicycle_wash)" + "description": "Layer 'Bike cleaning service' shows and asks freeform values for key 'service:bicycle:cleaning:charge' (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity!=bike_wash &amenity!=bicycle_wash)" }, { "key": "service:bicycle:cleaning:fee", - "description": "Layer 'Bike cleaning service' shows service:bicycle:cleaning:fee=no with a fixed text, namely 'The cleaning service is free to use' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity!=bike_wash&amenity!=bicycle_wash)", + "description": "Layer 'Bike cleaning service' shows service:bicycle:cleaning:fee=no with a fixed text, namely 'The cleaning service is free to use' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity!=bike_wash &amenity!=bicycle_wash)", "value": "no" }, { "key": "service:bicycle:cleaning:fee", - "description": "Layer 'Bike cleaning service' shows service:bicycle:cleaning:fee=yes with a fixed text, namely 'Free to use' (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity!=bike_wash&amenity!=bicycle_wash)", + "description": "Layer 'Bike cleaning service' shows service:bicycle:cleaning:fee=yes with a fixed text, namely 'Free to use' (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity!=bike_wash &amenity!=bicycle_wash)", "value": "yes" }, { "key": "service:bicycle:cleaning:charge", - "description": "Layer 'Bike cleaning service' shows service:bicycle:cleaning:fee=yes with a fixed text, namely 'Free to use' (in the mapcomplete.org theme 'Personal theme') Picking this answer will delete the key service:bicycle:cleaning:charge. (This is only shown if amenity!=bike_wash&amenity!=bicycle_wash)", + "description": "Layer 'Bike cleaning service' shows service:bicycle:cleaning:fee=yes with a fixed text, namely 'Free to use' (in the mapcomplete.org theme 'Personal theme') Picking this answer will delete the key service:bicycle:cleaning:charge. (This is only shown if amenity!=bike_wash &amenity!=bicycle_wash)", "value": "" }, { "key": "charge", - "description": "Layer 'Bike cleaning service' shows and asks freeform values for key 'charge' (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=bike_wash|amenity=bicycle_wash)" + "description": "Layer 'Bike cleaning service' shows and asks freeform values for key 'charge' (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=bike_wash |amenity=bicycle_wash)" }, { "key": "fee", - "description": "Layer 'Bike cleaning service' shows fee=no with a fixed text, namely 'This cleaning service is free to use' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=bike_wash|amenity=bicycle_wash)", + "description": "Layer 'Bike cleaning service' shows fee=no with a fixed text, namely 'This cleaning service is free to use' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=bike_wash |amenity=bicycle_wash)", "value": "no" }, { "key": "fee", - "description": "Layer 'Bike cleaning service' shows fee=yes with a fixed text, namely 'There is a fee to use this cleaning service' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=bike_wash|amenity=bicycle_wash)", + "description": "Layer 'Bike cleaning service' shows fee=yes with a fixed text, namely 'There is a fee to use this cleaning service' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=bike_wash |amenity=bicycle_wash)", "value": "yes" }, { @@ -1808,7 +1808,7 @@ }, { "key": "id", - "description": "Layer 'Bike parking' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Bike parking' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -1892,12 +1892,12 @@ }, { "key": "covered", - "description": "Layer 'Bike parking' shows covered=yes with a fixed text, namely 'This parking is covered (it has a roof)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if bicycle_parking!=shed&location!=underground)", + "description": "Layer 'Bike parking' shows covered=yes with a fixed text, namely 'This parking is covered (it has a roof)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if bicycle_parking!=shed &location!=underground)", "value": "yes" }, { "key": "covered", - "description": "Layer 'Bike parking' shows covered=no with a fixed text, namely 'This parking is not covered' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if bicycle_parking!=shed&location!=underground)", + "description": "Layer 'Bike parking' shows covered=no with a fixed text, namely 'This parking is not covered' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if bicycle_parking!=shed &location!=underground)", "value": "no" }, { @@ -1949,7 +1949,7 @@ }, { "key": "id", - "description": "Layer 'Bicycle pump and repair' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Bicycle pump and repair' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -1969,32 +1969,32 @@ }, { "key": "service:bicycle:tools", - "description": "Layer 'Bicycle pump and repair' shows service:bicycle:tools=no&service:bicycle:pump=yes with a fixed text, namely 'There is only a pump present' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "description": "Layer 'Bicycle pump and repair' shows service:bicycle:tools=no &service:bicycle:pump=yes with a fixed text, namely 'There is only a pump present' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", "value": "no" }, { "key": "service:bicycle:pump", - "description": "Layer 'Bicycle pump and repair' shows service:bicycle:tools=no&service:bicycle:pump=yes with a fixed text, namely 'There is only a pump present' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "description": "Layer 'Bicycle pump and repair' shows service:bicycle:tools=no &service:bicycle:pump=yes with a fixed text, namely 'There is only a pump present' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", "value": "yes" }, { "key": "service:bicycle:tools", - "description": "Layer 'Bicycle pump and repair' shows service:bicycle:tools=yes&service:bicycle:pump=no with a fixed text, namely 'There are only tools (screwdrivers, pliers, …) present' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "description": "Layer 'Bicycle pump and repair' shows service:bicycle:tools=yes &service:bicycle:pump=no with a fixed text, namely 'There are only tools (screwdrivers, pliers, …) present' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", "value": "yes" }, { "key": "service:bicycle:pump", - "description": "Layer 'Bicycle pump and repair' shows service:bicycle:tools=yes&service:bicycle:pump=no with a fixed text, namely 'There are only tools (screwdrivers, pliers, …) present' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "description": "Layer 'Bicycle pump and repair' shows service:bicycle:tools=yes &service:bicycle:pump=no with a fixed text, namely 'There are only tools (screwdrivers, pliers, …) present' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", "value": "no" }, { "key": "service:bicycle:tools", - "description": "Layer 'Bicycle pump and repair' shows service:bicycle:tools=yes&service:bicycle:pump=yes with a fixed text, namely 'There are both tools and a pump present' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "description": "Layer 'Bicycle pump and repair' shows service:bicycle:tools=yes &service:bicycle:pump=yes with a fixed text, namely 'There are both tools and a pump present' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", "value": "yes" }, { "key": "service:bicycle:pump", - "description": "Layer 'Bicycle pump and repair' shows service:bicycle:tools=yes&service:bicycle:pump=yes with a fixed text, namely 'There are both tools and a pump present' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "description": "Layer 'Bicycle pump and repair' shows service:bicycle:tools=yes &service:bicycle:pump=yes with a fixed text, namely 'There are both tools and a pump present' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", "value": "yes" }, { @@ -2173,7 +2173,7 @@ }, { "key": "id", - "description": "Layer 'Bike repair/shop' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Bike repair/shop' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -2193,7 +2193,7 @@ }, { "key": "shop", - "description": "Layer 'Bike repair/shop' shows shop=rental with a fixed text, namely 'This business focuses on rental' (in the mapcomplete.org theme 'Personal theme') (This is only shown if shop~.+&shop!~^(bicycle)$&shop!~^(sports)$)", + "description": "Layer 'Bike repair/shop' shows shop=rental with a fixed text, namely 'This business focuses on rental' (in the mapcomplete.org theme 'Personal theme') (This is only shown if shop~.+ &shop!~^(bicycle)$ &shop!~^(sports)$)", "value": "rental" }, { @@ -2318,31 +2318,31 @@ }, { "key": "capacity:city_bike", - "description": "Layer 'Bike repair/shop' shows and asks freeform values for key 'capacity:city_bike' (in the mapcomplete.org theme 'Personal theme') (This is only shown if rental~^(.*city_bike.*)$&service:bicycle:rental=yes)" + "description": "Layer 'Bike repair/shop' shows and asks freeform values for key 'capacity:city_bike' (in the mapcomplete.org theme 'Personal theme') (This is only shown if rental~^(.*city_bike.*)$ &service:bicycle:rental=yes)" }, { "key": "capacity:ebike", - "description": "Layer 'Bike repair/shop' shows and asks freeform values for key 'capacity:ebike' (in the mapcomplete.org theme 'Personal theme') (This is only shown if rental~^(.*ebike.*)$&service:bicycle:rental=yes)" + "description": "Layer 'Bike repair/shop' shows and asks freeform values for key 'capacity:ebike' (in the mapcomplete.org theme 'Personal theme') (This is only shown if rental~^(.*ebike.*)$ &service:bicycle:rental=yes)" }, { "key": "capacity:kid_bike", - "description": "Layer 'Bike repair/shop' shows and asks freeform values for key 'capacity:kid_bike' (in the mapcomplete.org theme 'Personal theme') (This is only shown if rental~^(.*kid_bike.*)$&service:bicycle:rental=yes)" + "description": "Layer 'Bike repair/shop' shows and asks freeform values for key 'capacity:kid_bike' (in the mapcomplete.org theme 'Personal theme') (This is only shown if rental~^(.*kid_bike.*)$ &service:bicycle:rental=yes)" }, { "key": "capacity:bmx", - "description": "Layer 'Bike repair/shop' shows and asks freeform values for key 'capacity:bmx' (in the mapcomplete.org theme 'Personal theme') (This is only shown if rental~^(.*bmx.*)$&service:bicycle:rental=yes)" + "description": "Layer 'Bike repair/shop' shows and asks freeform values for key 'capacity:bmx' (in the mapcomplete.org theme 'Personal theme') (This is only shown if rental~^(.*bmx.*)$ &service:bicycle:rental=yes)" }, { "key": "capacity:mtb", - "description": "Layer 'Bike repair/shop' shows and asks freeform values for key 'capacity:mtb' (in the mapcomplete.org theme 'Personal theme') (This is only shown if rental~^(.*mtb.*)$&service:bicycle:rental=yes)" + "description": "Layer 'Bike repair/shop' shows and asks freeform values for key 'capacity:mtb' (in the mapcomplete.org theme 'Personal theme') (This is only shown if rental~^(.*mtb.*)$ &service:bicycle:rental=yes)" }, { "key": "capacity:bicycle_pannier", - "description": "Layer 'Bike repair/shop' shows and asks freeform values for key 'capacity:bicycle_pannier' (in the mapcomplete.org theme 'Personal theme') (This is only shown if rental~^(.*bicycle_pannier.*)$&service:bicycle:rental=yes)" + "description": "Layer 'Bike repair/shop' shows and asks freeform values for key 'capacity:bicycle_pannier' (in the mapcomplete.org theme 'Personal theme') (This is only shown if rental~^(.*bicycle_pannier.*)$ &service:bicycle:rental=yes)" }, { "key": "capacity:tandem_bicycle", - "description": "Layer 'Bike repair/shop' shows and asks freeform values for key 'capacity:tandem_bicycle' (in the mapcomplete.org theme 'Personal theme') (This is only shown if rental~^(.*tandem_bicycle.*)$&service:bicycle:rental=yes)" + "description": "Layer 'Bike repair/shop' shows and asks freeform values for key 'capacity:tandem_bicycle' (in the mapcomplete.org theme 'Personal theme') (This is only shown if rental~^(.*tandem_bicycle.*)$ &service:bicycle:rental=yes)" }, { "key": "service:bicycle:second_hand", @@ -2406,21 +2406,21 @@ }, { "key": "service:bicycle:cleaning:charge", - "description": "Layer 'Bike repair/shop' shows and asks freeform values for key 'service:bicycle:cleaning:charge' (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity!=bike_wash&amenity!=bicycle_wash)" + "description": "Layer 'Bike repair/shop' shows and asks freeform values for key 'service:bicycle:cleaning:charge' (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity!=bike_wash &amenity!=bicycle_wash)" }, { "key": "service:bicycle:cleaning:fee", - "description": "Layer 'Bike repair/shop' shows service:bicycle:cleaning:fee=no with a fixed text, namely 'The cleaning service is free to use' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity!=bike_wash&amenity!=bicycle_wash)", + "description": "Layer 'Bike repair/shop' shows service:bicycle:cleaning:fee=no with a fixed text, namely 'The cleaning service is free to use' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity!=bike_wash &amenity!=bicycle_wash)", "value": "no" }, { "key": "service:bicycle:cleaning:fee", - "description": "Layer 'Bike repair/shop' shows service:bicycle:cleaning:fee=yes with a fixed text, namely 'Free to use' (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity!=bike_wash&amenity!=bicycle_wash)", + "description": "Layer 'Bike repair/shop' shows service:bicycle:cleaning:fee=yes with a fixed text, namely 'Free to use' (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity!=bike_wash &amenity!=bicycle_wash)", "value": "yes" }, { "key": "service:bicycle:cleaning:charge", - "description": "Layer 'Bike repair/shop' shows service:bicycle:cleaning:fee=yes with a fixed text, namely 'Free to use' (in the mapcomplete.org theme 'Personal theme') Picking this answer will delete the key service:bicycle:cleaning:charge. (This is only shown if amenity!=bike_wash&amenity!=bicycle_wash)", + "description": "Layer 'Bike repair/shop' shows service:bicycle:cleaning:fee=yes with a fixed text, namely 'Free to use' (in the mapcomplete.org theme 'Personal theme') Picking this answer will delete the key service:bicycle:cleaning:charge. (This is only shown if amenity!=bike_wash &amenity!=bicycle_wash)", "value": "" }, { @@ -2474,7 +2474,7 @@ }, { "key": "id", - "description": "Layer 'Bike-related object' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Bike-related object' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -2531,7 +2531,7 @@ }, { "key": "id", - "description": "Layer 'Binoculars' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Binoculars' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -2574,7 +2574,7 @@ }, { "key": "id", - "description": "Layer 'Bird watching places' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Bird watching places' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -2609,42 +2609,42 @@ }, { "key": "amenity", - "description": "Layer 'Bird watching places' shows amenity=shelter&building=yes&shelter=yes with a fixed text, namely 'Bird hide' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "description": "Layer 'Bird watching places' shows amenity=shelter &building=yes &shelter=yes with a fixed text, namely 'Bird hide' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", "value": "shelter" }, { "key": "building", - "description": "Layer 'Bird watching places' shows amenity=shelter&building=yes&shelter=yes with a fixed text, namely 'Bird hide' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "description": "Layer 'Bird watching places' shows amenity=shelter &building=yes &shelter=yes with a fixed text, namely 'Bird hide' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", "value": "yes" }, { "key": "shelter", - "description": "Layer 'Bird watching places' shows amenity=shelter&building=yes&shelter=yes with a fixed text, namely 'Bird hide' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "description": "Layer 'Bird watching places' shows amenity=shelter &building=yes &shelter=yes with a fixed text, namely 'Bird hide' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", "value": "yes" }, { "key": "building", - "description": "Layer 'Bird watching places' shows building=tower&bird_hide=tower with a fixed text, namely 'Bird tower hide' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "description": "Layer 'Bird watching places' shows building=tower &bird_hide=tower with a fixed text, namely 'Bird tower hide' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", "value": "tower" }, { "key": "bird_hide", - "description": "Layer 'Bird watching places' shows building=tower&bird_hide=tower with a fixed text, namely 'Bird tower hide' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "description": "Layer 'Bird watching places' shows building=tower &bird_hide=tower with a fixed text, namely 'Bird tower hide' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", "value": "tower" }, { "key": "amenity", - "description": "Layer 'Bird watching places' shows amenity=shelter|building=yes|shelter=yes with a fixed text, namely 'Bird hide shelter' (in the mapcomplete.org theme 'Personal theme')", + "description": "Layer 'Bird watching places' shows amenity=shelter |building=yes |shelter=yes with a fixed text, namely 'Bird hide shelter' (in the mapcomplete.org theme 'Personal theme')", "value": "shelter" }, { "key": "building", - "description": "Layer 'Bird watching places' shows amenity=shelter|building=yes|shelter=yes with a fixed text, namely 'Bird hide shelter' (in the mapcomplete.org theme 'Personal theme')", + "description": "Layer 'Bird watching places' shows amenity=shelter |building=yes |shelter=yes with a fixed text, namely 'Bird hide shelter' (in the mapcomplete.org theme 'Personal theme')", "value": "yes" }, { "key": "shelter", - "description": "Layer 'Bird watching places' shows amenity=shelter|building=yes|shelter=yes with a fixed text, namely 'Bird hide shelter' (in the mapcomplete.org theme 'Personal theme')", + "description": "Layer 'Bird watching places' shows amenity=shelter |building=yes |shelter=yes with a fixed text, namely 'Bird hide shelter' (in the mapcomplete.org theme 'Personal theme')", "value": "yes" }, { @@ -2708,7 +2708,7 @@ }, { "key": "id", - "description": "Layer 'Cafés and pubs' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Cafés and pubs' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -2934,17 +2934,17 @@ }, { "key": "internet_access:fee", - "description": "Layer 'Cafés and pubs' shows internet_access:fee=yes with a fixed text, namely 'There is a fee for the internet access at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if internet_access!=no&internet_access~.+)", + "description": "Layer 'Cafés and pubs' shows internet_access:fee=yes with a fixed text, namely 'There is a fee for the internet access at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if internet_access!=no &internet_access~.+)", "value": "yes" }, { "key": "internet_access:fee", - "description": "Layer 'Cafés and pubs' shows internet_access:fee=no with a fixed text, namely 'Internet access is free at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if internet_access!=no&internet_access~.+)", + "description": "Layer 'Cafés and pubs' shows internet_access:fee=no with a fixed text, namely 'Internet access is free at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if internet_access!=no &internet_access~.+)", "value": "no" }, { "key": "internet_access:fee", - "description": "Layer 'Cafés and pubs' shows internet_access:fee=customers with a fixed text, namely 'Internet access is free at this place, for customers only' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if internet_access!=no&internet_access~.+)", + "description": "Layer 'Cafés and pubs' shows internet_access:fee=customers with a fixed text, namely 'Internet access is free at this place, for customers only' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if internet_access!=no &internet_access~.+)", "value": "customers" }, { @@ -2978,7 +2978,7 @@ }, { "key": "id", - "description": "Layer 'Charging stations' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Charging stations' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -3066,7 +3066,7 @@ }, { "key": "socket:schuko", - "description": "Layer 'Charging stations' shows socket:schuko~.+&socket:schuko!=1 with a fixed text, namely 'Schuko wall plug without ground pin (CEE7/4 type F)' (in the mapcomplete.org theme 'Personal theme')" + "description": "Layer 'Charging stations' shows socket:schuko~.+ &socket:schuko!=1 with a fixed text, namely 'Schuko wall plug without ground pin (CEE7/4 type F)' (in the mapcomplete.org theme 'Personal theme')" }, { "key": "socket:typee", @@ -3075,7 +3075,7 @@ }, { "key": "socket:typee", - "description": "Layer 'Charging stations' shows socket:typee~.+&socket:typee!=1 with a fixed text, namely 'European wall plug with ground pin (CEE7/4 type E)' (in the mapcomplete.org theme 'Personal theme')" + "description": "Layer 'Charging stations' shows socket:typee~.+ &socket:typee!=1 with a fixed text, namely 'European wall plug with ground pin (CEE7/4 type E)' (in the mapcomplete.org theme 'Personal theme')" }, { "key": "socket:chademo", @@ -3084,7 +3084,7 @@ }, { "key": "socket:chademo", - "description": "Layer 'Charging stations' shows socket:chademo~.+&socket:chademo!=1 with a fixed text, namely 'Chademo' (in the mapcomplete.org theme 'Personal theme')" + "description": "Layer 'Charging stations' shows socket:chademo~.+ &socket:chademo!=1 with a fixed text, namely 'Chademo' (in the mapcomplete.org theme 'Personal theme')" }, { "key": "socket:type1_cable", @@ -3093,7 +3093,7 @@ }, { "key": "socket:type1_cable", - "description": "Layer 'Charging stations' shows socket:type1_cable~.+&socket:type1_cable!=1 with a fixed text, namely 'Type 1 with cable (J1772)' (in the mapcomplete.org theme 'Personal theme')" + "description": "Layer 'Charging stations' shows socket:type1_cable~.+ &socket:type1_cable!=1 with a fixed text, namely 'Type 1 with cable (J1772)' (in the mapcomplete.org theme 'Personal theme')" }, { "key": "socket:type1", @@ -3102,7 +3102,7 @@ }, { "key": "socket:type1", - "description": "Layer 'Charging stations' shows socket:type1~.+&socket:type1!=1 with a fixed text, namely 'Type 1 without cable (J1772)' (in the mapcomplete.org theme 'Personal theme')" + "description": "Layer 'Charging stations' shows socket:type1~.+ &socket:type1!=1 with a fixed text, namely 'Type 1 without cable (J1772)' (in the mapcomplete.org theme 'Personal theme')" }, { "key": "socket:type1_combo", @@ -3111,7 +3111,7 @@ }, { "key": "socket:type1_combo", - "description": "Layer 'Charging stations' shows socket:type1_combo~.+&socket:type1_combo!=1 with a fixed text, namely 'Type 1 CCS (aka Type 1 Combo)' (in the mapcomplete.org theme 'Personal theme')" + "description": "Layer 'Charging stations' shows socket:type1_combo~.+ &socket:type1_combo!=1 with a fixed text, namely 'Type 1 CCS (aka Type 1 Combo)' (in the mapcomplete.org theme 'Personal theme')" }, { "key": "socket:tesla_supercharger", @@ -3120,7 +3120,7 @@ }, { "key": "socket:tesla_supercharger", - "description": "Layer 'Charging stations' shows socket:tesla_supercharger~.+&socket:tesla_supercharger!=1 with a fixed text, namely 'Tesla Supercharger' (in the mapcomplete.org theme 'Personal theme')" + "description": "Layer 'Charging stations' shows socket:tesla_supercharger~.+ &socket:tesla_supercharger!=1 with a fixed text, namely 'Tesla Supercharger' (in the mapcomplete.org theme 'Personal theme')" }, { "key": "socket:type2", @@ -3129,7 +3129,7 @@ }, { "key": "socket:type2", - "description": "Layer 'Charging stations' shows socket:type2~.+&socket:type2!=1 with a fixed text, namely 'Type 2 (mennekes)' (in the mapcomplete.org theme 'Personal theme')" + "description": "Layer 'Charging stations' shows socket:type2~.+ &socket:type2!=1 with a fixed text, namely 'Type 2 (mennekes)' (in the mapcomplete.org theme 'Personal theme')" }, { "key": "socket:type2_combo", @@ -3138,7 +3138,7 @@ }, { "key": "socket:type2_combo", - "description": "Layer 'Charging stations' shows socket:type2_combo~.+&socket:type2_combo!=1 with a fixed text, namely 'Type 2 CCS (mennekes)' (in the mapcomplete.org theme 'Personal theme')" + "description": "Layer 'Charging stations' shows socket:type2_combo~.+ &socket:type2_combo!=1 with a fixed text, namely 'Type 2 CCS (mennekes)' (in the mapcomplete.org theme 'Personal theme')" }, { "key": "socket:type2_cable", @@ -3147,7 +3147,7 @@ }, { "key": "socket:type2_cable", - "description": "Layer 'Charging stations' shows socket:type2_cable~.+&socket:type2_cable!=1 with a fixed text, namely 'Type 2 with cable (mennekes)' (in the mapcomplete.org theme 'Personal theme')" + "description": "Layer 'Charging stations' shows socket:type2_cable~.+ &socket:type2_cable!=1 with a fixed text, namely 'Type 2 with cable (mennekes)' (in the mapcomplete.org theme 'Personal theme')" }, { "key": "socket:tesla_supercharger_ccs", @@ -3156,7 +3156,7 @@ }, { "key": "socket:tesla_supercharger_ccs", - "description": "Layer 'Charging stations' shows socket:tesla_supercharger_ccs~.+&socket:tesla_supercharger_ccs!=1 with a fixed text, namely 'Tesla Supercharger CCS (a branded type2_css)' (in the mapcomplete.org theme 'Personal theme')" + "description": "Layer 'Charging stations' shows socket:tesla_supercharger_ccs~.+ &socket:tesla_supercharger_ccs!=1 with a fixed text, namely 'Tesla Supercharger CCS (a branded type2_css)' (in the mapcomplete.org theme 'Personal theme')" }, { "key": "socket:tesla_destination", @@ -3165,7 +3165,7 @@ }, { "key": "socket:tesla_destination", - "description": "Layer 'Charging stations' shows socket:tesla_destination~.+&socket:tesla_destination!=1&_country=us with a fixed text, namely 'Tesla Supercharger (destination)' (in the mapcomplete.org theme 'Personal theme')" + "description": "Layer 'Charging stations' shows socket:tesla_destination~.+ &socket:tesla_destination!=1 &_country=us with a fixed text, namely 'Tesla Supercharger (destination)' (in the mapcomplete.org theme 'Personal theme')" }, { "key": "socket:tesla_destination", @@ -3174,7 +3174,7 @@ }, { "key": "socket:tesla_destination", - "description": "Layer 'Charging stations' shows socket:tesla_destination~.+&socket:tesla_destination!=1&_country!=us with a fixed text, namely 'Tesla supercharger (destination) (A Type 2 with cable branded as tesla)' (in the mapcomplete.org theme 'Personal theme')" + "description": "Layer 'Charging stations' shows socket:tesla_destination~.+ &socket:tesla_destination!=1 &_country!=us with a fixed text, namely 'Tesla supercharger (destination) (A Type 2 with cable branded as tesla)' (in the mapcomplete.org theme 'Personal theme')" }, { "key": "socket:USB-A", @@ -3183,7 +3183,7 @@ }, { "key": "socket:USB-A", - "description": "Layer 'Charging stations' shows socket:USB-A~.+&socket:USB-A!=1 with a fixed text, namely 'USB to charge phones and small electronics' (in the mapcomplete.org theme 'Personal theme')" + "description": "Layer 'Charging stations' shows socket:USB-A~.+ &socket:USB-A!=1 with a fixed text, namely 'USB to charge phones and small electronics' (in the mapcomplete.org theme 'Personal theme')" }, { "key": "socket:bosch_3pin", @@ -3192,7 +3192,7 @@ }, { "key": "socket:bosch_3pin", - "description": "Layer 'Charging stations' shows socket:bosch_3pin~.+&socket:bosch_3pin!=1 with a fixed text, namely 'Bosch Active Connect with 3 pins and cable' (in the mapcomplete.org theme 'Personal theme')" + "description": "Layer 'Charging stations' shows socket:bosch_3pin~.+ &socket:bosch_3pin!=1 with a fixed text, namely 'Bosch Active Connect with 3 pins and cable' (in the mapcomplete.org theme 'Personal theme')" }, { "key": "socket:bosch_5pin", @@ -3201,638 +3201,638 @@ }, { "key": "socket:bosch_5pin", - "description": "Layer 'Charging stations' shows socket:bosch_5pin~.+&socket:bosch_5pin!=1 with a fixed text, namely 'Bosch Active Connect with 5 pins and cable' (in the mapcomplete.org theme 'Personal theme')" + "description": "Layer 'Charging stations' shows socket:bosch_5pin~.+ &socket:bosch_5pin!=1 with a fixed text, namely 'Bosch Active Connect with 5 pins and cable' (in the mapcomplete.org theme 'Personal theme')" }, { "key": "socket:schuko", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:schuko' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:schuko~.+&socket:schuko!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:schuko' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:schuko~.+ &socket:schuko!=0)" }, { "key": "socket:typee", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:typee' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:typee~.+&socket:typee!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:typee' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:typee~.+ &socket:typee!=0)" }, { "key": "socket:chademo", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:chademo' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:chademo~.+&socket:chademo!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:chademo' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:chademo~.+ &socket:chademo!=0)" }, { "key": "socket:type1_cable", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1_cable' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type1_cable~.+&socket:type1_cable!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1_cable' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type1_cable~.+ &socket:type1_cable!=0)" }, { "key": "socket:type1", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type1~.+&socket:type1!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type1~.+ &socket:type1!=0)" }, { "key": "socket:type1_combo", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1_combo' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type1_combo~.+&socket:type1_combo!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1_combo' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type1_combo~.+ &socket:type1_combo!=0)" }, { "key": "socket:tesla_supercharger", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_supercharger' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_supercharger~.+&socket:tesla_supercharger!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_supercharger' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_supercharger~.+ &socket:tesla_supercharger!=0)" }, { "key": "socket:type2", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type2~.+&socket:type2!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type2~.+ &socket:type2!=0)" }, { "key": "socket:type2_combo", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2_combo' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type2_combo~.+&socket:type2_combo!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2_combo' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type2_combo~.+ &socket:type2_combo!=0)" }, { "key": "socket:type2_cable", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2_cable' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type2_cable~.+&socket:type2_cable!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2_cable' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type2_cable~.+ &socket:type2_cable!=0)" }, { "key": "socket:tesla_supercharger_ccs", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_supercharger_ccs' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_supercharger_ccs~.+&socket:tesla_supercharger_ccs!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_supercharger_ccs' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_supercharger_ccs~.+ &socket:tesla_supercharger_ccs!=0)" }, { "key": "socket:tesla_destination", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_destination' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_destination~.+&socket:tesla_destination!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_destination' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_destination~.+ &socket:tesla_destination!=0)" }, { "key": "socket:tesla_destination", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_destination' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_destination~.+&socket:tesla_destination!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_destination' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_destination~.+ &socket:tesla_destination!=0)" }, { "key": "socket:USB-A", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:USB-A' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:USB-A~.+&socket:USB-A!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:USB-A' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:USB-A~.+ &socket:USB-A!=0)" }, { "key": "socket:bosch_3pin", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:bosch_3pin' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:bosch_3pin~.+&socket:bosch_3pin!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:bosch_3pin' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:bosch_3pin~.+ &socket:bosch_3pin!=0)" }, { "key": "socket:bosch_5pin", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:bosch_5pin' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:bosch_5pin~.+&socket:bosch_5pin!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:bosch_5pin' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:bosch_5pin~.+ &socket:bosch_5pin!=0)" }, { "key": "socket:schuko:voltage", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:schuko:voltage' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:schuko~.+&socket:schuko!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:schuko:voltage' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:schuko~.+ &socket:schuko!=0)" }, { "key": "socket:schuko:voltage", - "description": "Layer 'Charging stations' shows socket:schuko:voltage=230 V with a fixed text, namely 'Schuko wall plug without ground pin (CEE7/4 type F) outputs 230 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:schuko~.+&socket:schuko!=0)", + "description": "Layer 'Charging stations' shows socket:schuko:voltage=230 V with a fixed text, namely 'Schuko wall plug without ground pin (CEE7/4 type F) outputs 230 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:schuko~.+ &socket:schuko!=0)", "value": "230 V" }, { "key": "socket:schuko:current", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:schuko:current' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:schuko~.+&socket:schuko!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:schuko:current' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:schuko~.+ &socket:schuko!=0)" }, { "key": "socket:schuko:current", - "description": "Layer 'Charging stations' shows socket:schuko:current=16 A with a fixed text, namely 'Schuko wall plug without ground pin (CEE7/4 type F) outputs at most 16 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:schuko~.+&socket:schuko!=0)", + "description": "Layer 'Charging stations' shows socket:schuko:current=16 A with a fixed text, namely 'Schuko wall plug without ground pin (CEE7/4 type F) outputs at most 16 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:schuko~.+ &socket:schuko!=0)", "value": "16 A" }, { "key": "socket:schuko:output", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:schuko:output' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:schuko~.+&socket:schuko!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:schuko:output' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:schuko~.+ &socket:schuko!=0)" }, { "key": "socket:schuko:output", - "description": "Layer 'Charging stations' shows socket:schuko:output=3.6 kW with a fixed text, namely 'Schuko wall plug without ground pin (CEE7/4 type F) outputs at most 3.6 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:schuko~.+&socket:schuko!=0)", + "description": "Layer 'Charging stations' shows socket:schuko:output=3.6 kW with a fixed text, namely 'Schuko wall plug without ground pin (CEE7/4 type F) outputs at most 3.6 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:schuko~.+ &socket:schuko!=0)", "value": "3.6 kW" }, { "key": "socket:typee:voltage", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:typee:voltage' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:typee~.+&socket:typee!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:typee:voltage' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:typee~.+ &socket:typee!=0)" }, { "key": "socket:typee:voltage", - "description": "Layer 'Charging stations' shows socket:typee:voltage=230 V with a fixed text, namely 'European wall plug with ground pin (CEE7/4 type E) outputs 230 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:typee~.+&socket:typee!=0)", + "description": "Layer 'Charging stations' shows socket:typee:voltage=230 V with a fixed text, namely 'European wall plug with ground pin (CEE7/4 type E) outputs 230 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:typee~.+ &socket:typee!=0)", "value": "230 V" }, { "key": "socket:typee:current", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:typee:current' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:typee~.+&socket:typee!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:typee:current' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:typee~.+ &socket:typee!=0)" }, { "key": "socket:typee:current", - "description": "Layer 'Charging stations' shows socket:typee:current=16 A with a fixed text, namely 'European wall plug with ground pin (CEE7/4 type E) outputs at most 16 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:typee~.+&socket:typee!=0)", + "description": "Layer 'Charging stations' shows socket:typee:current=16 A with a fixed text, namely 'European wall plug with ground pin (CEE7/4 type E) outputs at most 16 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:typee~.+ &socket:typee!=0)", "value": "16 A" }, { "key": "socket:typee:output", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:typee:output' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:typee~.+&socket:typee!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:typee:output' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:typee~.+ &socket:typee!=0)" }, { "key": "socket:typee:output", - "description": "Layer 'Charging stations' shows socket:typee:output=3 kW with a fixed text, namely 'European wall plug with ground pin (CEE7/4 type E) outputs at most 3 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:typee~.+&socket:typee!=0)", + "description": "Layer 'Charging stations' shows socket:typee:output=3 kW with a fixed text, namely 'European wall plug with ground pin (CEE7/4 type E) outputs at most 3 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:typee~.+ &socket:typee!=0)", "value": "3 kW" }, { "key": "socket:typee:output", - "description": "Layer 'Charging stations' shows socket:typee:output=22 kW with a fixed text, namely 'European wall plug with ground pin (CEE7/4 type E) outputs at most 22 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:typee~.+&socket:typee!=0)", + "description": "Layer 'Charging stations' shows socket:typee:output=22 kW with a fixed text, namely 'European wall plug with ground pin (CEE7/4 type E) outputs at most 22 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:typee~.+ &socket:typee!=0)", "value": "22 kW" }, { "key": "socket:chademo:voltage", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:chademo:voltage' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:chademo~.+&socket:chademo!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:chademo:voltage' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:chademo~.+ &socket:chademo!=0)" }, { "key": "socket:chademo:voltage", - "description": "Layer 'Charging stations' shows socket:chademo:voltage=500 V with a fixed text, namely 'Chademo outputs 500 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:chademo~.+&socket:chademo!=0)", + "description": "Layer 'Charging stations' shows socket:chademo:voltage=500 V with a fixed text, namely 'Chademo outputs 500 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:chademo~.+ &socket:chademo!=0)", "value": "500 V" }, { "key": "socket:chademo:current", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:chademo:current' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:chademo~.+&socket:chademo!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:chademo:current' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:chademo~.+ &socket:chademo!=0)" }, { "key": "socket:chademo:current", - "description": "Layer 'Charging stations' shows socket:chademo:current=120 A with a fixed text, namely 'Chademo outputs at most 120 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:chademo~.+&socket:chademo!=0)", + "description": "Layer 'Charging stations' shows socket:chademo:current=120 A with a fixed text, namely 'Chademo outputs at most 120 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:chademo~.+ &socket:chademo!=0)", "value": "120 A" }, { "key": "socket:chademo:output", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:chademo:output' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:chademo~.+&socket:chademo!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:chademo:output' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:chademo~.+ &socket:chademo!=0)" }, { "key": "socket:chademo:output", - "description": "Layer 'Charging stations' shows socket:chademo:output=50 kW with a fixed text, namely 'Chademo outputs at most 50 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:chademo~.+&socket:chademo!=0)", + "description": "Layer 'Charging stations' shows socket:chademo:output=50 kW with a fixed text, namely 'Chademo outputs at most 50 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:chademo~.+ &socket:chademo!=0)", "value": "50 kW" }, { "key": "socket:type1_cable:voltage", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1_cable:voltage' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type1_cable~.+&socket:type1_cable!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1_cable:voltage' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type1_cable~.+ &socket:type1_cable!=0)" }, { "key": "socket:type1_cable:voltage", - "description": "Layer 'Charging stations' shows socket:type1_cable:voltage=200 V with a fixed text, namely 'Type 1 with cable (J1772) outputs 200 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type1_cable~.+&socket:type1_cable!=0)", + "description": "Layer 'Charging stations' shows socket:type1_cable:voltage=200 V with a fixed text, namely 'Type 1 with cable (J1772) outputs 200 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type1_cable~.+ &socket:type1_cable!=0)", "value": "200 V" }, { "key": "socket:type1_cable:voltage", - "description": "Layer 'Charging stations' shows socket:type1_cable:voltage=240 V with a fixed text, namely 'Type 1 with cable (J1772) outputs 240 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type1_cable~.+&socket:type1_cable!=0)", + "description": "Layer 'Charging stations' shows socket:type1_cable:voltage=240 V with a fixed text, namely 'Type 1 with cable (J1772) outputs 240 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type1_cable~.+ &socket:type1_cable!=0)", "value": "240 V" }, { "key": "socket:type1_cable:current", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1_cable:current' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type1_cable~.+&socket:type1_cable!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1_cable:current' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type1_cable~.+ &socket:type1_cable!=0)" }, { "key": "socket:type1_cable:current", - "description": "Layer 'Charging stations' shows socket:type1_cable:current=32 A with a fixed text, namely 'Type 1 with cable (J1772) outputs at most 32 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type1_cable~.+&socket:type1_cable!=0)", + "description": "Layer 'Charging stations' shows socket:type1_cable:current=32 A with a fixed text, namely 'Type 1 with cable (J1772) outputs at most 32 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type1_cable~.+ &socket:type1_cable!=0)", "value": "32 A" }, { "key": "socket:type1_cable:output", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1_cable:output' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type1_cable~.+&socket:type1_cable!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1_cable:output' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type1_cable~.+ &socket:type1_cable!=0)" }, { "key": "socket:type1_cable:output", - "description": "Layer 'Charging stations' shows socket:type1_cable:output=3.7 kW with a fixed text, namely 'Type 1 with cable (J1772) outputs at most 3.7 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type1_cable~.+&socket:type1_cable!=0)", + "description": "Layer 'Charging stations' shows socket:type1_cable:output=3.7 kW with a fixed text, namely 'Type 1 with cable (J1772) outputs at most 3.7 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type1_cable~.+ &socket:type1_cable!=0)", "value": "3.7 kW" }, { "key": "socket:type1_cable:output", - "description": "Layer 'Charging stations' shows socket:type1_cable:output=7 kW with a fixed text, namely 'Type 1 with cable (J1772) outputs at most 7 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type1_cable~.+&socket:type1_cable!=0)", + "description": "Layer 'Charging stations' shows socket:type1_cable:output=7 kW with a fixed text, namely 'Type 1 with cable (J1772) outputs at most 7 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type1_cable~.+ &socket:type1_cable!=0)", "value": "7 kW" }, { "key": "socket:type1:voltage", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1:voltage' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type1~.+&socket:type1!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1:voltage' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type1~.+ &socket:type1!=0)" }, { "key": "socket:type1:voltage", - "description": "Layer 'Charging stations' shows socket:type1:voltage=200 V with a fixed text, namely 'Type 1 without cable (J1772) outputs 200 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type1~.+&socket:type1!=0)", + "description": "Layer 'Charging stations' shows socket:type1:voltage=200 V with a fixed text, namely 'Type 1 without cable (J1772) outputs 200 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type1~.+ &socket:type1!=0)", "value": "200 V" }, { "key": "socket:type1:voltage", - "description": "Layer 'Charging stations' shows socket:type1:voltage=240 V with a fixed text, namely 'Type 1 without cable (J1772) outputs 240 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type1~.+&socket:type1!=0)", + "description": "Layer 'Charging stations' shows socket:type1:voltage=240 V with a fixed text, namely 'Type 1 without cable (J1772) outputs 240 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type1~.+ &socket:type1!=0)", "value": "240 V" }, { "key": "socket:type1:current", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1:current' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type1~.+&socket:type1!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1:current' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type1~.+ &socket:type1!=0)" }, { "key": "socket:type1:current", - "description": "Layer 'Charging stations' shows socket:type1:current=32 A with a fixed text, namely 'Type 1 without cable (J1772) outputs at most 32 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type1~.+&socket:type1!=0)", + "description": "Layer 'Charging stations' shows socket:type1:current=32 A with a fixed text, namely 'Type 1 without cable (J1772) outputs at most 32 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type1~.+ &socket:type1!=0)", "value": "32 A" }, { "key": "socket:type1:output", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1:output' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type1~.+&socket:type1!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1:output' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type1~.+ &socket:type1!=0)" }, { "key": "socket:type1:output", - "description": "Layer 'Charging stations' shows socket:type1:output=3.7 kW with a fixed text, namely 'Type 1 without cable (J1772) outputs at most 3.7 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type1~.+&socket:type1!=0)", + "description": "Layer 'Charging stations' shows socket:type1:output=3.7 kW with a fixed text, namely 'Type 1 without cable (J1772) outputs at most 3.7 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type1~.+ &socket:type1!=0)", "value": "3.7 kW" }, { "key": "socket:type1:output", - "description": "Layer 'Charging stations' shows socket:type1:output=6.6 kW with a fixed text, namely 'Type 1 without cable (J1772) outputs at most 6.6 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type1~.+&socket:type1!=0)", + "description": "Layer 'Charging stations' shows socket:type1:output=6.6 kW with a fixed text, namely 'Type 1 without cable (J1772) outputs at most 6.6 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type1~.+ &socket:type1!=0)", "value": "6.6 kW" }, { "key": "socket:type1:output", - "description": "Layer 'Charging stations' shows socket:type1:output=7 kW with a fixed text, namely 'Type 1 without cable (J1772) outputs at most 7 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type1~.+&socket:type1!=0)", + "description": "Layer 'Charging stations' shows socket:type1:output=7 kW with a fixed text, namely 'Type 1 without cable (J1772) outputs at most 7 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type1~.+ &socket:type1!=0)", "value": "7 kW" }, { "key": "socket:type1:output", - "description": "Layer 'Charging stations' shows socket:type1:output=7.2 kW with a fixed text, namely 'Type 1 without cable (J1772) outputs at most 7.2 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type1~.+&socket:type1!=0)", + "description": "Layer 'Charging stations' shows socket:type1:output=7.2 kW with a fixed text, namely 'Type 1 without cable (J1772) outputs at most 7.2 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type1~.+ &socket:type1!=0)", "value": "7.2 kW" }, { "key": "socket:type1_combo:voltage", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1_combo:voltage' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type1_combo~.+&socket:type1_combo!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1_combo:voltage' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type1_combo~.+ &socket:type1_combo!=0)" }, { "key": "socket:type1_combo:voltage", - "description": "Layer 'Charging stations' shows socket:type1_combo:voltage=400 V with a fixed text, namely 'Type 1 CCS (aka Type 1 Combo) outputs 400 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type1_combo~.+&socket:type1_combo!=0)", + "description": "Layer 'Charging stations' shows socket:type1_combo:voltage=400 V with a fixed text, namely 'Type 1 CCS (aka Type 1 Combo) outputs 400 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type1_combo~.+ &socket:type1_combo!=0)", "value": "400 V" }, { "key": "socket:type1_combo:voltage", - "description": "Layer 'Charging stations' shows socket:type1_combo:voltage=1000 V with a fixed text, namely 'Type 1 CCS (aka Type 1 Combo) outputs 1000 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type1_combo~.+&socket:type1_combo!=0)", + "description": "Layer 'Charging stations' shows socket:type1_combo:voltage=1000 V with a fixed text, namely 'Type 1 CCS (aka Type 1 Combo) outputs 1000 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type1_combo~.+ &socket:type1_combo!=0)", "value": "1000 V" }, { "key": "socket:type1_combo:current", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1_combo:current' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type1_combo~.+&socket:type1_combo!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1_combo:current' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type1_combo~.+ &socket:type1_combo!=0)" }, { "key": "socket:type1_combo:current", - "description": "Layer 'Charging stations' shows socket:type1_combo:current=50 A with a fixed text, namely 'Type 1 CCS (aka Type 1 Combo) outputs at most 50 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type1_combo~.+&socket:type1_combo!=0)", + "description": "Layer 'Charging stations' shows socket:type1_combo:current=50 A with a fixed text, namely 'Type 1 CCS (aka Type 1 Combo) outputs at most 50 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type1_combo~.+ &socket:type1_combo!=0)", "value": "50 A" }, { "key": "socket:type1_combo:current", - "description": "Layer 'Charging stations' shows socket:type1_combo:current=125 A with a fixed text, namely 'Type 1 CCS (aka Type 1 Combo) outputs at most 125 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type1_combo~.+&socket:type1_combo!=0)", + "description": "Layer 'Charging stations' shows socket:type1_combo:current=125 A with a fixed text, namely 'Type 1 CCS (aka Type 1 Combo) outputs at most 125 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type1_combo~.+ &socket:type1_combo!=0)", "value": "125 A" }, { "key": "socket:type1_combo:output", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1_combo:output' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type1_combo~.+&socket:type1_combo!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1_combo:output' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type1_combo~.+ &socket:type1_combo!=0)" }, { "key": "socket:type1_combo:output", - "description": "Layer 'Charging stations' shows socket:type1_combo:output=50 kW with a fixed text, namely 'Type 1 CCS (aka Type 1 Combo) outputs at most 50 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type1_combo~.+&socket:type1_combo!=0)", + "description": "Layer 'Charging stations' shows socket:type1_combo:output=50 kW with a fixed text, namely 'Type 1 CCS (aka Type 1 Combo) outputs at most 50 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type1_combo~.+ &socket:type1_combo!=0)", "value": "50 kW" }, { "key": "socket:type1_combo:output", - "description": "Layer 'Charging stations' shows socket:type1_combo:output=62.5 kW with a fixed text, namely 'Type 1 CCS (aka Type 1 Combo) outputs at most 62.5 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type1_combo~.+&socket:type1_combo!=0)", + "description": "Layer 'Charging stations' shows socket:type1_combo:output=62.5 kW with a fixed text, namely 'Type 1 CCS (aka Type 1 Combo) outputs at most 62.5 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type1_combo~.+ &socket:type1_combo!=0)", "value": "62.5 kW" }, { "key": "socket:type1_combo:output", - "description": "Layer 'Charging stations' shows socket:type1_combo:output=150 kW with a fixed text, namely 'Type 1 CCS (aka Type 1 Combo) outputs at most 150 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type1_combo~.+&socket:type1_combo!=0)", + "description": "Layer 'Charging stations' shows socket:type1_combo:output=150 kW with a fixed text, namely 'Type 1 CCS (aka Type 1 Combo) outputs at most 150 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type1_combo~.+ &socket:type1_combo!=0)", "value": "150 kW" }, { "key": "socket:type1_combo:output", - "description": "Layer 'Charging stations' shows socket:type1_combo:output=350 kW with a fixed text, namely 'Type 1 CCS (aka Type 1 Combo) outputs at most 350 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type1_combo~.+&socket:type1_combo!=0)", + "description": "Layer 'Charging stations' shows socket:type1_combo:output=350 kW with a fixed text, namely 'Type 1 CCS (aka Type 1 Combo) outputs at most 350 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type1_combo~.+ &socket:type1_combo!=0)", "value": "350 kW" }, { "key": "socket:tesla_supercharger:voltage", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_supercharger:voltage' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_supercharger~.+&socket:tesla_supercharger!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_supercharger:voltage' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_supercharger~.+ &socket:tesla_supercharger!=0)" }, { "key": "socket:tesla_supercharger:voltage", - "description": "Layer 'Charging stations' shows socket:tesla_supercharger:voltage=480 V with a fixed text, namely 'Tesla Supercharger outputs 480 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_supercharger~.+&socket:tesla_supercharger!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_supercharger:voltage=480 V with a fixed text, namely 'Tesla Supercharger outputs 480 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_supercharger~.+ &socket:tesla_supercharger!=0)", "value": "480 V" }, { "key": "socket:tesla_supercharger:current", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_supercharger:current' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_supercharger~.+&socket:tesla_supercharger!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_supercharger:current' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_supercharger~.+ &socket:tesla_supercharger!=0)" }, { "key": "socket:tesla_supercharger:current", - "description": "Layer 'Charging stations' shows socket:tesla_supercharger:current=125 A with a fixed text, namely 'Tesla Supercharger outputs at most 125 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_supercharger~.+&socket:tesla_supercharger!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_supercharger:current=125 A with a fixed text, namely 'Tesla Supercharger outputs at most 125 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_supercharger~.+ &socket:tesla_supercharger!=0)", "value": "125 A" }, { "key": "socket:tesla_supercharger:current", - "description": "Layer 'Charging stations' shows socket:tesla_supercharger:current=350 A with a fixed text, namely 'Tesla Supercharger outputs at most 350 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_supercharger~.+&socket:tesla_supercharger!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_supercharger:current=350 A with a fixed text, namely 'Tesla Supercharger outputs at most 350 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_supercharger~.+ &socket:tesla_supercharger!=0)", "value": "350 A" }, { "key": "socket:tesla_supercharger:output", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_supercharger:output' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_supercharger~.+&socket:tesla_supercharger!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_supercharger:output' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_supercharger~.+ &socket:tesla_supercharger!=0)" }, { "key": "socket:tesla_supercharger:output", - "description": "Layer 'Charging stations' shows socket:tesla_supercharger:output=120 kW with a fixed text, namely 'Tesla Supercharger outputs at most 120 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_supercharger~.+&socket:tesla_supercharger!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_supercharger:output=120 kW with a fixed text, namely 'Tesla Supercharger outputs at most 120 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_supercharger~.+ &socket:tesla_supercharger!=0)", "value": "120 kW" }, { "key": "socket:tesla_supercharger:output", - "description": "Layer 'Charging stations' shows socket:tesla_supercharger:output=150 kW with a fixed text, namely 'Tesla Supercharger outputs at most 150 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_supercharger~.+&socket:tesla_supercharger!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_supercharger:output=150 kW with a fixed text, namely 'Tesla Supercharger outputs at most 150 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_supercharger~.+ &socket:tesla_supercharger!=0)", "value": "150 kW" }, { "key": "socket:tesla_supercharger:output", - "description": "Layer 'Charging stations' shows socket:tesla_supercharger:output=250 kW with a fixed text, namely 'Tesla Supercharger outputs at most 250 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_supercharger~.+&socket:tesla_supercharger!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_supercharger:output=250 kW with a fixed text, namely 'Tesla Supercharger outputs at most 250 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_supercharger~.+ &socket:tesla_supercharger!=0)", "value": "250 kW" }, { "key": "socket:type2:voltage", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2:voltage' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type2~.+&socket:type2!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2:voltage' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type2~.+ &socket:type2!=0)" }, { "key": "socket:type2:voltage", - "description": "Layer 'Charging stations' shows socket:type2:voltage=230 V with a fixed text, namely 'Type 2 (mennekes) outputs 230 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type2~.+&socket:type2!=0)", + "description": "Layer 'Charging stations' shows socket:type2:voltage=230 V with a fixed text, namely 'Type 2 (mennekes) outputs 230 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type2~.+ &socket:type2!=0)", "value": "230 V" }, { "key": "socket:type2:voltage", - "description": "Layer 'Charging stations' shows socket:type2:voltage=400 V with a fixed text, namely 'Type 2 (mennekes) outputs 400 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type2~.+&socket:type2!=0)", + "description": "Layer 'Charging stations' shows socket:type2:voltage=400 V with a fixed text, namely 'Type 2 (mennekes) outputs 400 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type2~.+ &socket:type2!=0)", "value": "400 V" }, { "key": "socket:type2:current", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2:current' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type2~.+&socket:type2!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2:current' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type2~.+ &socket:type2!=0)" }, { "key": "socket:type2:current", - "description": "Layer 'Charging stations' shows socket:type2:current=16 A with a fixed text, namely 'Type 2 (mennekes) outputs at most 16 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type2~.+&socket:type2!=0)", + "description": "Layer 'Charging stations' shows socket:type2:current=16 A with a fixed text, namely 'Type 2 (mennekes) outputs at most 16 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type2~.+ &socket:type2!=0)", "value": "16 A" }, { "key": "socket:type2:current", - "description": "Layer 'Charging stations' shows socket:type2:current=32 A with a fixed text, namely 'Type 2 (mennekes) outputs at most 32 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type2~.+&socket:type2!=0)", + "description": "Layer 'Charging stations' shows socket:type2:current=32 A with a fixed text, namely 'Type 2 (mennekes) outputs at most 32 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type2~.+ &socket:type2!=0)", "value": "32 A" }, { "key": "socket:type2:output", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2:output' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type2~.+&socket:type2!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2:output' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type2~.+ &socket:type2!=0)" }, { "key": "socket:type2:output", - "description": "Layer 'Charging stations' shows socket:type2:output=11 kW with a fixed text, namely 'Type 2 (mennekes) outputs at most 11 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type2~.+&socket:type2!=0)", + "description": "Layer 'Charging stations' shows socket:type2:output=11 kW with a fixed text, namely 'Type 2 (mennekes) outputs at most 11 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type2~.+ &socket:type2!=0)", "value": "11 kW" }, { "key": "socket:type2:output", - "description": "Layer 'Charging stations' shows socket:type2:output=22 kW with a fixed text, namely 'Type 2 (mennekes) outputs at most 22 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type2~.+&socket:type2!=0)", + "description": "Layer 'Charging stations' shows socket:type2:output=22 kW with a fixed text, namely 'Type 2 (mennekes) outputs at most 22 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type2~.+ &socket:type2!=0)", "value": "22 kW" }, { "key": "socket:type2_combo:voltage", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2_combo:voltage' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type2_combo~.+&socket:type2_combo!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2_combo:voltage' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type2_combo~.+ &socket:type2_combo!=0)" }, { "key": "socket:type2_combo:voltage", - "description": "Layer 'Charging stations' shows socket:type2_combo:voltage=500 V with a fixed text, namely 'Type 2 CCS (mennekes) outputs 500 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type2_combo~.+&socket:type2_combo!=0)", + "description": "Layer 'Charging stations' shows socket:type2_combo:voltage=500 V with a fixed text, namely 'Type 2 CCS (mennekes) outputs 500 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type2_combo~.+ &socket:type2_combo!=0)", "value": "500 V" }, { "key": "socket:type2_combo:voltage", - "description": "Layer 'Charging stations' shows socket:type2_combo:voltage=920 V with a fixed text, namely 'Type 2 CCS (mennekes) outputs 920 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type2_combo~.+&socket:type2_combo!=0)", + "description": "Layer 'Charging stations' shows socket:type2_combo:voltage=920 V with a fixed text, namely 'Type 2 CCS (mennekes) outputs 920 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type2_combo~.+ &socket:type2_combo!=0)", "value": "920 V" }, { "key": "socket:type2_combo:current", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2_combo:current' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type2_combo~.+&socket:type2_combo!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2_combo:current' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type2_combo~.+ &socket:type2_combo!=0)" }, { "key": "socket:type2_combo:current", - "description": "Layer 'Charging stations' shows socket:type2_combo:current=125 A with a fixed text, namely 'Type 2 CCS (mennekes) outputs at most 125 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type2_combo~.+&socket:type2_combo!=0)", + "description": "Layer 'Charging stations' shows socket:type2_combo:current=125 A with a fixed text, namely 'Type 2 CCS (mennekes) outputs at most 125 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type2_combo~.+ &socket:type2_combo!=0)", "value": "125 A" }, { "key": "socket:type2_combo:current", - "description": "Layer 'Charging stations' shows socket:type2_combo:current=350 A with a fixed text, namely 'Type 2 CCS (mennekes) outputs at most 350 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type2_combo~.+&socket:type2_combo!=0)", + "description": "Layer 'Charging stations' shows socket:type2_combo:current=350 A with a fixed text, namely 'Type 2 CCS (mennekes) outputs at most 350 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type2_combo~.+ &socket:type2_combo!=0)", "value": "350 A" }, { "key": "socket:type2_combo:output", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2_combo:output' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type2_combo~.+&socket:type2_combo!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2_combo:output' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type2_combo~.+ &socket:type2_combo!=0)" }, { "key": "socket:type2_combo:output", - "description": "Layer 'Charging stations' shows socket:type2_combo:output=50 kW with a fixed text, namely 'Type 2 CCS (mennekes) outputs at most 50 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type2_combo~.+&socket:type2_combo!=0)", + "description": "Layer 'Charging stations' shows socket:type2_combo:output=50 kW with a fixed text, namely 'Type 2 CCS (mennekes) outputs at most 50 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type2_combo~.+ &socket:type2_combo!=0)", "value": "50 kW" }, { "key": "socket:type2_cable:voltage", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2_cable:voltage' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type2_cable~.+&socket:type2_cable!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2_cable:voltage' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type2_cable~.+ &socket:type2_cable!=0)" }, { "key": "socket:type2_cable:voltage", - "description": "Layer 'Charging stations' shows socket:type2_cable:voltage=230 V with a fixed text, namely 'Type 2 with cable (mennekes) outputs 230 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type2_cable~.+&socket:type2_cable!=0)", + "description": "Layer 'Charging stations' shows socket:type2_cable:voltage=230 V with a fixed text, namely 'Type 2 with cable (mennekes) outputs 230 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type2_cable~.+ &socket:type2_cable!=0)", "value": "230 V" }, { "key": "socket:type2_cable:voltage", - "description": "Layer 'Charging stations' shows socket:type2_cable:voltage=400 V with a fixed text, namely 'Type 2 with cable (mennekes) outputs 400 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type2_cable~.+&socket:type2_cable!=0)", + "description": "Layer 'Charging stations' shows socket:type2_cable:voltage=400 V with a fixed text, namely 'Type 2 with cable (mennekes) outputs 400 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type2_cable~.+ &socket:type2_cable!=0)", "value": "400 V" }, { "key": "socket:type2_cable:current", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2_cable:current' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type2_cable~.+&socket:type2_cable!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2_cable:current' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type2_cable~.+ &socket:type2_cable!=0)" }, { "key": "socket:type2_cable:current", - "description": "Layer 'Charging stations' shows socket:type2_cable:current=16 A with a fixed text, namely 'Type 2 with cable (mennekes) outputs at most 16 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type2_cable~.+&socket:type2_cable!=0)", + "description": "Layer 'Charging stations' shows socket:type2_cable:current=16 A with a fixed text, namely 'Type 2 with cable (mennekes) outputs at most 16 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type2_cable~.+ &socket:type2_cable!=0)", "value": "16 A" }, { "key": "socket:type2_cable:current", - "description": "Layer 'Charging stations' shows socket:type2_cable:current=32 A with a fixed text, namely 'Type 2 with cable (mennekes) outputs at most 32 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type2_cable~.+&socket:type2_cable!=0)", + "description": "Layer 'Charging stations' shows socket:type2_cable:current=32 A with a fixed text, namely 'Type 2 with cable (mennekes) outputs at most 32 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type2_cable~.+ &socket:type2_cable!=0)", "value": "32 A" }, { "key": "socket:type2_cable:output", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2_cable:output' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type2_cable~.+&socket:type2_cable!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2_cable:output' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type2_cable~.+ &socket:type2_cable!=0)" }, { "key": "socket:type2_cable:output", - "description": "Layer 'Charging stations' shows socket:type2_cable:output=11 kW with a fixed text, namely 'Type 2 with cable (mennekes) outputs at most 11 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type2_cable~.+&socket:type2_cable!=0)", + "description": "Layer 'Charging stations' shows socket:type2_cable:output=11 kW with a fixed text, namely 'Type 2 with cable (mennekes) outputs at most 11 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type2_cable~.+ &socket:type2_cable!=0)", "value": "11 kW" }, { "key": "socket:type2_cable:output", - "description": "Layer 'Charging stations' shows socket:type2_cable:output=22 kW with a fixed text, namely 'Type 2 with cable (mennekes) outputs at most 22 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type2_cable~.+&socket:type2_cable!=0)", + "description": "Layer 'Charging stations' shows socket:type2_cable:output=22 kW with a fixed text, namely 'Type 2 with cable (mennekes) outputs at most 22 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:type2_cable~.+ &socket:type2_cable!=0)", "value": "22 kW" }, { "key": "socket:tesla_supercharger_ccs:voltage", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_supercharger_ccs:voltage' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_supercharger_ccs~.+&socket:tesla_supercharger_ccs!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_supercharger_ccs:voltage' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_supercharger_ccs~.+ &socket:tesla_supercharger_ccs!=0)" }, { "key": "socket:tesla_supercharger_ccs:voltage", - "description": "Layer 'Charging stations' shows socket:tesla_supercharger_ccs:voltage=500 V with a fixed text, namely 'Tesla Supercharger CCS (a branded Type 2 CSS) outputs 500 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_supercharger_ccs~.+&socket:tesla_supercharger_ccs!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_supercharger_ccs:voltage=500 V with a fixed text, namely 'Tesla Supercharger CCS (a branded Type 2 CSS) outputs 500 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_supercharger_ccs~.+ &socket:tesla_supercharger_ccs!=0)", "value": "500 V" }, { "key": "socket:tesla_supercharger_ccs:voltage", - "description": "Layer 'Charging stations' shows socket:tesla_supercharger_ccs:voltage=920 V with a fixed text, namely 'Tesla Supercharger CCS (a branded Type 2 CSS) outputs 920 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_supercharger_ccs~.+&socket:tesla_supercharger_ccs!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_supercharger_ccs:voltage=920 V with a fixed text, namely 'Tesla Supercharger CCS (a branded Type 2 CSS) outputs 920 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_supercharger_ccs~.+ &socket:tesla_supercharger_ccs!=0)", "value": "920 V" }, { "key": "socket:tesla_supercharger_ccs:current", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_supercharger_ccs:current' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_supercharger_ccs~.+&socket:tesla_supercharger_ccs!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_supercharger_ccs:current' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_supercharger_ccs~.+ &socket:tesla_supercharger_ccs!=0)" }, { "key": "socket:tesla_supercharger_ccs:current", - "description": "Layer 'Charging stations' shows socket:tesla_supercharger_ccs:current=125 A with a fixed text, namely 'Tesla Supercharger CCS (a branded type2_css) outputs at most 125 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_supercharger_ccs~.+&socket:tesla_supercharger_ccs!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_supercharger_ccs:current=125 A with a fixed text, namely 'Tesla Supercharger CCS (a branded type2_css) outputs at most 125 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_supercharger_ccs~.+ &socket:tesla_supercharger_ccs!=0)", "value": "125 A" }, { "key": "socket:tesla_supercharger_ccs:current", - "description": "Layer 'Charging stations' shows socket:tesla_supercharger_ccs:current=350 A with a fixed text, namely 'Tesla Supercharger CCS (a branded type2_css) outputs at most 350 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_supercharger_ccs~.+&socket:tesla_supercharger_ccs!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_supercharger_ccs:current=350 A with a fixed text, namely 'Tesla Supercharger CCS (a branded type2_css) outputs at most 350 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_supercharger_ccs~.+ &socket:tesla_supercharger_ccs!=0)", "value": "350 A" }, { "key": "socket:tesla_supercharger_ccs:output", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_supercharger_ccs:output' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_supercharger_ccs~.+&socket:tesla_supercharger_ccs!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_supercharger_ccs:output' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_supercharger_ccs~.+ &socket:tesla_supercharger_ccs!=0)" }, { "key": "socket:tesla_supercharger_ccs:output", - "description": "Layer 'Charging stations' shows socket:tesla_supercharger_ccs:output=50 kW with a fixed text, namely 'Tesla Supercharger CCS (a branded Type 2 CSS) outputs at most 50 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_supercharger_ccs~.+&socket:tesla_supercharger_ccs!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_supercharger_ccs:output=50 kW with a fixed text, namely 'Tesla Supercharger CCS (a branded Type 2 CSS) outputs at most 50 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_supercharger_ccs~.+ &socket:tesla_supercharger_ccs!=0)", "value": "50 kW" }, { "key": "socket:tesla_destination:voltage", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_destination:voltage' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_destination~.+&socket:tesla_destination!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_destination:voltage' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_destination~.+ &socket:tesla_destination!=0)" }, { "key": "socket:tesla_destination:voltage", - "description": "Layer 'Charging stations' shows socket:tesla_destination:voltage=480 V with a fixed text, namely 'Tesla Supercharger (Destination) outputs 480 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_destination~.+&socket:tesla_destination!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_destination:voltage=480 V with a fixed text, namely 'Tesla Supercharger (Destination) outputs 480 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_destination~.+ &socket:tesla_destination!=0)", "value": "480 V" }, { "key": "socket:tesla_destination:current", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_destination:current' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_destination~.+&socket:tesla_destination!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_destination:current' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_destination~.+ &socket:tesla_destination!=0)" }, { "key": "socket:tesla_destination:current", - "description": "Layer 'Charging stations' shows socket:tesla_destination:current=125 A with a fixed text, namely 'Tesla Supercharger (Destination) outputs at most 125 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_destination~.+&socket:tesla_destination!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_destination:current=125 A with a fixed text, namely 'Tesla Supercharger (Destination) outputs at most 125 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_destination~.+ &socket:tesla_destination!=0)", "value": "125 A" }, { "key": "socket:tesla_destination:current", - "description": "Layer 'Charging stations' shows socket:tesla_destination:current=350 A with a fixed text, namely 'Tesla Supercharger (Destination) outputs at most 350 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_destination~.+&socket:tesla_destination!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_destination:current=350 A with a fixed text, namely 'Tesla Supercharger (Destination) outputs at most 350 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_destination~.+ &socket:tesla_destination!=0)", "value": "350 A" }, { "key": "socket:tesla_destination:output", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_destination:output' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_destination~.+&socket:tesla_destination!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_destination:output' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_destination~.+ &socket:tesla_destination!=0)" }, { "key": "socket:tesla_destination:output", - "description": "Layer 'Charging stations' shows socket:tesla_destination:output=120 kW with a fixed text, namely 'Tesla Supercharger (Destination) outputs at most 120 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_destination~.+&socket:tesla_destination!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_destination:output=120 kW with a fixed text, namely 'Tesla Supercharger (Destination) outputs at most 120 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_destination~.+ &socket:tesla_destination!=0)", "value": "120 kW" }, { "key": "socket:tesla_destination:output", - "description": "Layer 'Charging stations' shows socket:tesla_destination:output=150 kW with a fixed text, namely 'Tesla Supercharger (Destination) outputs at most 150 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_destination~.+&socket:tesla_destination!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_destination:output=150 kW with a fixed text, namely 'Tesla Supercharger (Destination) outputs at most 150 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_destination~.+ &socket:tesla_destination!=0)", "value": "150 kW" }, { "key": "socket:tesla_destination:output", - "description": "Layer 'Charging stations' shows socket:tesla_destination:output=250 kW with a fixed text, namely 'Tesla Supercharger (Destination) outputs at most 250 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_destination~.+&socket:tesla_destination!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_destination:output=250 kW with a fixed text, namely 'Tesla Supercharger (Destination) outputs at most 250 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_destination~.+ &socket:tesla_destination!=0)", "value": "250 kW" }, { "key": "socket:tesla_destination:voltage", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_destination:voltage' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_destination~.+&socket:tesla_destination!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_destination:voltage' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_destination~.+ &socket:tesla_destination!=0)" }, { "key": "socket:tesla_destination:voltage", - "description": "Layer 'Charging stations' shows socket:tesla_destination:voltage=230 V with a fixed text, namely 'Tesla Supercharger (Destination) (A Type 2 with cable branded as Tesla) outputs 230 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_destination~.+&socket:tesla_destination!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_destination:voltage=230 V with a fixed text, namely 'Tesla Supercharger (Destination) (A Type 2 with cable branded as Tesla) outputs 230 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_destination~.+ &socket:tesla_destination!=0)", "value": "230 V" }, { "key": "socket:tesla_destination:voltage", - "description": "Layer 'Charging stations' shows socket:tesla_destination:voltage=400 V with a fixed text, namely 'Tesla Supercharger (Destination) (A Type 2 with cable branded as Tesla) outputs 400 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_destination~.+&socket:tesla_destination!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_destination:voltage=400 V with a fixed text, namely 'Tesla Supercharger (Destination) (A Type 2 with cable branded as Tesla) outputs 400 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_destination~.+ &socket:tesla_destination!=0)", "value": "400 V" }, { "key": "socket:tesla_destination:current", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_destination:current' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_destination~.+&socket:tesla_destination!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_destination:current' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_destination~.+ &socket:tesla_destination!=0)" }, { "key": "socket:tesla_destination:current", - "description": "Layer 'Charging stations' shows socket:tesla_destination:current=16 A with a fixed text, namely 'Tesla Supercharger (Destination) (A Type 2 with cable branded as tesla) outputs at most 16 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_destination~.+&socket:tesla_destination!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_destination:current=16 A with a fixed text, namely 'Tesla Supercharger (Destination) (A Type 2 with cable branded as tesla) outputs at most 16 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_destination~.+ &socket:tesla_destination!=0)", "value": "16 A" }, { "key": "socket:tesla_destination:current", - "description": "Layer 'Charging stations' shows socket:tesla_destination:current=32 A with a fixed text, namely 'Tesla Supercharger (Destination) (A Type 2 with cable branded as Tesla) outputs at most 32 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_destination~.+&socket:tesla_destination!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_destination:current=32 A with a fixed text, namely 'Tesla Supercharger (Destination) (A Type 2 with cable branded as Tesla) outputs at most 32 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_destination~.+ &socket:tesla_destination!=0)", "value": "32 A" }, { "key": "socket:tesla_destination:output", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_destination:output' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_destination~.+&socket:tesla_destination!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_destination:output' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_destination~.+ &socket:tesla_destination!=0)" }, { "key": "socket:tesla_destination:output", - "description": "Layer 'Charging stations' shows socket:tesla_destination:output=11 kW with a fixed text, namely 'Tesla Supercharger (Destination) (A Type 2 with cable branded as Tesla) outputs at most 11 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_destination~.+&socket:tesla_destination!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_destination:output=11 kW with a fixed text, namely 'Tesla Supercharger (Destination) (A Type 2 with cable branded as Tesla) outputs at most 11 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_destination~.+ &socket:tesla_destination!=0)", "value": "11 kW" }, { "key": "socket:tesla_destination:output", - "description": "Layer 'Charging stations' shows socket:tesla_destination:output=22 kW with a fixed text, namely 'Tesla Supercharger (Destination) (A Type 2 with cable branded as Tesla) outputs at most 22 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_destination~.+&socket:tesla_destination!=0)", + "description": "Layer 'Charging stations' shows socket:tesla_destination:output=22 kW with a fixed text, namely 'Tesla Supercharger (Destination) (A Type 2 with cable branded as Tesla) outputs at most 22 kw A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:tesla_destination~.+ &socket:tesla_destination!=0)", "value": "22 kW" }, { "key": "socket:USB-A:voltage", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:USB-A:voltage' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:USB-A~.+&socket:USB-A!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:USB-A:voltage' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:USB-A~.+ &socket:USB-A!=0)" }, { "key": "socket:USB-A:voltage", - "description": "Layer 'Charging stations' shows socket:USB-A:voltage=5 V with a fixed text, namely 'USB to charge phones and small electronics outputs 5 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:USB-A~.+&socket:USB-A!=0)", + "description": "Layer 'Charging stations' shows socket:USB-A:voltage=5 V with a fixed text, namely 'USB to charge phones and small electronics outputs 5 volt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:USB-A~.+ &socket:USB-A!=0)", "value": "5 V" }, { "key": "socket:USB-A:current", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:USB-A:current' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:USB-A~.+&socket:USB-A!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:USB-A:current' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:USB-A~.+ &socket:USB-A!=0)" }, { "key": "socket:USB-A:current", - "description": "Layer 'Charging stations' shows socket:USB-A:current=1 A with a fixed text, namely 'USB to charge phones and small electronics outputs at most 1 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:USB-A~.+&socket:USB-A!=0)", + "description": "Layer 'Charging stations' shows socket:USB-A:current=1 A with a fixed text, namely 'USB to charge phones and small electronics outputs at most 1 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:USB-A~.+ &socket:USB-A!=0)", "value": "1 A" }, { "key": "socket:USB-A:current", - "description": "Layer 'Charging stations' shows socket:USB-A:current=2 A with a fixed text, namely 'USB to charge phones and small electronics outputs at most 2 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:USB-A~.+&socket:USB-A!=0)", + "description": "Layer 'Charging stations' shows socket:USB-A:current=2 A with a fixed text, namely 'USB to charge phones and small electronics outputs at most 2 A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:USB-A~.+ &socket:USB-A!=0)", "value": "2 A" }, { "key": "socket:USB-A:output", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:USB-A:output' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:USB-A~.+&socket:USB-A!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:USB-A:output' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:USB-A~.+ &socket:USB-A!=0)" }, { "key": "socket:USB-A:output", - "description": "Layer 'Charging stations' shows socket:USB-A:output=5W with a fixed text, namely 'USB to charge phones and small electronics outputs at most 5w A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:USB-A~.+&socket:USB-A!=0)", + "description": "Layer 'Charging stations' shows socket:USB-A:output=5W with a fixed text, namely 'USB to charge phones and small electronics outputs at most 5w A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:USB-A~.+ &socket:USB-A!=0)", "value": "5W" }, { "key": "socket:USB-A:output", - "description": "Layer 'Charging stations' shows socket:USB-A:output=10W with a fixed text, namely 'USB to charge phones and small electronics outputs at most 10w A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:USB-A~.+&socket:USB-A!=0)", + "description": "Layer 'Charging stations' shows socket:USB-A:output=10W with a fixed text, namely 'USB to charge phones and small electronics outputs at most 10w A' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:USB-A~.+ &socket:USB-A!=0)", "value": "10W" }, { "key": "socket:bosch_3pin:voltage", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:bosch_3pin:voltage' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:bosch_3pin~.+&socket:bosch_3pin!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:bosch_3pin:voltage' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:bosch_3pin~.+ &socket:bosch_3pin!=0)" }, { "key": "socket:bosch_3pin:current", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:bosch_3pin:current' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:bosch_3pin~.+&socket:bosch_3pin!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:bosch_3pin:current' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:bosch_3pin~.+ &socket:bosch_3pin!=0)" }, { "key": "socket:bosch_3pin:output", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:bosch_3pin:output' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:bosch_3pin~.+&socket:bosch_3pin!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:bosch_3pin:output' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:bosch_3pin~.+ &socket:bosch_3pin!=0)" }, { "key": "socket:bosch_5pin:voltage", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:bosch_5pin:voltage' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:bosch_5pin~.+&socket:bosch_5pin!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:bosch_5pin:voltage' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:bosch_5pin~.+ &socket:bosch_5pin!=0)" }, { "key": "socket:bosch_5pin:current", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:bosch_5pin:current' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:bosch_5pin~.+&socket:bosch_5pin!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:bosch_5pin:current' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:bosch_5pin~.+ &socket:bosch_5pin!=0)" }, { "key": "socket:bosch_5pin:output", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:bosch_5pin:output' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:bosch_5pin~.+&socket:bosch_5pin!=0)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:bosch_5pin:output' (in the mapcomplete.org theme 'Personal theme') (This is only shown if socket:bosch_5pin~.+ &socket:bosch_5pin!=0)" }, { "key": "opening_hours", @@ -3845,42 +3845,42 @@ }, { "key": "fee", - "description": "Layer 'Charging stations' shows fee=no&authentication:none=yes with a fixed text, namely 'Free to use (without authenticating)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "description": "Layer 'Charging stations' shows fee=no &authentication:none=yes with a fixed text, namely 'Free to use (without authenticating)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", "value": "no" }, { "key": "fee:conditional", - "description": "Layer 'Charging stations' shows fee=no&authentication:none=yes with a fixed text, namely 'Free to use (without authenticating)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') Picking this answer will delete the key fee:conditional.", + "description": "Layer 'Charging stations' shows fee=no &authentication:none=yes with a fixed text, namely 'Free to use (without authenticating)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') Picking this answer will delete the key fee:conditional.", "value": "" }, { "key": "charge", - "description": "Layer 'Charging stations' shows fee=no&authentication:none=yes with a fixed text, namely 'Free to use (without authenticating)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') Picking this answer will delete the key charge.", + "description": "Layer 'Charging stations' shows fee=no &authentication:none=yes with a fixed text, namely 'Free to use (without authenticating)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') Picking this answer will delete the key charge.", "value": "" }, { "key": "authentication:none", - "description": "Layer 'Charging stations' shows fee=no&authentication:none=yes with a fixed text, namely 'Free to use (without authenticating)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "description": "Layer 'Charging stations' shows fee=no &authentication:none=yes with a fixed text, namely 'Free to use (without authenticating)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", "value": "yes" }, { "key": "fee", - "description": "Layer 'Charging stations' shows fee=no&authentication:none=no with a fixed text, namely 'Free to use, but one has to authenticate' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "description": "Layer 'Charging stations' shows fee=no &authentication:none=no with a fixed text, namely 'Free to use, but one has to authenticate' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", "value": "no" }, { "key": "fee:conditional", - "description": "Layer 'Charging stations' shows fee=no&authentication:none=no with a fixed text, namely 'Free to use, but one has to authenticate' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') Picking this answer will delete the key fee:conditional.", + "description": "Layer 'Charging stations' shows fee=no &authentication:none=no with a fixed text, namely 'Free to use, but one has to authenticate' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') Picking this answer will delete the key fee:conditional.", "value": "" }, { "key": "charge", - "description": "Layer 'Charging stations' shows fee=no&authentication:none=no with a fixed text, namely 'Free to use, but one has to authenticate' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') Picking this answer will delete the key charge.", + "description": "Layer 'Charging stations' shows fee=no &authentication:none=no with a fixed text, namely 'Free to use, but one has to authenticate' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') Picking this answer will delete the key charge.", "value": "" }, { "key": "authentication:none", - "description": "Layer 'Charging stations' shows fee=no&authentication:none=no with a fixed text, namely 'Free to use, but one has to authenticate' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "description": "Layer 'Charging stations' shows fee=no &authentication:none=no with a fixed text, namely 'Free to use, but one has to authenticate' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", "value": "no" }, { @@ -3890,12 +3890,12 @@ }, { "key": "fee", - "description": "Layer 'Charging stations' shows fee=yes&fee:conditional=no @ customers with a fixed text, namely 'Paid use, but free for customers of the hotel/pub/hospital/… who operates the charging station' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "description": "Layer 'Charging stations' shows fee=yes &fee:conditional=no @ customers with a fixed text, namely 'Paid use, but free for customers of the hotel/pub/hospital/… who operates the charging station' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", "value": "yes" }, { "key": "fee:conditional", - "description": "Layer 'Charging stations' shows fee=yes&fee:conditional=no @ customers with a fixed text, namely 'Paid use, but free for customers of the hotel/pub/hospital/… who operates the charging station' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "description": "Layer 'Charging stations' shows fee=yes &fee:conditional=no @ customers with a fixed text, namely 'Paid use, but free for customers of the hotel/pub/hospital/… who operates the charging station' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", "value": "no @ customers" }, { @@ -3914,80 +3914,80 @@ }, { "key": "payment:cash", - "description": "Layer 'Charging stations' shows payment:cash=yes with a fixed text, namely 'Cash is accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=yes|charge~.+)", + "description": "Layer 'Charging stations' shows payment:cash=yes with a fixed text, namely 'Cash is accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=yes |charge~.+)", "value": "yes" }, { "key": "payment:cards", - "description": "Layer 'Charging stations' shows payment:cards=yes with a fixed text, namely 'Payment cards are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=yes|charge~.+)", + "description": "Layer 'Charging stations' shows payment:cards=yes with a fixed text, namely 'Payment cards are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=yes |charge~.+)", "value": "yes" }, { "key": "payment:qr_code", - "description": "Layer 'Charging stations' shows payment:qr_code=yes with a fixed text, namely 'Payment by QR-code is possible here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=yes|charge~.+)", + "description": "Layer 'Charging stations' shows payment:qr_code=yes with a fixed text, namely 'Payment by QR-code is possible here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=yes |charge~.+)", "value": "yes" }, { "key": "payment:app", - "description": "Layer 'Charging stations' shows payment:app=yes with a fixed text, namely 'Payment is done using a dedicated app' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=yes|charge~.+)", + "description": "Layer 'Charging stations' shows payment:app=yes with a fixed text, namely 'Payment is done using a dedicated app' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=yes |charge~.+)", "value": "yes" }, { "key": "payment:membership_card", - "description": "Layer 'Charging stations' shows payment:membership_card=yes with a fixed text, namely 'Payment is done using a membership card' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=yes|charge~.+)", + "description": "Layer 'Charging stations' shows payment:membership_card=yes with a fixed text, namely 'Payment is done using a membership card' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=yes |charge~.+)", "value": "yes" }, { "key": "authentication:membership_card", - "description": "Layer 'Charging stations' shows authentication:membership_card=yes with a fixed text, namely 'Authentication by a membership card' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=no|)", + "description": "Layer 'Charging stations' shows authentication:membership_card=yes with a fixed text, namely 'Authentication by a membership card' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=no |)", "value": "yes" }, { "key": "authentication:app", - "description": "Layer 'Charging stations' shows authentication:app=yes with a fixed text, namely 'Authentication by an app' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=no|)", + "description": "Layer 'Charging stations' shows authentication:app=yes with a fixed text, namely 'Authentication by an app' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=no |)", "value": "yes" }, { "key": "authentication:phone_call", - "description": "Layer 'Charging stations' shows authentication:phone_call=yes with a fixed text, namely 'Authentication via phone call is available' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=no|)", + "description": "Layer 'Charging stations' shows authentication:phone_call=yes with a fixed text, namely 'Authentication via phone call is available' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=no |)", "value": "yes" }, { "key": "authentication:short_message", - "description": "Layer 'Charging stations' shows authentication:short_message=yes with a fixed text, namely 'Authentication via SMS is available' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=no|)", + "description": "Layer 'Charging stations' shows authentication:short_message=yes with a fixed text, namely 'Authentication via SMS is available' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=no |)", "value": "yes" }, { "key": "authentication:nfc", - "description": "Layer 'Charging stations' shows authentication:nfc=yes with a fixed text, namely 'Authentication via NFC is available' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=no|)", + "description": "Layer 'Charging stations' shows authentication:nfc=yes with a fixed text, namely 'Authentication via NFC is available' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=no |)", "value": "yes" }, { "key": "authentication:money_card", - "description": "Layer 'Charging stations' shows authentication:money_card=yes with a fixed text, namely 'Authentication via Money Card is available' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=no|)", + "description": "Layer 'Charging stations' shows authentication:money_card=yes with a fixed text, namely 'Authentication via Money Card is available' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=no |)", "value": "yes" }, { "key": "authentication:debit_card", - "description": "Layer 'Charging stations' shows authentication:debit_card=yes with a fixed text, namely 'Authentication via debit card is available' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=no|)", + "description": "Layer 'Charging stations' shows authentication:debit_card=yes with a fixed text, namely 'Authentication via debit card is available' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=no |)", "value": "yes" }, { "key": "authentication:none", - "description": "Layer 'Charging stations' shows authentication:none=yes with a fixed text, namely 'Charging here is (also) possible without authentication' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=no|)", + "description": "Layer 'Charging stations' shows authentication:none=yes with a fixed text, namely 'Charging here is (also) possible without authentication' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=no |)", "value": "yes" }, { "key": "authentication:phone_call:number", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'authentication:phone_call:number' (in the mapcomplete.org theme 'Personal theme') (This is only shown if authentication:phone_call=yes|authentication:short_message=yes)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'authentication:phone_call:number' (in the mapcomplete.org theme 'Personal theme') (This is only shown if authentication:phone_call=yes |authentication:short_message=yes)" }, { "key": "maxstay", - "description": "Layer 'Charging stations' shows and asks freeform values for key 'maxstay' (in the mapcomplete.org theme 'Personal theme') (This is only shown if maxstay~.+|motorcar=yes|hgv=yes|bus=yes)" + "description": "Layer 'Charging stations' shows and asks freeform values for key 'maxstay' (in the mapcomplete.org theme 'Personal theme') (This is only shown if maxstay~.+ |motorcar=yes |hgv=yes |bus=yes)" }, { "key": "maxstay", - "description": "Layer 'Charging stations' shows maxstay=unlimited with a fixed text, namely 'No timelimit on leaving your vehicle here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if maxstay~.+|motorcar=yes|hgv=yes|bus=yes)", + "description": "Layer 'Charging stations' shows maxstay=unlimited with a fixed text, namely 'No timelimit on leaving your vehicle here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if maxstay~.+ |motorcar=yes |hgv=yes |bus=yes)", "value": "unlimited" }, { @@ -4115,27 +4115,27 @@ }, { "key": "planned:amenity", - "description": "Layer 'Charging stations' shows operational_status=broken&amenity=charging_station with a fixed text, namely 'This charging station is broken' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') Picking this answer will delete the key planned:amenity.", + "description": "Layer 'Charging stations' shows operational_status=broken &amenity=charging_station with a fixed text, namely 'This charging station is broken' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') Picking this answer will delete the key planned:amenity.", "value": "" }, { "key": "construction:amenity", - "description": "Layer 'Charging stations' shows operational_status=broken&amenity=charging_station with a fixed text, namely 'This charging station is broken' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') Picking this answer will delete the key construction:amenity.", + "description": "Layer 'Charging stations' shows operational_status=broken &amenity=charging_station with a fixed text, namely 'This charging station is broken' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') Picking this answer will delete the key construction:amenity.", "value": "" }, { "key": "disused:amenity", - "description": "Layer 'Charging stations' shows operational_status=broken&amenity=charging_station with a fixed text, namely 'This charging station is broken' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') Picking this answer will delete the key disused:amenity.", + "description": "Layer 'Charging stations' shows operational_status=broken &amenity=charging_station with a fixed text, namely 'This charging station is broken' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') Picking this answer will delete the key disused:amenity.", "value": "" }, { "key": "operational_status", - "description": "Layer 'Charging stations' shows operational_status=broken&amenity=charging_station with a fixed text, namely 'This charging station is broken' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "description": "Layer 'Charging stations' shows operational_status=broken &amenity=charging_station with a fixed text, namely 'This charging station is broken' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", "value": "broken" }, { "key": "amenity", - "description": "Layer 'Charging stations' shows operational_status=broken&amenity=charging_station with a fixed text, namely 'This charging station is broken' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "description": "Layer 'Charging stations' shows operational_status=broken &amenity=charging_station with a fixed text, namely 'This charging station is broken' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", "value": "charging_station" }, { @@ -4215,12 +4215,12 @@ }, { "key": "parking:fee", - "description": "Layer 'Charging stations' shows parking:fee=no with a fixed text, namely 'No additional parking cost while charging' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if motor_vehicle=yes|hgv=yes|bus=yes|bicycle=no|)", + "description": "Layer 'Charging stations' shows parking:fee=no with a fixed text, namely 'No additional parking cost while charging' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if motor_vehicle=yes |hgv=yes |bus=yes |bicycle=no |)", "value": "no" }, { "key": "parking:fee", - "description": "Layer 'Charging stations' shows parking:fee=yes with a fixed text, namely 'An additional parking fee should be paid while charging' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if motor_vehicle=yes|hgv=yes|bus=yes|bicycle=no|)", + "description": "Layer 'Charging stations' shows parking:fee=yes with a fixed text, namely 'An additional parking fee should be paid while charging' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if motor_vehicle=yes |hgv=yes |bus=yes |bicycle=no |)", "value": "yes" }, { @@ -4230,7 +4230,7 @@ }, { "key": "id", - "description": "Layer 'Climbing opportunities' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Climbing opportunities' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -4279,16 +4279,16 @@ }, { "key": "rock", - "description": "Layer 'Climbing opportunities' shows and asks freeform values for key 'rock' (in the mapcomplete.org theme 'Personal theme') (This is only shown if climbing=crag|natural=cliff|natural=bare_rock)" + "description": "Layer 'Climbing opportunities' shows and asks freeform values for key 'rock' (in the mapcomplete.org theme 'Personal theme') (This is only shown if climbing=crag |natural=cliff |natural=bare_rock)" }, { "key": "rock", - "description": "Layer 'Climbing opportunities' shows rock=limestone with a fixed text, namely 'Limestone' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if climbing=crag|natural=cliff|natural=bare_rock)", + "description": "Layer 'Climbing opportunities' shows rock=limestone with a fixed text, namely 'Limestone' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if climbing=crag |natural=cliff |natural=bare_rock)", "value": "limestone" }, { "key": "url", - "description": "Layer 'Climbing opportunities' shows and asks freeform values for key 'url' (in the mapcomplete.org theme 'Personal theme') (This is only shown if leisure!~^(sports_centre)$&sport=climbing)" + "description": "Layer 'Climbing opportunities' shows and asks freeform values for key 'url' (in the mapcomplete.org theme 'Personal theme') (This is only shown if leisure!~^(sports_centre)$ &sport=climbing)" }, { "key": "charge", @@ -4348,7 +4348,7 @@ }, { "key": "id", - "description": "Layer 'Climbing club' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Climbing club' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "name", @@ -4394,7 +4394,7 @@ }, { "key": "id", - "description": "Layer 'Climbing gyms' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Climbing gyms' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -4480,31 +4480,31 @@ }, { "key": "service:climbing_shoes:rental", - "description": "Layer 'Climbing gyms' shows service:climbing_shoes:rental=yes&service:climbing_shoes:rental:fee=no with a fixed text, namely 'Climbing shoes can be borrowed for free here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "description": "Layer 'Climbing gyms' shows service:climbing_shoes:rental=yes &service:climbing_shoes:rental:fee=no with a fixed text, namely 'Climbing shoes can be borrowed for free here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", "value": "yes" }, { "key": "service:climbing_shoes:rental:fee", - "description": "Layer 'Climbing gyms' shows service:climbing_shoes:rental=yes&service:climbing_shoes:rental:fee=no with a fixed text, namely 'Climbing shoes can be borrowed for free here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "description": "Layer 'Climbing gyms' shows service:climbing_shoes:rental=yes &service:climbing_shoes:rental:fee=no with a fixed text, namely 'Climbing shoes can be borrowed for free here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", "value": "no" }, { "key": "service:climbing_shoes:rental", - "description": "Layer 'Climbing gyms' shows service:climbing_shoes:rental=yes&service:climbing_shoes:rental:charge~.+ with a fixed text, namely 'Climbing shoes can be rented here for {service:climbing_shoes:rental:charge}' (in the mapcomplete.org theme 'Personal theme')", + "description": "Layer 'Climbing gyms' shows service:climbing_shoes:rental=yes &service:climbing_shoes:rental:charge~.+ with a fixed text, namely 'Climbing shoes can be rented here for {service:climbing_shoes:rental:charge}' (in the mapcomplete.org theme 'Personal theme')", "value": "yes" }, { "key": "service:climbing_shoes:rental:charge", - "description": "Layer 'Climbing gyms' shows service:climbing_shoes:rental=yes&service:climbing_shoes:rental:charge~.+ with a fixed text, namely 'Climbing shoes can be rented here for {service:climbing_shoes:rental:charge}' (in the mapcomplete.org theme 'Personal theme')" + "description": "Layer 'Climbing gyms' shows service:climbing_shoes:rental=yes &service:climbing_shoes:rental:charge~.+ with a fixed text, namely 'Climbing shoes can be rented here for {service:climbing_shoes:rental:charge}' (in the mapcomplete.org theme 'Personal theme')" }, { "key": "service:climbing_shoes:rental", - "description": "Layer 'Climbing gyms' shows service:climbing_shoes:rental=yes&service:climbing_shoes:rental:fee=yes with a fixed text, namely 'Climbing shoes can be rented here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "description": "Layer 'Climbing gyms' shows service:climbing_shoes:rental=yes &service:climbing_shoes:rental:fee=yes with a fixed text, namely 'Climbing shoes can be rented here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", "value": "yes" }, { "key": "service:climbing_shoes:rental:fee", - "description": "Layer 'Climbing gyms' shows service:climbing_shoes:rental=yes&service:climbing_shoes:rental:fee=yes with a fixed text, namely 'Climbing shoes can be rented here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "description": "Layer 'Climbing gyms' shows service:climbing_shoes:rental=yes &service:climbing_shoes:rental:fee=yes with a fixed text, namely 'Climbing shoes can be rented here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", "value": "yes" }, { @@ -4514,85 +4514,85 @@ }, { "key": "service:climbing_harness:rental", - "description": "Layer 'Climbing gyms' shows service:climbing_harness:rental=yes&service:climbing_harness:rental:fee=no with a fixed text, namely 'A climbing harness can be borrowed for free here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if climbing:sport!=no|climbing:toprope!=no)", + "description": "Layer 'Climbing gyms' shows service:climbing_harness:rental=yes &service:climbing_harness:rental:fee=no with a fixed text, namely 'A climbing harness can be borrowed for free here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if climbing:sport!=no |climbing:toprope!=no)", "value": "yes" }, { "key": "service:climbing_harness:rental:fee", - "description": "Layer 'Climbing gyms' shows service:climbing_harness:rental=yes&service:climbing_harness:rental:fee=no with a fixed text, namely 'A climbing harness can be borrowed for free here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if climbing:sport!=no|climbing:toprope!=no)", + "description": "Layer 'Climbing gyms' shows service:climbing_harness:rental=yes &service:climbing_harness:rental:fee=no with a fixed text, namely 'A climbing harness can be borrowed for free here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if climbing:sport!=no |climbing:toprope!=no)", "value": "no" }, { "key": "service:climbing_harness:rental", - "description": "Layer 'Climbing gyms' shows service:climbing_harness:rental=yes&service:climbing_harness:rental:charge~.+ with a fixed text, namely 'A climbing harness can be rented here for {service:climbing_harness:rental:charge}' (in the mapcomplete.org theme 'Personal theme') (This is only shown if climbing:sport!=no|climbing:toprope!=no)", + "description": "Layer 'Climbing gyms' shows service:climbing_harness:rental=yes &service:climbing_harness:rental:charge~.+ with a fixed text, namely 'A climbing harness can be rented here for {service:climbing_harness:rental:charge}' (in the mapcomplete.org theme 'Personal theme') (This is only shown if climbing:sport!=no |climbing:toprope!=no)", "value": "yes" }, { "key": "service:climbing_harness:rental:charge", - "description": "Layer 'Climbing gyms' shows service:climbing_harness:rental=yes&service:climbing_harness:rental:charge~.+ with a fixed text, namely 'A climbing harness can be rented here for {service:climbing_harness:rental:charge}' (in the mapcomplete.org theme 'Personal theme') (This is only shown if climbing:sport!=no|climbing:toprope!=no)" + "description": "Layer 'Climbing gyms' shows service:climbing_harness:rental=yes &service:climbing_harness:rental:charge~.+ with a fixed text, namely 'A climbing harness can be rented here for {service:climbing_harness:rental:charge}' (in the mapcomplete.org theme 'Personal theme') (This is only shown if climbing:sport!=no |climbing:toprope!=no)" }, { "key": "service:climbing_harness:rental", - "description": "Layer 'Climbing gyms' shows service:climbing_harness:rental=yes with a fixed text, namely 'A climbing harness can be rented here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if climbing:sport!=no|climbing:toprope!=no)", + "description": "Layer 'Climbing gyms' shows service:climbing_harness:rental=yes with a fixed text, namely 'A climbing harness can be rented here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if climbing:sport!=no |climbing:toprope!=no)", "value": "yes" }, { "key": "service:climbing_harness:rental", - "description": "Layer 'Climbing gyms' shows service:climbing_harness:rental=no with a fixed text, namely 'A climbing harness can not be rented here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if climbing:sport!=no|climbing:toprope!=no)", + "description": "Layer 'Climbing gyms' shows service:climbing_harness:rental=no with a fixed text, namely 'A climbing harness can not be rented here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if climbing:sport!=no |climbing:toprope!=no)", "value": "no" }, { "key": "service:climbing_belay_device:provided_at_each_rope", - "description": "Layer 'Climbing gyms' shows service:climbing_belay_device:provided_at_each_rope=yes with a fixed text, namely 'Belay devices are provided at each rope' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if climbing:sport!=no|climbing:toprope!=no)", + "description": "Layer 'Climbing gyms' shows service:climbing_belay_device:provided_at_each_rope=yes with a fixed text, namely 'Belay devices are provided at each rope' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if climbing:sport!=no |climbing:toprope!=no)", "value": "yes" }, { "key": "service:climbing_belay_device:rental", - "description": "Layer 'Climbing gyms' shows service:climbing_belay_device:rental=yes&service:climbing_belay_device:rental:fee=no with a fixed text, namely 'A belay device can be borrowed for free here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if climbing:sport!=no|climbing:toprope!=no)", + "description": "Layer 'Climbing gyms' shows service:climbing_belay_device:rental=yes &service:climbing_belay_device:rental:fee=no with a fixed text, namely 'A belay device can be borrowed for free here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if climbing:sport!=no |climbing:toprope!=no)", "value": "yes" }, { "key": "service:climbing_belay_device:rental:fee", - "description": "Layer 'Climbing gyms' shows service:climbing_belay_device:rental=yes&service:climbing_belay_device:rental:fee=no with a fixed text, namely 'A belay device can be borrowed for free here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if climbing:sport!=no|climbing:toprope!=no)", + "description": "Layer 'Climbing gyms' shows service:climbing_belay_device:rental=yes &service:climbing_belay_device:rental:fee=no with a fixed text, namely 'A belay device can be borrowed for free here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if climbing:sport!=no |climbing:toprope!=no)", "value": "no" }, { "key": "service:climbing_belay_device:rental", - "description": "Layer 'Climbing gyms' shows service:climbing_belay_device:rental=yes&service:climbing_belay_device:rental:charge~.+ with a fixed text, namely 'A belay device can be rented here for {service:climbing_belay_device:rental:charge}' (in the mapcomplete.org theme 'Personal theme') (This is only shown if climbing:sport!=no|climbing:toprope!=no)", + "description": "Layer 'Climbing gyms' shows service:climbing_belay_device:rental=yes &service:climbing_belay_device:rental:charge~.+ with a fixed text, namely 'A belay device can be rented here for {service:climbing_belay_device:rental:charge}' (in the mapcomplete.org theme 'Personal theme') (This is only shown if climbing:sport!=no |climbing:toprope!=no)", "value": "yes" }, { "key": "service:climbing_belay_device:rental:charge", - "description": "Layer 'Climbing gyms' shows service:climbing_belay_device:rental=yes&service:climbing_belay_device:rental:charge~.+ with a fixed text, namely 'A belay device can be rented here for {service:climbing_belay_device:rental:charge}' (in the mapcomplete.org theme 'Personal theme') (This is only shown if climbing:sport!=no|climbing:toprope!=no)" + "description": "Layer 'Climbing gyms' shows service:climbing_belay_device:rental=yes &service:climbing_belay_device:rental:charge~.+ with a fixed text, namely 'A belay device can be rented here for {service:climbing_belay_device:rental:charge}' (in the mapcomplete.org theme 'Personal theme') (This is only shown if climbing:sport!=no |climbing:toprope!=no)" }, { "key": "service:climbing_belay_device:rental", - "description": "Layer 'Climbing gyms' shows service:climbing_belay_device:rental=yes with a fixed text, namely 'A belay device can be rented here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if climbing:sport!=no|climbing:toprope!=no)", + "description": "Layer 'Climbing gyms' shows service:climbing_belay_device:rental=yes with a fixed text, namely 'A belay device can be rented here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if climbing:sport!=no |climbing:toprope!=no)", "value": "yes" }, { "key": "service:climbing_belay_device:rental", - "description": "Layer 'Climbing gyms' shows service:climbing_belay_device:rental=no with a fixed text, namely 'A belay device can not be rented here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if climbing:sport!=no|climbing:toprope!=no)", + "description": "Layer 'Climbing gyms' shows service:climbing_belay_device:rental=no with a fixed text, namely 'A belay device can not be rented here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if climbing:sport!=no |climbing:toprope!=no)", "value": "no" }, { "key": "service:climbing_rope:rental", - "description": "Layer 'Climbing gyms' shows service:climbing_rope:rental=yes&service:climbing_rope:rental:fee=no with a fixed text, namely 'A climbing rope can be borrowed for free here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if climbing:sport!=no)", + "description": "Layer 'Climbing gyms' shows service:climbing_rope:rental=yes &service:climbing_rope:rental:fee=no with a fixed text, namely 'A climbing rope can be borrowed for free here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if climbing:sport!=no)", "value": "yes" }, { "key": "service:climbing_rope:rental:fee", - "description": "Layer 'Climbing gyms' shows service:climbing_rope:rental=yes&service:climbing_rope:rental:fee=no with a fixed text, namely 'A climbing rope can be borrowed for free here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if climbing:sport!=no)", + "description": "Layer 'Climbing gyms' shows service:climbing_rope:rental=yes &service:climbing_rope:rental:fee=no with a fixed text, namely 'A climbing rope can be borrowed for free here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if climbing:sport!=no)", "value": "no" }, { "key": "service:climbing_rope:rental", - "description": "Layer 'Climbing gyms' shows service:climbing_rope:rental=yes&service:climbing_rope:rental:charge~.+ with a fixed text, namely 'A climbing rope can be rented here for {service:climbing_rope:rental:charge}' (in the mapcomplete.org theme 'Personal theme') (This is only shown if climbing:sport!=no)", + "description": "Layer 'Climbing gyms' shows service:climbing_rope:rental=yes &service:climbing_rope:rental:charge~.+ with a fixed text, namely 'A climbing rope can be rented here for {service:climbing_rope:rental:charge}' (in the mapcomplete.org theme 'Personal theme') (This is only shown if climbing:sport!=no)", "value": "yes" }, { "key": "service:climbing_rope:rental:charge", - "description": "Layer 'Climbing gyms' shows service:climbing_rope:rental=yes&service:climbing_rope:rental:charge~.+ with a fixed text, namely 'A climbing rope can be rented here for {service:climbing_rope:rental:charge}' (in the mapcomplete.org theme 'Personal theme') (This is only shown if climbing:sport!=no)" + "description": "Layer 'Climbing gyms' shows service:climbing_rope:rental=yes &service:climbing_rope:rental:charge~.+ with a fixed text, namely 'A climbing rope can be rented here for {service:climbing_rope:rental:charge}' (in the mapcomplete.org theme 'Personal theme') (This is only shown if climbing:sport!=no)" }, { "key": "service:climbing_rope:rental", @@ -4653,7 +4653,7 @@ }, { "key": "climbing:length", - "description": "Layer 'Climbing gyms' shows and asks freeform values for key 'climbing:length' (in the mapcomplete.org theme 'Personal theme') (This is only shown if climbing:sport!=no|climbing:toprope!=no)" + "description": "Layer 'Climbing gyms' shows and asks freeform values for key 'climbing:length' (in the mapcomplete.org theme 'Personal theme') (This is only shown if climbing:sport!=no |climbing:toprope!=no)" }, { "key": "climbing:grade:french:min", @@ -4661,7 +4661,7 @@ }, { "key": "climbing:grade:french:max", - "description": "Layer 'Climbing gyms' shows and asks freeform values for key 'climbing:grade:french:max' (in the mapcomplete.org theme 'Personal theme') (This is only shown if climbing!~^(route)$&climbing:sport=yes|sport=climbing)" + "description": "Layer 'Climbing gyms' shows and asks freeform values for key 'climbing:grade:french:max' (in the mapcomplete.org theme 'Personal theme') (This is only shown if climbing!~^(route)$ &climbing:sport=yes |sport=climbing)" }, { "key": "climbing:bolts:max", @@ -4708,17 +4708,17 @@ }, { "key": "internet_access:fee", - "description": "Layer 'Climbing gyms' shows internet_access:fee=yes with a fixed text, namely 'There is a fee for the internet access at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if internet_access!=no&internet_access~.+)", + "description": "Layer 'Climbing gyms' shows internet_access:fee=yes with a fixed text, namely 'There is a fee for the internet access at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if internet_access!=no &internet_access~.+)", "value": "yes" }, { "key": "internet_access:fee", - "description": "Layer 'Climbing gyms' shows internet_access:fee=no with a fixed text, namely 'Internet access is free at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if internet_access!=no&internet_access~.+)", + "description": "Layer 'Climbing gyms' shows internet_access:fee=no with a fixed text, namely 'Internet access is free at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if internet_access!=no &internet_access~.+)", "value": "no" }, { "key": "internet_access:fee", - "description": "Layer 'Climbing gyms' shows internet_access:fee=customers with a fixed text, namely 'Internet access is free at this place, for customers only' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if internet_access!=no&internet_access~.+)", + "description": "Layer 'Climbing gyms' shows internet_access:fee=customers with a fixed text, namely 'Internet access is free at this place, for customers only' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if internet_access!=no &internet_access~.+)", "value": "customers" }, { @@ -4767,7 +4767,7 @@ }, { "key": "id", - "description": "Layer 'Climbing opportunities?' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Climbing opportunities?' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "sport", @@ -4786,7 +4786,7 @@ }, { "key": "id", - "description": "Layer 'Climbing routes' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Climbing routes' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -4846,7 +4846,7 @@ }, { "key": "id", - "description": "Layer 'Clocks' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Clocks' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -5010,7 +5010,7 @@ }, { "key": "id", - "description": "Layer 'Crossings' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Crossings' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -5095,12 +5095,12 @@ }, { "key": "button_operated", - "description": "Layer 'Crossings' shows button_operated=yes with a fixed text, namely 'This traffic light has a button to request green light' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if highway=traffic_signals|crossing=traffic_signals)", + "description": "Layer 'Crossings' shows button_operated=yes with a fixed text, namely 'This traffic light has a button to request green light' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if highway=traffic_signals |crossing=traffic_signals)", "value": "yes" }, { "key": "button_operated", - "description": "Layer 'Crossings' shows button_operated=no with a fixed text, namely 'This traffic light does not have a button to request green light' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if highway=traffic_signals|crossing=traffic_signals)", + "description": "Layer 'Crossings' shows button_operated=no with a fixed text, namely 'This traffic light does not have a button to request green light' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if highway=traffic_signals |crossing=traffic_signals)", "value": "no" }, { @@ -5125,12 +5125,12 @@ }, { "key": "traffic_signals:vibration", - "description": "Layer 'Crossings' shows traffic_signals:vibration=yes with a fixed text, namely 'The button for this traffic light has a vibration signal to indicate that it is safe to cross.' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if crossing=traffic_signals&button_operated=yes)", + "description": "Layer 'Crossings' shows traffic_signals:vibration=yes with a fixed text, namely 'The button for this traffic light has a vibration signal to indicate that it is safe to cross.' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if crossing=traffic_signals &button_operated=yes)", "value": "yes" }, { "key": "traffic_signals:vibration", - "description": "Layer 'Crossings' shows traffic_signals:vibration=no with a fixed text, namely 'The button for this traffic light does not have a vibration signal to indicate that it is safe to cross.' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if crossing=traffic_signals&button_operated=yes)", + "description": "Layer 'Crossings' shows traffic_signals:vibration=no with a fixed text, namely 'The button for this traffic light does not have a vibration signal to indicate that it is safe to cross.' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if crossing=traffic_signals &button_operated=yes)", "value": "no" }, { @@ -5280,36 +5280,36 @@ }, { "key": "id", - "description": "Layer 'Cycleways and roads' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Cycleways and roads' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "cycleway", - "description": "Layer 'Cycleways and roads' shows cycleway=shared_lane with a fixed text, namely 'There is a shared lane' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if highway!=cycleway&highway!=path&highway!=footway&highway!=pedestrian)", + "description": "Layer 'Cycleways and roads' shows cycleway=shared_lane with a fixed text, namely 'There is a shared lane' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if highway!=cycleway &highway!=path &highway!=footway &highway!=pedestrian)", "value": "shared_lane" }, { "key": "cycleway", - "description": "Layer 'Cycleways and roads' shows cycleway=lane with a fixed text, namely 'There is a lane next to the road (separated with paint)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if highway!=cycleway&highway!=path&highway!=footway&highway!=pedestrian)", + "description": "Layer 'Cycleways and roads' shows cycleway=lane with a fixed text, namely 'There is a lane next to the road (separated with paint)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if highway!=cycleway &highway!=path &highway!=footway &highway!=pedestrian)", "value": "lane" }, { "key": "cycleway", - "description": "Layer 'Cycleways and roads' shows cycleway=track with a fixed text, namely 'There is a track, but no cycleway drawn separately from this road on the map.' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if highway!=cycleway&highway!=path&highway!=footway&highway!=pedestrian)", + "description": "Layer 'Cycleways and roads' shows cycleway=track with a fixed text, namely 'There is a track, but no cycleway drawn separately from this road on the map.' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if highway!=cycleway &highway!=path &highway!=footway &highway!=pedestrian)", "value": "track" }, { "key": "cycleway", - "description": "Layer 'Cycleways and roads' shows cycleway=separate with a fixed text, namely 'There is a separately drawn cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if highway!=cycleway&highway!=path&highway!=footway&highway!=pedestrian)", + "description": "Layer 'Cycleways and roads' shows cycleway=separate with a fixed text, namely 'There is a separately drawn cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if highway!=cycleway &highway!=path &highway!=footway &highway!=pedestrian)", "value": "separate" }, { "key": "cycleway", - "description": "Layer 'Cycleways and roads' shows cycleway=no with a fixed text, namely 'There is no cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if highway!=cycleway&highway!=path&highway!=footway&highway!=pedestrian)", + "description": "Layer 'Cycleways and roads' shows cycleway=no with a fixed text, namely 'There is no cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if highway!=cycleway &highway!=path &highway!=footway &highway!=pedestrian)", "value": "no" }, { "key": "cycleway", - "description": "Layer 'Cycleways and roads' shows cycleway=no with a fixed text, namely 'There is no cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if highway!=cycleway&highway!=path&highway!=footway&highway!=pedestrian)", + "description": "Layer 'Cycleways and roads' shows cycleway=no with a fixed text, namely 'There is no cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if highway!=cycleway &highway!=path &highway!=footway &highway!=pedestrian)", "value": "no" }, { @@ -5334,155 +5334,155 @@ }, { "key": "cyclestreet", - "description": "Layer 'Cycleways and roads' shows cyclestreet=yes with a fixed text, namely 'This is a cyclestreet, and a 30km/h zone.' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if highway!=cycleway&highway!=path&highway!=footway)", + "description": "Layer 'Cycleways and roads' shows cyclestreet=yes with a fixed text, namely 'This is a cyclestreet, and a 30km/h zone.' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if highway!=cycleway &highway!=path &highway!=footway)", "value": "yes" }, { "key": "cyclestreet", - "description": "Layer 'Cycleways and roads' shows cyclestreet=yes with a fixed text, namely 'This is a cyclestreet' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if highway!=cycleway&highway!=path&highway!=footway)", + "description": "Layer 'Cycleways and roads' shows cyclestreet=yes with a fixed text, namely 'This is a cyclestreet' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if highway!=cycleway &highway!=path &highway!=footway)", "value": "yes" }, { "key": "cyclestreet", - "description": "Layer 'Cycleways and roads' shows with a fixed text, namely 'This is not a cyclestreet.' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') Picking this answer will delete the key cyclestreet. (This is only shown if highway!=cycleway&highway!=path&highway!=footway)", + "description": "Layer 'Cycleways and roads' shows with a fixed text, namely 'This is not a cyclestreet.' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') Picking this answer will delete the key cyclestreet. (This is only shown if highway!=cycleway &highway!=path &highway!=footway)", "value": "" }, { "key": "maxspeed", - "description": "Layer 'Cycleways and roads' shows and asks freeform values for key 'maxspeed' (in the mapcomplete.org theme 'Personal theme') (This is only shown if highway!=cycleway&highway!=path&highway!=footway&highway!=pedestrian)" + "description": "Layer 'Cycleways and roads' shows and asks freeform values for key 'maxspeed' (in the mapcomplete.org theme 'Personal theme') (This is only shown if highway!=cycleway &highway!=path &highway!=footway &highway!=pedestrian)" }, { "key": "maxspeed", - "description": "Layer 'Cycleways and roads' shows maxspeed=20 with a fixed text, namely 'The maximum speed is 20 km/h' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if highway!=cycleway&highway!=path&highway!=footway&highway!=pedestrian)", + "description": "Layer 'Cycleways and roads' shows maxspeed=20 with a fixed text, namely 'The maximum speed is 20 km/h' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if highway!=cycleway &highway!=path &highway!=footway &highway!=pedestrian)", "value": "20" }, { "key": "maxspeed", - "description": "Layer 'Cycleways and roads' shows maxspeed=30 with a fixed text, namely 'The maximum speed is 30 km/h' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if highway!=cycleway&highway!=path&highway!=footway&highway!=pedestrian)", + "description": "Layer 'Cycleways and roads' shows maxspeed=30 with a fixed text, namely 'The maximum speed is 30 km/h' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if highway!=cycleway &highway!=path &highway!=footway &highway!=pedestrian)", "value": "30" }, { "key": "maxspeed", - "description": "Layer 'Cycleways and roads' shows maxspeed=50 with a fixed text, namely 'The maximum speed is 50 km/h' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if highway!=cycleway&highway!=path&highway!=footway&highway!=pedestrian)", + "description": "Layer 'Cycleways and roads' shows maxspeed=50 with a fixed text, namely 'The maximum speed is 50 km/h' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if highway!=cycleway &highway!=path &highway!=footway &highway!=pedestrian)", "value": "50" }, { "key": "maxspeed", - "description": "Layer 'Cycleways and roads' shows maxspeed=70 with a fixed text, namely 'The maximum speed is 70 km/h' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if highway!=cycleway&highway!=path&highway!=footway&highway!=pedestrian)", + "description": "Layer 'Cycleways and roads' shows maxspeed=70 with a fixed text, namely 'The maximum speed is 70 km/h' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if highway!=cycleway &highway!=path &highway!=footway &highway!=pedestrian)", "value": "70" }, { "key": "maxspeed", - "description": "Layer 'Cycleways and roads' shows maxspeed=90 with a fixed text, namely 'The maximum speed is 90 km/h' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if highway!=cycleway&highway!=path&highway!=footway&highway!=pedestrian)", + "description": "Layer 'Cycleways and roads' shows maxspeed=90 with a fixed text, namely 'The maximum speed is 90 km/h' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if highway!=cycleway &highway!=path &highway!=footway &highway!=pedestrian)", "value": "90" }, { "key": "cycleway:surface", - "description": "Layer 'Cycleways and roads' shows and asks freeform values for key 'cycleway:surface' (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)" + "description": "Layer 'Cycleways and roads' shows and asks freeform values for key 'cycleway:surface' (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)" }, { "key": "cycleway:surface", - "description": "Layer 'Cycleways and roads' shows cycleway:surface=unpaved with a fixed text, namely 'This cycleway is unpaved' (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:surface=unpaved with a fixed text, namely 'This cycleway is unpaved' (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "unpaved" }, { "key": "cycleway:surface", - "description": "Layer 'Cycleways and roads' shows cycleway:surface=paved with a fixed text, namely 'This cycleway is paved' (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:surface=paved with a fixed text, namely 'This cycleway is paved' (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "paved" }, { "key": "cycleway:surface", - "description": "Layer 'Cycleways and roads' shows cycleway:surface=asphalt with a fixed text, namely 'This cycleway is made of asphalt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:surface=asphalt with a fixed text, namely 'This cycleway is made of asphalt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "asphalt" }, { "key": "cycleway:surface", - "description": "Layer 'Cycleways and roads' shows cycleway:surface=paving_stones with a fixed text, namely 'This cycleway is made of smooth paving stones' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:surface=paving_stones with a fixed text, namely 'This cycleway is made of smooth paving stones' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "paving_stones" }, { "key": "cycleway:surface", - "description": "Layer 'Cycleways and roads' shows cycleway:surface=concrete with a fixed text, namely 'This cycleway is made of concrete' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:surface=concrete with a fixed text, namely 'This cycleway is made of concrete' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "concrete" }, { "key": "cycleway:surface", - "description": "Layer 'Cycleways and roads' shows cycleway:surface=cobblestone with a fixed text, namely 'This cycleway is made of cobblestone (unhewn or sett)' (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:surface=cobblestone with a fixed text, namely 'This cycleway is made of cobblestone (unhewn or sett)' (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "cobblestone" }, { "key": "cycleway:surface", - "description": "Layer 'Cycleways and roads' shows cycleway:surface=unhewn_cobblestone with a fixed text, namely 'This cycleway is made of raw, natural cobblestone' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:surface=unhewn_cobblestone with a fixed text, namely 'This cycleway is made of raw, natural cobblestone' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "unhewn_cobblestone" }, { "key": "cycleway:surface", - "description": "Layer 'Cycleways and roads' shows cycleway:surface=sett with a fixed text, namely 'This cycleway is made of flat, square cobblestone' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:surface=sett with a fixed text, namely 'This cycleway is made of flat, square cobblestone' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "sett" }, { "key": "cycleway:surface", - "description": "Layer 'Cycleways and roads' shows cycleway:surface=wood with a fixed text, namely 'This cycleway is made of wood' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:surface=wood with a fixed text, namely 'This cycleway is made of wood' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "wood" }, { "key": "cycleway:surface", - "description": "Layer 'Cycleways and roads' shows cycleway:surface=gravel with a fixed text, namely 'This cycleway is made of gravel' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:surface=gravel with a fixed text, namely 'This cycleway is made of gravel' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "gravel" }, { "key": "cycleway:surface", - "description": "Layer 'Cycleways and roads' shows cycleway:surface=fine_gravel with a fixed text, namely 'This cycleway is made of fine gravel' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:surface=fine_gravel with a fixed text, namely 'This cycleway is made of fine gravel' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "fine_gravel" }, { "key": "cycleway:surface", - "description": "Layer 'Cycleways and roads' shows cycleway:surface=pebblestone with a fixed text, namely 'This cycleway is made of pebblestone' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:surface=pebblestone with a fixed text, namely 'This cycleway is made of pebblestone' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "pebblestone" }, { "key": "cycleway:surface", - "description": "Layer 'Cycleways and roads' shows cycleway:surface=ground with a fixed text, namely 'This cycleway is made from raw ground' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:surface=ground with a fixed text, namely 'This cycleway is made from raw ground' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "ground" }, { "key": "cycleway:smoothness", - "description": "Layer 'Cycleways and roads' shows cycleway:smoothness=excellent with a fixed text, namely 'Usable for thin rollers: rollerblade, skateboard' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:smoothness=excellent with a fixed text, namely 'Usable for thin rollers: rollerblade, skateboard' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "excellent" }, { "key": "cycleway:smoothness", - "description": "Layer 'Cycleways and roads' shows cycleway:smoothness=good with a fixed text, namely 'Usable for thin wheels: racing bike' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:smoothness=good with a fixed text, namely 'Usable for thin wheels: racing bike' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "good" }, { "key": "cycleway:smoothness", - "description": "Layer 'Cycleways and roads' shows cycleway:smoothness=intermediate with a fixed text, namely 'Usable for normal wheels: city bike, wheelchair, scooter' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:smoothness=intermediate with a fixed text, namely 'Usable for normal wheels: city bike, wheelchair, scooter' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "intermediate" }, { "key": "cycleway:smoothness", - "description": "Layer 'Cycleways and roads' shows cycleway:smoothness=bad with a fixed text, namely 'Usable for robust wheels: trekking bike, car, rickshaw' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:smoothness=bad with a fixed text, namely 'Usable for robust wheels: trekking bike, car, rickshaw' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "bad" }, { "key": "cycleway:smoothness", - "description": "Layer 'Cycleways and roads' shows cycleway:smoothness=very_bad with a fixed text, namely 'Usable for vehicles with high clearance: light duty off-road vehicle' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:smoothness=very_bad with a fixed text, namely 'Usable for vehicles with high clearance: light duty off-road vehicle' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "very_bad" }, { "key": "cycleway:smoothness", - "description": "Layer 'Cycleways and roads' shows cycleway:smoothness=horrible with a fixed text, namely 'Usable for off-road vehicles: heavy duty off-road vehicle' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:smoothness=horrible with a fixed text, namely 'Usable for off-road vehicles: heavy duty off-road vehicle' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "horrible" }, { "key": "cycleway:smoothness", - "description": "Layer 'Cycleways and roads' shows cycleway:smoothness=very_horrible with a fixed text, namely 'Usable for specialized off-road vehicles: tractor, ATV' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:smoothness=very_horrible with a fixed text, namely 'Usable for specialized off-road vehicles: tractor, ATV' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "very_horrible" }, { "key": "cycleway:smoothness", - "description": "Layer 'Cycleways and roads' shows cycleway:smoothness=impassable with a fixed text, namely 'Impassable / No wheeled vehicle' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=shared_lane|cycleway=lane|cycleway=track)", + "description": "Layer 'Cycleways and roads' shows cycleway:smoothness=impassable with a fixed text, namely 'Impassable / No wheeled vehicle' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=shared_lane |cycleway=lane |cycleway=track)", "value": "impassable" }, { @@ -5556,188 +5556,188 @@ }, { "key": "smoothness", - "description": "Layer 'Cycleways and roads' shows smoothness=excellent with a fixed text, namely 'Usable for thin rollers: rollerblade, skateboard' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=no|highway=cycleway)", + "description": "Layer 'Cycleways and roads' shows smoothness=excellent with a fixed text, namely 'Usable for thin rollers: rollerblade, skateboard' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=no |highway=cycleway)", "value": "excellent" }, { "key": "smoothness", - "description": "Layer 'Cycleways and roads' shows smoothness=good with a fixed text, namely 'Usable for thin wheels: racing bike' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=no|highway=cycleway)", + "description": "Layer 'Cycleways and roads' shows smoothness=good with a fixed text, namely 'Usable for thin wheels: racing bike' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=no |highway=cycleway)", "value": "good" }, { "key": "smoothness", - "description": "Layer 'Cycleways and roads' shows smoothness=intermediate with a fixed text, namely 'Usable for normal wheels: city bike, wheelchair, scooter' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=no|highway=cycleway)", + "description": "Layer 'Cycleways and roads' shows smoothness=intermediate with a fixed text, namely 'Usable for normal wheels: city bike, wheelchair, scooter' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=no |highway=cycleway)", "value": "intermediate" }, { "key": "smoothness", - "description": "Layer 'Cycleways and roads' shows smoothness=bad with a fixed text, namely 'Usable for robust wheels: trekking bike, car, rickshaw' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=no|highway=cycleway)", + "description": "Layer 'Cycleways and roads' shows smoothness=bad with a fixed text, namely 'Usable for robust wheels: trekking bike, car, rickshaw' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=no |highway=cycleway)", "value": "bad" }, { "key": "smoothness", - "description": "Layer 'Cycleways and roads' shows smoothness=very_bad with a fixed text, namely 'Usable for vehicles with high clearance: light duty off-road vehicle' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=no|highway=cycleway)", + "description": "Layer 'Cycleways and roads' shows smoothness=very_bad with a fixed text, namely 'Usable for vehicles with high clearance: light duty off-road vehicle' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=no |highway=cycleway)", "value": "very_bad" }, { "key": "smoothness", - "description": "Layer 'Cycleways and roads' shows smoothness=horrible with a fixed text, namely 'Usable for off-road vehicles: heavy duty off-road vehicle' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=no|highway=cycleway)", + "description": "Layer 'Cycleways and roads' shows smoothness=horrible with a fixed text, namely 'Usable for off-road vehicles: heavy duty off-road vehicle' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=no |highway=cycleway)", "value": "horrible" }, { "key": "smoothness", - "description": "Layer 'Cycleways and roads' shows smoothness=very_horrible with a fixed text, namely 'Usable for specialized off-road vehicles: tractor, ATV' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=no|highway=cycleway)", + "description": "Layer 'Cycleways and roads' shows smoothness=very_horrible with a fixed text, namely 'Usable for specialized off-road vehicles: tractor, ATV' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=no |highway=cycleway)", "value": "very_horrible" }, { "key": "smoothness", - "description": "Layer 'Cycleways and roads' shows smoothness=impassable with a fixed text, namely 'Impassable / No wheeled vehicle' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=no|highway=cycleway)", + "description": "Layer 'Cycleways and roads' shows smoothness=impassable with a fixed text, namely 'Impassable / No wheeled vehicle' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=no |highway=cycleway)", "value": "impassable" }, { "key": "width:carriageway", - "description": "Layer 'Cycleways and roads' shows and asks freeform values for key 'width:carriageway' (in the mapcomplete.org theme 'Personal theme') (This is only shown if highway!=cycleway&highway!=path&highway!=footway)" + "description": "Layer 'Cycleways and roads' shows and asks freeform values for key 'width:carriageway' (in the mapcomplete.org theme 'Personal theme') (This is only shown if highway!=cycleway &highway!=path &highway!=footway)" }, { "key": "cycleway:traffic_sign", - "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7 with a fixed text, namely 'Compulsory cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=lane|cycleway=track&_country=be)", + "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7 with a fixed text, namely 'Compulsory cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=lane |cycleway=track &_country=be)", "value": "BE:D7" }, { "key": "cycleway:traffic_sign", - "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign~^(BE:D7;.*)$ with a fixed text, namely 'Compulsory cycleway (with supplementary sign)
' (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=lane|cycleway=track&_country=be)" + "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign~^(BE:D7;.*)$ with a fixed text, namely 'Compulsory cycleway (with supplementary sign)
' (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=lane |cycleway=track &_country=be)" }, { "key": "cycleway:traffic_sign", - "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D9 with a fixed text, namely 'Segregated foot/cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=lane|cycleway=track&_country=be)", + "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D9 with a fixed text, namely 'Segregated foot/cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=lane |cycleway=track &_country=be)", "value": "BE:D9" }, { "key": "cycleway:traffic_sign", - "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D10 with a fixed text, namely 'Unsegregated foot/cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=lane|cycleway=track&_country=be)", + "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D10 with a fixed text, namely 'Unsegregated foot/cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=lane |cycleway=track &_country=be)", "value": "BE:D10" }, { "key": "cycleway:traffic_sign", - "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=none with a fixed text, namely 'No traffic sign present' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=lane|cycleway=track&_country=be)", + "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=none with a fixed text, namely 'No traffic sign present' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=lane |cycleway=track &_country=be)", "value": "none" }, { "key": "traffic_sign", - "description": "Layer 'Cycleways and roads' shows traffic_sign=BE:D7 with a fixed text, namely 'Compulsory cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if highway=cycleway|highway=path&_country=be|_country=nl)", + "description": "Layer 'Cycleways and roads' shows traffic_sign=BE:D7 with a fixed text, namely 'Compulsory cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if highway=cycleway |highway=path &_country=be |_country=nl)", "value": "BE:D7" }, { "key": "traffic_sign", - "description": "Layer 'Cycleways and roads' shows traffic_sign~^(BE:D7;.*)$ with a fixed text, namely 'Compulsory cycleway (with supplementary sign)
' (in the mapcomplete.org theme 'Personal theme') (This is only shown if highway=cycleway|highway=path&_country=be|_country=nl)" + "description": "Layer 'Cycleways and roads' shows traffic_sign~^(BE:D7;.*)$ with a fixed text, namely 'Compulsory cycleway (with supplementary sign)
' (in the mapcomplete.org theme 'Personal theme') (This is only shown if highway=cycleway |highway=path &_country=be |_country=nl)" }, { "key": "traffic_sign", - "description": "Layer 'Cycleways and roads' shows traffic_sign=BE:D9 with a fixed text, namely 'Segregated foot/cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if highway=cycleway|highway=path&_country=be|_country=nl)", + "description": "Layer 'Cycleways and roads' shows traffic_sign=BE:D9 with a fixed text, namely 'Segregated foot/cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if highway=cycleway |highway=path &_country=be |_country=nl)", "value": "BE:D9" }, { "key": "traffic_sign", - "description": "Layer 'Cycleways and roads' shows traffic_sign=BE:D10 with a fixed text, namely 'Unsegregated foot/cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if highway=cycleway|highway=path&_country=be|_country=nl)", + "description": "Layer 'Cycleways and roads' shows traffic_sign=BE:D10 with a fixed text, namely 'Unsegregated foot/cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if highway=cycleway |highway=path &_country=be |_country=nl)", "value": "BE:D10" }, { "key": "traffic_sign", - "description": "Layer 'Cycleways and roads' shows traffic_sign=NL:G11 with a fixed text, namely 'Compulsory cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if highway=cycleway|highway=path&_country=be|_country=nl)", + "description": "Layer 'Cycleways and roads' shows traffic_sign=NL:G11 with a fixed text, namely 'Compulsory cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if highway=cycleway |highway=path &_country=be |_country=nl)", "value": "NL:G11" }, { "key": "traffic_sign", - "description": "Layer 'Cycleways and roads' shows traffic_sign=NL:G12a with a fixed text, namely 'Compulsory (moped)cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if highway=cycleway|highway=path&_country=be|_country=nl)", + "description": "Layer 'Cycleways and roads' shows traffic_sign=NL:G12a with a fixed text, namely 'Compulsory (moped)cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if highway=cycleway |highway=path &_country=be |_country=nl)", "value": "NL:G12a" }, { "key": "traffic_sign", - "description": "Layer 'Cycleways and roads' shows traffic_sign=NL:G13 with a fixed text, namely 'Non-compulsory cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if highway=cycleway|highway=path&_country=be|_country=nl)", + "description": "Layer 'Cycleways and roads' shows traffic_sign=NL:G13 with a fixed text, namely 'Non-compulsory cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if highway=cycleway |highway=path &_country=be |_country=nl)", "value": "NL:G13" }, { "key": "traffic_sign", - "description": "Layer 'Cycleways and roads' shows traffic_sign=none with a fixed text, namely 'No traffic sign present' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if highway=cycleway|highway=path&_country=be|_country=nl)", + "description": "Layer 'Cycleways and roads' shows traffic_sign=none with a fixed text, namely 'No traffic sign present' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if highway=cycleway |highway=path &_country=be |_country=nl)", "value": "none" }, { "key": "cycleway:traffic_sign", - "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7;BE:M6 with a fixed text, namely 'Mopeds must use the cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway:traffic_sign=BE:D7|cycleway:traffic_sign~^(BE:D7;.*)$)", + "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7;BE:M6 with a fixed text, namely 'Mopeds must use the cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway:traffic_sign=BE:D7 |cycleway:traffic_sign~^(BE:D7;.*)$)", "value": "BE:D7;BE:M6" }, { "key": "cycleway:traffic_sign", - "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7;BE:M13 with a fixed text, namely 'Speedpedelecs must use the cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway:traffic_sign=BE:D7|cycleway:traffic_sign~^(BE:D7;.*)$)", + "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7;BE:M13 with a fixed text, namely 'Speedpedelecs must use the cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway:traffic_sign=BE:D7 |cycleway:traffic_sign~^(BE:D7;.*)$)", "value": "BE:D7;BE:M13" }, { "key": "cycleway:traffic_sign", - "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7;BE:M14 with a fixed text, namely 'Mopeds and speedpedelecs must use the cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway:traffic_sign=BE:D7|cycleway:traffic_sign~^(BE:D7;.*)$)", + "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7;BE:M14 with a fixed text, namely 'Mopeds and speedpedelecs must use the cycleway' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway:traffic_sign=BE:D7 |cycleway:traffic_sign~^(BE:D7;.*)$)", "value": "BE:D7;BE:M14" }, { "key": "cycleway:traffic_sign", - "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7;BE:M7 with a fixed text, namely 'Mopeds are not allowed' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway:traffic_sign=BE:D7|cycleway:traffic_sign~^(BE:D7;.*)$)", + "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7;BE:M7 with a fixed text, namely 'Mopeds are not allowed' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway:traffic_sign=BE:D7 |cycleway:traffic_sign~^(BE:D7;.*)$)", "value": "BE:D7;BE:M7" }, { "key": "cycleway:traffic_sign", - "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7;BE:M15 with a fixed text, namely 'Speedpedelecs are not allowed' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway:traffic_sign=BE:D7|cycleway:traffic_sign~^(BE:D7;.*)$)", + "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7;BE:M15 with a fixed text, namely 'Speedpedelecs are not allowed' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway:traffic_sign=BE:D7 |cycleway:traffic_sign~^(BE:D7;.*)$)", "value": "BE:D7;BE:M15" }, { "key": "cycleway:traffic_sign", - "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7;BE:M16 with a fixed text, namely 'Mopeds and speedpedelecs are not allowed' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway:traffic_sign=BE:D7|cycleway:traffic_sign~^(BE:D7;.*)$)", + "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7;BE:M16 with a fixed text, namely 'Mopeds and speedpedelecs are not allowed' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway:traffic_sign=BE:D7 |cycleway:traffic_sign~^(BE:D7;.*)$)", "value": "BE:D7;BE:M16" }, { "key": "cycleway:traffic_sign:supplementary", - "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign:supplementary=none with a fixed text, namely 'No supplementary traffic sign present' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway:traffic_sign=BE:D7|cycleway:traffic_sign~^(BE:D7;.*)$)", + "description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign:supplementary=none with a fixed text, namely 'No supplementary traffic sign present' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway:traffic_sign=BE:D7 |cycleway:traffic_sign~^(BE:D7;.*)$)", "value": "none" }, { "key": "cycleway:buffer", - "description": "Layer 'Cycleways and roads' shows and asks freeform values for key 'cycleway:buffer' (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=track|cycleway=lane)" + "description": "Layer 'Cycleways and roads' shows and asks freeform values for key 'cycleway:buffer' (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=track |cycleway=lane)" }, { "key": "cycleway:separation", - "description": "Layer 'Cycleways and roads' shows cycleway:separation=dashed_line with a fixed text, namely 'This cycleway is separated by a dashed line' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=track|cycleway=lane)", + "description": "Layer 'Cycleways and roads' shows cycleway:separation=dashed_line with a fixed text, namely 'This cycleway is separated by a dashed line' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=track |cycleway=lane)", "value": "dashed_line" }, { "key": "cycleway:separation", - "description": "Layer 'Cycleways and roads' shows cycleway:separation=solid_line with a fixed text, namely 'This cycleway is separated by a solid line' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=track|cycleway=lane)", + "description": "Layer 'Cycleways and roads' shows cycleway:separation=solid_line with a fixed text, namely 'This cycleway is separated by a solid line' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=track |cycleway=lane)", "value": "solid_line" }, { "key": "cycleway:separation", - "description": "Layer 'Cycleways and roads' shows cycleway:separation=parking_lane with a fixed text, namely 'This cycleway is separated by a parking lane' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=track|cycleway=lane)", + "description": "Layer 'Cycleways and roads' shows cycleway:separation=parking_lane with a fixed text, namely 'This cycleway is separated by a parking lane' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=track |cycleway=lane)", "value": "parking_lane" }, { "key": "cycleway:separation", - "description": "Layer 'Cycleways and roads' shows cycleway:separation=kerb with a fixed text, namely 'This cycleway is separated by a kerb' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=track|cycleway=lane)", + "description": "Layer 'Cycleways and roads' shows cycleway:separation=kerb with a fixed text, namely 'This cycleway is separated by a kerb' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if cycleway=track |cycleway=lane)", "value": "kerb" }, { "key": "separation", - "description": "Layer 'Cycleways and roads' shows separation=dashed_line with a fixed text, namely 'This cycleway is separated by a dashed line' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if highway=cycleway|highway=path)", + "description": "Layer 'Cycleways and roads' shows separation=dashed_line with a fixed text, namely 'This cycleway is separated by a dashed line' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if highway=cycleway |highway=path)", "value": "dashed_line" }, { "key": "separation", - "description": "Layer 'Cycleways and roads' shows separation=solid_line with a fixed text, namely 'This cycleway is separated by a solid line' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if highway=cycleway|highway=path)", + "description": "Layer 'Cycleways and roads' shows separation=solid_line with a fixed text, namely 'This cycleway is separated by a solid line' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if highway=cycleway |highway=path)", "value": "solid_line" }, { "key": "separation", - "description": "Layer 'Cycleways and roads' shows separation=parking_lane with a fixed text, namely 'This cycleway is separated by a parking lane' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if highway=cycleway|highway=path)", + "description": "Layer 'Cycleways and roads' shows separation=parking_lane with a fixed text, namely 'This cycleway is separated by a parking lane' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if highway=cycleway |highway=path)", "value": "parking_lane" }, { "key": "separation", - "description": "Layer 'Cycleways and roads' shows separation=kerb with a fixed text, namely 'This cycleway is separated by a kerb' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if highway=cycleway|highway=path)", + "description": "Layer 'Cycleways and roads' shows separation=kerb with a fixed text, namely 'This cycleway is separated by a kerb' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if highway=cycleway |highway=path)", "value": "kerb" }, { @@ -5747,7 +5747,7 @@ }, { "key": "id", - "description": "Layer 'Defibrillators' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Defibrillators' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -5914,7 +5914,7 @@ }, { "key": "id", - "description": "Layer 'Dentist' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Dentist' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -5971,7 +5971,7 @@ }, { "key": "id", - "description": "Layer 'Doctors' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Doctors' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -6071,7 +6071,7 @@ }, { "key": "id", - "description": "Layer 'dog parks' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'dog parks' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "barrier", @@ -6125,7 +6125,7 @@ }, { "key": "id", - "description": "Layer 'Drinking water' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Drinking water' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -6179,7 +6179,7 @@ }, { "key": "id", - "description": "Layer 'Elevator' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Elevator' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -6300,7 +6300,7 @@ }, { "key": "id", - "description": "Layer 'Penny Presses' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Penny Presses' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -6368,37 +6368,37 @@ }, { "key": "payment:cash", - "description": "Layer 'Penny Presses' shows payment:cash=yes with a fixed text, namely 'Cash is accepted here' (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=yes|)", + "description": "Layer 'Penny Presses' shows payment:cash=yes with a fixed text, namely 'Cash is accepted here' (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=yes |)", "value": "yes" }, { "key": "payment:cards", - "description": "Layer 'Penny Presses' shows payment:cards=yes with a fixed text, namely 'Payment cards are accepted here' (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=yes|)", + "description": "Layer 'Penny Presses' shows payment:cards=yes with a fixed text, namely 'Payment cards are accepted here' (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=yes |)", "value": "yes" }, { "key": "payment:qr_code", - "description": "Layer 'Penny Presses' shows payment:qr_code=yes with a fixed text, namely 'Payment by QR-code is possible here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=yes|)", + "description": "Layer 'Penny Presses' shows payment:qr_code=yes with a fixed text, namely 'Payment by QR-code is possible here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=yes |)", "value": "yes" }, { "key": "payment:coins", - "description": "Layer 'Penny Presses' shows payment:coins=yes with a fixed text, namely 'Coins are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=yes|)", + "description": "Layer 'Penny Presses' shows payment:coins=yes with a fixed text, namely 'Coins are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=yes |)", "value": "yes" }, { "key": "payment:notes", - "description": "Layer 'Penny Presses' shows payment:notes=yes with a fixed text, namely 'Bank notes are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=yes|)", + "description": "Layer 'Penny Presses' shows payment:notes=yes with a fixed text, namely 'Bank notes are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=yes |)", "value": "yes" }, { "key": "payment:debit_cards", - "description": "Layer 'Penny Presses' shows payment:debit_cards=yes with a fixed text, namely 'Debit cards are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=yes|)", + "description": "Layer 'Penny Presses' shows payment:debit_cards=yes with a fixed text, namely 'Debit cards are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=yes |)", "value": "yes" }, { "key": "payment:credit_cards", - "description": "Layer 'Penny Presses' shows payment:credit_cards=yes with a fixed text, namely 'Credit cards are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=yes|)", + "description": "Layer 'Penny Presses' shows payment:credit_cards=yes with a fixed text, namely 'Credit cards are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=yes |)", "value": "yes" }, { @@ -6450,101 +6450,101 @@ }, { "key": "charge", - "description": "Layer 'Penny Presses' shows and asks freeform values for key 'charge' (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=yes|)" + "description": "Layer 'Penny Presses' shows and asks freeform values for key 'charge' (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=yes |)" }, { "key": "charge", - "description": "Layer 'Penny Presses' shows charge=1 EUR with a fixed text, namely 'It costs 1 euro to press a penny.' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=yes|)", + "description": "Layer 'Penny Presses' shows charge=1 EUR with a fixed text, namely 'It costs 1 euro to press a penny.' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=yes |)", "value": "1 EUR" }, { "key": "charge", - "description": "Layer 'Penny Presses' shows charge=2 EUR with a fixed text, namely 'It costs 2 euros to press a penny.' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=yes|)", + "description": "Layer 'Penny Presses' shows charge=2 EUR with a fixed text, namely 'It costs 2 euros to press a penny.' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=yes |)", "value": "2 EUR" }, { "key": "charge", - "description": "Layer 'Penny Presses' shows charge=2 CHF with a fixed text, namely 'It costs 2 Swiss francs to press a penny.' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=yes|)", + "description": "Layer 'Penny Presses' shows charge=2 CHF with a fixed text, namely 'It costs 2 Swiss francs to press a penny.' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=yes |)", "value": "2 CHF" }, { "key": "charge", - "description": "Layer 'Penny Presses' shows charge=1 CHF with a fixed text, namely 'It costs 1 Swiss franc to press a penny.' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=yes|)", + "description": "Layer 'Penny Presses' shows charge=1 CHF with a fixed text, namely 'It costs 1 Swiss franc to press a penny.' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=yes |)", "value": "1 CHF" }, { "key": "payment:coins:denominations", - "description": "Layer 'Penny Presses' shows payment:coins:denominations=0.01 EUR with a fixed text, namely '1 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Penny Presses' shows payment:coins:denominations=0.01 EUR with a fixed text, namely '1 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.01 EUR" }, { "key": "payment:coins:denominations", - "description": "Layer 'Penny Presses' shows payment:coins:denominations=0.02 EUR with a fixed text, namely '2 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Penny Presses' shows payment:coins:denominations=0.02 EUR with a fixed text, namely '2 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.02 EUR" }, { "key": "payment:coins:denominations", - "description": "Layer 'Penny Presses' shows payment:coins:denominations=0.05 EUR with a fixed text, namely '5 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Penny Presses' shows payment:coins:denominations=0.05 EUR with a fixed text, namely '5 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.05 EUR" }, { "key": "payment:coins:denominations", - "description": "Layer 'Penny Presses' shows payment:coins:denominations=0.10 EUR with a fixed text, namely '10 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Penny Presses' shows payment:coins:denominations=0.10 EUR with a fixed text, namely '10 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.10 EUR" }, { "key": "payment:coins:denominations", - "description": "Layer 'Penny Presses' shows payment:coins:denominations=0.20 EUR with a fixed text, namely '20 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Penny Presses' shows payment:coins:denominations=0.20 EUR with a fixed text, namely '20 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.20 EUR" }, { "key": "payment:coins:denominations", - "description": "Layer 'Penny Presses' shows payment:coins:denominations=0.50 EUR with a fixed text, namely '50 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Penny Presses' shows payment:coins:denominations=0.50 EUR with a fixed text, namely '50 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.50 EUR" }, { "key": "payment:coins:denominations", - "description": "Layer 'Penny Presses' shows payment:coins:denominations=1 EUR with a fixed text, namely '1 euro coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Penny Presses' shows payment:coins:denominations=1 EUR with a fixed text, namely '1 euro coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "1 EUR" }, { "key": "payment:coins:denominations", - "description": "Layer 'Penny Presses' shows payment:coins:denominations=2 EUR with a fixed text, namely '2 euro coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Penny Presses' shows payment:coins:denominations=2 EUR with a fixed text, namely '2 euro coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "2 EUR" }, { "key": "payment:coins:denominations", - "description": "Layer 'Penny Presses' shows payment:coins:denominations=0.05 CHF with a fixed text, namely '5 centimes coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Penny Presses' shows payment:coins:denominations=0.05 CHF with a fixed text, namely '5 centimes coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.05 CHF" }, { "key": "payment:coins:denominations", - "description": "Layer 'Penny Presses' shows payment:coins:denominations=0.10 CHF with a fixed text, namely '10 centimes coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Penny Presses' shows payment:coins:denominations=0.10 CHF with a fixed text, namely '10 centimes coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.10 CHF" }, { "key": "payment:coins:denominations", - "description": "Layer 'Penny Presses' shows payment:coins:denominations=0.20 CHF with a fixed text, namely '20 centimes coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Penny Presses' shows payment:coins:denominations=0.20 CHF with a fixed text, namely '20 centimes coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.20 CHF" }, { "key": "payment:coins:denominations", - "description": "Layer 'Penny Presses' shows payment:coins:denominations=0.50 CHF with a fixed text, namely '½ franc coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Penny Presses' shows payment:coins:denominations=0.50 CHF with a fixed text, namely '½ franc coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.50 CHF" }, { "key": "payment:coins:denominations", - "description": "Layer 'Penny Presses' shows payment:coins:denominations=1 CHF with a fixed text, namely '1 franc coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Penny Presses' shows payment:coins:denominations=1 CHF with a fixed text, namely '1 franc coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "1 CHF" }, { "key": "payment:coins:denominations", - "description": "Layer 'Penny Presses' shows payment:coins:denominations=2 CHF with a fixed text, namely '2 francs coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Penny Presses' shows payment:coins:denominations=2 CHF with a fixed text, namely '2 francs coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "2 CHF" }, { "key": "payment:coins:denominations", - "description": "Layer 'Penny Presses' shows payment:coins:denominations=5 CHF with a fixed text, namely '5 francs coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Penny Presses' shows payment:coins:denominations=5 CHF with a fixed text, namely '5 francs coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "5 CHF" }, { @@ -6610,7 +6610,7 @@ }, { "key": "id", - "description": "Layer 'Entrance' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Entrance' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -6840,7 +6840,7 @@ }, { "key": "id", - "description": "Layer 'Has etymology' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Has etymology' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -6864,11 +6864,11 @@ }, { "key": "name:etymology", - "description": "Layer 'Has etymology' shows and asks freeform values for key 'name:etymology' (in the mapcomplete.org theme 'Personal theme') (This is only shown if name:etymology~.+|)" + "description": "Layer 'Has etymology' shows and asks freeform values for key 'name:etymology' (in the mapcomplete.org theme 'Personal theme') (This is only shown if name:etymology~.+ |)" }, { "key": "name:etymology", - "description": "Layer 'Has etymology' shows name:etymology=unknown with a fixed text, namely 'The origin of this name is unknown in all literature' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if name:etymology~.+|)", + "description": "Layer 'Has etymology' shows name:etymology=unknown with a fixed text, namely 'The origin of this name is unknown in all literature' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if name:etymology~.+ |)", "value": "unknown" }, { @@ -6894,7 +6894,7 @@ }, { "key": "id", - "description": "Layer 'Map of fire extinguishers' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Map of fire extinguishers' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "location", @@ -6933,7 +6933,7 @@ }, { "key": "id", - "description": "Layer 'Map of fire stations' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Map of fire stations' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "name", @@ -6953,12 +6953,12 @@ }, { "key": "operator", - "description": "Layer 'Map of fire stations' shows operator=Bureau of Fire Protection&operator:type=government with a fixed text, namely 'Bureau of Fire Protection' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "description": "Layer 'Map of fire stations' shows operator=Bureau of Fire Protection &operator:type=government with a fixed text, namely 'Bureau of Fire Protection' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", "value": "Bureau of Fire Protection" }, { "key": "operator:type", - "description": "Layer 'Map of fire stations' shows operator=Bureau of Fire Protection&operator:type=government with a fixed text, namely 'Bureau of Fire Protection' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "description": "Layer 'Map of fire stations' shows operator=Bureau of Fire Protection &operator:type=government with a fixed text, namely 'Bureau of Fire Protection' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", "value": "government" }, { @@ -7008,7 +7008,7 @@ }, { "key": "id", - "description": "Layer 'Fitness Centres' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Fitness Centres' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "name", @@ -7119,7 +7119,7 @@ }, { "key": "id", - "description": "Layer 'Fitness Stations' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Fitness Stations' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -7294,7 +7294,7 @@ }, { "key": "id", - "description": "Layer 'OSM objects with FIXME tags' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'OSM objects with FIXME tags' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "fixme", @@ -7317,7 +7317,7 @@ }, { "key": "id", - "description": "Layer 'Restaurants and fast food' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Restaurants and fast food' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -7837,17 +7837,17 @@ }, { "key": "internet_access:fee", - "description": "Layer 'Restaurants and fast food' shows internet_access:fee=yes with a fixed text, namely 'There is a fee for the internet access at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if internet_access!=no&internet_access~.+)", + "description": "Layer 'Restaurants and fast food' shows internet_access:fee=yes with a fixed text, namely 'There is a fee for the internet access at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if internet_access!=no &internet_access~.+)", "value": "yes" }, { "key": "internet_access:fee", - "description": "Layer 'Restaurants and fast food' shows internet_access:fee=no with a fixed text, namely 'Internet access is free at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if internet_access!=no&internet_access~.+)", + "description": "Layer 'Restaurants and fast food' shows internet_access:fee=no with a fixed text, namely 'Internet access is free at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if internet_access!=no &internet_access~.+)", "value": "no" }, { "key": "internet_access:fee", - "description": "Layer 'Restaurants and fast food' shows internet_access:fee=customers with a fixed text, namely 'Internet access is free at this place, for customers only' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if internet_access!=no&internet_access~.+)", + "description": "Layer 'Restaurants and fast food' shows internet_access:fee=customers with a fixed text, namely 'Internet access is free at this place, for customers only' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if internet_access!=no &internet_access~.+)", "value": "customers" }, { @@ -7866,7 +7866,7 @@ }, { "key": "id", - "description": "Layer 'Ghost bikes' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Ghost bikes' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -7916,7 +7916,7 @@ }, { "key": "id", - "description": "Layer 'governments' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'governments' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -7969,7 +7969,7 @@ }, { "key": "id", - "description": "Layer 'Guideposts' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Guideposts' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -7987,6 +7987,31 @@ "key": "wikipedia", "description": "The layer 'Guideposts allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" }, + { + "key": "bicycle", + "description": "Layer 'Guideposts' shows bicycle=yes with a fixed text, namely 'This guidepost shows bicycle routes' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "yes" + }, + { + "key": "hiking", + "description": "Layer 'Guideposts' shows hiking=yes with a fixed text, namely 'This guidepost shows hiking routes' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "yes" + }, + { + "key": "mtb", + "description": "Layer 'Guideposts' shows mtb=yes with a fixed text, namely 'This guidepost shows mountain bike routes' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "yes" + }, + { + "key": "horse", + "description": "Layer 'Guideposts' shows horse=yes with a fixed text, namely 'This guidepost shows horse riding routes' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "yes" + }, + { + "key": "ski", + "description": "Layer 'Guideposts' shows ski=yes with a fixed text, namely 'This guidepost shows ski routes' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "yes" + }, { "key": "leisure", "description": "The MapComplete theme Personal theme has a layer Hackerspace showing features with this tag", @@ -7994,7 +8019,7 @@ }, { "key": "id", - "description": "Layer 'Hackerspace' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Hackerspace' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -8168,7 +8193,7 @@ }, { "key": "id", - "description": "Layer 'Hospitals' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Hospitals' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "name", @@ -8219,7 +8244,7 @@ }, { "key": "id", - "description": "Layer 'Hotels' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Hotels' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -8312,17 +8337,17 @@ }, { "key": "internet_access:fee", - "description": "Layer 'Hotels' shows internet_access:fee=yes with a fixed text, namely 'There is a fee for the internet access at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if internet_access!=no&internet_access~.+)", + "description": "Layer 'Hotels' shows internet_access:fee=yes with a fixed text, namely 'There is a fee for the internet access at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if internet_access!=no &internet_access~.+)", "value": "yes" }, { "key": "internet_access:fee", - "description": "Layer 'Hotels' shows internet_access:fee=no with a fixed text, namely 'Internet access is free at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if internet_access!=no&internet_access~.+)", + "description": "Layer 'Hotels' shows internet_access:fee=no with a fixed text, namely 'Internet access is free at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if internet_access!=no &internet_access~.+)", "value": "no" }, { "key": "internet_access:fee", - "description": "Layer 'Hotels' shows internet_access:fee=customers with a fixed text, namely 'Internet access is free at this place, for customers only' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if internet_access!=no&internet_access~.+)", + "description": "Layer 'Hotels' shows internet_access:fee=customers with a fixed text, namely 'Internet access is free at this place, for customers only' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if internet_access!=no &internet_access~.+)", "value": "customers" }, { @@ -8341,7 +8366,7 @@ }, { "key": "id", - "description": "Layer 'Map of hydrants' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Map of hydrants' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "colour", @@ -8453,6 +8478,158 @@ "key": "wikipedia", "description": "The layer 'Map of hydrants allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" }, + { + "key": "amenity", + "description": "The MapComplete theme Personal theme has a layer Ice cream parlors showing features with this tag", + "value": "ice_cream" + }, + { + "key": "id", + "description": "Layer 'Ice cream parlors' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" + }, + { + "key": "image", + "description": "The layer 'Ice cream parlors allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" + }, + { + "key": "mapillary", + "description": "The layer 'Ice cream parlors allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" + }, + { + "key": "wikidata", + "description": "The layer 'Ice cream parlors allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" + }, + { + "key": "wikipedia", + "description": "The layer 'Ice cream parlors allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" + }, + { + "key": "name", + "description": "Layer 'Ice cream parlors' shows and asks freeform values for key 'name' (in the mapcomplete.org theme 'Personal theme')" + }, + { + "key": "opening_hours", + "description": "Layer 'Ice cream parlors' shows and asks freeform values for key 'opening_hours' (in the mapcomplete.org theme 'Personal theme')" + }, + { + "key": "phone", + "description": "Layer 'Ice cream parlors' shows and asks freeform values for key 'phone' (in the mapcomplete.org theme 'Personal theme')" + }, + { + "key": "contact:phone", + "description": "Layer 'Ice cream parlors' shows contact:phone~.+ with a fixed text, namely '{contact:phone}' (in the mapcomplete.org theme 'Personal theme')" + }, + { + "key": "email", + "description": "Layer 'Ice cream parlors' shows and asks freeform values for key 'email' (in the mapcomplete.org theme 'Personal theme')" + }, + { + "key": "contact:email", + "description": "Layer 'Ice cream parlors' shows contact:email~.+ with a fixed text, namely '{contact:email}' (in the mapcomplete.org theme 'Personal theme')" + }, + { + "key": "website", + "description": "Layer 'Ice cream parlors' shows and asks freeform values for key 'website' (in the mapcomplete.org theme 'Personal theme')" + }, + { + "key": "contact:website", + "description": "Layer 'Ice cream parlors' shows contact:website~.+ with a fixed text, namely '{contact:website}' (in the mapcomplete.org theme 'Personal theme')" + }, + { + "key": "diet:sugar_free", + "description": "Layer 'Ice cream parlors' shows diet:sugar_free=only with a fixed text, namely 'This shop only sells sugar free products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "only" + }, + { + "key": "diet:sugar_free", + "description": "Layer 'Ice cream parlors' shows diet:sugar_free=yes with a fixed text, namely 'This shop has a big sugar free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "yes" + }, + { + "key": "diet:sugar_free", + "description": "Layer 'Ice cream parlors' shows diet:sugar_free=limited with a fixed text, namely 'This shop has a limited sugar free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "limited" + }, + { + "key": "diet:sugar_free", + "description": "Layer 'Ice cream parlors' shows diet:sugar_free=no with a fixed text, namely 'This shop has no sugar free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "no" + }, + { + "key": "diet:lactose_free", + "description": "Layer 'Ice cream parlors' shows diet:lactose_free=only with a fixed text, namely 'Only sells lactose free products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "only" + }, + { + "key": "diet:lactose_free", + "description": "Layer 'Ice cream parlors' shows diet:lactose_free=yes with a fixed text, namely 'Big lactose free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "yes" + }, + { + "key": "diet:lactose_free", + "description": "Layer 'Ice cream parlors' shows diet:lactose_free=limited with a fixed text, namely 'Limited lactose free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "limited" + }, + { + "key": "diet:lactose_free", + "description": "Layer 'Ice cream parlors' shows diet:lactose_free=no with a fixed text, namely 'No lactose free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "no" + }, + { + "key": "diet:gluten_free", + "description": "Layer 'Ice cream parlors' shows diet:gluten_free=only with a fixed text, namely 'This shop only sells gluten free products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "only" + }, + { + "key": "diet:gluten_free", + "description": "Layer 'Ice cream parlors' shows diet:gluten_free=yes with a fixed text, namely 'This shop has a big gluten free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "yes" + }, + { + "key": "diet:gluten_free", + "description": "Layer 'Ice cream parlors' shows diet:gluten_free=limited with a fixed text, namely 'This shop has a limited gluten free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "limited" + }, + { + "key": "diet:gluten_free", + "description": "Layer 'Ice cream parlors' shows diet:gluten_free=no with a fixed text, namely 'This shop has no gluten free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "no" + }, + { + "key": "payment:cash", + "description": "Layer 'Ice cream parlors' shows payment:cash=yes with a fixed text, namely 'Cash is accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "yes" + }, + { + "key": "payment:cards", + "description": "Layer 'Ice cream parlors' shows payment:cards=yes with a fixed text, namely 'Payment cards are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "yes" + }, + { + "key": "payment:qr_code", + "description": "Layer 'Ice cream parlors' shows payment:qr_code=yes with a fixed text, namely 'Payment by QR-code is possible here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "yes" + }, + { + "key": "wheelchair", + "description": "Layer 'Ice cream parlors' shows wheelchair=designated with a fixed text, namely 'This place is specially adapted for wheelchair users' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "designated" + }, + { + "key": "wheelchair", + "description": "Layer 'Ice cream parlors' shows wheelchair=yes with a fixed text, namely 'This place is easily reachable with a wheelchair' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "yes" + }, + { + "key": "wheelchair", + "description": "Layer 'Ice cream parlors' shows wheelchair=limited with a fixed text, namely 'It is possible to reach this place in a wheelchair, but it is not easy' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "limited" + }, + { + "key": "wheelchair", + "description": "Layer 'Ice cream parlors' shows wheelchair=no with a fixed text, namely 'This place is not reachable with a wheelchair' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "no" + }, { "key": "indoor", "description": "The MapComplete theme Personal theme has a layer Indoors showing features with this tag", @@ -8480,7 +8657,7 @@ }, { "key": "id", - "description": "Layer 'Indoors' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Indoors' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -8529,11 +8706,11 @@ }, { "key": "ref", - "description": "Layer 'Indoors' shows and asks freeform values for key 'ref' (in the mapcomplete.org theme 'Personal theme') (This is only shown if indoor=room|indoor=area|indoor=corridor)" + "description": "Layer 'Indoors' shows and asks freeform values for key 'ref' (in the mapcomplete.org theme 'Personal theme') (This is only shown if indoor=room |indoor=area |indoor=corridor)" }, { "key": "name", - "description": "Layer 'Indoors' shows and asks freeform values for key 'name' (in the mapcomplete.org theme 'Personal theme') (This is only shown if indoor=room|indoor=area|indoor=corridor)" + "description": "Layer 'Indoors' shows and asks freeform values for key 'name' (in the mapcomplete.org theme 'Personal theme') (This is only shown if indoor=room |indoor=area |indoor=corridor)" }, { "key": "room", @@ -8652,7 +8829,7 @@ }, { "key": "capacity", - "description": "Layer 'Indoors' shows and asks freeform values for key 'capacity' (in the mapcomplete.org theme 'Personal theme') (This is only shown if room=waiting|room=restaurant|room=office|room=nursery|room=conference|room=auditorium|room=chapel|room=bedroom|room=classroom)" + "description": "Layer 'Indoors' shows and asks freeform values for key 'capacity' (in the mapcomplete.org theme 'Personal theme') (This is only shown if room=waiting |room=restaurant |room=office |room=nursery |room=conference |room=auditorium |room=chapel |room=bedroom |room=classroom)" }, { "key": "name:etymology:wikidata", @@ -8689,60 +8866,60 @@ }, { "key": "fee", - "description": "Layer 'Indoors' shows fee=yes with a fixed text, namely 'These are paid toilets' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets&access!=no)", + "description": "Layer 'Indoors' shows fee=yes with a fixed text, namely 'These are paid toilets' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets &access!=no)", "value": "yes" }, { "key": "fee", - "description": "Layer 'Indoors' shows fee=no with a fixed text, namely 'Free to use' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets&access!=no)", + "description": "Layer 'Indoors' shows fee=no with a fixed text, namely 'Free to use' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets &access!=no)", "value": "no" }, { "key": "charge", - "description": "Layer 'Indoors' shows and asks freeform values for key 'charge' (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets&fee=yes)" + "description": "Layer 'Indoors' shows and asks freeform values for key 'charge' (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets &fee=yes)" }, { "key": "payment:cash", - "description": "Layer 'Indoors' shows payment:cash=yes with a fixed text, namely 'Cash is accepted here' (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets&fee=yes)", + "description": "Layer 'Indoors' shows payment:cash=yes with a fixed text, namely 'Cash is accepted here' (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets &fee=yes)", "value": "yes" }, { "key": "payment:cards", - "description": "Layer 'Indoors' shows payment:cards=yes with a fixed text, namely 'Payment cards are accepted here' (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets&fee=yes)", + "description": "Layer 'Indoors' shows payment:cards=yes with a fixed text, namely 'Payment cards are accepted here' (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets &fee=yes)", "value": "yes" }, { "key": "payment:qr_code", - "description": "Layer 'Indoors' shows payment:qr_code=yes with a fixed text, namely 'Payment by QR-code is possible here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets&fee=yes)", + "description": "Layer 'Indoors' shows payment:qr_code=yes with a fixed text, namely 'Payment by QR-code is possible here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets &fee=yes)", "value": "yes" }, { "key": "payment:coins", - "description": "Layer 'Indoors' shows payment:coins=yes with a fixed text, namely 'Coins are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets&fee=yes)", + "description": "Layer 'Indoors' shows payment:coins=yes with a fixed text, namely 'Coins are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets &fee=yes)", "value": "yes" }, { "key": "payment:notes", - "description": "Layer 'Indoors' shows payment:notes=yes with a fixed text, namely 'Bank notes are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets&fee=yes)", + "description": "Layer 'Indoors' shows payment:notes=yes with a fixed text, namely 'Bank notes are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets &fee=yes)", "value": "yes" }, { "key": "payment:debit_cards", - "description": "Layer 'Indoors' shows payment:debit_cards=yes with a fixed text, namely 'Debit cards are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets&fee=yes)", + "description": "Layer 'Indoors' shows payment:debit_cards=yes with a fixed text, namely 'Debit cards are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets &fee=yes)", "value": "yes" }, { "key": "payment:credit_cards", - "description": "Layer 'Indoors' shows payment:credit_cards=yes with a fixed text, namely 'Credit cards are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets&fee=yes)", + "description": "Layer 'Indoors' shows payment:credit_cards=yes with a fixed text, namely 'Credit cards are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets &fee=yes)", "value": "yes" }, { "key": "opening_hours", - "description": "Layer 'Indoors' shows and asks freeform values for key 'opening_hours' (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets&access!=no)" + "description": "Layer 'Indoors' shows and asks freeform values for key 'opening_hours' (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets &access!=no)" }, { "key": "opening_hours", - "description": "Layer 'Indoors' shows opening_hours=24/7 with a fixed text, namely '24/7 opened (including holidays)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets&access!=no)", + "description": "Layer 'Indoors' shows opening_hours=24/7 with a fixed text, namely '24/7 opened (including holidays)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets &access!=no)", "value": "24/7" }, { @@ -8762,7 +8939,7 @@ }, { "key": "door:width", - "description": "Layer 'Indoors' shows and asks freeform values for key 'door:width' (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets&wheelchair=yes|wheelchair=designated)" + "description": "Layer 'Indoors' shows and asks freeform values for key 'door:width' (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets &wheelchair=yes |wheelchair=designated)" }, { "key": "toilets:position", @@ -8796,26 +8973,26 @@ }, { "key": "changing_table:location", - "description": "Layer 'Indoors' shows and asks freeform values for key 'changing_table:location' (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets&changing_table=yes)" + "description": "Layer 'Indoors' shows and asks freeform values for key 'changing_table:location' (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets &changing_table=yes)" }, { "key": "changing_table:location", - "description": "Layer 'Indoors' shows changing_table:location=female_toilet with a fixed text, namely 'The changing table is in the toilet for women. ' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets&changing_table=yes)", + "description": "Layer 'Indoors' shows changing_table:location=female_toilet with a fixed text, namely 'The changing table is in the toilet for women. ' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets &changing_table=yes)", "value": "female_toilet" }, { "key": "changing_table:location", - "description": "Layer 'Indoors' shows changing_table:location=male_toilet with a fixed text, namely 'The changing table is in the toilet for men. ' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets&changing_table=yes)", + "description": "Layer 'Indoors' shows changing_table:location=male_toilet with a fixed text, namely 'The changing table is in the toilet for men. ' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets &changing_table=yes)", "value": "male_toilet" }, { "key": "changing_table:location", - "description": "Layer 'Indoors' shows changing_table:location=wheelchair_toilet with a fixed text, namely 'The changing table is in the toilet for wheelchair users. ' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets&changing_table=yes)", + "description": "Layer 'Indoors' shows changing_table:location=wheelchair_toilet with a fixed text, namely 'The changing table is in the toilet for wheelchair users. ' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets &changing_table=yes)", "value": "wheelchair_toilet" }, { "key": "changing_table:location", - "description": "Layer 'Indoors' shows changing_table:location=dedicated_room with a fixed text, namely 'The changing table is in a dedicated room. ' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets&changing_table=yes)", + "description": "Layer 'Indoors' shows changing_table:location=dedicated_room with a fixed text, namely 'The changing table is in a dedicated room. ' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets &changing_table=yes)", "value": "dedicated_room" }, { @@ -8830,12 +9007,12 @@ }, { "key": "toilets:paper_supplied", - "description": "Layer 'Indoors' shows toilets:paper_supplied=yes with a fixed text, namely 'This toilet is equipped with toilet paper' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets&toilets:position!=urinal)", + "description": "Layer 'Indoors' shows toilets:paper_supplied=yes with a fixed text, namely 'This toilet is equipped with toilet paper' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets &toilets:position!=urinal)", "value": "yes" }, { "key": "toilets:paper_supplied", - "description": "Layer 'Indoors' shows toilets:paper_supplied=no with a fixed text, namely 'You have to bring your own toilet paper to this toilet' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets&toilets:position!=urinal)", + "description": "Layer 'Indoors' shows toilets:paper_supplied=no with a fixed text, namely 'You have to bring your own toilet paper to this toilet' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets &toilets:position!=urinal)", "value": "no" }, { @@ -8845,7 +9022,7 @@ }, { "key": "id", - "description": "Layer 'Information boards' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Information boards' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -8870,7 +9047,7 @@ }, { "key": "id", - "description": "Layer 'Kerbs' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Kerbs' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -8954,7 +9131,7 @@ }, { "key": "id", - "description": "Layer 'Kindergartens and childcare' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Kindergartens and childcare' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "amenity", @@ -9014,7 +9191,7 @@ }, { "key": "id", - "description": "Layer 'Maps' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Maps' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -9093,27 +9270,27 @@ }, { "key": "map_source:attribution", - "description": "Layer 'Maps' shows map_source:attribution=yes with a fixed text, namely 'OpenStreetMap is clearly attributed, including the ODBL-license' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if map_source~^((O|)pen(S|s)treet(M|m)ap)$|map_source=osm|map_source=OSM)", + "description": "Layer 'Maps' shows map_source:attribution=yes with a fixed text, namely 'OpenStreetMap is clearly attributed, including the ODBL-license' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if map_source~^((O|)pen(S|s)treet(M|m)ap)$ |map_source=osm |map_source=OSM)", "value": "yes" }, { "key": "map_source:attribution", - "description": "Layer 'Maps' shows map_source:attribution=incomplete with a fixed text, namely 'OpenStreetMap is clearly attributed, but the license is not mentioned' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if map_source~^((O|)pen(S|s)treet(M|m)ap)$|map_source=osm|map_source=OSM)", + "description": "Layer 'Maps' shows map_source:attribution=incomplete with a fixed text, namely 'OpenStreetMap is clearly attributed, but the license is not mentioned' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if map_source~^((O|)pen(S|s)treet(M|m)ap)$ |map_source=osm |map_source=OSM)", "value": "incomplete" }, { "key": "map_source:attribution", - "description": "Layer 'Maps' shows map_source:attribution=sticker with a fixed text, namely 'OpenStreetMap wasn't mentioned, but someone put an OpenStreetMap-sticker on it' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if map_source~^((O|)pen(S|s)treet(M|m)ap)$|map_source=osm|map_source=OSM)", + "description": "Layer 'Maps' shows map_source:attribution=sticker with a fixed text, namely 'OpenStreetMap wasn't mentioned, but someone put an OpenStreetMap-sticker on it' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if map_source~^((O|)pen(S|s)treet(M|m)ap)$ |map_source=osm |map_source=OSM)", "value": "sticker" }, { "key": "map_source:attribution", - "description": "Layer 'Maps' shows map_source:attribution=none with a fixed text, namely 'There is no attribution at all' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if map_source~^((O|)pen(S|s)treet(M|m)ap)$|map_source=osm|map_source=OSM)", + "description": "Layer 'Maps' shows map_source:attribution=none with a fixed text, namely 'There is no attribution at all' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if map_source~^((O|)pen(S|s)treet(M|m)ap)$ |map_source=osm |map_source=OSM)", "value": "none" }, { "key": "map_source:attribution", - "description": "Layer 'Maps' shows map_source:attribution=no with a fixed text, namely 'There is no attribution at all' (in the mapcomplete.org theme 'Personal theme') (This is only shown if map_source~^((O|)pen(S|s)treet(M|m)ap)$|map_source=osm|map_source=OSM)", + "description": "Layer 'Maps' shows map_source:attribution=no with a fixed text, namely 'There is no attribution at all' (in the mapcomplete.org theme 'Personal theme') (This is only shown if map_source~^((O|)pen(S|s)treet(M|m)ap)$ |map_source=osm |map_source=OSM)", "value": "no" }, { @@ -9188,7 +9365,7 @@ }, { "key": "id", - "description": "Layer 'Maxspeed' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Maxspeed' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "maxspeed", @@ -9211,7 +9388,7 @@ }, { "key": "id", - "description": "Layer 'Nature reserve' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Nature reserve' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -9285,12 +9462,12 @@ }, { "key": "access", - "description": "Layer 'Nature reserve' shows access=yes&fee=yes with a fixed text, namely 'Accessible with fee' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "description": "Layer 'Nature reserve' shows access=yes &fee=yes with a fixed text, namely 'Accessible with fee' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", "value": "yes" }, { "key": "fee", - "description": "Layer 'Nature reserve' shows access=yes&fee=yes with a fixed text, namely 'Accessible with fee' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "description": "Layer 'Nature reserve' shows access=yes &fee=yes with a fixed text, namely 'Accessible with fee' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", "value": "yes" }, { @@ -9327,17 +9504,17 @@ }, { "key": "dog", - "description": "Layer 'Nature reserve' shows dog=leashed with a fixed text, namely 'Dogs have to be leashed' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if access=yes|access=permissive|access=guided)", + "description": "Layer 'Nature reserve' shows dog=leashed with a fixed text, namely 'Dogs have to be leashed' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if access=yes |access=permissive |access=guided)", "value": "leashed" }, { "key": "dog", - "description": "Layer 'Nature reserve' shows dog=no with a fixed text, namely 'No dogs allowed' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if access=yes|access=permissive|access=guided)", + "description": "Layer 'Nature reserve' shows dog=no with a fixed text, namely 'No dogs allowed' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if access=yes |access=permissive |access=guided)", "value": "no" }, { "key": "dog", - "description": "Layer 'Nature reserve' shows dog=yes with a fixed text, namely 'Dogs are allowed to roam freely' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if access=yes|access=permissive|access=guided)", + "description": "Layer 'Nature reserve' shows dog=yes with a fixed text, namely 'Dogs are allowed to roam freely' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if access=yes |access=permissive |access=guided)", "value": "yes" }, { @@ -9388,7 +9565,7 @@ }, { "key": "id", - "description": "Layer 'Observation towers' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Observation towers' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -9431,31 +9608,31 @@ }, { "key": "charge", - "description": "Layer 'Observation towers' shows and asks freeform values for key 'charge' (in the mapcomplete.org theme 'Personal theme') (This is only shown if access=yes|access=guided)" + "description": "Layer 'Observation towers' shows and asks freeform values for key 'charge' (in the mapcomplete.org theme 'Personal theme') (This is only shown if access=yes |access=guided)" }, { "key": "fee", - "description": "Layer 'Observation towers' shows fee=no with a fixed text, namely 'Free to visit' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if access=yes|access=guided)", + "description": "Layer 'Observation towers' shows fee=no with a fixed text, namely 'Free to visit' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if access=yes |access=guided)", "value": "no" }, { "key": "charge", - "description": "Layer 'Observation towers' shows fee=no with a fixed text, namely 'Free to visit' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') Picking this answer will delete the key charge. (This is only shown if access=yes|access=guided)", + "description": "Layer 'Observation towers' shows fee=no with a fixed text, namely 'Free to visit' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') Picking this answer will delete the key charge. (This is only shown if access=yes |access=guided)", "value": "" }, { "key": "payment:cash", - "description": "Layer 'Observation towers' shows payment:cash=yes with a fixed text, namely 'Cash is accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=yes|charge~.+)", + "description": "Layer 'Observation towers' shows payment:cash=yes with a fixed text, namely 'Cash is accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=yes |charge~.+)", "value": "yes" }, { "key": "payment:cards", - "description": "Layer 'Observation towers' shows payment:cards=yes with a fixed text, namely 'Payment cards are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=yes|charge~.+)", + "description": "Layer 'Observation towers' shows payment:cards=yes with a fixed text, namely 'Payment cards are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=yes |charge~.+)", "value": "yes" }, { "key": "payment:qr_code", - "description": "Layer 'Observation towers' shows payment:qr_code=yes with a fixed text, namely 'Payment by QR-code is possible here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=yes|charge~.+)", + "description": "Layer 'Observation towers' shows payment:qr_code=yes with a fixed text, namely 'Payment by QR-code is possible here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=yes |charge~.+)", "value": "yes" }, { @@ -9468,16 +9645,16 @@ }, { "key": "step_count", - "description": "Layer 'Observation towers' shows and asks freeform values for key 'step_count' (in the mapcomplete.org theme 'Personal theme') (This is only shown if access=yes|access=guided)" + "description": "Layer 'Observation towers' shows and asks freeform values for key 'step_count' (in the mapcomplete.org theme 'Personal theme') (This is only shown if access=yes |access=guided)" }, { "key": "elevator", - "description": "Layer 'Observation towers' shows elevator=yes with a fixed text, namely 'This tower has an elevator which takes visitors to the top' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if access=yes|access=guided)", + "description": "Layer 'Observation towers' shows elevator=yes with a fixed text, namely 'This tower has an elevator which takes visitors to the top' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if access=yes |access=guided)", "value": "yes" }, { "key": "elevator", - "description": "Layer 'Observation towers' shows elevator=no with a fixed text, namely 'This tower does not have an elevator' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if access=yes|access=guided)", + "description": "Layer 'Observation towers' shows elevator=no with a fixed text, namely 'This tower does not have an elevator' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if access=yes |access=guided)", "value": "no" }, { @@ -9486,22 +9663,22 @@ }, { "key": "wheelchair", - "description": "Layer 'Observation towers' shows wheelchair=designated with a fixed text, namely 'This place is specially adapted for wheelchair users' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if elevator=yes&access=yes|access=guided)", + "description": "Layer 'Observation towers' shows wheelchair=designated with a fixed text, namely 'This place is specially adapted for wheelchair users' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if elevator=yes &access=yes |access=guided)", "value": "designated" }, { "key": "wheelchair", - "description": "Layer 'Observation towers' shows wheelchair=yes with a fixed text, namely 'This place is easily reachable with a wheelchair' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if elevator=yes&access=yes|access=guided)", + "description": "Layer 'Observation towers' shows wheelchair=yes with a fixed text, namely 'This place is easily reachable with a wheelchair' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if elevator=yes &access=yes |access=guided)", "value": "yes" }, { "key": "wheelchair", - "description": "Layer 'Observation towers' shows wheelchair=limited with a fixed text, namely 'It is possible to reach this place in a wheelchair, but it is not easy' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if elevator=yes&access=yes|access=guided)", + "description": "Layer 'Observation towers' shows wheelchair=limited with a fixed text, namely 'It is possible to reach this place in a wheelchair, but it is not easy' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if elevator=yes &access=yes |access=guided)", "value": "limited" }, { "key": "wheelchair", - "description": "Layer 'Observation towers' shows wheelchair=no with a fixed text, namely 'This place is not reachable with a wheelchair' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if elevator=yes&access=yes|access=guided)", + "description": "Layer 'Observation towers' shows wheelchair=no with a fixed text, namely 'This place is not reachable with a wheelchair' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if elevator=yes &access=yes |access=guided)", "value": "no" }, { @@ -9534,7 +9711,7 @@ }, { "key": "id", - "description": "Layer 'Parcel Lockers' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Parcel Lockers' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -9620,7 +9797,7 @@ }, { "key": "id", - "description": "Layer 'Parking' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Parking' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -9747,7 +9924,7 @@ }, { "key": "id", - "description": "Layer 'Parking Spaces' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Parking Spaces' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -9857,7 +10034,7 @@ }, { "key": "id", - "description": "Layer 'Parking Ticket Machines' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Parking Ticket Machines' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -9912,142 +10089,142 @@ }, { "key": "payment:coins:denominations", - "description": "Layer 'Parking Ticket Machines' shows payment:coins:denominations=0.01 EUR with a fixed text, namely '1 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Parking Ticket Machines' shows payment:coins:denominations=0.01 EUR with a fixed text, namely '1 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.01 EUR" }, { "key": "payment:coins:denominations", - "description": "Layer 'Parking Ticket Machines' shows payment:coins:denominations=0.02 EUR with a fixed text, namely '2 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Parking Ticket Machines' shows payment:coins:denominations=0.02 EUR with a fixed text, namely '2 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.02 EUR" }, { "key": "payment:coins:denominations", - "description": "Layer 'Parking Ticket Machines' shows payment:coins:denominations=0.05 EUR with a fixed text, namely '5 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Parking Ticket Machines' shows payment:coins:denominations=0.05 EUR with a fixed text, namely '5 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.05 EUR" }, { "key": "payment:coins:denominations", - "description": "Layer 'Parking Ticket Machines' shows payment:coins:denominations=0.10 EUR with a fixed text, namely '10 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Parking Ticket Machines' shows payment:coins:denominations=0.10 EUR with a fixed text, namely '10 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.10 EUR" }, { "key": "payment:coins:denominations", - "description": "Layer 'Parking Ticket Machines' shows payment:coins:denominations=0.20 EUR with a fixed text, namely '20 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Parking Ticket Machines' shows payment:coins:denominations=0.20 EUR with a fixed text, namely '20 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.20 EUR" }, { "key": "payment:coins:denominations", - "description": "Layer 'Parking Ticket Machines' shows payment:coins:denominations=0.50 EUR with a fixed text, namely '50 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Parking Ticket Machines' shows payment:coins:denominations=0.50 EUR with a fixed text, namely '50 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.50 EUR" }, { "key": "payment:coins:denominations", - "description": "Layer 'Parking Ticket Machines' shows payment:coins:denominations=1 EUR with a fixed text, namely '1 euro coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Parking Ticket Machines' shows payment:coins:denominations=1 EUR with a fixed text, namely '1 euro coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "1 EUR" }, { "key": "payment:coins:denominations", - "description": "Layer 'Parking Ticket Machines' shows payment:coins:denominations=2 EUR with a fixed text, namely '2 euro coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Parking Ticket Machines' shows payment:coins:denominations=2 EUR with a fixed text, namely '2 euro coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "2 EUR" }, { "key": "payment:coins:denominations", - "description": "Layer 'Parking Ticket Machines' shows payment:coins:denominations=0.05 CHF with a fixed text, namely '5 centimes coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Parking Ticket Machines' shows payment:coins:denominations=0.05 CHF with a fixed text, namely '5 centimes coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.05 CHF" }, { "key": "payment:coins:denominations", - "description": "Layer 'Parking Ticket Machines' shows payment:coins:denominations=0.10 CHF with a fixed text, namely '10 centimes coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Parking Ticket Machines' shows payment:coins:denominations=0.10 CHF with a fixed text, namely '10 centimes coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.10 CHF" }, { "key": "payment:coins:denominations", - "description": "Layer 'Parking Ticket Machines' shows payment:coins:denominations=0.20 CHF with a fixed text, namely '20 centimes coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Parking Ticket Machines' shows payment:coins:denominations=0.20 CHF with a fixed text, namely '20 centimes coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.20 CHF" }, { "key": "payment:coins:denominations", - "description": "Layer 'Parking Ticket Machines' shows payment:coins:denominations=0.50 CHF with a fixed text, namely '½ franc coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Parking Ticket Machines' shows payment:coins:denominations=0.50 CHF with a fixed text, namely '½ franc coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.50 CHF" }, { "key": "payment:coins:denominations", - "description": "Layer 'Parking Ticket Machines' shows payment:coins:denominations=1 CHF with a fixed text, namely '1 franc coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Parking Ticket Machines' shows payment:coins:denominations=1 CHF with a fixed text, namely '1 franc coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "1 CHF" }, { "key": "payment:coins:denominations", - "description": "Layer 'Parking Ticket Machines' shows payment:coins:denominations=2 CHF with a fixed text, namely '2 francs coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Parking Ticket Machines' shows payment:coins:denominations=2 CHF with a fixed text, namely '2 francs coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "2 CHF" }, { "key": "payment:coins:denominations", - "description": "Layer 'Parking Ticket Machines' shows payment:coins:denominations=5 CHF with a fixed text, namely '5 francs coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Parking Ticket Machines' shows payment:coins:denominations=5 CHF with a fixed text, namely '5 francs coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "5 CHF" }, { "key": "payment:notes:denominations", - "description": "Layer 'Parking Ticket Machines' shows payment:notes:denominations=5 EUR with a fixed text, namely '5 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Parking Ticket Machines' shows payment:notes:denominations=5 EUR with a fixed text, namely '5 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "5 EUR" }, { "key": "payment:notes:denominations", - "description": "Layer 'Parking Ticket Machines' shows payment:notes:denominations=10 EUR with a fixed text, namely '10 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Parking Ticket Machines' shows payment:notes:denominations=10 EUR with a fixed text, namely '10 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "10 EUR" }, { "key": "payment:notes:denominations", - "description": "Layer 'Parking Ticket Machines' shows payment:notes:denominations=20 EUR with a fixed text, namely '20 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Parking Ticket Machines' shows payment:notes:denominations=20 EUR with a fixed text, namely '20 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "20 EUR" }, { "key": "payment:notes:denominations", - "description": "Layer 'Parking Ticket Machines' shows payment:notes:denominations=50 EUR with a fixed text, namely '50 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Parking Ticket Machines' shows payment:notes:denominations=50 EUR with a fixed text, namely '50 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "50 EUR" }, { "key": "payment:notes:denominations", - "description": "Layer 'Parking Ticket Machines' shows payment:notes:denominations=100 EUR with a fixed text, namely '100 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Parking Ticket Machines' shows payment:notes:denominations=100 EUR with a fixed text, namely '100 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "100 EUR" }, { "key": "payment:notes:denominations", - "description": "Layer 'Parking Ticket Machines' shows payment:notes:denominations=200 EUR with a fixed text, namely '200 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Parking Ticket Machines' shows payment:notes:denominations=200 EUR with a fixed text, namely '200 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "200 EUR" }, { "key": "payment:notes:denominations", - "description": "Layer 'Parking Ticket Machines' shows payment:notes:denominations=500 EUR with a fixed text, namely '500 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Parking Ticket Machines' shows payment:notes:denominations=500 EUR with a fixed text, namely '500 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "500 EUR" }, { "key": "payment:notes:denominations", - "description": "Layer 'Parking Ticket Machines' shows payment:notes:denominations=10 CHF with a fixed text, namely '10 francs notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Parking Ticket Machines' shows payment:notes:denominations=10 CHF with a fixed text, namely '10 francs notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "10 CHF" }, { "key": "payment:notes:denominations", - "description": "Layer 'Parking Ticket Machines' shows payment:notes:denominations=20 CHF with a fixed text, namely '20 francs notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Parking Ticket Machines' shows payment:notes:denominations=20 CHF with a fixed text, namely '20 francs notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "20 CHF" }, { "key": "payment:notes:denominations", - "description": "Layer 'Parking Ticket Machines' shows payment:notes:denominations=50 CHF with a fixed text, namely '50 francs notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Parking Ticket Machines' shows payment:notes:denominations=50 CHF with a fixed text, namely '50 francs notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "50 CHF" }, { "key": "payment:notes:denominations", - "description": "Layer 'Parking Ticket Machines' shows payment:notes:denominations=100 CHF with a fixed text, namely '100 francs notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Parking Ticket Machines' shows payment:notes:denominations=100 CHF with a fixed text, namely '100 francs notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "100 CHF" }, { "key": "payment:notes:denominations", - "description": "Layer 'Parking Ticket Machines' shows payment:notes:denominations=200 CHF with a fixed text, namely '200 francs notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Parking Ticket Machines' shows payment:notes:denominations=200 CHF with a fixed text, namely '200 francs notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "200 CHF" }, { "key": "payment:notes:denominations", - "description": "Layer 'Parking Ticket Machines' shows payment:notes:denominations=1000 CHF with a fixed text, namely '1000 francs notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Parking Ticket Machines' shows payment:notes:denominations=1000 CHF with a fixed text, namely '1000 francs notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "1000 CHF" }, { @@ -10086,7 +10263,7 @@ }, { "key": "id", - "description": "Layer 'Pharmacies' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Pharmacies' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -10158,7 +10335,7 @@ }, { "key": "id", - "description": "Layer 'Physiotherapist' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Physiotherapist' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -10224,7 +10401,7 @@ }, { "key": "id", - "description": "Layer 'Picnic tables' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Picnic tables' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -10297,7 +10474,7 @@ }, { "key": "id", - "description": "Layer 'Playgrounds' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Playgrounds' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -10463,7 +10640,7 @@ }, { "key": "id", - "description": "Layer 'Postboxes' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Postboxes' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -10493,7 +10670,7 @@ }, { "key": "id", - "description": "Layer 'Post offices' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Post offices' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -10661,7 +10838,7 @@ }, { "key": "id", - "description": "Layer 'Bookcases' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Bookcases' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -10813,7 +10990,7 @@ }, { "key": "id", - "description": "Layer 'Crossings with rainbow paintings' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Crossings with rainbow paintings' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -10848,7 +11025,7 @@ }, { "key": "id", - "description": "Layer 'Reception desks' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Reception desks' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -10916,7 +11093,7 @@ }, { "key": "id", - "description": "Layer 'Recycling' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Recycling' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -11180,7 +11357,7 @@ }, { "key": "id", - "description": "Layer 'Primary and secondary schools' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Primary and secondary schools' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "name", @@ -11325,7 +11502,7 @@ }, { "key": "id", - "description": "Layer 'Shelter' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Shelter' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "shelter_type", @@ -11382,7 +11559,7 @@ }, { "key": "id", - "description": "Layer 'Shop' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Shop' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -11408,6 +11585,11 @@ "key": "shop", "description": "Layer 'Shop' shows and asks freeform values for key 'shop' (in the mapcomplete.org theme 'Personal theme')" }, + { + "key": "shop", + "description": "Layer 'Shop' shows shop=vacant with a fixed text, namely 'Vacant Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "vacant" + }, { "key": "shop", "description": "Layer 'Shop' shows shop=agrarian with a fixed text, namely 'Farm Supply Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", @@ -11425,7 +11607,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=antiques with a fixed text, namely 'Antiques Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "description": "Layer 'Shop' shows shop=antiques with a fixed text, namely 'Antique Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", "value": "antiques" }, { @@ -11490,7 +11672,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=books with a fixed text, namely 'Book Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "description": "Layer 'Shop' shows shop=books with a fixed text, namely 'Bookstore' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", "value": "books" }, { @@ -11610,7 +11792,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=country_store with a fixed text, namely 'Country Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "description": "Layer 'Shop' shows shop=country_store with a fixed text, namely 'Rural Supplies Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", "value": "country_store" }, { @@ -11630,7 +11812,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=deli with a fixed text, namely 'Deli' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "description": "Layer 'Shop' shows shop=deli with a fixed text, namely 'Delicatessen' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", "value": "deli" }, { @@ -11780,7 +11962,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=health_food with a fixed text, namely 'Health Food Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "description": "Layer 'Shop' shows shop=health_food with a fixed text, namely 'Health Food Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", "value": "health_food" }, { @@ -11800,8 +11982,8 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=hobby with a fixed text, namely 'Hobby Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", - "value": "hobby" + "description": "Layer 'Shop' shows shop=honey with a fixed text, namely 'Honey Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "honey" }, { "key": "shop", @@ -11920,7 +12102,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=newsagent with a fixed text, namely 'Newspaper/Magazine Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "description": "Layer 'Shop' shows shop=newsagent with a fixed text, namely 'Newsstand' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", "value": "newsagent" }, { @@ -11928,6 +12110,11 @@ "description": "Layer 'Shop' shows shop=nutrition_supplements with a fixed text, namely 'Nutrition Supplements Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", "value": "nutrition_supplements" }, + { + "key": "shop", + "description": "Layer 'Shop' shows shop=nuts with a fixed text, namely 'Nuts Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "nuts" + }, { "key": "shop", "description": "Layer 'Shop' shows shop=optician with a fixed text, namely 'Optician' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", @@ -11953,6 +12140,11 @@ "description": "Layer 'Shop' shows shop=party with a fixed text, namely 'Party Supply Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", "value": "party" }, + { + "key": "shop", + "description": "Layer 'Shop' shows shop=pasta with a fixed text, namely 'Pasta Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "pasta" + }, { "key": "shop", "description": "Layer 'Shop' shows shop=pastry with a fixed text, namely 'Pastry Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", @@ -11960,7 +12152,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=pawnbroker with a fixed text, namely 'Pawn Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "description": "Layer 'Shop' shows shop=pawnbroker with a fixed text, namely 'Pawnshop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", "value": "pawnbroker" }, { @@ -11975,7 +12167,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=pet_grooming with a fixed text, namely 'Pet Grooming Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "description": "Layer 'Shop' shows shop=pet_grooming with a fixed text, namely 'Pet Groomer' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", "value": "pet_grooming" }, { @@ -12023,6 +12215,11 @@ "description": "Layer 'Shop' shows shop=repair with a fixed text, namely 'Repair Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", "value": "repair" }, + { + "key": "shop", + "description": "Layer 'Shop' shows shop=rice with a fixed text, namely 'Rice Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "rice" + }, { "key": "shop", "description": "Layer 'Shop' shows shop=scuba_diving with a fixed text, namely 'Scuba Diving Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", @@ -12035,7 +12232,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=second_hand with a fixed text, namely 'Consignment/Thrift Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "description": "Layer 'Shop' shows shop=second_hand with a fixed text, namely 'Thrift Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", "value": "second_hand" }, { @@ -12155,7 +12352,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=variety_store with a fixed text, namely 'Variety Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "description": "Layer 'Shop' shows shop=variety_store with a fixed text, namely 'Discount Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", "value": "variety_store" }, { @@ -12210,17 +12407,17 @@ }, { "key": "second_hand", - "description": "Layer 'Shop' shows second_hand=only with a fixed text, namely 'This shop sells second-hand items only' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if shop=clothes|shop=car|shop=books|shop=charity|shop=car_repair|shop=furniture|shop=bicycle|shop=bicycle|shop=mobile_phone|shop=computer|shop=toys)", + "description": "Layer 'Shop' shows second_hand=only with a fixed text, namely 'This shop sells second-hand items only' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if shop=clothes |shop=car |shop=books |shop=charity |shop=car_repair |shop=furniture |shop=bicycle |shop=bicycle |shop=mobile_phone |shop=computer |shop=toys)", "value": "only" }, { "key": "second_hand", - "description": "Layer 'Shop' shows second_hand=yes with a fixed text, namely 'This shop sells second-hand items along with new items' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if shop=clothes|shop=car|shop=books|shop=charity|shop=car_repair|shop=furniture|shop=bicycle|shop=bicycle|shop=mobile_phone|shop=computer|shop=toys)", + "description": "Layer 'Shop' shows second_hand=yes with a fixed text, namely 'This shop sells second-hand items along with new items' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if shop=clothes |shop=car |shop=books |shop=charity |shop=car_repair |shop=furniture |shop=bicycle |shop=bicycle |shop=mobile_phone |shop=computer |shop=toys)", "value": "yes" }, { "key": "second_hand", - "description": "Layer 'Shop' shows second_hand=no with a fixed text, namely 'This shop only sells brand-new items' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if shop=clothes|shop=car|shop=books|shop=charity|shop=car_repair|shop=furniture|shop=bicycle|shop=bicycle|shop=mobile_phone|shop=computer|shop=toys)", + "description": "Layer 'Shop' shows second_hand=no with a fixed text, namely 'This shop only sells brand-new items' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if shop=clothes |shop=car |shop=books |shop=charity |shop=car_repair |shop=furniture |shop=bicycle |shop=bicycle |shop=mobile_phone |shop=computer |shop=toys)", "value": "no" }, { @@ -12297,29 +12494,49 @@ }, { "key": "service:print:A4", - "description": "Layer 'Shop' shows service:print:A4=yes with a fixed text, namely 'This shop can print on papers of size A4' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if shop~^(.*copyshop.*)$|shop~^(.*stationery.*)$|service:print=yes)", + "description": "Layer 'Shop' shows service:print:A4=yes with a fixed text, namely 'This shop can print on papers of size A4' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if shop~^(.*copyshop.*)$ |shop~^(.*stationery.*)$ |service:print=yes)", "value": "yes" }, { "key": "service:print:A3", - "description": "Layer 'Shop' shows service:print:A3=yes with a fixed text, namely 'This shop can print on papers of size A3' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if shop~^(.*copyshop.*)$|shop~^(.*stationery.*)$|service:print=yes)", + "description": "Layer 'Shop' shows service:print:A3=yes with a fixed text, namely 'This shop can print on papers of size A3' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if shop~^(.*copyshop.*)$ |shop~^(.*stationery.*)$ |service:print=yes)", "value": "yes" }, { "key": "service:print:A2", - "description": "Layer 'Shop' shows service:print:A2=yes with a fixed text, namely 'This shop can print on papers of size A2' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if shop~^(.*copyshop.*)$|shop~^(.*stationery.*)$|service:print=yes)", + "description": "Layer 'Shop' shows service:print:A2=yes with a fixed text, namely 'This shop can print on papers of size A2' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if shop~^(.*copyshop.*)$ |shop~^(.*stationery.*)$ |service:print=yes)", "value": "yes" }, { "key": "service:print:A1", - "description": "Layer 'Shop' shows service:print:A1=yes with a fixed text, namely 'This shop can print on papers of size A1' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if shop~^(.*copyshop.*)$|shop~^(.*stationery.*)$|service:print=yes)", + "description": "Layer 'Shop' shows service:print:A1=yes with a fixed text, namely 'This shop can print on papers of size A1' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if shop~^(.*copyshop.*)$ |shop~^(.*stationery.*)$ |service:print=yes)", "value": "yes" }, { "key": "service:print:A0", - "description": "Layer 'Shop' shows service:print:A0=yes with a fixed text, namely 'This shop can print on papers of size A0' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if shop~^(.*copyshop.*)$|shop~^(.*stationery.*)$|service:print=yes)", + "description": "Layer 'Shop' shows service:print:A0=yes with a fixed text, namely 'This shop can print on papers of size A0' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if shop~^(.*copyshop.*)$ |shop~^(.*stationery.*)$ |service:print=yes)", "value": "yes" }, + { + "key": "craft", + "description": "Layer 'Shop' shows craft=key_cutter with a fixed text, namely 'This shop is also specialized in key cutting' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if shop=shoe_repair |service:key_cutting~.+ |craft=key_cutting |shop=diy |shop=doityourself |shop=home_improvement |shop=hardware |shop=locksmith |shop=repair)", + "value": "key_cutter" + }, + { + "key": "service:key_cutting", + "description": "Layer 'Shop' shows service:key_cutting=yes with a fixed text, namely 'This shop offers key cutting as a service' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if shop=shoe_repair |service:key_cutting~.+ |craft=key_cutting |shop=diy |shop=doityourself |shop=home_improvement |shop=hardware |shop=locksmith |shop=repair)", + "value": "yes" + }, + { + "key": "craft", + "description": "Layer 'Shop' shows service:key_cutting=no with a fixed text, namely 'This shops does not offer key cutting as a service' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') Picking this answer will delete the key craft. (This is only shown if shop=shoe_repair |service:key_cutting~.+ |craft=key_cutting |shop=diy |shop=doityourself |shop=home_improvement |shop=hardware |shop=locksmith |shop=repair)", + "value": "" + }, + { + "key": "service:key_cutting", + "description": "Layer 'Shop' shows service:key_cutting=no with a fixed text, namely 'This shops does not offer key cutting as a service' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if shop=shoe_repair |service:key_cutting~.+ |craft=key_cutting |shop=diy |shop=doityourself |shop=home_improvement |shop=hardware |shop=locksmith |shop=repair)", + "value": "no" + }, { "key": "internet_access", "description": "Layer 'Shop' shows internet_access=wlan with a fixed text, namely 'This place offers wireless internet access' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", @@ -12347,17 +12564,17 @@ }, { "key": "internet_access:fee", - "description": "Layer 'Shop' shows internet_access:fee=yes with a fixed text, namely 'There is a fee for the internet access at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if internet_access!=no&internet_access~.+)", + "description": "Layer 'Shop' shows internet_access:fee=yes with a fixed text, namely 'There is a fee for the internet access at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if internet_access!=no &internet_access~.+)", "value": "yes" }, { "key": "internet_access:fee", - "description": "Layer 'Shop' shows internet_access:fee=no with a fixed text, namely 'Internet access is free at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if internet_access!=no&internet_access~.+)", + "description": "Layer 'Shop' shows internet_access:fee=no with a fixed text, namely 'Internet access is free at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if internet_access!=no &internet_access~.+)", "value": "no" }, { "key": "internet_access:fee", - "description": "Layer 'Shop' shows internet_access:fee=customers with a fixed text, namely 'Internet access is free at this place, for customers only' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if internet_access!=no&internet_access~.+)", + "description": "Layer 'Shop' shows internet_access:fee=customers with a fixed text, namely 'Internet access is free at this place, for customers only' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if internet_access!=no &internet_access~.+)", "value": "customers" }, { @@ -12371,77 +12588,77 @@ }, { "key": "organic", - "description": "Layer 'Shop' shows organic=yes with a fixed text, namely 'This shop offers organic products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=clothes|shop=shoes|shop=butcher|shop=cosmetics|shop=deli|shop=bakery|shop=alcohol|shop=seafood|shop=beverages|shop=florist)", + "description": "Layer 'Shop' shows organic=yes with a fixed text, namely 'This shop offers organic products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=clothes |shop=shoes |shop=butcher |shop=cosmetics |shop=deli |shop=bakery |shop=alcohol |shop=seafood |shop=beverages |shop=florist)", "value": "yes" }, { "key": "organic", - "description": "Layer 'Shop' shows organic=only with a fixed text, namely 'This shop only offers organic products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=clothes|shop=shoes|shop=butcher|shop=cosmetics|shop=deli|shop=bakery|shop=alcohol|shop=seafood|shop=beverages|shop=florist)", + "description": "Layer 'Shop' shows organic=only with a fixed text, namely 'This shop only offers organic products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=clothes |shop=shoes |shop=butcher |shop=cosmetics |shop=deli |shop=bakery |shop=alcohol |shop=seafood |shop=beverages |shop=florist)", "value": "only" }, { "key": "organic", - "description": "Layer 'Shop' shows organic=no with a fixed text, namely 'This shop does not offer organic products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=clothes|shop=shoes|shop=butcher|shop=cosmetics|shop=deli|shop=bakery|shop=alcohol|shop=seafood|shop=beverages|shop=florist)", + "description": "Layer 'Shop' shows organic=no with a fixed text, namely 'This shop does not offer organic products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=clothes |shop=shoes |shop=butcher |shop=cosmetics |shop=deli |shop=bakery |shop=alcohol |shop=seafood |shop=beverages |shop=florist)", "value": "no" }, { "key": "diet:sugar_free", - "description": "Layer 'Shop' shows diet:sugar_free=only with a fixed text, namely 'This shop only sells sugar free products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:sugar_free=only with a fixed text, namely 'This shop only sells sugar free products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "only" }, { "key": "diet:sugar_free", - "description": "Layer 'Shop' shows diet:sugar_free=yes with a fixed text, namely 'This shop has a big sugar free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:sugar_free=yes with a fixed text, namely 'This shop has a big sugar free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "yes" }, { "key": "diet:sugar_free", - "description": "Layer 'Shop' shows diet:sugar_free=limited with a fixed text, namely 'This shop has a limited sugar free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:sugar_free=limited with a fixed text, namely 'This shop has a limited sugar free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "limited" }, { "key": "diet:sugar_free", - "description": "Layer 'Shop' shows diet:sugar_free=no with a fixed text, namely 'This shop has no sugar free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:sugar_free=no with a fixed text, namely 'This shop has no sugar free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "no" }, { "key": "diet:gluten_free", - "description": "Layer 'Shop' shows diet:gluten_free=only with a fixed text, namely 'This shop only sells gluten free products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:gluten_free=only with a fixed text, namely 'This shop only sells gluten free products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "only" }, { "key": "diet:gluten_free", - "description": "Layer 'Shop' shows diet:gluten_free=yes with a fixed text, namely 'This shop has a big gluten free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:gluten_free=yes with a fixed text, namely 'This shop has a big gluten free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "yes" }, { "key": "diet:gluten_free", - "description": "Layer 'Shop' shows diet:gluten_free=limited with a fixed text, namely 'This shop has a limited gluten free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:gluten_free=limited with a fixed text, namely 'This shop has a limited gluten free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "limited" }, { "key": "diet:gluten_free", - "description": "Layer 'Shop' shows diet:gluten_free=no with a fixed text, namely 'This shop has no gluten free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:gluten_free=no with a fixed text, namely 'This shop has no gluten free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "no" }, { "key": "diet:lactose_free", - "description": "Layer 'Shop' shows diet:lactose_free=only with a fixed text, namely 'Only sells lactose free products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:lactose_free=only with a fixed text, namely 'Only sells lactose free products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "only" }, { "key": "diet:lactose_free", - "description": "Layer 'Shop' shows diet:lactose_free=yes with a fixed text, namely 'Big lactose free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:lactose_free=yes with a fixed text, namely 'Big lactose free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "yes" }, { "key": "diet:lactose_free", - "description": "Layer 'Shop' shows diet:lactose_free=limited with a fixed text, namely 'Limited lactose free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:lactose_free=limited with a fixed text, namely 'Limited lactose free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "limited" }, { "key": "diet:lactose_free", - "description": "Layer 'Shop' shows diet:lactose_free=no with a fixed text, namely 'No lactose free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:lactose_free=no with a fixed text, namely 'No lactose free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "no" }, { @@ -12451,7 +12668,7 @@ }, { "key": "id", - "description": "Layer 'Shower' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Shower' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -12548,37 +12765,37 @@ }, { "key": "payment:cash", - "description": "Layer 'Shower' shows payment:cash=yes with a fixed text, namely 'Cash is accepted here' (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=yes|hot_water=fee)", + "description": "Layer 'Shower' shows payment:cash=yes with a fixed text, namely 'Cash is accepted here' (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=yes |hot_water=fee)", "value": "yes" }, { "key": "payment:cards", - "description": "Layer 'Shower' shows payment:cards=yes with a fixed text, namely 'Payment cards are accepted here' (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=yes|hot_water=fee)", + "description": "Layer 'Shower' shows payment:cards=yes with a fixed text, namely 'Payment cards are accepted here' (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=yes |hot_water=fee)", "value": "yes" }, { "key": "payment:qr_code", - "description": "Layer 'Shower' shows payment:qr_code=yes with a fixed text, namely 'Payment by QR-code is possible here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=yes|hot_water=fee)", + "description": "Layer 'Shower' shows payment:qr_code=yes with a fixed text, namely 'Payment by QR-code is possible here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=yes |hot_water=fee)", "value": "yes" }, { "key": "payment:coins", - "description": "Layer 'Shower' shows payment:coins=yes with a fixed text, namely 'Coins are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=yes|hot_water=fee)", + "description": "Layer 'Shower' shows payment:coins=yes with a fixed text, namely 'Coins are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=yes |hot_water=fee)", "value": "yes" }, { "key": "payment:notes", - "description": "Layer 'Shower' shows payment:notes=yes with a fixed text, namely 'Bank notes are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=yes|hot_water=fee)", + "description": "Layer 'Shower' shows payment:notes=yes with a fixed text, namely 'Bank notes are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=yes |hot_water=fee)", "value": "yes" }, { "key": "payment:debit_cards", - "description": "Layer 'Shower' shows payment:debit_cards=yes with a fixed text, namely 'Debit cards are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=yes|hot_water=fee)", + "description": "Layer 'Shower' shows payment:debit_cards=yes with a fixed text, namely 'Debit cards are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=yes |hot_water=fee)", "value": "yes" }, { "key": "payment:credit_cards", - "description": "Layer 'Shower' shows payment:credit_cards=yes with a fixed text, namely 'Credit cards are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=yes|hot_water=fee)", + "description": "Layer 'Shower' shows payment:credit_cards=yes with a fixed text, namely 'Credit cards are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if fee=yes |hot_water=fee)", "value": "yes" }, { @@ -12588,7 +12805,7 @@ }, { "key": "id", - "description": "Layer 'Speed Camera' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Speed Camera' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "maxspeed", @@ -12601,7 +12818,7 @@ }, { "key": "id", - "description": "Layer 'Speed Display' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Speed Display' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "maxspeed", @@ -12618,7 +12835,7 @@ }, { "key": "id", - "description": "Layer 'Sport pitches' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Sport pitches' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -12750,22 +12967,22 @@ }, { "key": "reservation", - "description": "Layer 'Sport pitches' shows reservation=required with a fixed text, namely 'Making an appointment is obligatory to use this sport pitch' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if access!=public&access!=private&access!=members)", + "description": "Layer 'Sport pitches' shows reservation=required with a fixed text, namely 'Making an appointment is obligatory to use this sport pitch' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if access!=public &access!=private &access!=members)", "value": "required" }, { "key": "reservation", - "description": "Layer 'Sport pitches' shows reservation=recommended with a fixed text, namely 'Making an appointment is recommended when using this sport pitch' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if access!=public&access!=private&access!=members)", + "description": "Layer 'Sport pitches' shows reservation=recommended with a fixed text, namely 'Making an appointment is recommended when using this sport pitch' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if access!=public &access!=private &access!=members)", "value": "recommended" }, { "key": "reservation", - "description": "Layer 'Sport pitches' shows reservation=yes with a fixed text, namely 'Making an appointment is possible, but not necessary to use this sport pitch' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if access!=public&access!=private&access!=members)", + "description": "Layer 'Sport pitches' shows reservation=yes with a fixed text, namely 'Making an appointment is possible, but not necessary to use this sport pitch' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if access!=public &access!=private &access!=members)", "value": "yes" }, { "key": "reservation", - "description": "Layer 'Sport pitches' shows reservation=no with a fixed text, namely 'Making an appointment is not possible' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if access!=public&access!=private&access!=members)", + "description": "Layer 'Sport pitches' shows reservation=no with a fixed text, namely 'Making an appointment is not possible' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if access!=public &access!=private &access!=members)", "value": "no" }, { @@ -12797,7 +13014,7 @@ }, { "key": "id", - "description": "Layer 'Sports centres' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Sports centres' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -12870,7 +13087,7 @@ }, { "key": "id", - "description": "Layer 'Stairs' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Stairs' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -12984,7 +13201,7 @@ }, { "key": "id", - "description": "Layer 'Street Lamps' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Street Lamps' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -13190,7 +13407,7 @@ }, { "key": "id", - "description": "Layer 'Surveillance camera's' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Surveillance camera's' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -13235,16 +13452,16 @@ }, { "key": "camera:direction", - "description": "Layer 'Surveillance camera's' shows and asks freeform values for key 'camera:direction' (in the mapcomplete.org theme 'Personal theme') (This is only shown if camera:direction~.+|direction~.+|camera:type!=dome|camera:type=dome&camera:mount=wall)" + "description": "Layer 'Surveillance camera's' shows and asks freeform values for key 'camera:direction' (in the mapcomplete.org theme 'Personal theme') (This is only shown if camera:direction~.+ |direction~.+ |camera:type!=dome |camera:type=dome &camera:mount=wall)" }, { "key": "camera:direction", - "description": "Layer 'Surveillance camera's' shows direction~.+ with a fixed text, namely 'Films to a compass heading of {direction}' (in the mapcomplete.org theme 'Personal theme') Picking this answer will delete the key camera:direction. (This is only shown if camera:direction~.+|direction~.+|camera:type!=dome|camera:type=dome&camera:mount=wall)", + "description": "Layer 'Surveillance camera's' shows direction~.+ with a fixed text, namely 'Films to a compass heading of {direction}' (in the mapcomplete.org theme 'Personal theme') Picking this answer will delete the key camera:direction. (This is only shown if camera:direction~.+ |direction~.+ |camera:type!=dome |camera:type=dome &camera:mount=wall)", "value": "" }, { "key": "direction", - "description": "Layer 'Surveillance camera's' shows direction~.+ with a fixed text, namely 'Films to a compass heading of {direction}' (in the mapcomplete.org theme 'Personal theme') (This is only shown if camera:direction~.+|direction~.+|camera:type!=dome|camera:type=dome&camera:mount=wall)" + "description": "Layer 'Surveillance camera's' shows direction~.+ with a fixed text, namely 'Films to a compass heading of {direction}' (in the mapcomplete.org theme 'Personal theme') (This is only shown if camera:direction~.+ |direction~.+ |camera:type!=dome |camera:type=dome &camera:mount=wall)" }, { "key": "operator", @@ -13282,7 +13499,7 @@ }, { "key": "level", - "description": "Layer 'Surveillance camera's' shows and asks freeform values for key 'level' (in the mapcomplete.org theme 'Personal theme') (This is only shown if indoor=yes|surveillance:type=ye)" + "description": "Layer 'Surveillance camera's' shows and asks freeform values for key 'level' (in the mapcomplete.org theme 'Personal theme') (This is only shown if indoor=yes |surveillance:type=ye)" }, { "key": "surveillance:zone", @@ -13372,7 +13589,7 @@ }, { "key": "id", - "description": "Layer 'Colleges and universities' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Colleges and universities' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "amenity", @@ -13459,7 +13676,7 @@ }, { "key": "id", - "description": "Layer 'Ticket Machines' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Ticket Machines' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -13552,142 +13769,142 @@ }, { "key": "payment:coins:denominations", - "description": "Layer 'Ticket Machines' shows payment:coins:denominations=0.01 EUR with a fixed text, namely '1 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Ticket Machines' shows payment:coins:denominations=0.01 EUR with a fixed text, namely '1 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.01 EUR" }, { "key": "payment:coins:denominations", - "description": "Layer 'Ticket Machines' shows payment:coins:denominations=0.02 EUR with a fixed text, namely '2 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Ticket Machines' shows payment:coins:denominations=0.02 EUR with a fixed text, namely '2 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.02 EUR" }, { "key": "payment:coins:denominations", - "description": "Layer 'Ticket Machines' shows payment:coins:denominations=0.05 EUR with a fixed text, namely '5 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Ticket Machines' shows payment:coins:denominations=0.05 EUR with a fixed text, namely '5 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.05 EUR" }, { "key": "payment:coins:denominations", - "description": "Layer 'Ticket Machines' shows payment:coins:denominations=0.10 EUR with a fixed text, namely '10 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Ticket Machines' shows payment:coins:denominations=0.10 EUR with a fixed text, namely '10 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.10 EUR" }, { "key": "payment:coins:denominations", - "description": "Layer 'Ticket Machines' shows payment:coins:denominations=0.20 EUR with a fixed text, namely '20 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Ticket Machines' shows payment:coins:denominations=0.20 EUR with a fixed text, namely '20 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.20 EUR" }, { "key": "payment:coins:denominations", - "description": "Layer 'Ticket Machines' shows payment:coins:denominations=0.50 EUR with a fixed text, namely '50 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Ticket Machines' shows payment:coins:denominations=0.50 EUR with a fixed text, namely '50 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.50 EUR" }, { "key": "payment:coins:denominations", - "description": "Layer 'Ticket Machines' shows payment:coins:denominations=1 EUR with a fixed text, namely '1 euro coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Ticket Machines' shows payment:coins:denominations=1 EUR with a fixed text, namely '1 euro coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "1 EUR" }, { "key": "payment:coins:denominations", - "description": "Layer 'Ticket Machines' shows payment:coins:denominations=2 EUR with a fixed text, namely '2 euro coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Ticket Machines' shows payment:coins:denominations=2 EUR with a fixed text, namely '2 euro coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "2 EUR" }, { "key": "payment:coins:denominations", - "description": "Layer 'Ticket Machines' shows payment:coins:denominations=0.05 CHF with a fixed text, namely '5 centimes coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Ticket Machines' shows payment:coins:denominations=0.05 CHF with a fixed text, namely '5 centimes coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.05 CHF" }, { "key": "payment:coins:denominations", - "description": "Layer 'Ticket Machines' shows payment:coins:denominations=0.10 CHF with a fixed text, namely '10 centimes coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Ticket Machines' shows payment:coins:denominations=0.10 CHF with a fixed text, namely '10 centimes coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.10 CHF" }, { "key": "payment:coins:denominations", - "description": "Layer 'Ticket Machines' shows payment:coins:denominations=0.20 CHF with a fixed text, namely '20 centimes coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Ticket Machines' shows payment:coins:denominations=0.20 CHF with a fixed text, namely '20 centimes coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.20 CHF" }, { "key": "payment:coins:denominations", - "description": "Layer 'Ticket Machines' shows payment:coins:denominations=0.50 CHF with a fixed text, namely '½ franc coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Ticket Machines' shows payment:coins:denominations=0.50 CHF with a fixed text, namely '½ franc coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.50 CHF" }, { "key": "payment:coins:denominations", - "description": "Layer 'Ticket Machines' shows payment:coins:denominations=1 CHF with a fixed text, namely '1 franc coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Ticket Machines' shows payment:coins:denominations=1 CHF with a fixed text, namely '1 franc coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "1 CHF" }, { "key": "payment:coins:denominations", - "description": "Layer 'Ticket Machines' shows payment:coins:denominations=2 CHF with a fixed text, namely '2 francs coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Ticket Machines' shows payment:coins:denominations=2 CHF with a fixed text, namely '2 francs coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "2 CHF" }, { "key": "payment:coins:denominations", - "description": "Layer 'Ticket Machines' shows payment:coins:denominations=5 CHF with a fixed text, namely '5 francs coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Ticket Machines' shows payment:coins:denominations=5 CHF with a fixed text, namely '5 francs coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "5 CHF" }, { "key": "payment:notes:denominations", - "description": "Layer 'Ticket Machines' shows payment:notes:denominations=5 EUR with a fixed text, namely '5 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Ticket Machines' shows payment:notes:denominations=5 EUR with a fixed text, namely '5 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "5 EUR" }, { "key": "payment:notes:denominations", - "description": "Layer 'Ticket Machines' shows payment:notes:denominations=10 EUR with a fixed text, namely '10 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Ticket Machines' shows payment:notes:denominations=10 EUR with a fixed text, namely '10 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "10 EUR" }, { "key": "payment:notes:denominations", - "description": "Layer 'Ticket Machines' shows payment:notes:denominations=20 EUR with a fixed text, namely '20 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Ticket Machines' shows payment:notes:denominations=20 EUR with a fixed text, namely '20 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "20 EUR" }, { "key": "payment:notes:denominations", - "description": "Layer 'Ticket Machines' shows payment:notes:denominations=50 EUR with a fixed text, namely '50 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Ticket Machines' shows payment:notes:denominations=50 EUR with a fixed text, namely '50 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "50 EUR" }, { "key": "payment:notes:denominations", - "description": "Layer 'Ticket Machines' shows payment:notes:denominations=100 EUR with a fixed text, namely '100 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Ticket Machines' shows payment:notes:denominations=100 EUR with a fixed text, namely '100 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "100 EUR" }, { "key": "payment:notes:denominations", - "description": "Layer 'Ticket Machines' shows payment:notes:denominations=200 EUR with a fixed text, namely '200 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Ticket Machines' shows payment:notes:denominations=200 EUR with a fixed text, namely '200 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "200 EUR" }, { "key": "payment:notes:denominations", - "description": "Layer 'Ticket Machines' shows payment:notes:denominations=500 EUR with a fixed text, namely '500 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Ticket Machines' shows payment:notes:denominations=500 EUR with a fixed text, namely '500 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "500 EUR" }, { "key": "payment:notes:denominations", - "description": "Layer 'Ticket Machines' shows payment:notes:denominations=10 CHF with a fixed text, namely '10 francs notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Ticket Machines' shows payment:notes:denominations=10 CHF with a fixed text, namely '10 francs notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "10 CHF" }, { "key": "payment:notes:denominations", - "description": "Layer 'Ticket Machines' shows payment:notes:denominations=20 CHF with a fixed text, namely '20 francs notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Ticket Machines' shows payment:notes:denominations=20 CHF with a fixed text, namely '20 francs notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "20 CHF" }, { "key": "payment:notes:denominations", - "description": "Layer 'Ticket Machines' shows payment:notes:denominations=50 CHF with a fixed text, namely '50 francs notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Ticket Machines' shows payment:notes:denominations=50 CHF with a fixed text, namely '50 francs notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "50 CHF" }, { "key": "payment:notes:denominations", - "description": "Layer 'Ticket Machines' shows payment:notes:denominations=100 CHF with a fixed text, namely '100 francs notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Ticket Machines' shows payment:notes:denominations=100 CHF with a fixed text, namely '100 francs notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "100 CHF" }, { "key": "payment:notes:denominations", - "description": "Layer 'Ticket Machines' shows payment:notes:denominations=200 CHF with a fixed text, namely '200 francs notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Ticket Machines' shows payment:notes:denominations=200 CHF with a fixed text, namely '200 francs notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "200 CHF" }, { "key": "payment:notes:denominations", - "description": "Layer 'Ticket Machines' shows payment:notes:denominations=1000 CHF with a fixed text, namely '1000 francs notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Ticket Machines' shows payment:notes:denominations=1000 CHF with a fixed text, namely '1000 francs notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "1000 CHF" }, { @@ -13697,7 +13914,7 @@ }, { "key": "id", - "description": "Layer 'Toilets' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Toilets' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -13848,7 +14065,7 @@ }, { "key": "door:width", - "description": "Layer 'Toilets' shows and asks freeform values for key 'door:width' (in the mapcomplete.org theme 'Personal theme') (This is only shown if wheelchair=yes|wheelchair=designated)" + "description": "Layer 'Toilets' shows and asks freeform values for key 'door:width' (in the mapcomplete.org theme 'Personal theme') (This is only shown if wheelchair=yes |wheelchair=designated)" }, { "key": "toilets:position", @@ -13935,7 +14152,7 @@ }, { "key": "id", - "description": "Layer 'Toilets at other amenities' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Toilets at other amenities' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -14046,7 +14263,7 @@ }, { "key": "toilets:door:width", - "description": "Layer 'Toilets at other amenities' shows and asks freeform values for key 'toilets:door:width' (in the mapcomplete.org theme 'Personal theme') (This is only shown if toilets:wheelchair=yes|toilets:wheelchair=designated)" + "description": "Layer 'Toilets at other amenities' shows and asks freeform values for key 'toilets:door:width' (in the mapcomplete.org theme 'Personal theme') (This is only shown if toilets:wheelchair=yes |toilets:wheelchair=designated)" }, { "key": "toilets:position", @@ -14138,7 +14355,7 @@ }, { "key": "id", - "description": "Layer 'Bus lines' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Bus lines' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "name", @@ -14175,7 +14392,7 @@ }, { "key": "id", - "description": "Layer 'Transit Stops' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Transit Stops' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "name", @@ -14329,7 +14546,7 @@ }, { "key": "id", - "description": "Layer 'Tree' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Tree' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -14426,69 +14643,69 @@ }, { "key": "name", - "description": "Layer 'Tree' shows and asks freeform values for key 'name' (in the mapcomplete.org theme 'Personal theme') (This is only shown if denotation=landmark|denotation=natural_monument|name~.+)" + "description": "Layer 'Tree' shows and asks freeform values for key 'name' (in the mapcomplete.org theme 'Personal theme') (This is only shown if denotation=landmark |denotation=natural_monument |name~.+)" }, { "key": "name", - "description": "Layer 'Tree' shows noname=yes with a fixed text, namely 'The tree does not have a name.' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') Picking this answer will delete the key name. (This is only shown if denotation=landmark|denotation=natural_monument|name~.+)", + "description": "Layer 'Tree' shows noname=yes with a fixed text, namely 'The tree does not have a name.' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') Picking this answer will delete the key name. (This is only shown if denotation=landmark |denotation=natural_monument |name~.+)", "value": "" }, { "key": "noname", - "description": "Layer 'Tree' shows noname=yes with a fixed text, namely 'The tree does not have a name.' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if denotation=landmark|denotation=natural_monument|name~.+)", + "description": "Layer 'Tree' shows noname=yes with a fixed text, namely 'The tree does not have a name.' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if denotation=landmark |denotation=natural_monument |name~.+)", "value": "yes" }, { "key": "heritage", - "description": "Layer 'Tree' shows heritage=4&heritage:operator=OnroerendErfgoed with a fixed text, namely 'Registered as heritage by Onroerend Erfgoed Flanders' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if denotation=landmark|denotation=natural_monument)", + "description": "Layer 'Tree' shows heritage=4 &heritage:operator=OnroerendErfgoed with a fixed text, namely 'Registered as heritage by Onroerend Erfgoed Flanders' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if denotation=landmark |denotation=natural_monument)", "value": "4" }, { "key": "heritage:operator", - "description": "Layer 'Tree' shows heritage=4&heritage:operator=OnroerendErfgoed with a fixed text, namely 'Registered as heritage by Onroerend Erfgoed Flanders' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if denotation=landmark|denotation=natural_monument)", + "description": "Layer 'Tree' shows heritage=4 &heritage:operator=OnroerendErfgoed with a fixed text, namely 'Registered as heritage by Onroerend Erfgoed Flanders' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if denotation=landmark |denotation=natural_monument)", "value": "OnroerendErfgoed" }, { "key": "heritage", - "description": "Layer 'Tree' shows heritage=4&heritage:operator=aatl with a fixed text, namely 'Registered as heritage by Direction du Patrimoine culturel Brussels' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if denotation=landmark|denotation=natural_monument)", + "description": "Layer 'Tree' shows heritage=4 &heritage:operator=aatl with a fixed text, namely 'Registered as heritage by Direction du Patrimoine culturel Brussels' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if denotation=landmark |denotation=natural_monument)", "value": "4" }, { "key": "heritage:operator", - "description": "Layer 'Tree' shows heritage=4&heritage:operator=aatl with a fixed text, namely 'Registered as heritage by Direction du Patrimoine culturel Brussels' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if denotation=landmark|denotation=natural_monument)", + "description": "Layer 'Tree' shows heritage=4 &heritage:operator=aatl with a fixed text, namely 'Registered as heritage by Direction du Patrimoine culturel Brussels' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if denotation=landmark |denotation=natural_monument)", "value": "aatl" }, { "key": "heritage", - "description": "Layer 'Tree' shows heritage=yes with a fixed text, namely 'Registered as heritage by a different organisation' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if denotation=landmark|denotation=natural_monument)", + "description": "Layer 'Tree' shows heritage=yes with a fixed text, namely 'Registered as heritage by a different organisation' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if denotation=landmark |denotation=natural_monument)", "value": "yes" }, { "key": "heritage:operator", - "description": "Layer 'Tree' shows heritage=yes with a fixed text, namely 'Registered as heritage by a different organisation' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') Picking this answer will delete the key heritage:operator. (This is only shown if denotation=landmark|denotation=natural_monument)", + "description": "Layer 'Tree' shows heritage=yes with a fixed text, namely 'Registered as heritage by a different organisation' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') Picking this answer will delete the key heritage:operator. (This is only shown if denotation=landmark |denotation=natural_monument)", "value": "" }, { "key": "heritage", - "description": "Layer 'Tree' shows heritage=no with a fixed text, namely 'Not registered as heritage' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if denotation=landmark|denotation=natural_monument)", + "description": "Layer 'Tree' shows heritage=no with a fixed text, namely 'Not registered as heritage' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if denotation=landmark |denotation=natural_monument)", "value": "no" }, { "key": "heritage:operator", - "description": "Layer 'Tree' shows heritage=no with a fixed text, namely 'Not registered as heritage' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') Picking this answer will delete the key heritage:operator. (This is only shown if denotation=landmark|denotation=natural_monument)", + "description": "Layer 'Tree' shows heritage=no with a fixed text, namely 'Not registered as heritage' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') Picking this answer will delete the key heritage:operator. (This is only shown if denotation=landmark |denotation=natural_monument)", "value": "" }, { "key": "heritage", - "description": "Layer 'Tree' shows heritage~.+ with a fixed text, namely 'Registered as heritage by a different organisation' (in the mapcomplete.org theme 'Personal theme') (This is only shown if denotation=landmark|denotation=natural_monument)" + "description": "Layer 'Tree' shows heritage~.+ with a fixed text, namely 'Registered as heritage by a different organisation' (in the mapcomplete.org theme 'Personal theme') (This is only shown if denotation=landmark |denotation=natural_monument)" }, { "key": "ref:OnroerendErfgoed", - "description": "Layer 'Tree' shows and asks freeform values for key 'ref:OnroerendErfgoed' (in the mapcomplete.org theme 'Personal theme') (This is only shown if heritage=4&heritage:operator=OnroerendErfgoed)" + "description": "Layer 'Tree' shows and asks freeform values for key 'ref:OnroerendErfgoed' (in the mapcomplete.org theme 'Personal theme') (This is only shown if heritage=4 &heritage:operator=OnroerendErfgoed)" }, { "key": "wikidata", - "description": "Layer 'Tree' shows and asks freeform values for key 'wikidata' (in the mapcomplete.org theme 'Personal theme') (This is only shown if denotation=landmark|denotation=natural_monument|wikidata~.+)" + "description": "Layer 'Tree' shows and asks freeform values for key 'wikidata' (in the mapcomplete.org theme 'Personal theme') (This is only shown if denotation=landmark |denotation=natural_monument |wikidata~.+)" }, { "key": "amenity", @@ -14497,7 +14714,7 @@ }, { "key": "id", - "description": "Layer 'Vending Machines' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Vending Machines' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -14700,142 +14917,142 @@ }, { "key": "payment:coins:denominations", - "description": "Layer 'Vending Machines' shows payment:coins:denominations=0.01 EUR with a fixed text, namely '1 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Vending Machines' shows payment:coins:denominations=0.01 EUR with a fixed text, namely '1 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.01 EUR" }, { "key": "payment:coins:denominations", - "description": "Layer 'Vending Machines' shows payment:coins:denominations=0.02 EUR with a fixed text, namely '2 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Vending Machines' shows payment:coins:denominations=0.02 EUR with a fixed text, namely '2 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.02 EUR" }, { "key": "payment:coins:denominations", - "description": "Layer 'Vending Machines' shows payment:coins:denominations=0.05 EUR with a fixed text, namely '5 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Vending Machines' shows payment:coins:denominations=0.05 EUR with a fixed text, namely '5 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.05 EUR" }, { "key": "payment:coins:denominations", - "description": "Layer 'Vending Machines' shows payment:coins:denominations=0.10 EUR with a fixed text, namely '10 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Vending Machines' shows payment:coins:denominations=0.10 EUR with a fixed text, namely '10 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.10 EUR" }, { "key": "payment:coins:denominations", - "description": "Layer 'Vending Machines' shows payment:coins:denominations=0.20 EUR with a fixed text, namely '20 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Vending Machines' shows payment:coins:denominations=0.20 EUR with a fixed text, namely '20 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.20 EUR" }, { "key": "payment:coins:denominations", - "description": "Layer 'Vending Machines' shows payment:coins:denominations=0.50 EUR with a fixed text, namely '50 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Vending Machines' shows payment:coins:denominations=0.50 EUR with a fixed text, namely '50 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.50 EUR" }, { "key": "payment:coins:denominations", - "description": "Layer 'Vending Machines' shows payment:coins:denominations=1 EUR with a fixed text, namely '1 euro coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Vending Machines' shows payment:coins:denominations=1 EUR with a fixed text, namely '1 euro coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "1 EUR" }, { "key": "payment:coins:denominations", - "description": "Layer 'Vending Machines' shows payment:coins:denominations=2 EUR with a fixed text, namely '2 euro coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Vending Machines' shows payment:coins:denominations=2 EUR with a fixed text, namely '2 euro coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "2 EUR" }, { "key": "payment:coins:denominations", - "description": "Layer 'Vending Machines' shows payment:coins:denominations=0.05 CHF with a fixed text, namely '5 centimes coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Vending Machines' shows payment:coins:denominations=0.05 CHF with a fixed text, namely '5 centimes coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.05 CHF" }, { "key": "payment:coins:denominations", - "description": "Layer 'Vending Machines' shows payment:coins:denominations=0.10 CHF with a fixed text, namely '10 centimes coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Vending Machines' shows payment:coins:denominations=0.10 CHF with a fixed text, namely '10 centimes coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.10 CHF" }, { "key": "payment:coins:denominations", - "description": "Layer 'Vending Machines' shows payment:coins:denominations=0.20 CHF with a fixed text, namely '20 centimes coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Vending Machines' shows payment:coins:denominations=0.20 CHF with a fixed text, namely '20 centimes coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.20 CHF" }, { "key": "payment:coins:denominations", - "description": "Layer 'Vending Machines' shows payment:coins:denominations=0.50 CHF with a fixed text, namely '½ franc coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Vending Machines' shows payment:coins:denominations=0.50 CHF with a fixed text, namely '½ franc coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.50 CHF" }, { "key": "payment:coins:denominations", - "description": "Layer 'Vending Machines' shows payment:coins:denominations=1 CHF with a fixed text, namely '1 franc coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Vending Machines' shows payment:coins:denominations=1 CHF with a fixed text, namely '1 franc coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "1 CHF" }, { "key": "payment:coins:denominations", - "description": "Layer 'Vending Machines' shows payment:coins:denominations=2 CHF with a fixed text, namely '2 francs coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Vending Machines' shows payment:coins:denominations=2 CHF with a fixed text, namely '2 francs coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "2 CHF" }, { "key": "payment:coins:denominations", - "description": "Layer 'Vending Machines' shows payment:coins:denominations=5 CHF with a fixed text, namely '5 francs coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Vending Machines' shows payment:coins:denominations=5 CHF with a fixed text, namely '5 francs coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "5 CHF" }, { "key": "payment:notes:denominations", - "description": "Layer 'Vending Machines' shows payment:notes:denominations=5 EUR with a fixed text, namely '5 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Vending Machines' shows payment:notes:denominations=5 EUR with a fixed text, namely '5 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "5 EUR" }, { "key": "payment:notes:denominations", - "description": "Layer 'Vending Machines' shows payment:notes:denominations=10 EUR with a fixed text, namely '10 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Vending Machines' shows payment:notes:denominations=10 EUR with a fixed text, namely '10 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "10 EUR" }, { "key": "payment:notes:denominations", - "description": "Layer 'Vending Machines' shows payment:notes:denominations=20 EUR with a fixed text, namely '20 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Vending Machines' shows payment:notes:denominations=20 EUR with a fixed text, namely '20 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "20 EUR" }, { "key": "payment:notes:denominations", - "description": "Layer 'Vending Machines' shows payment:notes:denominations=50 EUR with a fixed text, namely '50 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Vending Machines' shows payment:notes:denominations=50 EUR with a fixed text, namely '50 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "50 EUR" }, { "key": "payment:notes:denominations", - "description": "Layer 'Vending Machines' shows payment:notes:denominations=100 EUR with a fixed text, namely '100 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Vending Machines' shows payment:notes:denominations=100 EUR with a fixed text, namely '100 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "100 EUR" }, { "key": "payment:notes:denominations", - "description": "Layer 'Vending Machines' shows payment:notes:denominations=200 EUR with a fixed text, namely '200 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Vending Machines' shows payment:notes:denominations=200 EUR with a fixed text, namely '200 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "200 EUR" }, { "key": "payment:notes:denominations", - "description": "Layer 'Vending Machines' shows payment:notes:denominations=500 EUR with a fixed text, namely '500 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Vending Machines' shows payment:notes:denominations=500 EUR with a fixed text, namely '500 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "500 EUR" }, { "key": "payment:notes:denominations", - "description": "Layer 'Vending Machines' shows payment:notes:denominations=10 CHF with a fixed text, namely '10 francs notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Vending Machines' shows payment:notes:denominations=10 CHF with a fixed text, namely '10 francs notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "10 CHF" }, { "key": "payment:notes:denominations", - "description": "Layer 'Vending Machines' shows payment:notes:denominations=20 CHF with a fixed text, namely '20 francs notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Vending Machines' shows payment:notes:denominations=20 CHF with a fixed text, namely '20 francs notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "20 CHF" }, { "key": "payment:notes:denominations", - "description": "Layer 'Vending Machines' shows payment:notes:denominations=50 CHF with a fixed text, namely '50 francs notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Vending Machines' shows payment:notes:denominations=50 CHF with a fixed text, namely '50 francs notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "50 CHF" }, { "key": "payment:notes:denominations", - "description": "Layer 'Vending Machines' shows payment:notes:denominations=100 CHF with a fixed text, namely '100 francs notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Vending Machines' shows payment:notes:denominations=100 CHF with a fixed text, namely '100 francs notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "100 CHF" }, { "key": "payment:notes:denominations", - "description": "Layer 'Vending Machines' shows payment:notes:denominations=200 CHF with a fixed text, namely '200 francs notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Vending Machines' shows payment:notes:denominations=200 CHF with a fixed text, namely '200 francs notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "200 CHF" }, { "key": "payment:notes:denominations", - "description": "Layer 'Vending Machines' shows payment:notes:denominations=1000 CHF with a fixed text, namely '1000 francs notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Vending Machines' shows payment:notes:denominations=1000 CHF with a fixed text, namely '1000 francs notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "1000 CHF" }, { @@ -14909,7 +15126,7 @@ }, { "key": "id", - "description": "Layer 'veterinary' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'veterinary' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "website", @@ -14942,7 +15159,7 @@ }, { "key": "id", - "description": "Layer 'Waste Basket' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Waste Basket' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -15002,27 +15219,27 @@ }, { "key": "vending", - "description": "Layer 'Waste Basket' shows vending=dog_excrement_bag with a fixed text, namely 'This waste basket has a dispenser for (dog) excrement bags' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if waste=dog_excrement|waste=trash|)", + "description": "Layer 'Waste Basket' shows vending=dog_excrement_bag with a fixed text, namely 'This waste basket has a dispenser for (dog) excrement bags' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if waste=dog_excrement |waste=trash |)", "value": "dog_excrement_bag" }, { "key": "not:vending", - "description": "Layer 'Waste Basket' shows vending=dog_excrement_bag with a fixed text, namely 'This waste basket has a dispenser for (dog) excrement bags' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') Picking this answer will delete the key not:vending. (This is only shown if waste=dog_excrement|waste=trash|)", + "description": "Layer 'Waste Basket' shows vending=dog_excrement_bag with a fixed text, namely 'This waste basket has a dispenser for (dog) excrement bags' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') Picking this answer will delete the key not:vending. (This is only shown if waste=dog_excrement |waste=trash |)", "value": "" }, { "key": "not:vending", - "description": "Layer 'Waste Basket' shows not:vending=dog_excrement_bag with a fixed text, namely 'This waste basket does not have a dispenser for (dog) excrement bags' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if waste=dog_excrement|waste=trash|)", + "description": "Layer 'Waste Basket' shows not:vending=dog_excrement_bag with a fixed text, namely 'This waste basket does not have a dispenser for (dog) excrement bags' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if waste=dog_excrement |waste=trash |)", "value": "dog_excrement_bag" }, { "key": "vending", - "description": "Layer 'Waste Basket' shows not:vending=dog_excrement_bag with a fixed text, namely 'This waste basket does not have a dispenser for (dog) excrement bags' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') Picking this answer will delete the key vending. (This is only shown if waste=dog_excrement|waste=trash|)", + "description": "Layer 'Waste Basket' shows not:vending=dog_excrement_bag with a fixed text, namely 'This waste basket does not have a dispenser for (dog) excrement bags' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') Picking this answer will delete the key vending. (This is only shown if waste=dog_excrement |waste=trash |)", "value": "" }, { "key": "vending", - "description": "Layer 'Waste Basket' shows with a fixed text, namely 'This waste basket does not have a dispenser for (dog) excrement bags' (in the mapcomplete.org theme 'Personal theme') Picking this answer will delete the key vending. (This is only shown if waste=dog_excrement|waste=trash|)", + "description": "Layer 'Waste Basket' shows with a fixed text, namely 'This waste basket does not have a dispenser for (dog) excrement bags' (in the mapcomplete.org theme 'Personal theme') Picking this answer will delete the key vending. (This is only shown if waste=dog_excrement |waste=trash |)", "value": "" }, { @@ -15032,7 +15249,7 @@ }, { "key": "id", - "description": "Layer 'Waste Disposal Bins' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Waste Disposal Bins' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -15101,7 +15318,7 @@ }, { "key": "id", - "description": "Layer 'wind turbine' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'wind turbine' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "generator:output:electricity", diff --git a/Docs/TagInfo/mapcomplete_pets.json b/Docs/TagInfo/mapcomplete_pets.json index 208c9f619..49fddf4b9 100644 --- a/Docs/TagInfo/mapcomplete_pets.json +++ b/Docs/TagInfo/mapcomplete_pets.json @@ -27,7 +27,7 @@ }, { "key": "id", - "description": "Layer 'dog parks' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'dog parks' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "barrier", @@ -96,7 +96,7 @@ }, { "key": "id", - "description": "Layer 'Dog friendly eateries' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Dog friendly eateries' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -616,17 +616,17 @@ }, { "key": "internet_access:fee", - "description": "Layer 'Dog friendly eateries' shows internet_access:fee=yes with a fixed text, namely 'There is a fee for the internet access at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if internet_access!=no&internet_access~.+)", + "description": "Layer 'Dog friendly eateries' shows internet_access:fee=yes with a fixed text, namely 'There is a fee for the internet access at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if internet_access!=no &internet_access~.+)", "value": "yes" }, { "key": "internet_access:fee", - "description": "Layer 'Dog friendly eateries' shows internet_access:fee=no with a fixed text, namely 'Internet access is free at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if internet_access!=no&internet_access~.+)", + "description": "Layer 'Dog friendly eateries' shows internet_access:fee=no with a fixed text, namely 'Internet access is free at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if internet_access!=no &internet_access~.+)", "value": "no" }, { "key": "internet_access:fee", - "description": "Layer 'Dog friendly eateries' shows internet_access:fee=customers with a fixed text, namely 'Internet access is free at this place, for customers only' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if internet_access!=no&internet_access~.+)", + "description": "Layer 'Dog friendly eateries' shows internet_access:fee=customers with a fixed text, namely 'Internet access is free at this place, for customers only' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if internet_access!=no &internet_access~.+)", "value": "customers" }, { @@ -659,7 +659,7 @@ }, { "key": "id", - "description": "Layer 'Dog-friendly shops' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Dog-friendly shops' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -685,6 +685,11 @@ "key": "shop", "description": "Layer 'Dog-friendly shops' shows and asks freeform values for key 'shop' (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities')" }, + { + "key": "shop", + "description": "Layer 'Dog-friendly shops' shows shop=vacant with a fixed text, namely 'Vacant Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities')", + "value": "vacant" + }, { "key": "shop", "description": "Layer 'Dog-friendly shops' shows shop=agrarian with a fixed text, namely 'Farm Supply Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities')", @@ -702,7 +707,7 @@ }, { "key": "shop", - "description": "Layer 'Dog-friendly shops' shows shop=antiques with a fixed text, namely 'Antiques Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities')", + "description": "Layer 'Dog-friendly shops' shows shop=antiques with a fixed text, namely 'Antique Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities')", "value": "antiques" }, { @@ -767,7 +772,7 @@ }, { "key": "shop", - "description": "Layer 'Dog-friendly shops' shows shop=books with a fixed text, namely 'Book Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities')", + "description": "Layer 'Dog-friendly shops' shows shop=books with a fixed text, namely 'Bookstore' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities')", "value": "books" }, { @@ -887,7 +892,7 @@ }, { "key": "shop", - "description": "Layer 'Dog-friendly shops' shows shop=country_store with a fixed text, namely 'Country Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities')", + "description": "Layer 'Dog-friendly shops' shows shop=country_store with a fixed text, namely 'Rural Supplies Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities')", "value": "country_store" }, { @@ -907,7 +912,7 @@ }, { "key": "shop", - "description": "Layer 'Dog-friendly shops' shows shop=deli with a fixed text, namely 'Deli' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities')", + "description": "Layer 'Dog-friendly shops' shows shop=deli with a fixed text, namely 'Delicatessen' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities')", "value": "deli" }, { @@ -1057,7 +1062,7 @@ }, { "key": "shop", - "description": "Layer 'Dog-friendly shops' shows shop=health_food with a fixed text, namely 'Health Food Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities')", + "description": "Layer 'Dog-friendly shops' shows shop=health_food with a fixed text, namely 'Health Food Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities')", "value": "health_food" }, { @@ -1077,8 +1082,8 @@ }, { "key": "shop", - "description": "Layer 'Dog-friendly shops' shows shop=hobby with a fixed text, namely 'Hobby Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities')", - "value": "hobby" + "description": "Layer 'Dog-friendly shops' shows shop=honey with a fixed text, namely 'Honey Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities')", + "value": "honey" }, { "key": "shop", @@ -1197,7 +1202,7 @@ }, { "key": "shop", - "description": "Layer 'Dog-friendly shops' shows shop=newsagent with a fixed text, namely 'Newspaper/Magazine Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities')", + "description": "Layer 'Dog-friendly shops' shows shop=newsagent with a fixed text, namely 'Newsstand' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities')", "value": "newsagent" }, { @@ -1205,6 +1210,11 @@ "description": "Layer 'Dog-friendly shops' shows shop=nutrition_supplements with a fixed text, namely 'Nutrition Supplements Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities')", "value": "nutrition_supplements" }, + { + "key": "shop", + "description": "Layer 'Dog-friendly shops' shows shop=nuts with a fixed text, namely 'Nuts Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities')", + "value": "nuts" + }, { "key": "shop", "description": "Layer 'Dog-friendly shops' shows shop=optician with a fixed text, namely 'Optician' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities')", @@ -1230,6 +1240,11 @@ "description": "Layer 'Dog-friendly shops' shows shop=party with a fixed text, namely 'Party Supply Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities')", "value": "party" }, + { + "key": "shop", + "description": "Layer 'Dog-friendly shops' shows shop=pasta with a fixed text, namely 'Pasta Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities')", + "value": "pasta" + }, { "key": "shop", "description": "Layer 'Dog-friendly shops' shows shop=pastry with a fixed text, namely 'Pastry Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities')", @@ -1237,7 +1252,7 @@ }, { "key": "shop", - "description": "Layer 'Dog-friendly shops' shows shop=pawnbroker with a fixed text, namely 'Pawn Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities')", + "description": "Layer 'Dog-friendly shops' shows shop=pawnbroker with a fixed text, namely 'Pawnshop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities')", "value": "pawnbroker" }, { @@ -1252,7 +1267,7 @@ }, { "key": "shop", - "description": "Layer 'Dog-friendly shops' shows shop=pet_grooming with a fixed text, namely 'Pet Grooming Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities')", + "description": "Layer 'Dog-friendly shops' shows shop=pet_grooming with a fixed text, namely 'Pet Groomer' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities')", "value": "pet_grooming" }, { @@ -1300,6 +1315,11 @@ "description": "Layer 'Dog-friendly shops' shows shop=repair with a fixed text, namely 'Repair Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities')", "value": "repair" }, + { + "key": "shop", + "description": "Layer 'Dog-friendly shops' shows shop=rice with a fixed text, namely 'Rice Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities')", + "value": "rice" + }, { "key": "shop", "description": "Layer 'Dog-friendly shops' shows shop=scuba_diving with a fixed text, namely 'Scuba Diving Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities')", @@ -1312,7 +1332,7 @@ }, { "key": "shop", - "description": "Layer 'Dog-friendly shops' shows shop=second_hand with a fixed text, namely 'Consignment/Thrift Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities')", + "description": "Layer 'Dog-friendly shops' shows shop=second_hand with a fixed text, namely 'Thrift Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities')", "value": "second_hand" }, { @@ -1432,7 +1452,7 @@ }, { "key": "shop", - "description": "Layer 'Dog-friendly shops' shows shop=variety_store with a fixed text, namely 'Variety Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities')", + "description": "Layer 'Dog-friendly shops' shows shop=variety_store with a fixed text, namely 'Discount Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities')", "value": "variety_store" }, { @@ -1487,17 +1507,17 @@ }, { "key": "second_hand", - "description": "Layer 'Dog-friendly shops' shows second_hand=only with a fixed text, namely 'This shop sells second-hand items only' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if shop=clothes|shop=car|shop=books|shop=charity|shop=car_repair|shop=furniture|shop=bicycle|shop=bicycle|shop=mobile_phone|shop=computer|shop=toys)", + "description": "Layer 'Dog-friendly shops' shows second_hand=only with a fixed text, namely 'This shop sells second-hand items only' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if shop=clothes |shop=car |shop=books |shop=charity |shop=car_repair |shop=furniture |shop=bicycle |shop=bicycle |shop=mobile_phone |shop=computer |shop=toys)", "value": "only" }, { "key": "second_hand", - "description": "Layer 'Dog-friendly shops' shows second_hand=yes with a fixed text, namely 'This shop sells second-hand items along with new items' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if shop=clothes|shop=car|shop=books|shop=charity|shop=car_repair|shop=furniture|shop=bicycle|shop=bicycle|shop=mobile_phone|shop=computer|shop=toys)", + "description": "Layer 'Dog-friendly shops' shows second_hand=yes with a fixed text, namely 'This shop sells second-hand items along with new items' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if shop=clothes |shop=car |shop=books |shop=charity |shop=car_repair |shop=furniture |shop=bicycle |shop=bicycle |shop=mobile_phone |shop=computer |shop=toys)", "value": "yes" }, { "key": "second_hand", - "description": "Layer 'Dog-friendly shops' shows second_hand=no with a fixed text, namely 'This shop only sells brand-new items' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if shop=clothes|shop=car|shop=books|shop=charity|shop=car_repair|shop=furniture|shop=bicycle|shop=bicycle|shop=mobile_phone|shop=computer|shop=toys)", + "description": "Layer 'Dog-friendly shops' shows second_hand=no with a fixed text, namely 'This shop only sells brand-new items' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if shop=clothes |shop=car |shop=books |shop=charity |shop=car_repair |shop=furniture |shop=bicycle |shop=bicycle |shop=mobile_phone |shop=computer |shop=toys)", "value": "no" }, { @@ -1574,29 +1594,49 @@ }, { "key": "service:print:A4", - "description": "Layer 'Dog-friendly shops' shows service:print:A4=yes with a fixed text, namely 'This shop can print on papers of size A4' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if shop~^(.*copyshop.*)$|shop~^(.*stationery.*)$|service:print=yes)", + "description": "Layer 'Dog-friendly shops' shows service:print:A4=yes with a fixed text, namely 'This shop can print on papers of size A4' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if shop~^(.*copyshop.*)$ |shop~^(.*stationery.*)$ |service:print=yes)", "value": "yes" }, { "key": "service:print:A3", - "description": "Layer 'Dog-friendly shops' shows service:print:A3=yes with a fixed text, namely 'This shop can print on papers of size A3' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if shop~^(.*copyshop.*)$|shop~^(.*stationery.*)$|service:print=yes)", + "description": "Layer 'Dog-friendly shops' shows service:print:A3=yes with a fixed text, namely 'This shop can print on papers of size A3' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if shop~^(.*copyshop.*)$ |shop~^(.*stationery.*)$ |service:print=yes)", "value": "yes" }, { "key": "service:print:A2", - "description": "Layer 'Dog-friendly shops' shows service:print:A2=yes with a fixed text, namely 'This shop can print on papers of size A2' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if shop~^(.*copyshop.*)$|shop~^(.*stationery.*)$|service:print=yes)", + "description": "Layer 'Dog-friendly shops' shows service:print:A2=yes with a fixed text, namely 'This shop can print on papers of size A2' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if shop~^(.*copyshop.*)$ |shop~^(.*stationery.*)$ |service:print=yes)", "value": "yes" }, { "key": "service:print:A1", - "description": "Layer 'Dog-friendly shops' shows service:print:A1=yes with a fixed text, namely 'This shop can print on papers of size A1' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if shop~^(.*copyshop.*)$|shop~^(.*stationery.*)$|service:print=yes)", + "description": "Layer 'Dog-friendly shops' shows service:print:A1=yes with a fixed text, namely 'This shop can print on papers of size A1' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if shop~^(.*copyshop.*)$ |shop~^(.*stationery.*)$ |service:print=yes)", "value": "yes" }, { "key": "service:print:A0", - "description": "Layer 'Dog-friendly shops' shows service:print:A0=yes with a fixed text, namely 'This shop can print on papers of size A0' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if shop~^(.*copyshop.*)$|shop~^(.*stationery.*)$|service:print=yes)", + "description": "Layer 'Dog-friendly shops' shows service:print:A0=yes with a fixed text, namely 'This shop can print on papers of size A0' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if shop~^(.*copyshop.*)$ |shop~^(.*stationery.*)$ |service:print=yes)", "value": "yes" }, + { + "key": "craft", + "description": "Layer 'Dog-friendly shops' shows craft=key_cutter with a fixed text, namely 'This shop is also specialized in key cutting' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if shop=shoe_repair |service:key_cutting~.+ |craft=key_cutting |shop=diy |shop=doityourself |shop=home_improvement |shop=hardware |shop=locksmith |shop=repair)", + "value": "key_cutter" + }, + { + "key": "service:key_cutting", + "description": "Layer 'Dog-friendly shops' shows service:key_cutting=yes with a fixed text, namely 'This shop offers key cutting as a service' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if shop=shoe_repair |service:key_cutting~.+ |craft=key_cutting |shop=diy |shop=doityourself |shop=home_improvement |shop=hardware |shop=locksmith |shop=repair)", + "value": "yes" + }, + { + "key": "craft", + "description": "Layer 'Dog-friendly shops' shows service:key_cutting=no with a fixed text, namely 'This shops does not offer key cutting as a service' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') Picking this answer will delete the key craft. (This is only shown if shop=shoe_repair |service:key_cutting~.+ |craft=key_cutting |shop=diy |shop=doityourself |shop=home_improvement |shop=hardware |shop=locksmith |shop=repair)", + "value": "" + }, + { + "key": "service:key_cutting", + "description": "Layer 'Dog-friendly shops' shows service:key_cutting=no with a fixed text, namely 'This shops does not offer key cutting as a service' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if shop=shoe_repair |service:key_cutting~.+ |craft=key_cutting |shop=diy |shop=doityourself |shop=home_improvement |shop=hardware |shop=locksmith |shop=repair)", + "value": "no" + }, { "key": "internet_access", "description": "Layer 'Dog-friendly shops' shows internet_access=wlan with a fixed text, namely 'This place offers wireless internet access' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities')", @@ -1624,17 +1664,17 @@ }, { "key": "internet_access:fee", - "description": "Layer 'Dog-friendly shops' shows internet_access:fee=yes with a fixed text, namely 'There is a fee for the internet access at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if internet_access!=no&internet_access~.+)", + "description": "Layer 'Dog-friendly shops' shows internet_access:fee=yes with a fixed text, namely 'There is a fee for the internet access at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if internet_access!=no &internet_access~.+)", "value": "yes" }, { "key": "internet_access:fee", - "description": "Layer 'Dog-friendly shops' shows internet_access:fee=no with a fixed text, namely 'Internet access is free at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if internet_access!=no&internet_access~.+)", + "description": "Layer 'Dog-friendly shops' shows internet_access:fee=no with a fixed text, namely 'Internet access is free at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if internet_access!=no &internet_access~.+)", "value": "no" }, { "key": "internet_access:fee", - "description": "Layer 'Dog-friendly shops' shows internet_access:fee=customers with a fixed text, namely 'Internet access is free at this place, for customers only' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if internet_access!=no&internet_access~.+)", + "description": "Layer 'Dog-friendly shops' shows internet_access:fee=customers with a fixed text, namely 'Internet access is free at this place, for customers only' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if internet_access!=no &internet_access~.+)", "value": "customers" }, { @@ -1648,77 +1688,77 @@ }, { "key": "organic", - "description": "Layer 'Dog-friendly shops' shows organic=yes with a fixed text, namely 'This shop offers organic products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=clothes|shop=shoes|shop=butcher|shop=cosmetics|shop=deli|shop=bakery|shop=alcohol|shop=seafood|shop=beverages|shop=florist)", + "description": "Layer 'Dog-friendly shops' shows organic=yes with a fixed text, namely 'This shop offers organic products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=clothes |shop=shoes |shop=butcher |shop=cosmetics |shop=deli |shop=bakery |shop=alcohol |shop=seafood |shop=beverages |shop=florist)", "value": "yes" }, { "key": "organic", - "description": "Layer 'Dog-friendly shops' shows organic=only with a fixed text, namely 'This shop only offers organic products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=clothes|shop=shoes|shop=butcher|shop=cosmetics|shop=deli|shop=bakery|shop=alcohol|shop=seafood|shop=beverages|shop=florist)", + "description": "Layer 'Dog-friendly shops' shows organic=only with a fixed text, namely 'This shop only offers organic products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=clothes |shop=shoes |shop=butcher |shop=cosmetics |shop=deli |shop=bakery |shop=alcohol |shop=seafood |shop=beverages |shop=florist)", "value": "only" }, { "key": "organic", - "description": "Layer 'Dog-friendly shops' shows organic=no with a fixed text, namely 'This shop does not offer organic products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=clothes|shop=shoes|shop=butcher|shop=cosmetics|shop=deli|shop=bakery|shop=alcohol|shop=seafood|shop=beverages|shop=florist)", + "description": "Layer 'Dog-friendly shops' shows organic=no with a fixed text, namely 'This shop does not offer organic products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=clothes |shop=shoes |shop=butcher |shop=cosmetics |shop=deli |shop=bakery |shop=alcohol |shop=seafood |shop=beverages |shop=florist)", "value": "no" }, { "key": "diet:sugar_free", - "description": "Layer 'Dog-friendly shops' shows diet:sugar_free=only with a fixed text, namely 'This shop only sells sugar free products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Dog-friendly shops' shows diet:sugar_free=only with a fixed text, namely 'This shop only sells sugar free products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "only" }, { "key": "diet:sugar_free", - "description": "Layer 'Dog-friendly shops' shows diet:sugar_free=yes with a fixed text, namely 'This shop has a big sugar free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Dog-friendly shops' shows diet:sugar_free=yes with a fixed text, namely 'This shop has a big sugar free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "yes" }, { "key": "diet:sugar_free", - "description": "Layer 'Dog-friendly shops' shows diet:sugar_free=limited with a fixed text, namely 'This shop has a limited sugar free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Dog-friendly shops' shows diet:sugar_free=limited with a fixed text, namely 'This shop has a limited sugar free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "limited" }, { "key": "diet:sugar_free", - "description": "Layer 'Dog-friendly shops' shows diet:sugar_free=no with a fixed text, namely 'This shop has no sugar free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Dog-friendly shops' shows diet:sugar_free=no with a fixed text, namely 'This shop has no sugar free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "no" }, { "key": "diet:gluten_free", - "description": "Layer 'Dog-friendly shops' shows diet:gluten_free=only with a fixed text, namely 'This shop only sells gluten free products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Dog-friendly shops' shows diet:gluten_free=only with a fixed text, namely 'This shop only sells gluten free products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "only" }, { "key": "diet:gluten_free", - "description": "Layer 'Dog-friendly shops' shows diet:gluten_free=yes with a fixed text, namely 'This shop has a big gluten free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Dog-friendly shops' shows diet:gluten_free=yes with a fixed text, namely 'This shop has a big gluten free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "yes" }, { "key": "diet:gluten_free", - "description": "Layer 'Dog-friendly shops' shows diet:gluten_free=limited with a fixed text, namely 'This shop has a limited gluten free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Dog-friendly shops' shows diet:gluten_free=limited with a fixed text, namely 'This shop has a limited gluten free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "limited" }, { "key": "diet:gluten_free", - "description": "Layer 'Dog-friendly shops' shows diet:gluten_free=no with a fixed text, namely 'This shop has no gluten free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Dog-friendly shops' shows diet:gluten_free=no with a fixed text, namely 'This shop has no gluten free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "no" }, { "key": "diet:lactose_free", - "description": "Layer 'Dog-friendly shops' shows diet:lactose_free=only with a fixed text, namely 'Only sells lactose free products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Dog-friendly shops' shows diet:lactose_free=only with a fixed text, namely 'Only sells lactose free products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "only" }, { "key": "diet:lactose_free", - "description": "Layer 'Dog-friendly shops' shows diet:lactose_free=yes with a fixed text, namely 'Big lactose free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Dog-friendly shops' shows diet:lactose_free=yes with a fixed text, namely 'Big lactose free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "yes" }, { "key": "diet:lactose_free", - "description": "Layer 'Dog-friendly shops' shows diet:lactose_free=limited with a fixed text, namely 'Limited lactose free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Dog-friendly shops' shows diet:lactose_free=limited with a fixed text, namely 'Limited lactose free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "limited" }, { "key": "diet:lactose_free", - "description": "Layer 'Dog-friendly shops' shows diet:lactose_free=no with a fixed text, namely 'No lactose free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Dog-friendly shops' shows diet:lactose_free=no with a fixed text, namely 'No lactose free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "no" }, { @@ -1728,7 +1768,7 @@ }, { "key": "id", - "description": "Layer 'veterinary' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'veterinary' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "website", diff --git a/Docs/TagInfo/mapcomplete_playgrounds.json b/Docs/TagInfo/mapcomplete_playgrounds.json index 92903d04a..a39f2a876 100644 --- a/Docs/TagInfo/mapcomplete_playgrounds.json +++ b/Docs/TagInfo/mapcomplete_playgrounds.json @@ -17,7 +17,7 @@ }, { "key": "id", - "description": "Layer 'Playgrounds' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Playgrounds') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Playgrounds' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Playgrounds') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -183,7 +183,7 @@ }, { "key": "id", - "description": "Layer 'Benches' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Playgrounds') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Benches' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Playgrounds') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -203,12 +203,12 @@ }, { "key": "backrest", - "description": "Layer 'Benches' shows backrest=yes&two_sided=yes with a fixed text, namely 'This bench is two-sided and shares the backrest' and allows to pick this as a default answer (in the mapcomplete.org theme 'Playgrounds')", + "description": "Layer 'Benches' shows backrest=yes &two_sided=yes with a fixed text, namely 'This bench is two-sided and shares the backrest' and allows to pick this as a default answer (in the mapcomplete.org theme 'Playgrounds')", "value": "yes" }, { "key": "two_sided", - "description": "Layer 'Benches' shows backrest=yes&two_sided=yes with a fixed text, namely 'This bench is two-sided and shares the backrest' and allows to pick this as a default answer (in the mapcomplete.org theme 'Playgrounds')", + "description": "Layer 'Benches' shows backrest=yes &two_sided=yes with a fixed text, namely 'This bench is two-sided and shares the backrest' and allows to pick this as a default answer (in the mapcomplete.org theme 'Playgrounds')", "value": "yes" }, { @@ -352,17 +352,17 @@ }, { "key": "historic", - "description": "Layer 'Benches' shows historic=memorial with a fixed text, namely 'This bench is a memorial for someone or something' and allows to pick this as a default answer (in the mapcomplete.org theme 'Playgrounds') (This is only shown if historic=memorial|inscription~.+|memorial=bench|tourism=artwork)", + "description": "Layer 'Benches' shows historic=memorial with a fixed text, namely 'This bench is a memorial for someone or something' and allows to pick this as a default answer (in the mapcomplete.org theme 'Playgrounds') (This is only shown if historic=memorial |inscription~.+ |memorial=bench |tourism=artwork)", "value": "memorial" }, { "key": "historic", - "description": "Layer 'Benches' shows not:historic=memorial with a fixed text, namely 'This bench is a not a memorial for someone or something' and allows to pick this as a default answer (in the mapcomplete.org theme 'Playgrounds') Picking this answer will delete the key historic. (This is only shown if historic=memorial|inscription~.+|memorial=bench|tourism=artwork)", + "description": "Layer 'Benches' shows not:historic=memorial with a fixed text, namely 'This bench is a not a memorial for someone or something' and allows to pick this as a default answer (in the mapcomplete.org theme 'Playgrounds') Picking this answer will delete the key historic. (This is only shown if historic=memorial |inscription~.+ |memorial=bench |tourism=artwork)", "value": "" }, { "key": "not:historic", - "description": "Layer 'Benches' shows not:historic=memorial with a fixed text, namely 'This bench is a not a memorial for someone or something' and allows to pick this as a default answer (in the mapcomplete.org theme 'Playgrounds') (This is only shown if historic=memorial|inscription~.+|memorial=bench|tourism=artwork)", + "description": "Layer 'Benches' shows not:historic=memorial with a fixed text, namely 'This bench is a not a memorial for someone or something' and allows to pick this as a default answer (in the mapcomplete.org theme 'Playgrounds') (This is only shown if historic=memorial |inscription~.+ |memorial=bench |tourism=artwork)", "value": "memorial" }, { @@ -457,7 +457,7 @@ }, { "key": "id", - "description": "Layer 'Picnic tables' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Playgrounds') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Picnic tables' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Playgrounds') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", diff --git a/Docs/TagInfo/mapcomplete_postboxes.json b/Docs/TagInfo/mapcomplete_postboxes.json index eac3cdef5..7699fb2fc 100644 --- a/Docs/TagInfo/mapcomplete_postboxes.json +++ b/Docs/TagInfo/mapcomplete_postboxes.json @@ -17,7 +17,7 @@ }, { "key": "id", - "description": "Layer 'Postboxes' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Postbox and Post Office Map') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Postboxes' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Postbox and Post Office Map') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -47,7 +47,7 @@ }, { "key": "id", - "description": "Layer 'Post offices' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Postbox and Post Office Map') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Post offices' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Postbox and Post Office Map') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -225,7 +225,7 @@ }, { "key": "id", - "description": "Layer 'Parcel Lockers' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Postbox and Post Office Map') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Parcel Lockers' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Postbox and Post Office Map') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", diff --git a/Docs/TagInfo/mapcomplete_rainbow_crossings.json b/Docs/TagInfo/mapcomplete_rainbow_crossings.json index 5bd35ddbb..f40c8d6de 100644 --- a/Docs/TagInfo/mapcomplete_rainbow_crossings.json +++ b/Docs/TagInfo/mapcomplete_rainbow_crossings.json @@ -32,7 +32,7 @@ }, { "key": "id", - "description": "Layer 'Crossings with rainbow paintings' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Rainbow pedestrian crossings') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Crossings with rainbow paintings' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Rainbow pedestrian crossings') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", diff --git a/Docs/TagInfo/mapcomplete_shops.json b/Docs/TagInfo/mapcomplete_shops.json index 6ba4c107f..b1bfc00a3 100644 --- a/Docs/TagInfo/mapcomplete_shops.json +++ b/Docs/TagInfo/mapcomplete_shops.json @@ -26,7 +26,7 @@ }, { "key": "id", - "description": "Layer 'Shop' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Shops') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Shop' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Shops') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -52,6 +52,11 @@ "key": "shop", "description": "Layer 'Shop' shows and asks freeform values for key 'shop' (in the mapcomplete.org theme 'Shops')" }, + { + "key": "shop", + "description": "Layer 'Shop' shows shop=vacant with a fixed text, namely 'Vacant Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops')", + "value": "vacant" + }, { "key": "shop", "description": "Layer 'Shop' shows shop=agrarian with a fixed text, namely 'Farm Supply Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops')", @@ -69,7 +74,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=antiques with a fixed text, namely 'Antiques Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops')", + "description": "Layer 'Shop' shows shop=antiques with a fixed text, namely 'Antique Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops')", "value": "antiques" }, { @@ -134,7 +139,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=books with a fixed text, namely 'Book Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops')", + "description": "Layer 'Shop' shows shop=books with a fixed text, namely 'Bookstore' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops')", "value": "books" }, { @@ -254,7 +259,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=country_store with a fixed text, namely 'Country Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops')", + "description": "Layer 'Shop' shows shop=country_store with a fixed text, namely 'Rural Supplies Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops')", "value": "country_store" }, { @@ -274,7 +279,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=deli with a fixed text, namely 'Deli' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops')", + "description": "Layer 'Shop' shows shop=deli with a fixed text, namely 'Delicatessen' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops')", "value": "deli" }, { @@ -424,7 +429,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=health_food with a fixed text, namely 'Health Food Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops')", + "description": "Layer 'Shop' shows shop=health_food with a fixed text, namely 'Health Food Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops')", "value": "health_food" }, { @@ -444,8 +449,8 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=hobby with a fixed text, namely 'Hobby Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops')", - "value": "hobby" + "description": "Layer 'Shop' shows shop=honey with a fixed text, namely 'Honey Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops')", + "value": "honey" }, { "key": "shop", @@ -564,7 +569,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=newsagent with a fixed text, namely 'Newspaper/Magazine Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops')", + "description": "Layer 'Shop' shows shop=newsagent with a fixed text, namely 'Newsstand' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops')", "value": "newsagent" }, { @@ -572,6 +577,11 @@ "description": "Layer 'Shop' shows shop=nutrition_supplements with a fixed text, namely 'Nutrition Supplements Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops')", "value": "nutrition_supplements" }, + { + "key": "shop", + "description": "Layer 'Shop' shows shop=nuts with a fixed text, namely 'Nuts Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops')", + "value": "nuts" + }, { "key": "shop", "description": "Layer 'Shop' shows shop=optician with a fixed text, namely 'Optician' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops')", @@ -597,6 +607,11 @@ "description": "Layer 'Shop' shows shop=party with a fixed text, namely 'Party Supply Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops')", "value": "party" }, + { + "key": "shop", + "description": "Layer 'Shop' shows shop=pasta with a fixed text, namely 'Pasta Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops')", + "value": "pasta" + }, { "key": "shop", "description": "Layer 'Shop' shows shop=pastry with a fixed text, namely 'Pastry Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops')", @@ -604,7 +619,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=pawnbroker with a fixed text, namely 'Pawn Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops')", + "description": "Layer 'Shop' shows shop=pawnbroker with a fixed text, namely 'Pawnshop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops')", "value": "pawnbroker" }, { @@ -619,7 +634,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=pet_grooming with a fixed text, namely 'Pet Grooming Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops')", + "description": "Layer 'Shop' shows shop=pet_grooming with a fixed text, namely 'Pet Groomer' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops')", "value": "pet_grooming" }, { @@ -667,6 +682,11 @@ "description": "Layer 'Shop' shows shop=repair with a fixed text, namely 'Repair Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops')", "value": "repair" }, + { + "key": "shop", + "description": "Layer 'Shop' shows shop=rice with a fixed text, namely 'Rice Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops')", + "value": "rice" + }, { "key": "shop", "description": "Layer 'Shop' shows shop=scuba_diving with a fixed text, namely 'Scuba Diving Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops')", @@ -679,7 +699,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=second_hand with a fixed text, namely 'Consignment/Thrift Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops')", + "description": "Layer 'Shop' shows shop=second_hand with a fixed text, namely 'Thrift Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops')", "value": "second_hand" }, { @@ -799,7 +819,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=variety_store with a fixed text, namely 'Variety Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops')", + "description": "Layer 'Shop' shows shop=variety_store with a fixed text, namely 'Discount Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops')", "value": "variety_store" }, { @@ -854,17 +874,17 @@ }, { "key": "second_hand", - "description": "Layer 'Shop' shows second_hand=only with a fixed text, namely 'This shop sells second-hand items only' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops') (This is only shown if shop=clothes|shop=car|shop=books|shop=charity|shop=car_repair|shop=furniture|shop=bicycle|shop=bicycle|shop=mobile_phone|shop=computer|shop=toys)", + "description": "Layer 'Shop' shows second_hand=only with a fixed text, namely 'This shop sells second-hand items only' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops') (This is only shown if shop=clothes |shop=car |shop=books |shop=charity |shop=car_repair |shop=furniture |shop=bicycle |shop=bicycle |shop=mobile_phone |shop=computer |shop=toys)", "value": "only" }, { "key": "second_hand", - "description": "Layer 'Shop' shows second_hand=yes with a fixed text, namely 'This shop sells second-hand items along with new items' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops') (This is only shown if shop=clothes|shop=car|shop=books|shop=charity|shop=car_repair|shop=furniture|shop=bicycle|shop=bicycle|shop=mobile_phone|shop=computer|shop=toys)", + "description": "Layer 'Shop' shows second_hand=yes with a fixed text, namely 'This shop sells second-hand items along with new items' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops') (This is only shown if shop=clothes |shop=car |shop=books |shop=charity |shop=car_repair |shop=furniture |shop=bicycle |shop=bicycle |shop=mobile_phone |shop=computer |shop=toys)", "value": "yes" }, { "key": "second_hand", - "description": "Layer 'Shop' shows second_hand=no with a fixed text, namely 'This shop only sells brand-new items' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops') (This is only shown if shop=clothes|shop=car|shop=books|shop=charity|shop=car_repair|shop=furniture|shop=bicycle|shop=bicycle|shop=mobile_phone|shop=computer|shop=toys)", + "description": "Layer 'Shop' shows second_hand=no with a fixed text, namely 'This shop only sells brand-new items' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops') (This is only shown if shop=clothes |shop=car |shop=books |shop=charity |shop=car_repair |shop=furniture |shop=bicycle |shop=bicycle |shop=mobile_phone |shop=computer |shop=toys)", "value": "no" }, { @@ -941,29 +961,49 @@ }, { "key": "service:print:A4", - "description": "Layer 'Shop' shows service:print:A4=yes with a fixed text, namely 'This shop can print on papers of size A4' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops') (This is only shown if shop~^(.*copyshop.*)$|shop~^(.*stationery.*)$|service:print=yes)", + "description": "Layer 'Shop' shows service:print:A4=yes with a fixed text, namely 'This shop can print on papers of size A4' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops') (This is only shown if shop~^(.*copyshop.*)$ |shop~^(.*stationery.*)$ |service:print=yes)", "value": "yes" }, { "key": "service:print:A3", - "description": "Layer 'Shop' shows service:print:A3=yes with a fixed text, namely 'This shop can print on papers of size A3' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops') (This is only shown if shop~^(.*copyshop.*)$|shop~^(.*stationery.*)$|service:print=yes)", + "description": "Layer 'Shop' shows service:print:A3=yes with a fixed text, namely 'This shop can print on papers of size A3' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops') (This is only shown if shop~^(.*copyshop.*)$ |shop~^(.*stationery.*)$ |service:print=yes)", "value": "yes" }, { "key": "service:print:A2", - "description": "Layer 'Shop' shows service:print:A2=yes with a fixed text, namely 'This shop can print on papers of size A2' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops') (This is only shown if shop~^(.*copyshop.*)$|shop~^(.*stationery.*)$|service:print=yes)", + "description": "Layer 'Shop' shows service:print:A2=yes with a fixed text, namely 'This shop can print on papers of size A2' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops') (This is only shown if shop~^(.*copyshop.*)$ |shop~^(.*stationery.*)$ |service:print=yes)", "value": "yes" }, { "key": "service:print:A1", - "description": "Layer 'Shop' shows service:print:A1=yes with a fixed text, namely 'This shop can print on papers of size A1' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops') (This is only shown if shop~^(.*copyshop.*)$|shop~^(.*stationery.*)$|service:print=yes)", + "description": "Layer 'Shop' shows service:print:A1=yes with a fixed text, namely 'This shop can print on papers of size A1' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops') (This is only shown if shop~^(.*copyshop.*)$ |shop~^(.*stationery.*)$ |service:print=yes)", "value": "yes" }, { "key": "service:print:A0", - "description": "Layer 'Shop' shows service:print:A0=yes with a fixed text, namely 'This shop can print on papers of size A0' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops') (This is only shown if shop~^(.*copyshop.*)$|shop~^(.*stationery.*)$|service:print=yes)", + "description": "Layer 'Shop' shows service:print:A0=yes with a fixed text, namely 'This shop can print on papers of size A0' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops') (This is only shown if shop~^(.*copyshop.*)$ |shop~^(.*stationery.*)$ |service:print=yes)", "value": "yes" }, + { + "key": "craft", + "description": "Layer 'Shop' shows craft=key_cutter with a fixed text, namely 'This shop is also specialized in key cutting' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops') (This is only shown if shop=shoe_repair |service:key_cutting~.+ |craft=key_cutting |shop=diy |shop=doityourself |shop=home_improvement |shop=hardware |shop=locksmith |shop=repair)", + "value": "key_cutter" + }, + { + "key": "service:key_cutting", + "description": "Layer 'Shop' shows service:key_cutting=yes with a fixed text, namely 'This shop offers key cutting as a service' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops') (This is only shown if shop=shoe_repair |service:key_cutting~.+ |craft=key_cutting |shop=diy |shop=doityourself |shop=home_improvement |shop=hardware |shop=locksmith |shop=repair)", + "value": "yes" + }, + { + "key": "craft", + "description": "Layer 'Shop' shows service:key_cutting=no with a fixed text, namely 'This shops does not offer key cutting as a service' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops') Picking this answer will delete the key craft. (This is only shown if shop=shoe_repair |service:key_cutting~.+ |craft=key_cutting |shop=diy |shop=doityourself |shop=home_improvement |shop=hardware |shop=locksmith |shop=repair)", + "value": "" + }, + { + "key": "service:key_cutting", + "description": "Layer 'Shop' shows service:key_cutting=no with a fixed text, namely 'This shops does not offer key cutting as a service' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops') (This is only shown if shop=shoe_repair |service:key_cutting~.+ |craft=key_cutting |shop=diy |shop=doityourself |shop=home_improvement |shop=hardware |shop=locksmith |shop=repair)", + "value": "no" + }, { "key": "internet_access", "description": "Layer 'Shop' shows internet_access=wlan with a fixed text, namely 'This place offers wireless internet access' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops')", @@ -991,17 +1031,17 @@ }, { "key": "internet_access:fee", - "description": "Layer 'Shop' shows internet_access:fee=yes with a fixed text, namely 'There is a fee for the internet access at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops') (This is only shown if internet_access!=no&internet_access~.+)", + "description": "Layer 'Shop' shows internet_access:fee=yes with a fixed text, namely 'There is a fee for the internet access at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops') (This is only shown if internet_access!=no &internet_access~.+)", "value": "yes" }, { "key": "internet_access:fee", - "description": "Layer 'Shop' shows internet_access:fee=no with a fixed text, namely 'Internet access is free at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops') (This is only shown if internet_access!=no&internet_access~.+)", + "description": "Layer 'Shop' shows internet_access:fee=no with a fixed text, namely 'Internet access is free at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops') (This is only shown if internet_access!=no &internet_access~.+)", "value": "no" }, { "key": "internet_access:fee", - "description": "Layer 'Shop' shows internet_access:fee=customers with a fixed text, namely 'Internet access is free at this place, for customers only' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops') (This is only shown if internet_access!=no&internet_access~.+)", + "description": "Layer 'Shop' shows internet_access:fee=customers with a fixed text, namely 'Internet access is free at this place, for customers only' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops') (This is only shown if internet_access!=no &internet_access~.+)", "value": "customers" }, { @@ -1015,77 +1055,77 @@ }, { "key": "organic", - "description": "Layer 'Shop' shows organic=yes with a fixed text, namely 'This shop offers organic products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=clothes|shop=shoes|shop=butcher|shop=cosmetics|shop=deli|shop=bakery|shop=alcohol|shop=seafood|shop=beverages|shop=florist)", + "description": "Layer 'Shop' shows organic=yes with a fixed text, namely 'This shop offers organic products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=clothes |shop=shoes |shop=butcher |shop=cosmetics |shop=deli |shop=bakery |shop=alcohol |shop=seafood |shop=beverages |shop=florist)", "value": "yes" }, { "key": "organic", - "description": "Layer 'Shop' shows organic=only with a fixed text, namely 'This shop only offers organic products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=clothes|shop=shoes|shop=butcher|shop=cosmetics|shop=deli|shop=bakery|shop=alcohol|shop=seafood|shop=beverages|shop=florist)", + "description": "Layer 'Shop' shows organic=only with a fixed text, namely 'This shop only offers organic products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=clothes |shop=shoes |shop=butcher |shop=cosmetics |shop=deli |shop=bakery |shop=alcohol |shop=seafood |shop=beverages |shop=florist)", "value": "only" }, { "key": "organic", - "description": "Layer 'Shop' shows organic=no with a fixed text, namely 'This shop does not offer organic products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=clothes|shop=shoes|shop=butcher|shop=cosmetics|shop=deli|shop=bakery|shop=alcohol|shop=seafood|shop=beverages|shop=florist)", + "description": "Layer 'Shop' shows organic=no with a fixed text, namely 'This shop does not offer organic products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=clothes |shop=shoes |shop=butcher |shop=cosmetics |shop=deli |shop=bakery |shop=alcohol |shop=seafood |shop=beverages |shop=florist)", "value": "no" }, { "key": "diet:sugar_free", - "description": "Layer 'Shop' shows diet:sugar_free=only with a fixed text, namely 'This shop only sells sugar free products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:sugar_free=only with a fixed text, namely 'This shop only sells sugar free products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "only" }, { "key": "diet:sugar_free", - "description": "Layer 'Shop' shows diet:sugar_free=yes with a fixed text, namely 'This shop has a big sugar free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:sugar_free=yes with a fixed text, namely 'This shop has a big sugar free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "yes" }, { "key": "diet:sugar_free", - "description": "Layer 'Shop' shows diet:sugar_free=limited with a fixed text, namely 'This shop has a limited sugar free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:sugar_free=limited with a fixed text, namely 'This shop has a limited sugar free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "limited" }, { "key": "diet:sugar_free", - "description": "Layer 'Shop' shows diet:sugar_free=no with a fixed text, namely 'This shop has no sugar free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:sugar_free=no with a fixed text, namely 'This shop has no sugar free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "no" }, { "key": "diet:gluten_free", - "description": "Layer 'Shop' shows diet:gluten_free=only with a fixed text, namely 'This shop only sells gluten free products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:gluten_free=only with a fixed text, namely 'This shop only sells gluten free products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "only" }, { "key": "diet:gluten_free", - "description": "Layer 'Shop' shows diet:gluten_free=yes with a fixed text, namely 'This shop has a big gluten free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:gluten_free=yes with a fixed text, namely 'This shop has a big gluten free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "yes" }, { "key": "diet:gluten_free", - "description": "Layer 'Shop' shows diet:gluten_free=limited with a fixed text, namely 'This shop has a limited gluten free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:gluten_free=limited with a fixed text, namely 'This shop has a limited gluten free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "limited" }, { "key": "diet:gluten_free", - "description": "Layer 'Shop' shows diet:gluten_free=no with a fixed text, namely 'This shop has no gluten free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:gluten_free=no with a fixed text, namely 'This shop has no gluten free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "no" }, { "key": "diet:lactose_free", - "description": "Layer 'Shop' shows diet:lactose_free=only with a fixed text, namely 'Only sells lactose free products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:lactose_free=only with a fixed text, namely 'Only sells lactose free products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "only" }, { "key": "diet:lactose_free", - "description": "Layer 'Shop' shows diet:lactose_free=yes with a fixed text, namely 'Big lactose free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:lactose_free=yes with a fixed text, namely 'Big lactose free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "yes" }, { "key": "diet:lactose_free", - "description": "Layer 'Shop' shows diet:lactose_free=limited with a fixed text, namely 'Limited lactose free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:lactose_free=limited with a fixed text, namely 'Limited lactose free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "limited" }, { "key": "diet:lactose_free", - "description": "Layer 'Shop' shows diet:lactose_free=no with a fixed text, namely 'No lactose free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:lactose_free=no with a fixed text, namely 'No lactose free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "no" }, { @@ -1095,7 +1135,7 @@ }, { "key": "id", - "description": "Layer 'Pharmacies' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Shops') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Pharmacies' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Shops') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -1159,6 +1199,158 @@ "key": "wheelchair", "description": "Layer 'Pharmacies' shows wheelchair=limited with a fixed text, namely 'This pharmacy has limited access for wheelchair users' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops')", "value": "limited" + }, + { + "key": "amenity", + "description": "The MapComplete theme Shops has a layer Ice cream parlors showing features with this tag", + "value": "ice_cream" + }, + { + "key": "id", + "description": "Layer 'Ice cream parlors' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Shops') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" + }, + { + "key": "image", + "description": "The layer 'Ice cream parlors allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" + }, + { + "key": "mapillary", + "description": "The layer 'Ice cream parlors allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" + }, + { + "key": "wikidata", + "description": "The layer 'Ice cream parlors allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" + }, + { + "key": "wikipedia", + "description": "The layer 'Ice cream parlors allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" + }, + { + "key": "name", + "description": "Layer 'Ice cream parlors' shows and asks freeform values for key 'name' (in the mapcomplete.org theme 'Shops')" + }, + { + "key": "opening_hours", + "description": "Layer 'Ice cream parlors' shows and asks freeform values for key 'opening_hours' (in the mapcomplete.org theme 'Shops')" + }, + { + "key": "phone", + "description": "Layer 'Ice cream parlors' shows and asks freeform values for key 'phone' (in the mapcomplete.org theme 'Shops')" + }, + { + "key": "contact:phone", + "description": "Layer 'Ice cream parlors' shows contact:phone~.+ with a fixed text, namely '{contact:phone}' (in the mapcomplete.org theme 'Shops')" + }, + { + "key": "email", + "description": "Layer 'Ice cream parlors' shows and asks freeform values for key 'email' (in the mapcomplete.org theme 'Shops')" + }, + { + "key": "contact:email", + "description": "Layer 'Ice cream parlors' shows contact:email~.+ with a fixed text, namely '{contact:email}' (in the mapcomplete.org theme 'Shops')" + }, + { + "key": "website", + "description": "Layer 'Ice cream parlors' shows and asks freeform values for key 'website' (in the mapcomplete.org theme 'Shops')" + }, + { + "key": "contact:website", + "description": "Layer 'Ice cream parlors' shows contact:website~.+ with a fixed text, namely '{contact:website}' (in the mapcomplete.org theme 'Shops')" + }, + { + "key": "diet:sugar_free", + "description": "Layer 'Ice cream parlors' shows diet:sugar_free=only with a fixed text, namely 'This shop only sells sugar free products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops')", + "value": "only" + }, + { + "key": "diet:sugar_free", + "description": "Layer 'Ice cream parlors' shows diet:sugar_free=yes with a fixed text, namely 'This shop has a big sugar free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops')", + "value": "yes" + }, + { + "key": "diet:sugar_free", + "description": "Layer 'Ice cream parlors' shows diet:sugar_free=limited with a fixed text, namely 'This shop has a limited sugar free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops')", + "value": "limited" + }, + { + "key": "diet:sugar_free", + "description": "Layer 'Ice cream parlors' shows diet:sugar_free=no with a fixed text, namely 'This shop has no sugar free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops')", + "value": "no" + }, + { + "key": "diet:lactose_free", + "description": "Layer 'Ice cream parlors' shows diet:lactose_free=only with a fixed text, namely 'Only sells lactose free products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops')", + "value": "only" + }, + { + "key": "diet:lactose_free", + "description": "Layer 'Ice cream parlors' shows diet:lactose_free=yes with a fixed text, namely 'Big lactose free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops')", + "value": "yes" + }, + { + "key": "diet:lactose_free", + "description": "Layer 'Ice cream parlors' shows diet:lactose_free=limited with a fixed text, namely 'Limited lactose free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops')", + "value": "limited" + }, + { + "key": "diet:lactose_free", + "description": "Layer 'Ice cream parlors' shows diet:lactose_free=no with a fixed text, namely 'No lactose free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops')", + "value": "no" + }, + { + "key": "diet:gluten_free", + "description": "Layer 'Ice cream parlors' shows diet:gluten_free=only with a fixed text, namely 'This shop only sells gluten free products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops')", + "value": "only" + }, + { + "key": "diet:gluten_free", + "description": "Layer 'Ice cream parlors' shows diet:gluten_free=yes with a fixed text, namely 'This shop has a big gluten free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops')", + "value": "yes" + }, + { + "key": "diet:gluten_free", + "description": "Layer 'Ice cream parlors' shows diet:gluten_free=limited with a fixed text, namely 'This shop has a limited gluten free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops')", + "value": "limited" + }, + { + "key": "diet:gluten_free", + "description": "Layer 'Ice cream parlors' shows diet:gluten_free=no with a fixed text, namely 'This shop has no gluten free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops')", + "value": "no" + }, + { + "key": "payment:cash", + "description": "Layer 'Ice cream parlors' shows payment:cash=yes with a fixed text, namely 'Cash is accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops')", + "value": "yes" + }, + { + "key": "payment:cards", + "description": "Layer 'Ice cream parlors' shows payment:cards=yes with a fixed text, namely 'Payment cards are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops')", + "value": "yes" + }, + { + "key": "payment:qr_code", + "description": "Layer 'Ice cream parlors' shows payment:qr_code=yes with a fixed text, namely 'Payment by QR-code is possible here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops')", + "value": "yes" + }, + { + "key": "wheelchair", + "description": "Layer 'Ice cream parlors' shows wheelchair=designated with a fixed text, namely 'This place is specially adapted for wheelchair users' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops')", + "value": "designated" + }, + { + "key": "wheelchair", + "description": "Layer 'Ice cream parlors' shows wheelchair=yes with a fixed text, namely 'This place is easily reachable with a wheelchair' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops')", + "value": "yes" + }, + { + "key": "wheelchair", + "description": "Layer 'Ice cream parlors' shows wheelchair=limited with a fixed text, namely 'It is possible to reach this place in a wheelchair, but it is not easy' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops')", + "value": "limited" + }, + { + "key": "wheelchair", + "description": "Layer 'Ice cream parlors' shows wheelchair=no with a fixed text, namely 'This place is not reachable with a wheelchair' and allows to pick this as a default answer (in the mapcomplete.org theme 'Shops')", + "value": "no" } ] } \ No newline at end of file diff --git a/Docs/TagInfo/mapcomplete_sport_pitches.json b/Docs/TagInfo/mapcomplete_sport_pitches.json index 8120b1361..ed3ac51fe 100644 --- a/Docs/TagInfo/mapcomplete_sport_pitches.json +++ b/Docs/TagInfo/mapcomplete_sport_pitches.json @@ -17,7 +17,7 @@ }, { "key": "id", - "description": "Layer 'Sport pitches' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Sport pitches') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Sport pitches' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Sport pitches') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -149,22 +149,22 @@ }, { "key": "reservation", - "description": "Layer 'Sport pitches' shows reservation=required with a fixed text, namely 'Making an appointment is obligatory to use this sport pitch' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sport pitches') (This is only shown if access!=public&access!=private&access!=members)", + "description": "Layer 'Sport pitches' shows reservation=required with a fixed text, namely 'Making an appointment is obligatory to use this sport pitch' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sport pitches') (This is only shown if access!=public &access!=private &access!=members)", "value": "required" }, { "key": "reservation", - "description": "Layer 'Sport pitches' shows reservation=recommended with a fixed text, namely 'Making an appointment is recommended when using this sport pitch' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sport pitches') (This is only shown if access!=public&access!=private&access!=members)", + "description": "Layer 'Sport pitches' shows reservation=recommended with a fixed text, namely 'Making an appointment is recommended when using this sport pitch' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sport pitches') (This is only shown if access!=public &access!=private &access!=members)", "value": "recommended" }, { "key": "reservation", - "description": "Layer 'Sport pitches' shows reservation=yes with a fixed text, namely 'Making an appointment is possible, but not necessary to use this sport pitch' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sport pitches') (This is only shown if access!=public&access!=private&access!=members)", + "description": "Layer 'Sport pitches' shows reservation=yes with a fixed text, namely 'Making an appointment is possible, but not necessary to use this sport pitch' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sport pitches') (This is only shown if access!=public &access!=private &access!=members)", "value": "yes" }, { "key": "reservation", - "description": "Layer 'Sport pitches' shows reservation=no with a fixed text, namely 'Making an appointment is not possible' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sport pitches') (This is only shown if access!=public&access!=private&access!=members)", + "description": "Layer 'Sport pitches' shows reservation=no with a fixed text, namely 'Making an appointment is not possible' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sport pitches') (This is only shown if access!=public &access!=private &access!=members)", "value": "no" }, { diff --git a/Docs/TagInfo/mapcomplete_sports.json b/Docs/TagInfo/mapcomplete_sports.json index ff8ef8dd7..fea33daee 100644 --- a/Docs/TagInfo/mapcomplete_sports.json +++ b/Docs/TagInfo/mapcomplete_sports.json @@ -17,7 +17,7 @@ }, { "key": "id", - "description": "Layer 'Sport pitches' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Sports') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Sport pitches' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Sports') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -149,22 +149,22 @@ }, { "key": "reservation", - "description": "Layer 'Sport pitches' shows reservation=required with a fixed text, namely 'Making an appointment is obligatory to use this sport pitch' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports') (This is only shown if access!=public&access!=private&access!=members)", + "description": "Layer 'Sport pitches' shows reservation=required with a fixed text, namely 'Making an appointment is obligatory to use this sport pitch' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports') (This is only shown if access!=public &access!=private &access!=members)", "value": "required" }, { "key": "reservation", - "description": "Layer 'Sport pitches' shows reservation=recommended with a fixed text, namely 'Making an appointment is recommended when using this sport pitch' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports') (This is only shown if access!=public&access!=private&access!=members)", + "description": "Layer 'Sport pitches' shows reservation=recommended with a fixed text, namely 'Making an appointment is recommended when using this sport pitch' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports') (This is only shown if access!=public &access!=private &access!=members)", "value": "recommended" }, { "key": "reservation", - "description": "Layer 'Sport pitches' shows reservation=yes with a fixed text, namely 'Making an appointment is possible, but not necessary to use this sport pitch' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports') (This is only shown if access!=public&access!=private&access!=members)", + "description": "Layer 'Sport pitches' shows reservation=yes with a fixed text, namely 'Making an appointment is possible, but not necessary to use this sport pitch' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports') (This is only shown if access!=public &access!=private &access!=members)", "value": "yes" }, { "key": "reservation", - "description": "Layer 'Sport pitches' shows reservation=no with a fixed text, namely 'Making an appointment is not possible' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports') (This is only shown if access!=public&access!=private&access!=members)", + "description": "Layer 'Sport pitches' shows reservation=no with a fixed text, namely 'Making an appointment is not possible' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports') (This is only shown if access!=public &access!=private &access!=members)", "value": "no" }, { @@ -196,7 +196,7 @@ }, { "key": "id", - "description": "Layer 'Fitness Centres' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Sports') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Fitness Centres' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Sports') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "name", @@ -307,7 +307,7 @@ }, { "key": "id", - "description": "Layer 'Fitness Stations' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Sports') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Fitness Stations' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Sports') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -479,7 +479,7 @@ }, { "key": "id", - "description": "Layer 'Sports centres' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Sports') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Sports centres' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Sports') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -552,7 +552,7 @@ }, { "key": "id", - "description": "Layer 'Shop' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Sports') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Shop' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Sports') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -578,6 +578,11 @@ "key": "shop", "description": "Layer 'Shop' shows and asks freeform values for key 'shop' (in the mapcomplete.org theme 'Sports')" }, + { + "key": "shop", + "description": "Layer 'Shop' shows shop=vacant with a fixed text, namely 'Vacant Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports')", + "value": "vacant" + }, { "key": "shop", "description": "Layer 'Shop' shows shop=agrarian with a fixed text, namely 'Farm Supply Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports')", @@ -595,7 +600,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=antiques with a fixed text, namely 'Antiques Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports')", + "description": "Layer 'Shop' shows shop=antiques with a fixed text, namely 'Antique Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports')", "value": "antiques" }, { @@ -660,7 +665,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=books with a fixed text, namely 'Book Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports')", + "description": "Layer 'Shop' shows shop=books with a fixed text, namely 'Bookstore' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports')", "value": "books" }, { @@ -780,7 +785,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=country_store with a fixed text, namely 'Country Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports')", + "description": "Layer 'Shop' shows shop=country_store with a fixed text, namely 'Rural Supplies Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports')", "value": "country_store" }, { @@ -800,7 +805,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=deli with a fixed text, namely 'Deli' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports')", + "description": "Layer 'Shop' shows shop=deli with a fixed text, namely 'Delicatessen' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports')", "value": "deli" }, { @@ -950,7 +955,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=health_food with a fixed text, namely 'Health Food Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports')", + "description": "Layer 'Shop' shows shop=health_food with a fixed text, namely 'Health Food Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports')", "value": "health_food" }, { @@ -970,8 +975,8 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=hobby with a fixed text, namely 'Hobby Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports')", - "value": "hobby" + "description": "Layer 'Shop' shows shop=honey with a fixed text, namely 'Honey Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports')", + "value": "honey" }, { "key": "shop", @@ -1090,7 +1095,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=newsagent with a fixed text, namely 'Newspaper/Magazine Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports')", + "description": "Layer 'Shop' shows shop=newsagent with a fixed text, namely 'Newsstand' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports')", "value": "newsagent" }, { @@ -1098,6 +1103,11 @@ "description": "Layer 'Shop' shows shop=nutrition_supplements with a fixed text, namely 'Nutrition Supplements Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports')", "value": "nutrition_supplements" }, + { + "key": "shop", + "description": "Layer 'Shop' shows shop=nuts with a fixed text, namely 'Nuts Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports')", + "value": "nuts" + }, { "key": "shop", "description": "Layer 'Shop' shows shop=optician with a fixed text, namely 'Optician' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports')", @@ -1123,6 +1133,11 @@ "description": "Layer 'Shop' shows shop=party with a fixed text, namely 'Party Supply Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports')", "value": "party" }, + { + "key": "shop", + "description": "Layer 'Shop' shows shop=pasta with a fixed text, namely 'Pasta Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports')", + "value": "pasta" + }, { "key": "shop", "description": "Layer 'Shop' shows shop=pastry with a fixed text, namely 'Pastry Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports')", @@ -1130,7 +1145,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=pawnbroker with a fixed text, namely 'Pawn Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports')", + "description": "Layer 'Shop' shows shop=pawnbroker with a fixed text, namely 'Pawnshop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports')", "value": "pawnbroker" }, { @@ -1145,7 +1160,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=pet_grooming with a fixed text, namely 'Pet Grooming Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports')", + "description": "Layer 'Shop' shows shop=pet_grooming with a fixed text, namely 'Pet Groomer' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports')", "value": "pet_grooming" }, { @@ -1193,6 +1208,11 @@ "description": "Layer 'Shop' shows shop=repair with a fixed text, namely 'Repair Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports')", "value": "repair" }, + { + "key": "shop", + "description": "Layer 'Shop' shows shop=rice with a fixed text, namely 'Rice Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports')", + "value": "rice" + }, { "key": "shop", "description": "Layer 'Shop' shows shop=scuba_diving with a fixed text, namely 'Scuba Diving Shop' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports')", @@ -1205,7 +1225,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=second_hand with a fixed text, namely 'Consignment/Thrift Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports')", + "description": "Layer 'Shop' shows shop=second_hand with a fixed text, namely 'Thrift Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports')", "value": "second_hand" }, { @@ -1325,7 +1345,7 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows shop=variety_store with a fixed text, namely 'Variety Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports')", + "description": "Layer 'Shop' shows shop=variety_store with a fixed text, namely 'Discount Store' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports')", "value": "variety_store" }, { @@ -1380,17 +1400,17 @@ }, { "key": "second_hand", - "description": "Layer 'Shop' shows second_hand=only with a fixed text, namely 'This shop sells second-hand items only' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports') (This is only shown if shop=clothes|shop=car|shop=books|shop=charity|shop=car_repair|shop=furniture|shop=bicycle|shop=bicycle|shop=mobile_phone|shop=computer|shop=toys)", + "description": "Layer 'Shop' shows second_hand=only with a fixed text, namely 'This shop sells second-hand items only' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports') (This is only shown if shop=clothes |shop=car |shop=books |shop=charity |shop=car_repair |shop=furniture |shop=bicycle |shop=bicycle |shop=mobile_phone |shop=computer |shop=toys)", "value": "only" }, { "key": "second_hand", - "description": "Layer 'Shop' shows second_hand=yes with a fixed text, namely 'This shop sells second-hand items along with new items' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports') (This is only shown if shop=clothes|shop=car|shop=books|shop=charity|shop=car_repair|shop=furniture|shop=bicycle|shop=bicycle|shop=mobile_phone|shop=computer|shop=toys)", + "description": "Layer 'Shop' shows second_hand=yes with a fixed text, namely 'This shop sells second-hand items along with new items' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports') (This is only shown if shop=clothes |shop=car |shop=books |shop=charity |shop=car_repair |shop=furniture |shop=bicycle |shop=bicycle |shop=mobile_phone |shop=computer |shop=toys)", "value": "yes" }, { "key": "second_hand", - "description": "Layer 'Shop' shows second_hand=no with a fixed text, namely 'This shop only sells brand-new items' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports') (This is only shown if shop=clothes|shop=car|shop=books|shop=charity|shop=car_repair|shop=furniture|shop=bicycle|shop=bicycle|shop=mobile_phone|shop=computer|shop=toys)", + "description": "Layer 'Shop' shows second_hand=no with a fixed text, namely 'This shop only sells brand-new items' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports') (This is only shown if shop=clothes |shop=car |shop=books |shop=charity |shop=car_repair |shop=furniture |shop=bicycle |shop=bicycle |shop=mobile_phone |shop=computer |shop=toys)", "value": "no" }, { @@ -1467,29 +1487,49 @@ }, { "key": "service:print:A4", - "description": "Layer 'Shop' shows service:print:A4=yes with a fixed text, namely 'This shop can print on papers of size A4' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports') (This is only shown if shop~^(.*copyshop.*)$|shop~^(.*stationery.*)$|service:print=yes)", + "description": "Layer 'Shop' shows service:print:A4=yes with a fixed text, namely 'This shop can print on papers of size A4' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports') (This is only shown if shop~^(.*copyshop.*)$ |shop~^(.*stationery.*)$ |service:print=yes)", "value": "yes" }, { "key": "service:print:A3", - "description": "Layer 'Shop' shows service:print:A3=yes with a fixed text, namely 'This shop can print on papers of size A3' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports') (This is only shown if shop~^(.*copyshop.*)$|shop~^(.*stationery.*)$|service:print=yes)", + "description": "Layer 'Shop' shows service:print:A3=yes with a fixed text, namely 'This shop can print on papers of size A3' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports') (This is only shown if shop~^(.*copyshop.*)$ |shop~^(.*stationery.*)$ |service:print=yes)", "value": "yes" }, { "key": "service:print:A2", - "description": "Layer 'Shop' shows service:print:A2=yes with a fixed text, namely 'This shop can print on papers of size A2' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports') (This is only shown if shop~^(.*copyshop.*)$|shop~^(.*stationery.*)$|service:print=yes)", + "description": "Layer 'Shop' shows service:print:A2=yes with a fixed text, namely 'This shop can print on papers of size A2' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports') (This is only shown if shop~^(.*copyshop.*)$ |shop~^(.*stationery.*)$ |service:print=yes)", "value": "yes" }, { "key": "service:print:A1", - "description": "Layer 'Shop' shows service:print:A1=yes with a fixed text, namely 'This shop can print on papers of size A1' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports') (This is only shown if shop~^(.*copyshop.*)$|shop~^(.*stationery.*)$|service:print=yes)", + "description": "Layer 'Shop' shows service:print:A1=yes with a fixed text, namely 'This shop can print on papers of size A1' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports') (This is only shown if shop~^(.*copyshop.*)$ |shop~^(.*stationery.*)$ |service:print=yes)", "value": "yes" }, { "key": "service:print:A0", - "description": "Layer 'Shop' shows service:print:A0=yes with a fixed text, namely 'This shop can print on papers of size A0' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports') (This is only shown if shop~^(.*copyshop.*)$|shop~^(.*stationery.*)$|service:print=yes)", + "description": "Layer 'Shop' shows service:print:A0=yes with a fixed text, namely 'This shop can print on papers of size A0' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports') (This is only shown if shop~^(.*copyshop.*)$ |shop~^(.*stationery.*)$ |service:print=yes)", "value": "yes" }, + { + "key": "craft", + "description": "Layer 'Shop' shows craft=key_cutter with a fixed text, namely 'This shop is also specialized in key cutting' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports') (This is only shown if shop=shoe_repair |service:key_cutting~.+ |craft=key_cutting |shop=diy |shop=doityourself |shop=home_improvement |shop=hardware |shop=locksmith |shop=repair)", + "value": "key_cutter" + }, + { + "key": "service:key_cutting", + "description": "Layer 'Shop' shows service:key_cutting=yes with a fixed text, namely 'This shop offers key cutting as a service' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports') (This is only shown if shop=shoe_repair |service:key_cutting~.+ |craft=key_cutting |shop=diy |shop=doityourself |shop=home_improvement |shop=hardware |shop=locksmith |shop=repair)", + "value": "yes" + }, + { + "key": "craft", + "description": "Layer 'Shop' shows service:key_cutting=no with a fixed text, namely 'This shops does not offer key cutting as a service' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports') Picking this answer will delete the key craft. (This is only shown if shop=shoe_repair |service:key_cutting~.+ |craft=key_cutting |shop=diy |shop=doityourself |shop=home_improvement |shop=hardware |shop=locksmith |shop=repair)", + "value": "" + }, + { + "key": "service:key_cutting", + "description": "Layer 'Shop' shows service:key_cutting=no with a fixed text, namely 'This shops does not offer key cutting as a service' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports') (This is only shown if shop=shoe_repair |service:key_cutting~.+ |craft=key_cutting |shop=diy |shop=doityourself |shop=home_improvement |shop=hardware |shop=locksmith |shop=repair)", + "value": "no" + }, { "key": "internet_access", "description": "Layer 'Shop' shows internet_access=wlan with a fixed text, namely 'This place offers wireless internet access' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports')", @@ -1517,17 +1557,17 @@ }, { "key": "internet_access:fee", - "description": "Layer 'Shop' shows internet_access:fee=yes with a fixed text, namely 'There is a fee for the internet access at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports') (This is only shown if internet_access!=no&internet_access~.+)", + "description": "Layer 'Shop' shows internet_access:fee=yes with a fixed text, namely 'There is a fee for the internet access at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports') (This is only shown if internet_access!=no &internet_access~.+)", "value": "yes" }, { "key": "internet_access:fee", - "description": "Layer 'Shop' shows internet_access:fee=no with a fixed text, namely 'Internet access is free at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports') (This is only shown if internet_access!=no&internet_access~.+)", + "description": "Layer 'Shop' shows internet_access:fee=no with a fixed text, namely 'Internet access is free at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports') (This is only shown if internet_access!=no &internet_access~.+)", "value": "no" }, { "key": "internet_access:fee", - "description": "Layer 'Shop' shows internet_access:fee=customers with a fixed text, namely 'Internet access is free at this place, for customers only' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports') (This is only shown if internet_access!=no&internet_access~.+)", + "description": "Layer 'Shop' shows internet_access:fee=customers with a fixed text, namely 'Internet access is free at this place, for customers only' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports') (This is only shown if internet_access!=no &internet_access~.+)", "value": "customers" }, { @@ -1541,77 +1581,77 @@ }, { "key": "organic", - "description": "Layer 'Shop' shows organic=yes with a fixed text, namely 'This shop offers organic products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=clothes|shop=shoes|shop=butcher|shop=cosmetics|shop=deli|shop=bakery|shop=alcohol|shop=seafood|shop=beverages|shop=florist)", + "description": "Layer 'Shop' shows organic=yes with a fixed text, namely 'This shop offers organic products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=clothes |shop=shoes |shop=butcher |shop=cosmetics |shop=deli |shop=bakery |shop=alcohol |shop=seafood |shop=beverages |shop=florist)", "value": "yes" }, { "key": "organic", - "description": "Layer 'Shop' shows organic=only with a fixed text, namely 'This shop only offers organic products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=clothes|shop=shoes|shop=butcher|shop=cosmetics|shop=deli|shop=bakery|shop=alcohol|shop=seafood|shop=beverages|shop=florist)", + "description": "Layer 'Shop' shows organic=only with a fixed text, namely 'This shop only offers organic products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=clothes |shop=shoes |shop=butcher |shop=cosmetics |shop=deli |shop=bakery |shop=alcohol |shop=seafood |shop=beverages |shop=florist)", "value": "only" }, { "key": "organic", - "description": "Layer 'Shop' shows organic=no with a fixed text, namely 'This shop does not offer organic products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=clothes|shop=shoes|shop=butcher|shop=cosmetics|shop=deli|shop=bakery|shop=alcohol|shop=seafood|shop=beverages|shop=florist)", + "description": "Layer 'Shop' shows organic=no with a fixed text, namely 'This shop does not offer organic products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=clothes |shop=shoes |shop=butcher |shop=cosmetics |shop=deli |shop=bakery |shop=alcohol |shop=seafood |shop=beverages |shop=florist)", "value": "no" }, { "key": "diet:sugar_free", - "description": "Layer 'Shop' shows diet:sugar_free=only with a fixed text, namely 'This shop only sells sugar free products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:sugar_free=only with a fixed text, namely 'This shop only sells sugar free products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "only" }, { "key": "diet:sugar_free", - "description": "Layer 'Shop' shows diet:sugar_free=yes with a fixed text, namely 'This shop has a big sugar free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:sugar_free=yes with a fixed text, namely 'This shop has a big sugar free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "yes" }, { "key": "diet:sugar_free", - "description": "Layer 'Shop' shows diet:sugar_free=limited with a fixed text, namely 'This shop has a limited sugar free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:sugar_free=limited with a fixed text, namely 'This shop has a limited sugar free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "limited" }, { "key": "diet:sugar_free", - "description": "Layer 'Shop' shows diet:sugar_free=no with a fixed text, namely 'This shop has no sugar free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:sugar_free=no with a fixed text, namely 'This shop has no sugar free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "no" }, { "key": "diet:gluten_free", - "description": "Layer 'Shop' shows diet:gluten_free=only with a fixed text, namely 'This shop only sells gluten free products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:gluten_free=only with a fixed text, namely 'This shop only sells gluten free products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "only" }, { "key": "diet:gluten_free", - "description": "Layer 'Shop' shows diet:gluten_free=yes with a fixed text, namely 'This shop has a big gluten free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:gluten_free=yes with a fixed text, namely 'This shop has a big gluten free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "yes" }, { "key": "diet:gluten_free", - "description": "Layer 'Shop' shows diet:gluten_free=limited with a fixed text, namely 'This shop has a limited gluten free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:gluten_free=limited with a fixed text, namely 'This shop has a limited gluten free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "limited" }, { "key": "diet:gluten_free", - "description": "Layer 'Shop' shows diet:gluten_free=no with a fixed text, namely 'This shop has no gluten free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:gluten_free=no with a fixed text, namely 'This shop has no gluten free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "no" }, { "key": "diet:lactose_free", - "description": "Layer 'Shop' shows diet:lactose_free=only with a fixed text, namely 'Only sells lactose free products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:lactose_free=only with a fixed text, namely 'Only sells lactose free products' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "only" }, { "key": "diet:lactose_free", - "description": "Layer 'Shop' shows diet:lactose_free=yes with a fixed text, namely 'Big lactose free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:lactose_free=yes with a fixed text, namely 'Big lactose free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "yes" }, { "key": "diet:lactose_free", - "description": "Layer 'Shop' shows diet:lactose_free=limited with a fixed text, namely 'Limited lactose free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:lactose_free=limited with a fixed text, namely 'Limited lactose free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "limited" }, { "key": "diet:lactose_free", - "description": "Layer 'Shop' shows diet:lactose_free=no with a fixed text, namely 'No lactose free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports') (This is only shown if shop=supermarket|shop=convenience|shop=farm|shop=greengrocer|shop=health_food|shop=deli|shop=bakery|shop=beverages|shop=beverages|shop=pastry|shop=chocolate|shop=frozen_food|shop=ice_cream)", + "description": "Layer 'Shop' shows diet:lactose_free=no with a fixed text, namely 'No lactose free offering' and allows to pick this as a default answer (in the mapcomplete.org theme 'Sports') (This is only shown if shop=supermarket |shop=convenience |shop=farm |shop=greengrocer |shop=health_food |shop=deli |shop=bakery |shop=beverages |shop=beverages |shop=pastry |shop=chocolate |shop=frozen_food |shop=ice_cream)", "value": "no" } ] diff --git a/Docs/TagInfo/mapcomplete_street_lighting.json b/Docs/TagInfo/mapcomplete_street_lighting.json index 21d4d3e83..13e1570f4 100644 --- a/Docs/TagInfo/mapcomplete_street_lighting.json +++ b/Docs/TagInfo/mapcomplete_street_lighting.json @@ -17,7 +17,7 @@ }, { "key": "id", - "description": "Layer 'Street Lamps' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Street Lighting') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Street Lamps' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Street Lighting') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -211,7 +211,7 @@ }, { "key": "id", - "description": "Layer 'Lit streets' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Street Lighting') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Lit streets' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Street Lighting') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -255,7 +255,7 @@ }, { "key": "id", - "description": "Layer 'All streets' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Street Lighting') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'All streets' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Street Lighting') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", diff --git a/Docs/TagInfo/mapcomplete_surveillance.json b/Docs/TagInfo/mapcomplete_surveillance.json index c81f266a6..eda3a1065 100644 --- a/Docs/TagInfo/mapcomplete_surveillance.json +++ b/Docs/TagInfo/mapcomplete_surveillance.json @@ -32,7 +32,7 @@ }, { "key": "id", - "description": "Layer 'Surveillance camera's' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Surveillance under Surveillance') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Surveillance camera's' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Surveillance under Surveillance') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -77,16 +77,16 @@ }, { "key": "camera:direction", - "description": "Layer 'Surveillance camera's' shows and asks freeform values for key 'camera:direction' (in the mapcomplete.org theme 'Surveillance under Surveillance') (This is only shown if camera:direction~.+|direction~.+|camera:type!=dome|camera:type=dome&camera:mount=wall)" + "description": "Layer 'Surveillance camera's' shows and asks freeform values for key 'camera:direction' (in the mapcomplete.org theme 'Surveillance under Surveillance') (This is only shown if camera:direction~.+ |direction~.+ |camera:type!=dome |camera:type=dome &camera:mount=wall)" }, { "key": "camera:direction", - "description": "Layer 'Surveillance camera's' shows direction~.+ with a fixed text, namely 'Films to a compass heading of {direction}' (in the mapcomplete.org theme 'Surveillance under Surveillance') Picking this answer will delete the key camera:direction. (This is only shown if camera:direction~.+|direction~.+|camera:type!=dome|camera:type=dome&camera:mount=wall)", + "description": "Layer 'Surveillance camera's' shows direction~.+ with a fixed text, namely 'Films to a compass heading of {direction}' (in the mapcomplete.org theme 'Surveillance under Surveillance') Picking this answer will delete the key camera:direction. (This is only shown if camera:direction~.+ |direction~.+ |camera:type!=dome |camera:type=dome &camera:mount=wall)", "value": "" }, { "key": "direction", - "description": "Layer 'Surveillance camera's' shows direction~.+ with a fixed text, namely 'Films to a compass heading of {direction}' (in the mapcomplete.org theme 'Surveillance under Surveillance') (This is only shown if camera:direction~.+|direction~.+|camera:type!=dome|camera:type=dome&camera:mount=wall)" + "description": "Layer 'Surveillance camera's' shows direction~.+ with a fixed text, namely 'Films to a compass heading of {direction}' (in the mapcomplete.org theme 'Surveillance under Surveillance') (This is only shown if camera:direction~.+ |direction~.+ |camera:type!=dome |camera:type=dome &camera:mount=wall)" }, { "key": "operator", @@ -124,7 +124,7 @@ }, { "key": "level", - "description": "Layer 'Surveillance camera's' shows and asks freeform values for key 'level' (in the mapcomplete.org theme 'Surveillance under Surveillance') (This is only shown if indoor=yes|surveillance:type=ye)" + "description": "Layer 'Surveillance camera's' shows and asks freeform values for key 'level' (in the mapcomplete.org theme 'Surveillance under Surveillance') (This is only shown if indoor=yes |surveillance:type=ye)" }, { "key": "surveillance:zone", diff --git a/Docs/TagInfo/mapcomplete_toilets.json b/Docs/TagInfo/mapcomplete_toilets.json index f7cd69de9..41fc652b3 100644 --- a/Docs/TagInfo/mapcomplete_toilets.json +++ b/Docs/TagInfo/mapcomplete_toilets.json @@ -17,7 +17,7 @@ }, { "key": "id", - "description": "Layer 'Toilets' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Public toilets') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Toilets' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Public toilets') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -168,7 +168,7 @@ }, { "key": "door:width", - "description": "Layer 'Toilets' shows and asks freeform values for key 'door:width' (in the mapcomplete.org theme 'Public toilets') (This is only shown if wheelchair=yes|wheelchair=designated)" + "description": "Layer 'Toilets' shows and asks freeform values for key 'door:width' (in the mapcomplete.org theme 'Public toilets') (This is only shown if wheelchair=yes |wheelchair=designated)" }, { "key": "toilets:position", @@ -255,7 +255,7 @@ }, { "key": "id", - "description": "Layer 'Toilets at other amenities' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Public toilets') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Toilets at other amenities' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Public toilets') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -366,7 +366,7 @@ }, { "key": "toilets:door:width", - "description": "Layer 'Toilets at other amenities' shows and asks freeform values for key 'toilets:door:width' (in the mapcomplete.org theme 'Public toilets') (This is only shown if toilets:wheelchair=yes|toilets:wheelchair=designated)" + "description": "Layer 'Toilets at other amenities' shows and asks freeform values for key 'toilets:door:width' (in the mapcomplete.org theme 'Public toilets') (This is only shown if toilets:wheelchair=yes |toilets:wheelchair=designated)" }, { "key": "toilets:position", @@ -453,7 +453,7 @@ }, { "key": "id", - "description": "Layer 'Shower' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Public toilets') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Shower' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Public toilets') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -550,37 +550,37 @@ }, { "key": "payment:cash", - "description": "Layer 'Shower' shows payment:cash=yes with a fixed text, namely 'Cash is accepted here' (in the mapcomplete.org theme 'Public toilets') (This is only shown if fee=yes|hot_water=fee)", + "description": "Layer 'Shower' shows payment:cash=yes with a fixed text, namely 'Cash is accepted here' (in the mapcomplete.org theme 'Public toilets') (This is only shown if fee=yes |hot_water=fee)", "value": "yes" }, { "key": "payment:cards", - "description": "Layer 'Shower' shows payment:cards=yes with a fixed text, namely 'Payment cards are accepted here' (in the mapcomplete.org theme 'Public toilets') (This is only shown if fee=yes|hot_water=fee)", + "description": "Layer 'Shower' shows payment:cards=yes with a fixed text, namely 'Payment cards are accepted here' (in the mapcomplete.org theme 'Public toilets') (This is only shown if fee=yes |hot_water=fee)", "value": "yes" }, { "key": "payment:qr_code", - "description": "Layer 'Shower' shows payment:qr_code=yes with a fixed text, namely 'Payment by QR-code is possible here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Public toilets') (This is only shown if fee=yes|hot_water=fee)", + "description": "Layer 'Shower' shows payment:qr_code=yes with a fixed text, namely 'Payment by QR-code is possible here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Public toilets') (This is only shown if fee=yes |hot_water=fee)", "value": "yes" }, { "key": "payment:coins", - "description": "Layer 'Shower' shows payment:coins=yes with a fixed text, namely 'Coins are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Public toilets') (This is only shown if fee=yes|hot_water=fee)", + "description": "Layer 'Shower' shows payment:coins=yes with a fixed text, namely 'Coins are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Public toilets') (This is only shown if fee=yes |hot_water=fee)", "value": "yes" }, { "key": "payment:notes", - "description": "Layer 'Shower' shows payment:notes=yes with a fixed text, namely 'Bank notes are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Public toilets') (This is only shown if fee=yes|hot_water=fee)", + "description": "Layer 'Shower' shows payment:notes=yes with a fixed text, namely 'Bank notes are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Public toilets') (This is only shown if fee=yes |hot_water=fee)", "value": "yes" }, { "key": "payment:debit_cards", - "description": "Layer 'Shower' shows payment:debit_cards=yes with a fixed text, namely 'Debit cards are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Public toilets') (This is only shown if fee=yes|hot_water=fee)", + "description": "Layer 'Shower' shows payment:debit_cards=yes with a fixed text, namely 'Debit cards are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Public toilets') (This is only shown if fee=yes |hot_water=fee)", "value": "yes" }, { "key": "payment:credit_cards", - "description": "Layer 'Shower' shows payment:credit_cards=yes with a fixed text, namely 'Credit cards are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Public toilets') (This is only shown if fee=yes|hot_water=fee)", + "description": "Layer 'Shower' shows payment:credit_cards=yes with a fixed text, namely 'Credit cards are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Public toilets') (This is only shown if fee=yes |hot_water=fee)", "value": "yes" } ] diff --git a/Docs/TagInfo/mapcomplete_transit.json b/Docs/TagInfo/mapcomplete_transit.json index a6868b928..5331db0af 100644 --- a/Docs/TagInfo/mapcomplete_transit.json +++ b/Docs/TagInfo/mapcomplete_transit.json @@ -17,7 +17,7 @@ }, { "key": "id", - "description": "Layer 'Transit Stops' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Bus routes') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Transit Stops' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Bus routes') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "name", @@ -176,7 +176,7 @@ }, { "key": "id", - "description": "Layer 'Bus lines' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Bus routes') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Bus lines' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Bus routes') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "name", @@ -213,7 +213,7 @@ }, { "key": "id", - "description": "Layer 'Bike parking' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Bus routes') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Bike parking' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Bus routes') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -297,12 +297,12 @@ }, { "key": "covered", - "description": "Layer 'Bike parking' shows covered=yes with a fixed text, namely 'This parking is covered (it has a roof)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bus routes') (This is only shown if bicycle_parking!=shed&location!=underground)", + "description": "Layer 'Bike parking' shows covered=yes with a fixed text, namely 'This parking is covered (it has a roof)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bus routes') (This is only shown if bicycle_parking!=shed &location!=underground)", "value": "yes" }, { "key": "covered", - "description": "Layer 'Bike parking' shows covered=no with a fixed text, namely 'This parking is not covered' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bus routes') (This is only shown if bicycle_parking!=shed&location!=underground)", + "description": "Layer 'Bike parking' shows covered=no with a fixed text, namely 'This parking is not covered' and allows to pick this as a default answer (in the mapcomplete.org theme 'Bus routes') (This is only shown if bicycle_parking!=shed &location!=underground)", "value": "no" }, { @@ -354,7 +354,7 @@ }, { "key": "id", - "description": "Layer 'Parking' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Bus routes') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Parking' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Bus routes') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -486,7 +486,7 @@ }, { "key": "id", - "description": "Layer 'Shelter' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Bus routes') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Shelter' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Bus routes') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" } ] } \ No newline at end of file diff --git a/Docs/TagInfo/mapcomplete_trees.json b/Docs/TagInfo/mapcomplete_trees.json index 7c1bcab36..5ec909f78 100644 --- a/Docs/TagInfo/mapcomplete_trees.json +++ b/Docs/TagInfo/mapcomplete_trees.json @@ -17,7 +17,7 @@ }, { "key": "id", - "description": "Layer 'Tree' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Trees') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Tree' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Trees') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -114,69 +114,69 @@ }, { "key": "name", - "description": "Layer 'Tree' shows and asks freeform values for key 'name' (in the mapcomplete.org theme 'Trees') (This is only shown if denotation=landmark|denotation=natural_monument|name~.+)" + "description": "Layer 'Tree' shows and asks freeform values for key 'name' (in the mapcomplete.org theme 'Trees') (This is only shown if denotation=landmark |denotation=natural_monument |name~.+)" }, { "key": "name", - "description": "Layer 'Tree' shows noname=yes with a fixed text, namely 'The tree does not have a name.' and allows to pick this as a default answer (in the mapcomplete.org theme 'Trees') Picking this answer will delete the key name. (This is only shown if denotation=landmark|denotation=natural_monument|name~.+)", + "description": "Layer 'Tree' shows noname=yes with a fixed text, namely 'The tree does not have a name.' and allows to pick this as a default answer (in the mapcomplete.org theme 'Trees') Picking this answer will delete the key name. (This is only shown if denotation=landmark |denotation=natural_monument |name~.+)", "value": "" }, { "key": "noname", - "description": "Layer 'Tree' shows noname=yes with a fixed text, namely 'The tree does not have a name.' and allows to pick this as a default answer (in the mapcomplete.org theme 'Trees') (This is only shown if denotation=landmark|denotation=natural_monument|name~.+)", + "description": "Layer 'Tree' shows noname=yes with a fixed text, namely 'The tree does not have a name.' and allows to pick this as a default answer (in the mapcomplete.org theme 'Trees') (This is only shown if denotation=landmark |denotation=natural_monument |name~.+)", "value": "yes" }, { "key": "heritage", - "description": "Layer 'Tree' shows heritage=4&heritage:operator=OnroerendErfgoed with a fixed text, namely 'Registered as heritage by Onroerend Erfgoed Flanders' and allows to pick this as a default answer (in the mapcomplete.org theme 'Trees') (This is only shown if denotation=landmark|denotation=natural_monument)", + "description": "Layer 'Tree' shows heritage=4 &heritage:operator=OnroerendErfgoed with a fixed text, namely 'Registered as heritage by Onroerend Erfgoed Flanders' and allows to pick this as a default answer (in the mapcomplete.org theme 'Trees') (This is only shown if denotation=landmark |denotation=natural_monument)", "value": "4" }, { "key": "heritage:operator", - "description": "Layer 'Tree' shows heritage=4&heritage:operator=OnroerendErfgoed with a fixed text, namely 'Registered as heritage by Onroerend Erfgoed Flanders' and allows to pick this as a default answer (in the mapcomplete.org theme 'Trees') (This is only shown if denotation=landmark|denotation=natural_monument)", + "description": "Layer 'Tree' shows heritage=4 &heritage:operator=OnroerendErfgoed with a fixed text, namely 'Registered as heritage by Onroerend Erfgoed Flanders' and allows to pick this as a default answer (in the mapcomplete.org theme 'Trees') (This is only shown if denotation=landmark |denotation=natural_monument)", "value": "OnroerendErfgoed" }, { "key": "heritage", - "description": "Layer 'Tree' shows heritage=4&heritage:operator=aatl with a fixed text, namely 'Registered as heritage by Direction du Patrimoine culturel Brussels' and allows to pick this as a default answer (in the mapcomplete.org theme 'Trees') (This is only shown if denotation=landmark|denotation=natural_monument)", + "description": "Layer 'Tree' shows heritage=4 &heritage:operator=aatl with a fixed text, namely 'Registered as heritage by Direction du Patrimoine culturel Brussels' and allows to pick this as a default answer (in the mapcomplete.org theme 'Trees') (This is only shown if denotation=landmark |denotation=natural_monument)", "value": "4" }, { "key": "heritage:operator", - "description": "Layer 'Tree' shows heritage=4&heritage:operator=aatl with a fixed text, namely 'Registered as heritage by Direction du Patrimoine culturel Brussels' and allows to pick this as a default answer (in the mapcomplete.org theme 'Trees') (This is only shown if denotation=landmark|denotation=natural_monument)", + "description": "Layer 'Tree' shows heritage=4 &heritage:operator=aatl with a fixed text, namely 'Registered as heritage by Direction du Patrimoine culturel Brussels' and allows to pick this as a default answer (in the mapcomplete.org theme 'Trees') (This is only shown if denotation=landmark |denotation=natural_monument)", "value": "aatl" }, { "key": "heritage", - "description": "Layer 'Tree' shows heritage=yes with a fixed text, namely 'Registered as heritage by a different organisation' and allows to pick this as a default answer (in the mapcomplete.org theme 'Trees') (This is only shown if denotation=landmark|denotation=natural_monument)", + "description": "Layer 'Tree' shows heritage=yes with a fixed text, namely 'Registered as heritage by a different organisation' and allows to pick this as a default answer (in the mapcomplete.org theme 'Trees') (This is only shown if denotation=landmark |denotation=natural_monument)", "value": "yes" }, { "key": "heritage:operator", - "description": "Layer 'Tree' shows heritage=yes with a fixed text, namely 'Registered as heritage by a different organisation' and allows to pick this as a default answer (in the mapcomplete.org theme 'Trees') Picking this answer will delete the key heritage:operator. (This is only shown if denotation=landmark|denotation=natural_monument)", + "description": "Layer 'Tree' shows heritage=yes with a fixed text, namely 'Registered as heritage by a different organisation' and allows to pick this as a default answer (in the mapcomplete.org theme 'Trees') Picking this answer will delete the key heritage:operator. (This is only shown if denotation=landmark |denotation=natural_monument)", "value": "" }, { "key": "heritage", - "description": "Layer 'Tree' shows heritage=no with a fixed text, namely 'Not registered as heritage' and allows to pick this as a default answer (in the mapcomplete.org theme 'Trees') (This is only shown if denotation=landmark|denotation=natural_monument)", + "description": "Layer 'Tree' shows heritage=no with a fixed text, namely 'Not registered as heritage' and allows to pick this as a default answer (in the mapcomplete.org theme 'Trees') (This is only shown if denotation=landmark |denotation=natural_monument)", "value": "no" }, { "key": "heritage:operator", - "description": "Layer 'Tree' shows heritage=no with a fixed text, namely 'Not registered as heritage' and allows to pick this as a default answer (in the mapcomplete.org theme 'Trees') Picking this answer will delete the key heritage:operator. (This is only shown if denotation=landmark|denotation=natural_monument)", + "description": "Layer 'Tree' shows heritage=no with a fixed text, namely 'Not registered as heritage' and allows to pick this as a default answer (in the mapcomplete.org theme 'Trees') Picking this answer will delete the key heritage:operator. (This is only shown if denotation=landmark |denotation=natural_monument)", "value": "" }, { "key": "heritage", - "description": "Layer 'Tree' shows heritage~.+ with a fixed text, namely 'Registered as heritage by a different organisation' (in the mapcomplete.org theme 'Trees') (This is only shown if denotation=landmark|denotation=natural_monument)" + "description": "Layer 'Tree' shows heritage~.+ with a fixed text, namely 'Registered as heritage by a different organisation' (in the mapcomplete.org theme 'Trees') (This is only shown if denotation=landmark |denotation=natural_monument)" }, { "key": "ref:OnroerendErfgoed", - "description": "Layer 'Tree' shows and asks freeform values for key 'ref:OnroerendErfgoed' (in the mapcomplete.org theme 'Trees') (This is only shown if heritage=4&heritage:operator=OnroerendErfgoed)" + "description": "Layer 'Tree' shows and asks freeform values for key 'ref:OnroerendErfgoed' (in the mapcomplete.org theme 'Trees') (This is only shown if heritage=4 &heritage:operator=OnroerendErfgoed)" }, { "key": "wikidata", - "description": "Layer 'Tree' shows and asks freeform values for key 'wikidata' (in the mapcomplete.org theme 'Trees') (This is only shown if denotation=landmark|denotation=natural_monument|wikidata~.+)" + "description": "Layer 'Tree' shows and asks freeform values for key 'wikidata' (in the mapcomplete.org theme 'Trees') (This is only shown if denotation=landmark |denotation=natural_monument |wikidata~.+)" } ] } \ No newline at end of file diff --git a/Docs/TagInfo/mapcomplete_vending_machine.json b/Docs/TagInfo/mapcomplete_vending_machine.json index 12eedf701..6235bd49e 100644 --- a/Docs/TagInfo/mapcomplete_vending_machine.json +++ b/Docs/TagInfo/mapcomplete_vending_machine.json @@ -17,7 +17,7 @@ }, { "key": "id", - "description": "Layer 'Vending Machines' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Vending Machines') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Vending Machines' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Vending Machines') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -220,142 +220,142 @@ }, { "key": "payment:coins:denominations", - "description": "Layer 'Vending Machines' shows payment:coins:denominations=0.01 EUR with a fixed text, namely '1 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Vending Machines' shows payment:coins:denominations=0.01 EUR with a fixed text, namely '1 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.01 EUR" }, { "key": "payment:coins:denominations", - "description": "Layer 'Vending Machines' shows payment:coins:denominations=0.02 EUR with a fixed text, namely '2 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Vending Machines' shows payment:coins:denominations=0.02 EUR with a fixed text, namely '2 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.02 EUR" }, { "key": "payment:coins:denominations", - "description": "Layer 'Vending Machines' shows payment:coins:denominations=0.05 EUR with a fixed text, namely '5 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Vending Machines' shows payment:coins:denominations=0.05 EUR with a fixed text, namely '5 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.05 EUR" }, { "key": "payment:coins:denominations", - "description": "Layer 'Vending Machines' shows payment:coins:denominations=0.10 EUR with a fixed text, namely '10 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Vending Machines' shows payment:coins:denominations=0.10 EUR with a fixed text, namely '10 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.10 EUR" }, { "key": "payment:coins:denominations", - "description": "Layer 'Vending Machines' shows payment:coins:denominations=0.20 EUR with a fixed text, namely '20 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Vending Machines' shows payment:coins:denominations=0.20 EUR with a fixed text, namely '20 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.20 EUR" }, { "key": "payment:coins:denominations", - "description": "Layer 'Vending Machines' shows payment:coins:denominations=0.50 EUR with a fixed text, namely '50 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Vending Machines' shows payment:coins:denominations=0.50 EUR with a fixed text, namely '50 cent coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.50 EUR" }, { "key": "payment:coins:denominations", - "description": "Layer 'Vending Machines' shows payment:coins:denominations=1 EUR with a fixed text, namely '1 euro coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Vending Machines' shows payment:coins:denominations=1 EUR with a fixed text, namely '1 euro coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "1 EUR" }, { "key": "payment:coins:denominations", - "description": "Layer 'Vending Machines' shows payment:coins:denominations=2 EUR with a fixed text, namely '2 euro coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Vending Machines' shows payment:coins:denominations=2 EUR with a fixed text, namely '2 euro coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "2 EUR" }, { "key": "payment:coins:denominations", - "description": "Layer 'Vending Machines' shows payment:coins:denominations=0.05 CHF with a fixed text, namely '5 centimes coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Vending Machines' shows payment:coins:denominations=0.05 CHF with a fixed text, namely '5 centimes coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.05 CHF" }, { "key": "payment:coins:denominations", - "description": "Layer 'Vending Machines' shows payment:coins:denominations=0.10 CHF with a fixed text, namely '10 centimes coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Vending Machines' shows payment:coins:denominations=0.10 CHF with a fixed text, namely '10 centimes coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.10 CHF" }, { "key": "payment:coins:denominations", - "description": "Layer 'Vending Machines' shows payment:coins:denominations=0.20 CHF with a fixed text, namely '20 centimes coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Vending Machines' shows payment:coins:denominations=0.20 CHF with a fixed text, namely '20 centimes coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.20 CHF" }, { "key": "payment:coins:denominations", - "description": "Layer 'Vending Machines' shows payment:coins:denominations=0.50 CHF with a fixed text, namely '½ franc coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Vending Machines' shows payment:coins:denominations=0.50 CHF with a fixed text, namely '½ franc coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "0.50 CHF" }, { "key": "payment:coins:denominations", - "description": "Layer 'Vending Machines' shows payment:coins:denominations=1 CHF with a fixed text, namely '1 franc coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Vending Machines' shows payment:coins:denominations=1 CHF with a fixed text, namely '1 franc coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "1 CHF" }, { "key": "payment:coins:denominations", - "description": "Layer 'Vending Machines' shows payment:coins:denominations=2 CHF with a fixed text, namely '2 francs coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Vending Machines' shows payment:coins:denominations=2 CHF with a fixed text, namely '2 francs coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "2 CHF" }, { "key": "payment:coins:denominations", - "description": "Layer 'Vending Machines' shows payment:coins:denominations=5 CHF with a fixed text, namely '5 francs coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines') (This is only shown if payment:coins=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Vending Machines' shows payment:coins:denominations=5 CHF with a fixed text, namely '5 francs coins are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines') (This is only shown if payment:coins=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "5 CHF" }, { "key": "payment:notes:denominations", - "description": "Layer 'Vending Machines' shows payment:notes:denominations=5 EUR with a fixed text, namely '5 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines') (This is only shown if payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Vending Machines' shows payment:notes:denominations=5 EUR with a fixed text, namely '5 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines') (This is only shown if payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "5 EUR" }, { "key": "payment:notes:denominations", - "description": "Layer 'Vending Machines' shows payment:notes:denominations=10 EUR with a fixed text, namely '10 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines') (This is only shown if payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Vending Machines' shows payment:notes:denominations=10 EUR with a fixed text, namely '10 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines') (This is only shown if payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "10 EUR" }, { "key": "payment:notes:denominations", - "description": "Layer 'Vending Machines' shows payment:notes:denominations=20 EUR with a fixed text, namely '20 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines') (This is only shown if payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Vending Machines' shows payment:notes:denominations=20 EUR with a fixed text, namely '20 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines') (This is only shown if payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "20 EUR" }, { "key": "payment:notes:denominations", - "description": "Layer 'Vending Machines' shows payment:notes:denominations=50 EUR with a fixed text, namely '50 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines') (This is only shown if payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Vending Machines' shows payment:notes:denominations=50 EUR with a fixed text, namely '50 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines') (This is only shown if payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "50 EUR" }, { "key": "payment:notes:denominations", - "description": "Layer 'Vending Machines' shows payment:notes:denominations=100 EUR with a fixed text, namely '100 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines') (This is only shown if payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Vending Machines' shows payment:notes:denominations=100 EUR with a fixed text, namely '100 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines') (This is only shown if payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "100 EUR" }, { "key": "payment:notes:denominations", - "description": "Layer 'Vending Machines' shows payment:notes:denominations=200 EUR with a fixed text, namely '200 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines') (This is only shown if payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Vending Machines' shows payment:notes:denominations=200 EUR with a fixed text, namely '200 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines') (This is only shown if payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "200 EUR" }, { "key": "payment:notes:denominations", - "description": "Layer 'Vending Machines' shows payment:notes:denominations=500 EUR with a fixed text, namely '500 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines') (This is only shown if payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Vending Machines' shows payment:notes:denominations=500 EUR with a fixed text, namely '500 euro notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines') (This is only shown if payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "500 EUR" }, { "key": "payment:notes:denominations", - "description": "Layer 'Vending Machines' shows payment:notes:denominations=10 CHF with a fixed text, namely '10 francs notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines') (This is only shown if payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Vending Machines' shows payment:notes:denominations=10 CHF with a fixed text, namely '10 francs notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines') (This is only shown if payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "10 CHF" }, { "key": "payment:notes:denominations", - "description": "Layer 'Vending Machines' shows payment:notes:denominations=20 CHF with a fixed text, namely '20 francs notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines') (This is only shown if payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Vending Machines' shows payment:notes:denominations=20 CHF with a fixed text, namely '20 francs notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines') (This is only shown if payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "20 CHF" }, { "key": "payment:notes:denominations", - "description": "Layer 'Vending Machines' shows payment:notes:denominations=50 CHF with a fixed text, namely '50 francs notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines') (This is only shown if payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Vending Machines' shows payment:notes:denominations=50 CHF with a fixed text, namely '50 francs notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines') (This is only shown if payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "50 CHF" }, { "key": "payment:notes:denominations", - "description": "Layer 'Vending Machines' shows payment:notes:denominations=100 CHF with a fixed text, namely '100 francs notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines') (This is only shown if payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Vending Machines' shows payment:notes:denominations=100 CHF with a fixed text, namely '100 francs notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines') (This is only shown if payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "100 CHF" }, { "key": "payment:notes:denominations", - "description": "Layer 'Vending Machines' shows payment:notes:denominations=200 CHF with a fixed text, namely '200 francs notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines') (This is only shown if payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Vending Machines' shows payment:notes:denominations=200 CHF with a fixed text, namely '200 francs notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines') (This is only shown if payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "200 CHF" }, { "key": "payment:notes:denominations", - "description": "Layer 'Vending Machines' shows payment:notes:denominations=1000 CHF with a fixed text, namely '1000 francs notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines') (This is only shown if payment:notes=yes|payment:cash=yes&_currency~^(.*EUR.*)$|_currency~^(.*CHF.*)$)", + "description": "Layer 'Vending Machines' shows payment:notes:denominations=1000 CHF with a fixed text, namely '1000 francs notes are accepted' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines') (This is only shown if payment:notes=yes |payment:cash=yes &_currency~^(.*EUR.*)$ |_currency~^(.*CHF.*)$)", "value": "1000 CHF" }, { diff --git a/Docs/TagInfo/mapcomplete_waste.json b/Docs/TagInfo/mapcomplete_waste.json index 4f8a8b2ef..d7dc49a63 100644 --- a/Docs/TagInfo/mapcomplete_waste.json +++ b/Docs/TagInfo/mapcomplete_waste.json @@ -17,7 +17,7 @@ }, { "key": "id", - "description": "Layer 'Waste Basket' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Waste') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Waste Basket' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Waste') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -77,27 +77,27 @@ }, { "key": "vending", - "description": "Layer 'Waste Basket' shows vending=dog_excrement_bag with a fixed text, namely 'This waste basket has a dispenser for (dog) excrement bags' and allows to pick this as a default answer (in the mapcomplete.org theme 'Waste') (This is only shown if waste=dog_excrement|waste=trash|)", + "description": "Layer 'Waste Basket' shows vending=dog_excrement_bag with a fixed text, namely 'This waste basket has a dispenser for (dog) excrement bags' and allows to pick this as a default answer (in the mapcomplete.org theme 'Waste') (This is only shown if waste=dog_excrement |waste=trash |)", "value": "dog_excrement_bag" }, { "key": "not:vending", - "description": "Layer 'Waste Basket' shows vending=dog_excrement_bag with a fixed text, namely 'This waste basket has a dispenser for (dog) excrement bags' and allows to pick this as a default answer (in the mapcomplete.org theme 'Waste') Picking this answer will delete the key not:vending. (This is only shown if waste=dog_excrement|waste=trash|)", + "description": "Layer 'Waste Basket' shows vending=dog_excrement_bag with a fixed text, namely 'This waste basket has a dispenser for (dog) excrement bags' and allows to pick this as a default answer (in the mapcomplete.org theme 'Waste') Picking this answer will delete the key not:vending. (This is only shown if waste=dog_excrement |waste=trash |)", "value": "" }, { "key": "not:vending", - "description": "Layer 'Waste Basket' shows not:vending=dog_excrement_bag with a fixed text, namely 'This waste basket does not have a dispenser for (dog) excrement bags' and allows to pick this as a default answer (in the mapcomplete.org theme 'Waste') (This is only shown if waste=dog_excrement|waste=trash|)", + "description": "Layer 'Waste Basket' shows not:vending=dog_excrement_bag with a fixed text, namely 'This waste basket does not have a dispenser for (dog) excrement bags' and allows to pick this as a default answer (in the mapcomplete.org theme 'Waste') (This is only shown if waste=dog_excrement |waste=trash |)", "value": "dog_excrement_bag" }, { "key": "vending", - "description": "Layer 'Waste Basket' shows not:vending=dog_excrement_bag with a fixed text, namely 'This waste basket does not have a dispenser for (dog) excrement bags' and allows to pick this as a default answer (in the mapcomplete.org theme 'Waste') Picking this answer will delete the key vending. (This is only shown if waste=dog_excrement|waste=trash|)", + "description": "Layer 'Waste Basket' shows not:vending=dog_excrement_bag with a fixed text, namely 'This waste basket does not have a dispenser for (dog) excrement bags' and allows to pick this as a default answer (in the mapcomplete.org theme 'Waste') Picking this answer will delete the key vending. (This is only shown if waste=dog_excrement |waste=trash |)", "value": "" }, { "key": "vending", - "description": "Layer 'Waste Basket' shows with a fixed text, namely 'This waste basket does not have a dispenser for (dog) excrement bags' (in the mapcomplete.org theme 'Waste') Picking this answer will delete the key vending. (This is only shown if waste=dog_excrement|waste=trash|)", + "description": "Layer 'Waste Basket' shows with a fixed text, namely 'This waste basket does not have a dispenser for (dog) excrement bags' (in the mapcomplete.org theme 'Waste') Picking this answer will delete the key vending. (This is only shown if waste=dog_excrement |waste=trash |)", "value": "" }, { @@ -107,7 +107,7 @@ }, { "key": "id", - "description": "Layer 'Recycling' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Waste') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Recycling' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Waste') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -371,7 +371,7 @@ }, { "key": "id", - "description": "Layer 'Waste Disposal Bins' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Waste') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Waste Disposal Bins' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Waste') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", diff --git a/Docs/TagInfo/mapcomplete_waste_basket.json b/Docs/TagInfo/mapcomplete_waste_basket.json index 6b95079ea..e2fdf07e4 100644 --- a/Docs/TagInfo/mapcomplete_waste_basket.json +++ b/Docs/TagInfo/mapcomplete_waste_basket.json @@ -17,7 +17,7 @@ }, { "key": "id", - "description": "Layer 'Waste Basket' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Waste Basket') (This is only shown if _backend~.+&_last_edit:passed_time<300&|_version_number=1)" + "description": "Layer 'Waste Basket' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Waste Basket') (This is only shown if _backend~.+ &_last_edit:passed_time<300 & |_version_number=1)" }, { "key": "image", @@ -77,27 +77,27 @@ }, { "key": "vending", - "description": "Layer 'Waste Basket' shows vending=dog_excrement_bag with a fixed text, namely 'This waste basket has a dispenser for (dog) excrement bags' and allows to pick this as a default answer (in the mapcomplete.org theme 'Waste Basket') (This is only shown if waste=dog_excrement|waste=trash|)", + "description": "Layer 'Waste Basket' shows vending=dog_excrement_bag with a fixed text, namely 'This waste basket has a dispenser for (dog) excrement bags' and allows to pick this as a default answer (in the mapcomplete.org theme 'Waste Basket') (This is only shown if waste=dog_excrement |waste=trash |)", "value": "dog_excrement_bag" }, { "key": "not:vending", - "description": "Layer 'Waste Basket' shows vending=dog_excrement_bag with a fixed text, namely 'This waste basket has a dispenser for (dog) excrement bags' and allows to pick this as a default answer (in the mapcomplete.org theme 'Waste Basket') Picking this answer will delete the key not:vending. (This is only shown if waste=dog_excrement|waste=trash|)", + "description": "Layer 'Waste Basket' shows vending=dog_excrement_bag with a fixed text, namely 'This waste basket has a dispenser for (dog) excrement bags' and allows to pick this as a default answer (in the mapcomplete.org theme 'Waste Basket') Picking this answer will delete the key not:vending. (This is only shown if waste=dog_excrement |waste=trash |)", "value": "" }, { "key": "not:vending", - "description": "Layer 'Waste Basket' shows not:vending=dog_excrement_bag with a fixed text, namely 'This waste basket does not have a dispenser for (dog) excrement bags' and allows to pick this as a default answer (in the mapcomplete.org theme 'Waste Basket') (This is only shown if waste=dog_excrement|waste=trash|)", + "description": "Layer 'Waste Basket' shows not:vending=dog_excrement_bag with a fixed text, namely 'This waste basket does not have a dispenser for (dog) excrement bags' and allows to pick this as a default answer (in the mapcomplete.org theme 'Waste Basket') (This is only shown if waste=dog_excrement |waste=trash |)", "value": "dog_excrement_bag" }, { "key": "vending", - "description": "Layer 'Waste Basket' shows not:vending=dog_excrement_bag with a fixed text, namely 'This waste basket does not have a dispenser for (dog) excrement bags' and allows to pick this as a default answer (in the mapcomplete.org theme 'Waste Basket') Picking this answer will delete the key vending. (This is only shown if waste=dog_excrement|waste=trash|)", + "description": "Layer 'Waste Basket' shows not:vending=dog_excrement_bag with a fixed text, namely 'This waste basket does not have a dispenser for (dog) excrement bags' and allows to pick this as a default answer (in the mapcomplete.org theme 'Waste Basket') Picking this answer will delete the key vending. (This is only shown if waste=dog_excrement |waste=trash |)", "value": "" }, { "key": "vending", - "description": "Layer 'Waste Basket' shows with a fixed text, namely 'This waste basket does not have a dispenser for (dog) excrement bags' (in the mapcomplete.org theme 'Waste Basket') Picking this answer will delete the key vending. (This is only shown if waste=dog_excrement|waste=trash|)", + "description": "Layer 'Waste Basket' shows with a fixed text, namely 'This waste basket does not have a dispenser for (dog) excrement bags' (in the mapcomplete.org theme 'Waste Basket') Picking this answer will delete the key vending. (This is only shown if waste=dog_excrement |waste=trash |)", "value": "" } ] diff --git a/Docs/Tags_format.md b/Docs/Tags_format.md index 0e9d9b0aa..bd77a55b4 100644 --- a/Docs/Tags_format.md +++ b/Docs/Tags_format.md @@ -1,4 +1,4 @@ -Tags format +[//]: # (WARNING: this file is automatically generated. Please find the sources at the bottom and edit those sources)Tags format ============= When creating the `json` file describing your layer or theme, you'll have to add a few tags to describe what you want. @@ -35,14 +35,13 @@ This example shows the most common options on how to specify tags: ``` -Strict equality ---------------- + + +## `=` strict equality Strict equality is denoted by `key=value`. This key matches __only if__ the keypair is present exactly as stated. -**Only normal tags (eventually in an `and`) can be used in places where they are uploaded**. Normal tags are used in -the `mappings` of a [TagRendering] (unless `hideInAnswer` is specified), they are used in `addExtraTags` of [Freeform] -and are used in the `tags`-list of a preset. +**Only normal tags (eventually in an `and`) can be used in places where they are uploaded**. Normal tags are used in the `mappings` of a [TagRendering] (unless `hideInAnswer` is specified), they are used in `addExtraTags` of [Freeform] and are used in the `tags`-list of a preset. If a different kind of tag specification is given, your theme will fail to parse. @@ -56,8 +55,9 @@ if `key` is missing or if `key` is a literal empty value. If a key should be deleted in the OpenStreetMap-database, specify `key=` as well. This can be used e.g. to remove a fixme or value from another mapping if another field is filled out. -Strict not equals ------------------ + + +## `!=` strict not equals To check if a key does _not_ equal a certain value, use `key!=value`. This is converted behind the scenes to `key!~^value$` @@ -69,37 +69,48 @@ If `key` is not present or empty, this will match too. This implies that, to check if a key is present, `key!=` can be used. This will only match if the key is present and not empty. -Number and date comparison --------------------------- -If the value of a tag is a number (e.g. `key=42`), one can use a filter `key<=42`, `key>=35`, `key>40` or `key<50` to -match this, e.g. in conditions for renderings. These tags cannot be used to generate an answer nor can they be used to -request data upstream from overpass. -Note that the value coming from OSM will first be stripped by removing all non-numeric characters. For -example, `length=42 meter` will be interpreted as `length=42` and will thus match `length<=42` and `length>=42`. In -special circumstances (e.g. `surface_area=42 m2` or `length=100 feet`), this will result in erronous -values (`surface=422` or if a length in meters is compared to). However, this can be partially alleviated by using ' -Units' to rewrite to a default format. - -Dates can be compared with the same expression: `somekey<2022-06-22` will match if `somekey` is a date and is smaller -then 22nd june '22. - -Regex equals ------------- +## `~` Value matches regex A tag can also be tested against a regex with `key~regex`. Note that this regex __must match__ the entire value. If the value is allowed to appear anywhere as substring, use `key~.*regex.*`. The regex is put within braces as to prevent runaway values. -Regexes will match the newline character with `.` too - the `s`-flag is enabled by default. To enable case invariant -matching, use `key~i~regex` - -Equivalently, `key!~regex` can be used if you _don't_ want to match the regex in order to appear. +Use `key~*` to indicate that any value is allowed. This is effectively the check that the attribute is present (defined _and_ not empty). +Regexes will match the newline character with `.` too - the `s`-flag is enabled by default. -Using other tags as variables ------------------------------ + +## `~i~` Value matches case-invariant regex + +A tag can also be tested against a regex with `key~i~regex`, where the case of the value will be ignored. The regex is still matched against the _entire_ value + + + +## `!~` Value should _not_ match regex + +A tag can also be tested against a regex with `key!~regex`. This filter will match if the value does *not* match the regex. + If the +value is allowed to appear anywhere as substring, use `key~.*regex.*`. +The regex is put within braces as to prevent runaway values. + + + + +## `!~i~` Value does *not* match case-invariant regex + +A tag can also be tested against a regex with `key~i~regex`, where the case of the value will be ignored. The regex is still matched against the _entire_ value. This filter returns true if the value does *not* match + + + +## `~~` Key and value should match given regex + +Both the `key` and `value` part of this specification are interpreted as regexes, both the key and value musth completely match their respective regexes + + + +## `:=` Substitute `... {some_key} ...` and match `key` **This is an advanced feature - use with caution** @@ -133,6 +144,27 @@ To mitigate this, use: One can use `key!:=prefix-{other_key}-postfix` as well, to match if `key` is _not_ the same as `prefix-{other_key}-postfix` (with `other_key` substituted by the value) + + +## `!:=` Substitute `{some_key}` should not match `key` + +See `:=`, except that this filter is inverted + + +## `<=` `>=` `<` `>` Logical comparators +If the value of a tag is a number (e.g. `key=42`), one can use a filter `key<=42`, `key>=35`, `key>40` or `key<50` to +match this, e.g. in conditions for renderings. These tags cannot be used to generate an answer nor can they be used to +request data upstream from overpass. + +Note that the value coming from OSM will first be stripped by removing all non-numeric characters. For +example, `length=42 meter` will be interpreted as `length=42` and will thus match `length<=42` and `length>=42`. In +special circumstances (e.g. `surface_area=42 m2` or `length=100 feet`), this will result in erronous +values (`surface=422` or if a length in meters is compared to). However, this can be partially alleviated by using ' +Units' to rewrite to a default format. + +Dates can be compared with the same expression: `somekey<2022-06-22` will match if `somekey` is a date and is smaller +then 22nd june '22. + ## Logical operators One can combine multiple tags by using `and` or `or`, e.g.: @@ -147,4 +179,6 @@ One can combine multiple tags by using `and` or `or`, e.g.: } } ``` + +This document is autogenerated from [src/Logic/Tags/TagUtils.ts](https://github.com/pietervdvn/MapComplete/blob/develop/src/Logic/Tags/TagUtils.ts) diff --git a/Docs/Themes/cyclenodes.md b/Docs/Themes/cyclenodes.md index 0f8ae0cd7..514537571 100644 --- a/Docs/Themes/cyclenodes.md +++ b/Docs/Themes/cyclenodes.md @@ -13,6 +13,9 @@ This theme contains the following layers: - [node2node](../Layers/node2node.md) - [node](../Layers/node.md) + - [guidepost](../Layers/guidepost.md) + - [route_marker](../Layers/route_marker.md) + - [cycleways_and_roads](../Layers/cycleways_and_roads.md) - [selected_element](../Layers/selected_element.md) - [gps_location](../Layers/gps_location.md) - [gps_location_history](../Layers/gps_location_history.md) diff --git a/Docs/Themes/icecream.md b/Docs/Themes/icecream.md new file mode 100644 index 000000000..19f29c763 --- /dev/null +++ b/Docs/Themes/icecream.md @@ -0,0 +1,31 @@ +[//]: # (WARNING: this file is automatically generated. Please find the sources at the bottom and edit those sources) + + Icecream ( [icecream](https://mapcomplete.org/icecream) ) +----------------------------------------------------------- + + + +A map showing ice cream parlors and ice cream vending machines + +This theme contains the following layers: + + + + - [ice_cream](../Layers/ice_cream.md) + - [selected_element](../Layers/selected_element.md) + - [gps_location](../Layers/gps_location.md) + - [gps_location_history](../Layers/gps_location_history.md) + - [home_location](../Layers/home_location.md) + - [gps_track](../Layers/gps_track.md) + - [range](../Layers/range.md) + - [last_click](../Layers/last_click.md) + + +Available languages: + + + + - en + + +This document is autogenerated from [assets/themes/icecream/icecream.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/themes/icecream/icecream.json) diff --git a/Docs/Themes/personal.md b/Docs/Themes/personal.md index b9e86d3c2..ab095c877 100644 --- a/Docs/Themes/personal.md +++ b/Docs/Themes/personal.md @@ -63,6 +63,7 @@ This theme contains the following layers: - [hospital](../Layers/hospital.md) - [hotel](../Layers/hotel.md) - [hydrant](../Layers/hydrant.md) + - [ice_cream](../Layers/ice_cream.md) - [indoors](../Layers/indoors.md) - [information_board](../Layers/information_board.md) - [kerbs](../Layers/kerbs.md) diff --git a/Docs/Themes/shops.md b/Docs/Themes/shops.md index d710f7a01..702429566 100644 --- a/Docs/Themes/shops.md +++ b/Docs/Themes/shops.md @@ -13,6 +13,7 @@ This theme contains the following layers: - [shops](../Layers/shops.md) - [pharmacy](../Layers/pharmacy.md) + - [ice_cream](../Layers/ice_cream.md) - [selected_element](../Layers/selected_element.md) - [gps_location](../Layers/gps_location.md) - [gps_location_history](../Layers/gps_location_history.md) diff --git a/Docs/Themes/walkingnodes.md b/Docs/Themes/walkingnodes.md new file mode 100644 index 000000000..ef5e0da93 --- /dev/null +++ b/Docs/Themes/walkingnodes.md @@ -0,0 +1,36 @@ +[//]: # (WARNING: this file is automatically generated. Please find the sources at the bottom and edit those sources) + + Walking Node Networks ( [walkingnodes](https://mapcomplete.org/walkingnodes) ) +-------------------------------------------------------------------------------- + + + +This map shows walking node networks and allows you to add new nodes easily + +This theme contains the following layers: + + + + - [node2node](../Layers/node2node.md) + - [node](../Layers/node.md) + - [guidepost](../Layers/guidepost.md) + - [route_marker](../Layers/route_marker.md) + - [cycleways_and_roads](../Layers/cycleways_and_roads.md) + - [selected_element](../Layers/selected_element.md) + - [gps_location](../Layers/gps_location.md) + - [gps_location_history](../Layers/gps_location_history.md) + - [home_location](../Layers/home_location.md) + - [gps_track](../Layers/gps_track.md) + - [range](../Layers/range.md) + - [last_click](../Layers/last_click.md) + + +Available languages: + + + + - en + - nl + + +This document is autogenerated from [assets/themes/walkingnodes/walkingnodes.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/themes/walkingnodes/walkingnodes.json) diff --git a/Docs/URL_Parameters.md b/Docs/URL_Parameters.md index 81a5cdc98..35ea337bb 100644 --- a/Docs/URL_Parameters.md +++ b/Docs/URL_Parameters.md @@ -145,7 +145,7 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src Disables/Enables the search bar -This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L85) +This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L88) The default value is _true_ @@ -156,7 +156,7 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src Disables/Enables the background layer control -This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L90) +This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L93) The default value is _true_ @@ -167,7 +167,7 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src Disables/Enables the filter view -This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L96) +This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L99) The default value is _true_ @@ -178,7 +178,7 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src Disables/enables the help menu or welcome message -This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L102) +This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L105) The default value is _true_ @@ -189,7 +189,7 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src Disables/enables the button to get in touch with the community -This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L107) +This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L110) The default value is _true_ @@ -200,7 +200,7 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src Disables/Enables the extraLink button. By default, if in iframe mode and the welcome message is hidden, a popout button to the full mapcomplete instance is shown instead (unless disabled with this switch or another extraLink button is enabled) -This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L112) +This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L115) The default value is _true_ @@ -211,7 +211,7 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src Disables/Enables the 'More Quests'-tab in the welcome message -This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L117) +This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L120) The default value is _true_ @@ -222,7 +222,7 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src Disables/Enables the 'Share-screen'-tab in the welcome message -This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L122) +This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L125) The default value is _true_ @@ -233,7 +233,7 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src Disables/Enables the geolocation button -This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L127) +This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L130) The default value is _true_ @@ -244,7 +244,7 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src Always show all questions -This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L132) +This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L135) The default value is _false_ @@ -255,7 +255,7 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src Enable the export as GeoJSON and CSV button -This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L138) +This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L141) The default value is _true_ @@ -266,7 +266,7 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src 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 -This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L152) +This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L155) The default value is _false_ @@ -277,7 +277,7 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src If true, shows some extra debugging help such as all the available tags on every object -This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L158) +This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L161) The default value is _false_ @@ -288,7 +288,7 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src Point mapcomplete to a different overpass-instance. Example: https://overpass-api.de/api/interpreter -This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L164) +This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L167) The default value is _https://overpass-api.de/api/interpreter,https://overpass.kumi.systems/api/interpreter,https://overpass.openstreetmap.ru/cgi/interpreter_ @@ -299,7 +299,7 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src Set a different timeout (in seconds) for queries in overpass -This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L175) +This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L178) The default value is _30_ @@ -310,7 +310,7 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src point to switch between OSM-api and overpass -This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L183) +This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L186) The default value is _16_ @@ -321,7 +321,7 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src Tilesize when the OSM-API is used to fetch data within a BBOX -This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L191) +This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L194) The default value is _17_ @@ -332,7 +332,7 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src The id of the background layer to start with -This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L198) +This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L201) No default value set @@ -343,7 +343,7 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src Wether or not the layer with id is shown -This documentation is defined in the source code at [QueryParameterDocumentation.ts](/src/UI/QueryParameterDocumentation.ts#L53) +This documentation is defined in the source code at [QueryParameterDocumentation.ts](/src/UI/QueryParameterDocumentation.ts#L59) The default value is _true_ diff --git a/Docs/UserTests/2023-06 HAN Accessibility Report MapComplete.pdf b/Docs/UserTests/2023-06 HAN Accessibility Report MapComplete.pdf new file mode 100644 index 000000000..08f89cc6f Binary files /dev/null and b/Docs/UserTests/2023-06 HAN Accessibility Report MapComplete.pdf differ diff --git a/Docs/UserTests/2023-10-17 User Test Studio Thibault.md b/Docs/UserTests/2023-10-17 User Test Studio Thibault.md new file mode 100644 index 000000000..af8792e16 --- /dev/null +++ b/Docs/UserTests/2023-10-17 User Test Studio Thibault.md @@ -0,0 +1,35 @@ +# User Test of the Studio + +## Task + +Create a simple layer specification using MapComplete studio with 'images' and a question. The actual _topic_ of the layer can be chosen by the participant + +This participant wanted to create a layer about solar panels. + +## Background info + +Browser: Librewolf on a linux machine (actually: pietervdvn's dev machine) +Testurl: hosted.Mapcomplete.org/studio.html +The participant has an extensive knowledge of MapComplete - both as user, data contributor but also as beta tester. +As such, many terms and the general structure of Studio were intuitively clear. + +## Surfaced issues with studio + +- [x] If the 'name' or 'description' of the layer are not given, it cannot be loaded as 'fake' theme. This needs a clear warning message +- [x] The explanation of the field `render` uses `&LBRACEkey&RBRACE` instead of `{key}` +- [x] The freeform textfield only takes a small part of the screen, should be made full-width +- [x] The 'render'-field should be moved in the 'freeform' section +- [x] A pending `Translated value:` is still shown in the UI (for debugging purposes) - should be removed +- [x] The 'textfield' of the 'Translated Value' should be hidden - especially as it contains JSON +- [x] If an external dataset is loaded, a 'read only' mode should be triggered causing the 'question' - part to be disabled +- [ ] snapToLayer-section under presets section is not immediately clear. The participant realized after a few seconds what it meant drawing on their extensive MC-experience, but a beginner would not be able to figure this out + +## Suggestions and feature requests by the participant + +- Add image previews (e.g. show a preview) +- The ability to paste `key=value` tags and have them filled into the relevant fields +- [x] minzoom is set on 0 by default, which might choke mapcomplete; a sensible default (~15) should be taken for this + +## Other misc issues + +- [x] The crosshair might be invisible if the aerial imagery is quite dark (fixed in 9dc222be433512d4d1ca530c1d09e28442d976ec) diff --git a/Docs/UserTests/2023-10-17 User Test Studio bxl-forever.md b/Docs/UserTests/2023-10-17 User Test Studio bxl-forever.md new file mode 100644 index 000000000..d980bd67c --- /dev/null +++ b/Docs/UserTests/2023-10-17 User Test Studio bxl-forever.md @@ -0,0 +1,25 @@ +# User Test of the Studio + +## Task + +Create a simple layer specification using MapComplete studio with 'images' and a question. The actual _topic_ of the layer can be chosen by the participant + +This participant wanted to create a layer to park escooters + +## Background info + +Browser: Participants machine, browser unknown (but no browser-specific bugs were encountered) +Testurl: hosted.Mapcomplete.org/studio.html +The participant has extensive OpenStreetMap-knowledge but only used MapComplete a few times, long ago. + +## Surfaced issues + +- [x] In presets, all options can be chosen (e.g. regex, '<', ...). However, these should be uploadable tags +- [x] The 'try it out'-button should be a 'next'-button +- [x] Entering an incorrect ID and pressing enter still takes you to the layer editor with an incorrect ID +- [x] A name and description are obligatory to use the layer as single-layer-theme; but those error messages are unclear. +- [x] This user had an expression with two tags in an AND. There was some confusion if the taginfo-count gave the totals for the tags individually or for the entire expression. + Fix: play with padding and wording +- [x] BUG: having a complex expression for tags (e.g. with `and: [key=value, key0=value0]`) fails as the JSON would be stringified +- [x] In MapComplete (not in studio): creating a new point: the buttons might dissapear under scroll if zoomed in a lot +- [x] If a layer does not have a title and a tagRenderings, it is not interpreted as 'standalone' theme diff --git a/Docs/UserTests/2023-10-31 User Test Studio Shareish.md b/Docs/UserTests/2023-10-31 User Test Studio Shareish.md new file mode 100644 index 000000000..af97f91f8 --- /dev/null +++ b/Docs/UserTests/2023-10-31 User Test Studio Shareish.md @@ -0,0 +1,45 @@ +# User Test of the Studio + +## Task + +Create a simple layer specification using MapComplete studio with 'images', a few questions and an icon. The actual _topic_ of the layer can be chosen by the participant + +This participant wanted to create a layer about food_sharing and give_boxes. + +## Background info + +User has used mapcomplete a few times before but has very little OSM-knowledge. + +## Surfaced issues + +- [x] dev.mapcomplete.org crashes +- [x] Switching tagRenderings or creating them sometimes creates a 'null' value which crashes downstream: should be filtered out +- [x] Switching between editing layers does not update the title +- [x] The warning messages don't update when editing +- [x] The distinction between a 'warning' and an 'error' is unclear +- [x] A questionHint without a question should give an error +- [x] The 'title'-field should not have a 'question', as it is read-only +- [x] Button to edit the tagRendering is unclear + - [x] Change text + - [x] Change to primary +- [ ] The markers (which can be built from multiple, stacked images) approach is unclear +- [x] When creating a new layer, perhaps force 'source' too? +- [x] Forced questions in the beginning: do not show errors +- [x] Validation: forbid that a mapping starts with "yes" or "no" +- [x] TagRenderings: freeform key cannot be set to 'undefined' again +- [x] When a new tagRendering is added, the floatover should open immediately +- [x] Mappings with different keys do not erase each other/freeform (e.g. noname=yes should erase `name`) +- [x] Rename `mapping` to `predifined icon`, perhaps add a clarifying icon +- [x] In tagRenderings: the `question`-field should be in question-mode right from the start +- [x] If _only_ freeform.key is set (but no question nor render): an error should be generated +- [x] The questionHints take too much space and should be unstickied +- [x] There should be some space for the 'close'-button in the tagRendering +- [x] Changing the icon: the term 'icon badge' is misunderstood and interpreted as "the logo" +- [x] Trying to change the 'iconBadges' does not work + +### Wont fix + +Should be clear to seasoned OSM-people + +- [-] How to create a mapping for `key=yes` or `key=no` is unclear. Person searched for a 'binary'-type instead +- [-] Creating a preset: initially very unclear diff --git a/Docs/wikiIndex.txt b/Docs/wikiIndex.txt index eead649b2..f99078527 100644 --- a/Docs/wikiIndex.txt +++ b/Docs/wikiIndex.txt @@ -328,6 +328,15 @@ The position of a signpost can be used by a hiker/biker/rider... |genre= POI, editor, hotels }} {{service_item +|name= [https://mapcomplete.org/icecream icecream] +|region= Worldwide +|lang= {{#language:en|en}} +|descr= A MapComplete theme: A map showing ice cream parlors and ice cream vending machines +|material= {{yes|[https://mapcomplete.org/ Yes]}} +|image= MapComplete_Screenshot.png +|genre= POI, editor, icecream +}} +{{service_item |name= [https://mapcomplete.org/indoors indoors] |region= Worldwide |lang= {{#language:en|en}}, {{#language:de|en}}, {{#language:fr|en}}, {{#language:da|en}}, {{#language:nl|en}}, {{#language:cs|en}}, {{#language:nb_NO|en}}, {{#language:es|en}}, {{#language:ca|en}}, {{#language:pl|en}} diff --git a/assets/layers/address/address.json b/assets/layers/address/address.json index 519fe5266..af063ee2e 100644 --- a/assets/layers/address/address.json +++ b/assets/layers/address/address.json @@ -23,43 +23,6 @@ "eu": "OSMko helbide ezagunak", "pl": "Znane adresy w OSM" }, - "minzoom": 18, - "source": { - "osmTags": { - "or": [ - "addr:housenumber~*", - "addr:street~*" - ] - } - }, - "calculatedTags": [ - "_closest_3_street_names=closestn(feat)('named_streets',3, 'name').map(f => f.feat.properties.name)", - "_closest_street:0:name=JSON.parse(feat.properties._closest_3_street_names)[0]", - "_closest_street:1:name=JSON.parse(feat.properties._closest_3_street_names)[1]", - "_closest_street:2:name=JSON.parse(feat.properties._closest_3_street_names)[2]" - ], - "title": { - "render": { - "en": "Known address", - "de": "Bekannte Adresse", - "hu": "Ismert cím", - "nl": "Bekend adres", - "fr": "Adresse connue", - "pl": "Znany adres", - "ru": "Известный адрес", - "es": "Domicilio conocido", - "zh_Hans": "已知的地址", - "id": "Alamat yang diketahui", - "nb_NO": "Kjent adresse", - "da": "Kendt adresse", - "cs": "Známá adresa", - "ca": "Adreça coneguda", - "pt": "Endereço conhecido", - "pt_BR": "Endereço conhecido", - "he": "כתובת ידועה", - "eu": "Helbide ezaguna" - } - }, "description": { "en": "Addresses", "nl": "Adressen", @@ -84,6 +47,104 @@ "he": "כתובות", "eu": "Helbideak" }, + "source": { + "osmTags": { + "or": [ + "addr:housenumber~*", + "addr:street~*" + ] + } + }, + "calculatedTags": [ + "_closest_3_street_names=closestn(feat)('named_streets',3, 'name').map(f => f.feat.properties.name)", + "_closest_street:0:name=JSON.parse(feat.properties._closest_3_street_names)[0]", + "_closest_street:1:name=JSON.parse(feat.properties._closest_3_street_names)[1]", + "_closest_street:2:name=JSON.parse(feat.properties._closest_3_street_names)[2]" + ], + "minzoom": 18, + "title": { + "render": { + "en": "Known address", + "de": "Bekannte Adresse", + "hu": "Ismert cím", + "nl": "Bekend adres", + "fr": "Adresse connue", + "pl": "Znany adres", + "ru": "Известный адрес", + "es": "Domicilio conocido", + "zh_Hans": "已知的地址", + "id": "Alamat yang diketahui", + "nb_NO": "Kjent adresse", + "da": "Kendt adresse", + "cs": "Známá adresa", + "ca": "Adreça coneguda", + "pt": "Endereço conhecido", + "pt_BR": "Endereço conhecido", + "he": "כתובת ידועה", + "eu": "Helbide ezaguna" + } + }, + "pointRendering": [ + { + "label": { + "render": "
{addr:housenumber}
", + "condition": "addr:housenumber~*" + }, + "iconSize": "50,50", + "marker": [ + { + "icon": { + "render": "./assets/layers/address/housenumber_blank.svg", + "mappings": [ + { + "if": { + "or": [ + { + "and": [ + "addr:housenumber=", + "nohousenumber!=yes" + ] + }, + "addr:street=" + ] + }, + "then": "./assets/themes/uk_addresses/housenumber_unknown.svg" + } + ] + } + } + ], + "location": [ + "point", + "centroid" + ], + "anchor": "center" + } + ], + "lineRendering": [ + { + "color": { + "render": "#00f", + "mappings": [ + { + "if": { + "or": [ + { + "and": [ + "addr:housenumber=", + "nohousenumber!=yes" + ] + }, + "addr:street=" + ] + }, + "then": "#ff0" + } + ] + }, + "width": "8" + } + ], "tagRenderings": [ { "id": "housenumber", @@ -140,6 +201,7 @@ "nohousenumber=yes" ] }, + "addExtraTags": ["addr:housenumber="], "then": { "en": "This building has no house number", "nl": "Dit gebouw heeft geen huisnummer", @@ -262,60 +324,5 @@ } ] } - ], - "mapRendering": [ - { - "label": { - "render": "
{addr:housenumber}
", - "condition": "addr:housenumber~*" - }, - "iconSize": "50,50", - "icon": { - "render": "./assets/layers/address/housenumber_blank.svg", - "mappings": [ - { - "if": { - "or": [ - { - "and": [ - "addr:housenumber=", - "nohousenumber!=yes" - ] - }, - "addr:street=" - ] - }, - "then": "./assets/themes/uk_addresses/housenumber_unknown.svg" - } - ] - }, - "location": [ - "point", - "centroid" - ], - "anchor": "center" - }, - { - "color": { - "render": "#00f", - "mappings": [ - { - "if": { - "or": [ - { - "and": [ - "addr:housenumber=", - "nohousenumber!=yes" - ] - }, - "addr:street=" - ] - }, - "then": "#ff0" - } - ] - }, - "width": "8" - } ] } diff --git a/assets/layers/advertising/advertising.json b/assets/layers/advertising/advertising.json index 05075371d..bd379c4cc 100644 --- a/assets/layers/advertising/advertising.json +++ b/assets/layers/advertising/advertising.json @@ -13,10 +13,21 @@ "pl": "Reklama", "pt_BR": "Anunciar" }, - "minzoom": 15, + "description": { + "ca": "Completarem les dades dels elements publicitaris amb referència, operador i il·luminació", + "es": "Completaremos los datos de los elementos publicitarios con referencia, operador y iluminación", + "en": "We will complete data from advertising features with reference, operator and lit", + "de": "Wir vervollständigen Daten von Werbeanlagen mit Referenz-, Betreiber- und Beleuchtungsdaten", + "cs": "Doplníme údaje z reklamních prvků s referencemi, provozovatelem a osvětlením", + "pt": "Iremos completar os dados das funcionalidades publicitárias com referência, operador e iluminado", + "eu": "Publizitate-ezaugarrien datuak osatuko ditugu erreferentziarekin, operadorearekin eta argiztatuarekin.", + "pl": "Uzupełnimy dane z obiektów reklamowych o referencję, operatora i oświetlenie", + "pt_BR": "Completaremos os dados das características de publicidade com referência, operador e iluminação" + }, "source": { "osmTags": "advertising~*" }, + "minzoom": 15, "title": { "render": { "*": "{advertising}" @@ -224,17 +235,484 @@ } ] }, - "description": { - "ca": "Completarem les dades dels elements publicitaris amb referència, operador i il·luminació", - "es": "Completaremos los datos de los elementos publicitarios con referencia, operador y iluminación", - "en": "We will complete data from advertising features with reference, operator and lit", - "de": "Wir vervollständigen Daten von Werbeanlagen mit Referenz-, Betreiber- und Beleuchtungsdaten", - "cs": "Doplníme údaje z reklamních prvků s referencemi, provozovatelem a osvětlením", - "pt": "Iremos completar os dados das funcionalidades publicitárias com referência, operador e iluminado", - "eu": "Publizitate-ezaugarrien datuak osatuko ditugu erreferentziarekin, operadorearekin eta argiztatuarekin.", - "pl": "Uzupełnimy dane z obiektów reklamowych o referencję, operatora i oświetlenie", - "pt_BR": "Completaremos os dados das características de publicidade com referência, operador e iluminação" - }, + "pointRendering": [ + { + "location": [ + "point", + "centroid" + ], + "marker": [ + { + "icon": { + "mappings": [ + { + "if": "_referencing_ways=[\"way/-1\"]", + "then": "brick_wall_square" + } + ] + } + }, + { + "icon": { + "render": "./assets/themes/advertising/sign.svg", + "mappings": [ + { + "if": { + "or": [ + "advertising=billboard" + ] + }, + "then": "./assets/themes/advertising/billboard.svg" + }, + { + "if": "advertising=board", + "then": "./assets/themes/advertising/board.svg" + }, + { + "if": "advertising=column", + "then": "./assets/themes/advertising/column.svg" + }, + { + "if": "advertising=flag", + "then": "./assets/themes/advertising/flag.svg" + }, + { + "if": { + "and": [ + "advertising=poster_box", + "_referencing_ways~*" + ] + }, + "then": "./assets/themes/advertising/poster_box_no_support.svg" + }, + { + "if": "advertising=poster_box", + "then": "./assets/themes/advertising/poster_box.svg" + }, + { + "if": { + "and": [ + "advertising=screen", + "_referencing_ways~*" + ] + }, + "then": "./assets/themes/advertising/screen_no_support.svg" + }, + { + "if": "advertising=screen", + "then": "./assets/themes/advertising/screen.svg" + }, + { + "if": "advertising=sculpture", + "then": "./assets/themes/advertising/sculpture.svg" + }, + { + "if": "advertising=sign", + "then": "./assets/themes/advertising/sign.svg" + }, + { + "if": "advertising=tarp", + "then": "./assets/themes/advertising/tarp.svg" + }, + { + "if": "advertising=totem", + "then": "./assets/themes/advertising/totem.svg" + }, + { + "if": "advertising=wall_painting", + "then": "./assets/themes/advertising/wall_painting.svg" + } + ] + } + } + ], + "iconSize": { + "render": "40,40", + "mappings": [ + { + "if": "advertising=flag", + "then": "60,60" + }, + { + "if": "advertising=sculpture", + "then": "50,50" + } + ] + }, + "anchor": { + "render": "bottom", + "mappings": [ + { + "if": "_referencing_ways~*", + "then": "center" + } + ] + } + } + ], + "lineRendering": [ + { + "width": "8", + "color": "#00f" + } + ], + "presets": [ + { + "tags": [ + "advertising=billboard" + ], + "title": { + "en": "a billboard", + "ca": "una tanca publicitària", + "es": "una valla publicitària", + "de": "eine Werbetafel", + "cs": "billboard", + "pt": "um outdoor", + "fr": "un grand panneau", + "he": "שלט חוצות", + "eu": "iragarki panela", + "pl": "bilbord", + "pt_BR": "um outdoor" + }, + "description": { + "en": "A large outdoor advertising structure, typically found in high-traffic areas such as alongside busy roads", + "ca": "Una estructura publicitària gran a l'exterior, que normalment es troba a zones transitades com ara al costat de carreteres amb molta intensitat", + "es": "Una estructura publicitaria grande al aire libre, que normalmente se encuentra en áreas transitadas como carreteras con mucha intensidad", + "de": "Eine große Außenwerbung, die typischerweise in stark befahrenen Gebieten, z. B. entlang stark befahrener Straßen, zu finden ist", + "cs": "Velká venkovní reklamní konstrukce, která se obvykle nachází na místech s velkým provozem, například podél frekventovaných silnic", + "fr": "Un grand équipement extérieur, principalement disposé dans les zones à fort trafic comme une route", + "pt": "Uma grande estrutura de publicidade ao ar livre, normalmente encontrada em áreas de alto tráfego, como ao longo de estradas movimentadas", + "he": "מבנה פרסום חוצות גדול, שנמצא בדרך כלל באזורים עתירי תנועה כמו לצד כבישים סואנים", + "eu": "Atari zabaleko publizitate-egitura handia, trafiko handiko eremuetan egon ohi dena, adibidez errepideen ondoan", + "pl": "Duża struktura reklamowa na dworze, zwykle znajdująca się w obszarach z dużym ruchem, np. w pobliżu ruchliwych dróg", + "pt_BR": "Uma grande estrutura de publicidade outdoor, geralmente encontrada em áreas com alto tráfego, como ao longo de estradas movimentadas" + }, + "exampleImages": [ + "./assets/themes/advertising/KFC_Billboard.jpg", + "./assets/themes/advertising/LIDL_Billboard.jpg", + "./assets/themes/advertising/Repsol_Billboard.jpg" + ] + }, + { + "tags": [ + "advertising=poster_box" + ], + "title": { + "en": "a freestanding poster box", + "ca": "un mupi", + "es": "un mupi", + "de": "eine freistehende Posterbox", + "cs": "volně stojící plakátovací skříň", + "pt": "uma caixa de pôster independente", + "fr": "un panneau à affiches scellé au sol", + "pl": "wolnostojąca skrzynka plakatowa", + "pt_BR": "uma caixa expositora independente" + }, + "exampleImages": [ + "./assets/themes/advertising/Mupi_spain.jpg", + "./assets/themes/advertising/Mupi_Alcoi.jpg" + ] + }, + { + "tags": [ + "advertising=poster_box" + ], + "title": { + "en": "a poster box mounted on a wall", + "ca": "un mupi sobre la paret", + "es": "un mupi sobre la pared", + "de": "eine wandmontierte Posterbox", + "cs": "plakátovací skříň připevněná na stěnu", + "pt": "uma caixa de pôster montada em uma parede", + "fr": "un panneau à affiches monté sur un mur", + "pl": "skrzynka plakatowa montowana na ścianie", + "pt_BR": "uma caixa de pôster montada em uma parede" + }, + "snapToLayer": [ + "walls_and_buildings" + ] + }, + { + "tags": [ + "advertising=board" + ], + "title": { + "ca": "un tauló d'anunis", + "es": "un tablón de anuncios", + "en": "a board", + "de": "ein Anschlagbrett", + "cs": "billboard", + "nl": "een uithangbord", + "fr": "un petit panneau", + "pt": "a bordo", + "pl": "tablica", + "pt_BR": "um painel publicitário" + }, + "description": { + "en": "Small billboard for neighbourhood advertising, generally intended for pedestrians", + "es": "Un pequeño tablón de anuncios para anuncios del vecindario, normalmente destinado a peatones", + "ca": "Un xicotet tauló d'anuncics per a anuncis del veïnat, normalment destitat a peatons", + "de": "Kleines Anschlagbrett für Nachbarschaftswerbung, normalerweise an Fußgänger gerichtet", + "cs": "Malý billboard pro sousedskou reklamu, zpravidla určený pro chodce", + "fr": "Petit panneau pour l’affichage de proximité, généralement à destination des piétons", + "nl": "Een klein uithangbord voor buurtadvertenties, meestal gericht op voetgangers", + "pt": "Pequeno outdoor para publicidade de bairro, geralmente destinado a pedestres", + "pl": "Mały bilbord dla reklam lokalnych, przeznaczony głównie dla pieszych", + "pt_BR": "Pequeno outdoor para publicidade local, geralmente destinado a pedestres" + }, + "exampleImages": [ + "./assets/themes/advertising/local_Board.jpg", + "./assets/themes/advertising/FGV_Founding.jpg", + "./assets/themes/advertising/Small_Board.jpg" + ] + }, + { + "tags": [ + "advertising=column" + ], + "title": { + "ca": "una columna", + "es": "una columna", + "en": "a column", + "de": "eine Litfaßsäule", + "cs": "sloup", + "nl": "een aanplakzuil", + "fr": "une colonne", + "pt": "uma coluna", + "pl": "kolumna", + "pt_BR": "uma coluna" + }, + "description": { + "en": "A cylindrical outdoor structure which shows advertisements", + "es": "Una estructura cilíndrica exterior que muestra publicidad", + "ca": "Una extructura cilíndica exterior que mostra publicitat", + "de": "Eine zylindrische Struktur im Freien, die Werbung zeigt", + "cs": "Válcová venkovní konstrukce, která zobrazuje reklamy", + "fr": "Une structure extérieure cylindrique qui affiche de la publicité", + "nl": "Een cylindervormige structuur die buiten staat waarop advertenties staan", + "pt": "Uma estrutura exterior cilíndrica que mostra anúncios", + "pl": "Cylindryczna konstrukcja zewnętrzna, na której pokazywane są reklamy", + "pt_BR": "Uma estrutura cilíndrica ao ar livre que exibe anúncios" + }, + "exampleImages": [ + "./assets/themes/advertising/AdvertisingColumn_001.jpg", + "./assets/themes/advertising/AdvertisingColumn_003.jpg" + ] + }, + { + "tags": [ + "advertising=flag", + "man_made=pole" + ], + "title": { + "ca": "una bandera", + "es": "una bandera", + "en": "a flag", + "de": "eine Flagge", + "cs": "vlajka", + "nl": "een vlag", + "fr": "un drapeau", + "pt": "uma bandeira", + "pl": "flaga", + "pt_BR": "uma bandeira" + }, + "exampleImages": [ + "./assets/themes/advertising/Advertising_flag.jpg", + "./assets/themes/advertising/JR_Central.jpg" + ] + }, + { + "tags": [ + "advertising=screen" + ], + "title": { + "ca": "una pantalla", + "es": "una pantalla", + "en": "a screen", + "de": "einen Bildschirm", + "cs": "obrazovka", + "nl": "een scherm", + "fr": "un écran", + "pt": "uma tela", + "pl": "ekran", + "pt_BR": "uma tela" + }, + "exampleImages": [ + "./assets/themes/advertising/Screen_poster_box.jpg", + "./assets/themes/advertising/City-Light-Poster.jpg" + ] + }, + { + "tags": [ + "advertising=screen" + ], + "title": { + "ca": "una patalla sobre una paret", + "es": "una pantalla sobre una pared", + "en": "a screen mounted on a wall", + "de": "ein wandmontierter Bildschirm", + "cs": "obrazovka připevněná na stěnu", + "nl": "een scherm op een muur", + "fr": "un écran fixé au mur", + "pt": "uma tela montada em uma parede", + "pl": "ekran zamontowany na ścianie", + "pt_BR": "uma tela montada em uma parede" + }, + "exampleImages": [ + "./assets/themes/advertising/Subway_screen.jpg", + "./assets/themes/advertising/TV_media.jpg", + "./assets/themes/advertising/Times square.jpg" + ], + "snapToLayer": [ + "walls_and_buildings" + ], + "maxSnapDistance": 5 + }, + { + "tags": [ + "advertising=tarp" + ], + "title": { + "ca": "una lona", + "es": "una lona", + "en": "a tarp", + "de": "eine Plane", + "cs": "plachta", + "nl": "een spandoek", + "fr": "une bâche", + "pt": "uma lona", + "pl": "plandeka", + "pt_BR": "uma lona" + }, + "description": { + "en": "A piece of waterproof textile with a printed message, permanently anchored on a wall", + "ca": "Una peça de tèxtil impermeable amb un missatge imprès, fixada permanentment a una paret", + "es": "Una pieza de tela impermeable con un mensaje impreso, anclada permanentemente en una pared", + "de": "Ein wasserfestes Textil mit einer aufgedruckten Botschaft, das dauerhaft an einer Wand verankert ist", + "cs": "Kus nepromokavého textilu s natištěným vzkazem, trvale připevněný na stěnu", + "nl": "Een stuk groot, weerbestendig textiel met opgedrukte reclameboodschap die permanent aan de muur hangt", + "pt": "Uma peça de tecido impermeável com uma mensagem impressa, permanentemente ancorada na parede", + "fr": "Une pièce de textile imperméable avec un message imprimé, ancrée de façon permanente sur un mur.", + "pl": "Kawałek wodoodpornej tkaniny z nadrukowanym przesłaniem, trwale przymocowany do ściany", + "pt_BR": "Um pedaço de tecido impermeável com uma mensagem impressa, permanentemente fixado a uma parede" + }, + "exampleImages": [ + "./assets/themes/advertising/tarp_feder.jpg", + "./assets/themes/advertising/tarp_madrid.jpg" + ], + "snapToLayer": [ + "walls_and_buildings" + ], + "maxSnapDistance": 5 + }, + { + "tags": [ + "advertising=totem" + ], + "title": { + "ca": "un tòtem", + "es": "un tótem", + "en": "a totem", + "de": "ein Totem", + "cs": "totem", + "fr": "un totem", + "pt": "um totem", + "pl": "totem", + "pt_BR": "um totem" + }, + "exampleImages": [ + "./assets/themes/advertising/AdvertisingTotem_004.jpg", + "./assets/themes/advertising/AdvertisingTotem_003.jpg", + "./assets/themes/advertising/Lidl_totem.jpg" + ] + }, + { + "tags": [ + "advertising=sign" + ], + "title": { + "ca": "un lletrer", + "es": "un señal", + "en": "a sign", + "de": "ein Schild", + "cs": "cedule", + "fr": "une enseigne", + "pt": "um sinal", + "pt_BR": "uma placa", + "eu": "letrero bat", + "pl": "znak" + }, + "description": { + "en": "Used for advertising signs, neon signs, logos & institutional entrance signs", + "es": "Se utiliza para carteles publicitarios, letreros de neón, logotipos y carteles en entradas institucionales", + "ca": "S'utilitza per a cartells publicitaris, rètols de neó, logotips i cartells en entrades institucionals", + "de": "Verwendet für Werbeschilder, Leuchtreklamen, Logos und institutionelle Eingangsschilder", + "cs": "Používá se pro reklamní nápisy, neonové nápisy, loga a vstupní nápisy institucí", + "fr": "Désigne une enseigne publicitaire, une enseigne néon, les logos ou des indications d'entrées", + "pt": "Usado para sinais publicitários, sinais de néon, logotipos e sinais de entrada institucionais", + "eu": "Iragarki publizitarioetarako, neon-karteletarako, logotipoetarako eta erakundeen sarrera-seinaleetarako erabiltzen da", + "pl": "Używany do znaków reklamowych, neonów, logo i znaków wejściowych do instytucji", + "pt_BR": "Usado para placas de publicidade, letreiros de neon, logotipos e placas de entrada institucionais" + }, + "exampleImages": [ + "./assets/themes/advertising/Waitrose_sign.jpg", + "./assets/themes/advertising/sign_EOI.jpg", + "./assets/themes/advertising/farma_sign.jpg" + ], + "snapToLayer": [ + "walls_and_buildings" + ], + "maxSnapDistance": 5 + }, + { + "tags": [ + "advertising=sculpture" + ], + "title": { + "ca": "una escupltura", + "es": "una escultura", + "en": "a sculpture", + "de": "eine Skulptur", + "cs": "socha", + "fr": "une sculpture", + "pt": "uma escultura", + "eu": "eskultura bat", + "pl": "rzeźba", + "pt_BR": "uma escultura" + }, + "exampleImages": [ + "./assets/themes/advertising/Aircraft_Sculpture.jpg", + "./assets/themes/advertising/Mug.jpg", + "./assets/themes/advertising/BS.JPG" + ] + }, + { + "tags": [ + "advertising=wall_painting" + ], + "title": { + "ca": "una paret pintada", + "es": "una pared pintada", + "en": "a wall painting", + "de": "eine Wandmalerei", + "cs": "nástěnná malba", + "fr": "une peinture murale", + "pt": "uma pintura de parede", + "nl": "een muurschildering", + "eu": "pareta margotu bat", + "pl": "mural ścienny", + "pt_BR": "uma pintura mural" + }, + "exampleImages": [ + "./assets/themes/advertising/Capitol_wall.jpg", + "./assets/themes/advertising/clarke_wall.jpg" + ], + "snapToLayer": [ + "walls_and_buildings" + ], + "maxSnapDistance": 5 + } + ], "tagRenderings": [ "images", { @@ -644,7 +1122,8 @@ "pl": "To jest lampa neonowa", "pt_BR": "Isso é uma luz de neon" }, - "hideInAnswer": "advertising!=sign" + "hideInAnswer": "advertising!=sign", + "addExtraTags": ["lit=no"] } ], "condition": { @@ -986,488 +1465,9 @@ } } ], - "mapRendering": [ - { - "location": [ - "point", - "centroid" - ], - "icon": { - "render": "./assets/themes/advertising/sign.svg", - "mappings": [ - { - "if": { - "or": [ - "advertising=billboard" - ] - }, - "then": "./assets/themes/advertising/billboard.svg" - }, - { - "if": "advertising=board", - "then": "./assets/themes/advertising/board.svg" - }, - { - "if": "advertising=column", - "then": "./assets/themes/advertising/column.svg" - }, - { - "if": "advertising=flag", - "then": "./assets/themes/advertising/flag.svg" - }, - { - "if": { - "and": [ - "advertising=poster_box", - "_referencing_ways=[\"way/-1\"]" - ] - }, - "then": "brick_wall_square;./assets/themes/advertising/poster_box_no_support.svg" - }, - { - "if": { - "and": [ - "advertising=poster_box", - "_referencing_ways~*" - ] - }, - "then": "./assets/themes/advertising/poster_box_no_support.svg" - }, - { - "if": "advertising=poster_box", - "then": "./assets/themes/advertising/poster_box.svg" - }, - { - "if": { - "and": [ - "advertising=screen", - "_referencing_ways=[\"way/-1\"]" - ] - }, - "then": "brick_wall_square;./assets/themes/advertising/screen_no_support.svg" - }, - { - "if": { - "and": [ - "advertising=screen", - "_referencing_ways~*" - ] - }, - "then": "./assets/themes/advertising/screen_no_support.svg" - }, - { - "if": "advertising=screen", - "then": "./assets/themes/advertising/screen.svg" - }, - { - "if": "advertising=sculpture", - "then": "./assets/themes/advertising/sculpture.svg" - }, - { - "if": { - "and": [ - "advertising=sign", - "_referencing_ways=[\"way/-1\"]" - ] - }, - "then": "brick_wall_square;./assets/themes/advertising/sign.svg" - }, - { - "if": "advertising=sign", - "then": "./assets/themes/advertising/sign.svg" - }, - { - "if": "advertising=tarp", - "then": "./assets/themes/advertising/tarp.svg" - }, - { - "if": "advertising=totem", - "then": "./assets/themes/advertising/totem.svg" - }, - { - "if": "advertising=wall_painting", - "then": "./assets/themes/advertising/wall_painting.svg" - } - ] - }, - "iconSize": { - "render": "40,40", - "mappings": [ - { - "if": "advertising=flag", - "then": "60,60" - }, - { - "if": "advertising=sculpture", - "then": "50,50" - } - ] - }, - "anchor": { - "render": "bottom", - "mappings": [ - { - "if": "_referencing_ways~*", - "then": "center" - } - ] - } - }, - { - "width": "8", - "color": "#00f" - } - ], + "deletion": true, "allowMove": { "enableImproveAccuracy": true, "enableRelocation": false - }, - "deletion": true, - "presets": [ - { - "tags": [ - "advertising=billboard" - ], - "title": { - "en": "a billboard", - "ca": "una tanca publicitària", - "es": "una valla publicitària", - "de": "eine Werbetafel", - "cs": "billboard", - "pt": "um outdoor", - "fr": "un grand panneau", - "he": "שלט חוצות", - "eu": "iragarki panela", - "pl": "bilbord", - "pt_BR": "um outdoor" - }, - "description": { - "en": "A large outdoor advertising structure, typically found in high-traffic areas such as alongside busy roads", - "ca": "Una estructura publicitària gran a l'exterior, que normalment es troba a zones transitades com ara al costat de carreteres amb molta intensitat", - "es": "Una estructura publicitaria grande al aire libre, que normalmente se encuentra en áreas transitadas como carreteras con mucha intensidad", - "de": "Eine große Außenwerbung, die typischerweise in stark befahrenen Gebieten, z. B. entlang stark befahrener Straßen, zu finden ist", - "cs": "Velká venkovní reklamní konstrukce, která se obvykle nachází na místech s velkým provozem, například podél frekventovaných silnic", - "fr": "Un grand équipement extérieur, principalement disposé dans les zones à fort trafic comme une route", - "pt": "Uma grande estrutura de publicidade ao ar livre, normalmente encontrada em áreas de alto tráfego, como ao longo de estradas movimentadas", - "he": "מבנה פרסום חוצות גדול, שנמצא בדרך כלל באזורים עתירי תנועה כמו לצד כבישים סואנים", - "eu": "Atari zabaleko publizitate-egitura handia, trafiko handiko eremuetan egon ohi dena, adibidez errepideen ondoan", - "pl": "Duża struktura reklamowa na dworze, zwykle znajdująca się w obszarach z dużym ruchem, np. w pobliżu ruchliwych dróg", - "pt_BR": "Uma grande estrutura de publicidade outdoor, geralmente encontrada em áreas com alto tráfego, como ao longo de estradas movimentadas" - }, - "exampleImages": [ - "./assets/themes/advertising/KFC_Billboard.jpg", - "./assets/themes/advertising/LIDL_Billboard.jpg", - "./assets/themes/advertising/Repsol_Billboard.jpg" - ] - }, - { - "tags": [ - "advertising=poster_box" - ], - "title": { - "en": "a freestanding poster box", - "ca": "un mupi", - "es": "un mupi", - "de": "eine freistehende Posterbox", - "cs": "volně stojící plakátovací skříň", - "pt": "uma caixa de pôster independente", - "fr": "un panneau à affiches scellé au sol", - "pl": "wolnostojąca skrzynka plakatowa", - "pt_BR": "uma caixa expositora independente" - }, - "exampleImages": [ - "./assets/themes/advertising/Mupi_spain.jpg", - "./assets/themes/advertising/Mupi_Alcoi.jpg" - ] - }, - { - "tags": [ - "advertising=poster_box" - ], - "title": { - "en": "a poster box mounted on a wall", - "ca": "un mupi sobre la paret", - "es": "un mupi sobre la pared", - "de": "eine wandmontierte Posterbox", - "cs": "plakátovací skříň připevněná na stěnu", - "pt": "uma caixa de pôster montada em uma parede", - "fr": "un panneau à affiches monté sur un mur", - "pl": "skrzynka plakatowa montowana na ścianie", - "pt_BR": "uma caixa de pôster montada em uma parede" - }, - "snapToLayer": "walls_and_buildings" - }, - { - "tags": [ - "advertising=board" - ], - "title": { - "ca": "un tauló d'anunis", - "es": "un tablón de anuncios", - "en": "a board", - "de": "ein Anschlagbrett", - "cs": "billboard", - "nl": "een uithangbord", - "fr": "un petit panneau", - "pt": "a bordo", - "pl": "tablica", - "pt_BR": "um painel publicitário" - }, - "description": { - "en": "Small billboard for neighbourhood advertising, generally intended for pedestrians", - "es": "Un pequeño tablón de anuncios para anuncios del vecindario, normalmente destinado a peatones", - "ca": "Un xicotet tauló d'anuncics per a anuncis del veïnat, normalment destitat a peatons", - "de": "Kleines Anschlagbrett für Nachbarschaftswerbung, normalerweise an Fußgänger gerichtet", - "cs": "Malý billboard pro sousedskou reklamu, zpravidla určený pro chodce", - "fr": "Petit panneau pour l’affichage de proximité, généralement à destination des piétons", - "nl": "Een klein uithangbord voor buurtadvertenties, meestal gericht op voetgangers", - "pt": "Pequeno outdoor para publicidade de bairro, geralmente destinado a pedestres", - "pl": "Mały bilbord dla reklam lokalnych, przeznaczony głównie dla pieszych", - "pt_BR": "Pequeno outdoor para publicidade local, geralmente destinado a pedestres" - }, - "exampleImages": [ - "./assets/themes/advertising/local_Board.jpg", - "./assets/themes/advertising/FGV_Founding.jpg", - "./assets/themes/advertising/Small_Board.jpg" - ] - }, - { - "tags": [ - "advertising=column" - ], - "title": { - "ca": "una columna", - "es": "una columna", - "en": "a column", - "de": "eine Litfaßsäule", - "cs": "sloup", - "nl": "een aanplakzuil", - "fr": "une colonne", - "pt": "uma coluna", - "pl": "kolumna", - "pt_BR": "uma coluna" - }, - "description": { - "en": "A cylindrical outdoor structure which shows advertisements", - "es": "Una estructura cilíndrica exterior que muestra publicidad", - "ca": "Una extructura cilíndica exterior que mostra publicitat", - "de": "Eine zylindrische Struktur im Freien, die Werbung zeigt", - "cs": "Válcová venkovní konstrukce, která zobrazuje reklamy", - "fr": "Une structure extérieure cylindrique qui affiche de la publicité", - "nl": "Een cylindervormige structuur die buiten staat waarop advertenties staan", - "pt": "Uma estrutura exterior cilíndrica que mostra anúncios", - "pl": "Cylindryczna konstrukcja zewnętrzna, na której pokazywane są reklamy", - "pt_BR": "Uma estrutura cilíndrica ao ar livre que exibe anúncios" - }, - "exampleImages": [ - "./assets/themes/advertising/AdvertisingColumn_001.jpg", - "./assets/themes/advertising/AdvertisingColumn_003.jpg" - ] - }, - { - "tags": [ - "advertising=flag", - "man_made=pole" - ], - "title": { - "ca": "una bandera", - "es": "una bandera", - "en": "a flag", - "de": "eine Flagge", - "cs": "vlajka", - "nl": "een vlag", - "fr": "un drapeau", - "pt": "uma bandeira", - "pl": "flaga", - "pt_BR": "uma bandeira" - }, - "exampleImages": [ - "./assets/themes/advertising/Advertising_flag.jpg", - "./assets/themes/advertising/JR_Central.jpg" - ] - }, - { - "tags": [ - "advertising=screen" - ], - "title": { - "ca": "una pantalla", - "es": "una pantalla", - "en": "a screen", - "de": "einen Bildschirm", - "cs": "obrazovka", - "nl": "een scherm", - "fr": "un écran", - "pt": "uma tela", - "pl": "ekran", - "pt_BR": "uma tela" - }, - "exampleImages": [ - "./assets/themes/advertising/Screen_poster_box.jpg", - "./assets/themes/advertising/City-Light-Poster.jpg" - ] - }, - { - "tags": [ - "advertising=screen" - ], - "title": { - "ca": "una patalla sobre una paret", - "es": "una pantalla sobre una pared", - "en": "a screen mounted on a wall", - "de": "ein wandmontierter Bildschirm", - "cs": "obrazovka připevněná na stěnu", - "nl": "een scherm op een muur", - "fr": "un écran fixé au mur", - "pt": "uma tela montada em uma parede", - "pl": "ekran zamontowany na ścianie", - "pt_BR": "uma tela montada em uma parede" - }, - "exampleImages": [ - "./assets/themes/advertising/Subway_screen.jpg", - "./assets/themes/advertising/TV_media.jpg", - "./assets/themes/advertising/Times square.jpg" - ], - "snapToLayer": "walls_and_buildings", - "maxSnapDistance": 5 - }, - { - "tags": [ - "advertising=tarp" - ], - "title": { - "ca": "una lona", - "es": "una lona", - "en": "a tarp", - "de": "eine Plane", - "cs": "plachta", - "nl": "een spandoek", - "fr": "une bâche", - "pt": "uma lona", - "pl": "plandeka", - "pt_BR": "uma lona" - }, - "description": { - "en": "A piece of waterproof textile with a printed message, permanently anchored on a wall", - "ca": "Una peça de tèxtil impermeable amb un missatge imprès, fixada permanentment a una paret", - "es": "Una pieza de tela impermeable con un mensaje impreso, anclada permanentemente en una pared", - "de": "Ein wasserfestes Textil mit einer aufgedruckten Botschaft, das dauerhaft an einer Wand verankert ist", - "cs": "Kus nepromokavého textilu s natištěným vzkazem, trvale připevněný na stěnu", - "nl": "Een stuk groot, weerbestendig textiel met opgedrukte reclameboodschap die permanent aan de muur hangt", - "pt": "Uma peça de tecido impermeável com uma mensagem impressa, permanentemente ancorada na parede", - "fr": "Une pièce de textile imperméable avec un message imprimé, ancrée de façon permanente sur un mur.", - "pl": "Kawałek wodoodpornej tkaniny z nadrukowanym przesłaniem, trwale przymocowany do ściany", - "pt_BR": "Um pedaço de tecido impermeável com uma mensagem impressa, permanentemente fixado a uma parede" - }, - "exampleImages": [ - "./assets/themes/advertising/tarp_feder.jpg", - "./assets/themes/advertising/tarp_madrid.jpg" - ], - "snapToLayer": "walls_and_buildings", - "maxSnapDistance": 5 - }, - { - "tags": [ - "advertising=totem" - ], - "title": { - "ca": "un tòtem", - "es": "un tótem", - "en": "a totem", - "de": "ein Totem", - "cs": "totem", - "fr": "un totem", - "pt": "um totem", - "pl": "totem", - "pt_BR": "um totem" - }, - "exampleImages": [ - "./assets/themes/advertising/AdvertisingTotem_004.jpg", - "./assets/themes/advertising/AdvertisingTotem_003.jpg", - "./assets/themes/advertising/Lidl_totem.jpg" - ] - }, - { - "tags": [ - "advertising=sign" - ], - "title": { - "ca": "un lletrer", - "es": "un señal", - "en": "a sign", - "de": "ein Schild", - "cs": "cedule", - "fr": "une enseigne", - "pt": "um sinal", - "pt_BR": "uma placa", - "eu": "letrero bat", - "pl": "znak" - }, - "description": { - "en": "Used for advertising signs, neon signs, logos & institutional entrance signs", - "es": "Se utiliza para carteles publicitarios, letreros de neón, logotipos y carteles en entradas institucionales", - "ca": "S'utilitza per a cartells publicitaris, rètols de neó, logotips i cartells en entrades institucionals", - "de": "Verwendet für Werbeschilder, Leuchtreklamen, Logos und institutionelle Eingangsschilder", - "cs": "Používá se pro reklamní nápisy, neonové nápisy, loga a vstupní nápisy institucí", - "fr": "Désigne une enseigne publicitaire, une enseigne néon, les logos ou des indications d'entrées", - "pt": "Usado para sinais publicitários, sinais de néon, logotipos e sinais de entrada institucionais", - "eu": "Iragarki publizitarioetarako, neon-karteletarako, logotipoetarako eta erakundeen sarrera-seinaleetarako erabiltzen da", - "pl": "Używany do znaków reklamowych, neonów, logo i znaków wejściowych do instytucji", - "pt_BR": "Usado para placas de publicidade, letreiros de neon, logotipos e placas de entrada institucionais" - }, - "exampleImages": [ - "./assets/themes/advertising/Waitrose_sign.jpg", - "./assets/themes/advertising/sign_EOI.jpg", - "./assets/themes/advertising/farma_sign.jpg" - ], - "snapToLayer": "walls_and_buildings", - "maxSnapDistance": 5 - }, - { - "tags": [ - "advertising=sculpture" - ], - "title": { - "ca": "una escupltura", - "es": "una escultura", - "en": "a sculpture", - "de": "eine Skulptur", - "cs": "socha", - "fr": "une sculpture", - "pt": "uma escultura", - "eu": "eskultura bat", - "pl": "rzeźba", - "pt_BR": "uma escultura" - }, - "exampleImages": [ - "./assets/themes/advertising/Aircraft_Sculpture.jpg", - "./assets/themes/advertising/Mug.jpg", - "./assets/themes/advertising/BS.JPG" - ] - }, - { - "tags": [ - "advertising=wall_painting" - ], - "title": { - "ca": "una paret pintada", - "es": "una pared pintada", - "en": "a wall painting", - "de": "eine Wandmalerei", - "cs": "nástěnná malba", - "fr": "une peinture murale", - "pt": "uma pintura de parede", - "nl": "een muurschildering", - "eu": "pareta margotu bat", - "pl": "mural ścienny", - "pt_BR": "uma pintura mural" - }, - "exampleImages": [ - "./assets/themes/advertising/Capitol_wall.jpg", - "./assets/themes/advertising/clarke_wall.jpg" - ], - "snapToLayer": "walls_and_buildings", - "maxSnapDistance": 5 - } - ] + } } diff --git a/assets/layers/ambulancestation/ambulancestation.json b/assets/layers/ambulancestation/ambulancestation.json index 15c9afa5e..e51eb5ba0 100644 --- a/assets/layers/ambulancestation/ambulancestation.json +++ b/assets/layers/ambulancestation/ambulancestation.json @@ -20,7 +20,23 @@ "pl": "Mapa stacji pogotowia ratunkowego", "pt_BR": "Mapa de estações de ambulância" }, - "minzoom": 12, + "description": { + "en": "An ambulance station is an area for storage of ambulance vehicles, medical equipment, personal protective equipment, and other medical supplies.", + "ja": "救急ステーションは、救急車、医療機器、個人用保護具、およびその他の医療用品を保管する場所です。", + "fr": "Une station d’ambulance est un lieu où sont stockés les véhicules d’urgence ainsi que de l’équipement médical.", + "de": "Eine Rettungswache ist ein Ort, an dem Rettungsfahrzeuge, medizinische Ausrüstung, persönliche Schutzausrüstung und anderes medizinisches Material untergebracht sind.", + "it": "La stazione delle ambulanze è un’area per lo stoccaggio delle ambulanze, dell’equipaggiamento medico, dei dispositivi di protezione individuale e di altre forniture medicali.", + "hu": "A mentőállomás olyan terület, ahol mentőautókat, orvosi felszereléseket, egyéni védőfelszereléseket és egyéb orvosi felszereléseket tárolnak.", + "ru": "Станция скорой помощи это полигон для хранения транспорта, медицинского оборудования, средств индивидуальной защиты и других медицинских принадлежностей.", + "nl": "Een ambulancestation is een plaats waar ambulances, medisch materiaal, persoonlijk beschermingsmateriaal en aanverwanten worden bewaard.", + "es": "Una estación de ambulancias es una zona para almacenar vehículos de ambulancia, equipamiento médico, equipos de protección personal y otros suministros médicos.", + "da": "En ambulancestation er et område til opbevaring af ambulancekøretøjer, medicinsk udstyr, personlige værnemidler og andre medicinske forsyninger.", + "cs": "Stanice záchranné služby je prostor pro umístění sanitních vozidel, zdravotnického vybavení, osobních ochranných prostředků a dalšího zdravotnického materiálu.", + "ca": "Una estició d'abulàncies és una àrea per a emmagatzemar ambulàncies, equipament mèdic, equips de protecció personal i altres subministraments mèdics.", + "he": "תחנת אמבולנס היא אזור לאחסון רכבי אמבולנס, ציוד רפואי, ציוד מגן אישי וציוד רפואי אחר.", + "pl": "Stacja pogotowia ratunkowego to miejsce przechowywania pojazdów ambulansów, sprzętu medycznego, środków ochrony osobistej i innych artykułów medycznych.", + "pt_BR": "Uma estação de ambulância é uma área de armazenamento de veículos de ambulância, equipamentos médicos, equipamentos de proteção pessoal e outros suprimentos médicos." + }, "source": { "osmTags": { "and": [ @@ -28,6 +44,7 @@ ] } }, + "minzoom": 12, "title": { "render": { "en": "Ambulance Station", @@ -48,23 +65,73 @@ "pt_BR": "Estação de Ambulância" } }, - "description": { - "en": "An ambulance station is an area for storage of ambulance vehicles, medical equipment, personal protective equipment, and other medical supplies.", - "ja": "救急ステーションは、救急車、医療機器、個人用保護具、およびその他の医療用品を保管する場所です。", - "fr": "Une station d’ambulance est un lieu où sont stockés les véhicules d’urgence ainsi que de l’équipement médical.", - "de": "Eine Rettungswache ist ein Ort, an dem Rettungsfahrzeuge, medizinische Ausrüstung, persönliche Schutzausrüstung und anderes medizinisches Material untergebracht sind.", - "it": "La stazione delle ambulanze è un’area per lo stoccaggio delle ambulanze, dell’equipaggiamento medico, dei dispositivi di protezione individuale e di altre forniture medicali.", - "hu": "A mentőállomás olyan terület, ahol mentőautókat, orvosi felszereléseket, egyéni védőfelszereléseket és egyéb orvosi felszereléseket tárolnak.", - "ru": "Станция скорой помощи это полигон для хранения транспорта, медицинского оборудования, средств индивидуальной защиты и других медицинских принадлежностей.", - "nl": "Een ambulancestation is een plaats waar ambulances, medisch materiaal, persoonlijk beschermingsmateriaal en aanverwanten worden bewaard.", - "es": "Una estación de ambulancias es una zona para almacenar vehículos de ambulancia, equipamiento médico, equipos de protección personal y otros suministros médicos.", - "da": "En ambulancestation er et område til opbevaring af ambulancekøretøjer, medicinsk udstyr, personlige værnemidler og andre medicinske forsyninger.", - "cs": "Stanice záchranné služby je prostor pro umístění sanitních vozidel, zdravotnického vybavení, osobních ochranných prostředků a dalšího zdravotnického materiálu.", - "ca": "Una estició d'abulàncies és una àrea per a emmagatzemar ambulàncies, equipament mèdic, equips de protecció personal i altres subministraments mèdics.", - "he": "תחנת אמבולנס היא אזור לאחסון רכבי אמבולנס, ציוד רפואי, ציוד מגן אישי וציוד רפואי אחר.", - "pl": "Stacja pogotowia ratunkowego to miejsce przechowywania pojazdów ambulansów, sprzętu medycznego, środków ochrony osobistej i innych artykułów medycznych.", - "pt_BR": "Uma estação de ambulância é uma área de armazenamento de veículos de ambulância, equipamentos médicos, equipamentos de proteção pessoal e outros suprimentos médicos." - }, + "pointRendering": [ + { + "iconSize": "35,35", + "location": [ + "point", + "centroid" + ], + "anchor": "center", + "marker": [ + { + "icon": "./assets/themes/hailhydrant/Twemoji_1f691.svg" + } + ] + } + ], + "lineRendering": [ + { + "color": "#00f", + "width": "1" + } + ], + "presets": [ + { + "tags": [ + "emergency=ambulance_station" + ], + "title": { + "en": "an ambulance station", + "ru": "Станция скорой помощи", + "ja": "救急ステーション(消防署)", + "fr": "une station d’ambulances", + "de": "eine Rettungswache", + "it": "una stazione delle ambulanze", + "hu": "Mentőállomás", + "nl": "een ambulancestation", + "zh_Hans": "救护车站", + "id": "Stasiun ambulans", + "es": "una estación de ambulancias", + "nb_NO": "en ambulansestasjon", + "da": "en ambulancestation", + "cs": "stanice rychlé záchranné služby", + "ca": "una estació d'ambulàncies", + "pl": "stacja pogotowia ratunkowego", + "pt_BR": "uma estação de ambulância" + }, + "description": { + "en": "Add an ambulance station to the map", + "ja": "救急ステーション(消防署)をマップに追加する", + "ru": "Добавить станцию скорой помощи на карту", + "fr": "Ajouter une station d’ambulances à la carte", + "de": "Eine Rettungsstation der Karte hinzufügen", + "it": "Aggiungi una stazione delle ambulanza alla mappa", + "hu": "Mentőállomás hozzáadása a térképhez", + "nl": "Voeg een ambulancestation toe aan de kaart", + "zh_Hans": "向地图中添加一个救护车站", + "id": "Tambahkan stasiun ambulans ke peta", + "es": "Añadir una estación de ambulancias al mapa", + "nb_NO": "Legg til en ambulansestasjon på kartet", + "da": "Tilføj en ambulancestation til kortet", + "cs": "Přidat na mapu stanici záchranné služby", + "ca": "Afegeix una estació d'ambulàncies al mapa", + "he": "הוספת תחנת אמבולנס למפה", + "pl": "Dodaj stację pogotowia ratunkowego do mapy", + "pt_BR": "Adicionar uma estação de ambulância ao mapa" + } + } + ], "tagRenderings": [ { "id": "ambulance-name", @@ -363,66 +430,5 @@ ] }, "images" - ], - "presets": [ - { - "tags": [ - "emergency=ambulance_station" - ], - "title": { - "en": "an ambulance station", - "ru": "Станция скорой помощи", - "ja": "救急ステーション(消防署)", - "fr": "une station d’ambulances", - "de": "eine Rettungswache", - "it": "una stazione delle ambulanze", - "hu": "Mentőállomás", - "nl": "een ambulancestation", - "zh_Hans": "救护车站", - "id": "Stasiun ambulans", - "es": "una estación de ambulancias", - "nb_NO": "en ambulansestasjon", - "da": "en ambulancestation", - "cs": "stanice rychlé záchranné služby", - "ca": "una estació d'ambulàncies", - "pl": "stacja pogotowia ratunkowego", - "pt_BR": "uma estação de ambulância" - }, - "description": { - "en": "Add an ambulance station to the map", - "ja": "救急ステーション(消防署)をマップに追加する", - "ru": "Добавить станцию скорой помощи на карту", - "fr": "Ajouter une station d’ambulances à la carte", - "de": "Eine Rettungsstation der Karte hinzufügen", - "it": "Aggiungi una stazione delle ambulanza alla mappa", - "hu": "Mentőállomás hozzáadása a térképhez", - "nl": "Voeg een ambulancestation toe aan de kaart", - "zh_Hans": "向地图中添加一个救护车站", - "id": "Tambahkan stasiun ambulans ke peta", - "es": "Añadir una estación de ambulancias al mapa", - "nb_NO": "Legg til en ambulansestasjon på kartet", - "da": "Tilføj en ambulancestation til kortet", - "cs": "Přidat na mapu stanici záchranné služby", - "ca": "Afegeix una estació d'ambulàncies al mapa", - "he": "הוספת תחנת אמבולנס למפה", - "pl": "Dodaj stację pogotowia ratunkowego do mapy", - "pt_BR": "Adicionar uma estação de ambulância ao mapa" - } - } - ], - "mapRendering": [ - { - "icon": "./assets/themes/hailhydrant/Twemoji_1f691.svg", - "iconSize": "35,35", - "location": [ - "point", - "centroid" - ], - "anchor": "center" - }, - { - "color": "#00f", - "width": "1" - } ] } diff --git a/assets/layers/animal_shelter/animal_shelter.json b/assets/layers/animal_shelter/animal_shelter.json new file mode 100644 index 000000000..9407643fd --- /dev/null +++ b/assets/layers/animal_shelter/animal_shelter.json @@ -0,0 +1,121 @@ +{ + "id": "animal_shelter", + "name": { + "en": "Animal shelters" + }, + "description": { + "en": "An animal shelter is a facility where animals in trouble are brought and facility's staff (volunteers or not) feeds them and cares of them, rehabilitating and healing them if necessary. This definition includes kennels for abandoned dogs, catteries for abandoned cats, shelters for other abandoned pets and wildlife recovery centres. " + }, + "source": { + "osmTags": "amenity=animal_shelter" + }, + "title": { + "render": { + "en": "Animal shelter" + }, + "mappings": [ + { + "if": "name~*", + "then": { + "en": "{name}" + } + } + ] + }, + "pointRendering": [ + { + "location": [ + "centroid", + "point" + ], + "marker": [ + { + "icon": "circle", + "color": "#ffffff" + }, + { + "icon": "https://upload.wikimedia.org/wikipedia/commons/7/7a/Animal_Shelter_%288670%29_-_The_Noun_Project.svg" + } + ] + } + ], + "lineRendering": [ + { + "width": "1", + "lineCap": "square", + "color": "#b5835a" + } + ], + "presets": [ + { + "title": { + "en": "an animal shelter" + }, + "tags": [ + "amenity=animal_shelter" + ] + } + ], + "tagRenderings": [ + "images", + "reviews", + { + "id": "2", + "freeform": { + "key": "name" + }, + "question": { + "en": "What is the name of this animal shelter?" + }, + "render": { + "en": "This animal shelter is named {name}" + } + }, + "website", + "phone", + "email", + { + "id": "6", + "question": { + "en": "What is the purpose of the animal shelter?" + }, + "mappings": [ + { + "then": { + "en": "Animals are kept here until adopted by a new owner" + }, + "if": "purpose=adoption" + }, + { + "then": { + "en": "Animals are taken care of for the rest of their lives" + }, + "if": "purpose=sanctuary" + }, + { + "then": { + "en": "Injured animals are rehabilitated here until they can be released in nature again " + }, + "if": "purpose=release" + } + ], + "multiAnswer": true + }, + { + "question": { + "en": "When is this animal shelter opened?" + }, + "id": "7", + "render": { + "en": "{opening_hours_table()}" + }, + "freeform": { + "key": "opening_hours", + "type": "opening_hours" + } + } + ], + "deletion": true, + "allowMove": true, + "credits": "Pieter Vander Vennet" +} diff --git a/assets/layers/artwork/artwork.json b/assets/layers/artwork/artwork.json index a429d6f5a..f09ee8d6b 100644 --- a/assets/layers/artwork/artwork.json +++ b/assets/layers/artwork/artwork.json @@ -23,9 +23,36 @@ "eu": "Artelanak", "pt_BR": "Obras de arte" }, + "description": { + "en": "An open map of statues, busts, graffitis and other artwork all over the world", + "nl": "Een vrije kaart met standbeelden, bustes, graffiti en andere kunstwerken van over de hele wereld", + "fr": "Une carte ouverte de statues, bustes, graffitis et autres œuvres d'art de par le monde", + "de": "Eine freie Karte mit Statuen, Büsten, Graffitis und anderen Kunstwerken auf der ganzen Welt", + "it": "Diverse opere d’arte", + "ru": "Разнообразные произведения искусства", + "es": "Un mapa abierto de Estatuas, bustos, Graffitis y otras Obras de Arte en todo el mundo", + "ja": "多様な作品", + "zh_Hant": "顯示全世界的雕像、半身像、塗鴉以及其他類型的藝術品的地圖", + "id": "Peta terbuka patung, grafiti, dan karya seni lainnya di seluruh dunia", + "pt": "Diversas obras de arte", + "hu": "Szobrok, mellszobrok, graffitik és egyéb műalkotások nyílt világtérképe", + "da": "Et åbent kort over statuer, buster, graffitis og andre kunstværker over hele verden", + "ca": "Un mapa obert d'estàtues, busts, grafitis i altres obres d'art del tot el món", + "cs": "Otevřená mapa soch, bust, graffiti a dalších uměleckých děl po celém světě", + "zh_Hans": "一个雕塑、半身像、涂鸦和其他全球艺术品的地图", + "nb_NO": "Statuer, byster, graffiti, og andre kunstverk verden over", + "zgh": "ⵢⴰⵜ ⵜⴽⴰⵕⴹⴰ ⵉⵕⵥⵎⵏ ⵅⴼ ⵉⵙⴼⵔⵉⵙⵏ, ⵉⵖⵔⴰⵙⵏ ⴷ ⵜⵡⵓⵔⵉⵡⵉⵏ ⵜⵉⵏⴰⵥⵓⵕⵉⵏ ⵢⴰⴹⵏⵉⵏ ⴳ ⵓⵎⴰⴹⴰⵍ", + "eu": "Estatuen, bustoen, graffitien eta mundu osoko beste artelan batzuen mapa irekia", + "pl": "Otwarta mapa posągów, popiersi, graffiti i innych dzieł sztuki z całego świata", + "pt_BR": "Um mapa aberto de estátuas, bustos, grafites e outras obras de arte em todo o mundo" + }, "source": { "osmTags": "tourism=artwork" }, + "calculatedTags": [ + "website:=feat.properties.website ?? feat.properties.url" + ], + "minzoom": 12, "title": { "render": { "en": "Artwork", @@ -83,30 +110,29 @@ } ] }, - "description": { - "en": "An open map of statues, busts, graffitis and other artwork all over the world", - "nl": "Een vrije kaart met standbeelden, bustes, graffiti en andere kunstwerken van over de hele wereld", - "fr": "Une carte ouverte de statues, bustes, graffitis et autres œuvres d'art de par le monde", - "de": "Eine freie Karte mit Statuen, Büsten, Graffitis und anderen Kunstwerken auf der ganzen Welt", - "it": "Diverse opere d’arte", - "ru": "Разнообразные произведения искусства", - "es": "Un mapa abierto de Estatuas, bustos, Graffitis y otras Obras de Arte en todo el mundo", - "ja": "多様な作品", - "zh_Hant": "顯示全世界的雕像、半身像、塗鴉以及其他類型的藝術品的地圖", - "id": "Peta terbuka patung, grafiti, dan karya seni lainnya di seluruh dunia", - "pt": "Diversas obras de arte", - "hu": "Szobrok, mellszobrok, graffitik és egyéb műalkotások nyílt világtérképe", - "da": "Et åbent kort over statuer, buster, graffitis og andre kunstværker over hele verden", - "ca": "Un mapa obert d'estàtues, busts, grafitis i altres obres d'art del tot el món", - "cs": "Otevřená mapa soch, bust, graffiti a dalších uměleckých děl po celém světě", - "zh_Hans": "一个雕塑、半身像、涂鸦和其他全球艺术品的地图", - "nb_NO": "Statuer, byster, graffiti, og andre kunstverk verden over", - "zgh": "ⵢⴰⵜ ⵜⴽⴰⵕⴹⴰ ⵉⵕⵥⵎⵏ ⵅⴼ ⵉⵙⴼⵔⵉⵙⵏ, ⵉⵖⵔⴰⵙⵏ ⴷ ⵜⵡⵓⵔⵉⵡⵉⵏ ⵜⵉⵏⴰⵥⵓⵕⵉⵏ ⵢⴰⴹⵏⵉⵏ ⴳ ⵓⵎⴰⴹⴰⵍ", - "eu": "Estatuen, bustoen, graffitien eta mundu osoko beste artelan batzuen mapa irekia", - "pl": "Otwarta mapa posągów, popiersi, graffiti i innych dzieł sztuki z całego świata", - "pt_BR": "Um mapa aberto de estátuas, bustos, grafites e outras obras de arte em todo o mundo" - }, - "minzoom": 12, + "pointRendering": [ + { + "marker": [ + { + "icon": "circle", + "color": "white" + }, + { + "icon": "./assets/themes/artwork/artwork.svg" + } + ], + "location": [ + "point", + "centroid" + ] + } + ], + "lineRendering": [ + { + "color": "#0000ff", + "width": "10" + } + ], "presets": [ { "tags": [ @@ -151,12 +177,11 @@ "pl": "Dzieło sztuki na ścianie", "pt_BR": "uma obra de arte em uma parede" }, - "snapToLayer": "walls_and_buildings" + "snapToLayer": [ + "walls_and_buildings" + ] } ], - "calculatedTags": [ - "website:=feat.properties.website ?? feat.properties.url" - ], "tagRenderings": [ "images", { @@ -804,6 +829,9 @@ } } ], + "filter": [ + "has_image" + ], "deletion": { "softDeletionTags": { "and": [ @@ -816,31 +844,5 @@ "allowMove": { "enableRelocation": false, "enableImproveAccuraccy": true - }, - "mapRendering": [ - { - "icon": "circle:white;./assets/themes/artwork/artwork.svg", - "location": [ - "point", - "centroid" - ] - }, - { - "color": "#0000ff", - "width": "10" - } - ], - "filter": [ - "has_image" - ], - "pl": { - "title": { - "mappings": { - "0": { - "then": "{name}" - } - }, - "render": "turbina wiatrowa" - } } } diff --git a/assets/layers/atm/atm.json b/assets/layers/atm/atm.json index 529dad37d..09b0a5e86 100644 --- a/assets/layers/atm/atm.json +++ b/assets/layers/atm/atm.json @@ -26,6 +26,10 @@ "pl": "Bankomaty do wypłacania pieniędzy", "pt_BR": "Caixas eletrônicos para sacar dinheiro" }, + "source": { + "osmTags": "amenity=atm" + }, + "minzoom": 13, "title": { "render": { "en": "ATM", @@ -58,10 +62,24 @@ } ] }, - "source": { - "osmTags": "amenity=atm" - }, - "minzoom": 13, + "pointRendering": [ + { + "marker": [ + { + "icon": "circle", + "color": "white" + }, + { + "icon": "./assets/layers/atm/atm.svg" + } + ], + "location": [ + "point", + "centroid" + ] + } + ], + "lineRendering": [], "presets": [ { "tags": [ @@ -500,27 +518,6 @@ } } ], - "mapRendering": [ - { - "icon": "circle:white;./assets/layers/atm/atm.svg", - "location": [ - "point", - "centroid" - ] - } - ], - "allowMove": { - "enableImproveAccuracy": true, - "enableRelocation": false - }, - "deletion": { - "softDeletionTags": { - "and": [ - "disused:amenity=atm", - "amenity=" - ] - } - }, "filter": [ "open_now", { @@ -540,5 +537,17 @@ } ] } - ] + ], + "deletion": { + "softDeletionTags": { + "and": [ + "disused:amenity=atm", + "amenity=" + ] + } + }, + "allowMove": { + "enableImproveAccuracy": true, + "enableRelocation": false + } } diff --git a/assets/layers/bank/bank.json b/assets/layers/bank/bank.json index 7a87bae21..310ac65e0 100644 --- a/assets/layers/bank/bank.json +++ b/assets/layers/bank/bank.json @@ -7,8 +7,7 @@ "ca": "Una institució financera per a dipositar diners", "cs": "Finanční instituce pro ukládání peněz", "he": "מוסד פיננסי להפקדת כסף", - "pl": "Instytucja finansowa pozwalająca wpłacić pieniądze", - "pt_BR": "Um instituição financeira para depositar dinheiro" + "pl": "Instytucja finansowa pozwalająca wpłacić pieniądze" }, "name": { "en": "Banks", @@ -19,8 +18,7 @@ "cs": "Banky", "he": "בנקים", "eu": "Bankuak", - "pl": "Banki", - "pt_BR": "Bancos" + "pl": "Banki" }, "title": { "render": "Bank", @@ -34,16 +32,8 @@ "source": { "osmTags": "amenity=bank" }, - "mapRendering": [ - { - "icon": "circle:white;./assets/layers/bank/bank.svg", - "location": [ - "point", - "centroid" - ] - } - ], "tagRenderings": [ + "images", { "id": "has_atm", "question": { @@ -54,8 +44,7 @@ "ca": "Aquest banc té un caixer automàtic?", "cs": "Má tato banka bankomat?", "he": "האם לבנק הזה יש כספומט?", - "pl": "Czy ten bank ma bankomat?", - "pt_BR": "Esse banco tem caixa eletrônico?" + "pl": "Czy ten bank ma bankomat?" }, "mappings": [ { @@ -68,8 +57,7 @@ "ca": "Aquest banc té un caixer automàtic", "cs": "Tato banka má bankomat", "he": "לבנק הזה יש כספומט", - "pl": "Ten bank ma bankomat", - "pt_BR": "Este banco tem um caixa eletrônico" + "pl": "Ten bank ma bankomat" } }, { @@ -81,8 +69,7 @@ "nl": "Deze bank heeft geen bankautomaaat", "ca": "Aquest banc no té un caixer automàtic", "cs": "Tato banka nemá bankomat", - "pl": "Ten bank nie ma bankomatu", - "pt_BR": "Este banco não tem um caixa eletrônico" + "pl": "Ten bank nie ma bankomatu" } }, { @@ -92,8 +79,7 @@ "de": "Diese Bank hat zwar einen Geldautomaten, aber dieser ist mit einem anderen Symbol dargestellt", "nl": "Deze bank heeft een bankautomaat, maar deze staat apart op de kaart aangeduid", "ca": "Aquest banc té un caixer, però està mapejat com a un element diferent", - "cs": "Tato banka má bankomat, ale je namapován jako jiná ikona", - "pt_BR": "Este banco tem um caixa eletrônico, mas está mapeado como um ícone diferente" + "cs": "Tato banka má bankomat, ale je namapován jako jiná ikona" } } ] @@ -113,12 +99,29 @@ "ca": "Amb un caixer automàtic", "cs": "S bankomatem", "he": "עם כספומט", - "pl": "Za pomocą bankomatu", - "pt_BR": "Com um caixa eletrônico" + "pl": "Za pomocą bankomatu" }, "osmTags": "atm=yes" } ] } - ] -} + ], + "pointRendering": [ + { + "marker": [ + { + "icon": "circle", + "color": "white" + }, + { + "icon": "./assets/layers/bank/bank.svg" + } + ], + "location": [ + "point", + "centroid" + ] + } + ], + "lineRendering": [] +} \ No newline at end of file diff --git a/assets/layers/barrier/barrier.json b/assets/layers/barrier/barrier.json index 396b1c091..a6a19de20 100644 --- a/assets/layers/barrier/barrier.json +++ b/assets/layers/barrier/barrier.json @@ -90,6 +90,23 @@ } ] }, + "pointRendering": [ + { + "marker": [ + { + "icon": "./assets/layers/barrier/barrier.svg" + } + ], + "location": [ + "point" + ] + } + ], + "lineRendering": [ + { + "width": "5" + } + ], "presets": [ { "title": { @@ -121,7 +138,9 @@ "ca": "Un bol·lard a la carretera", "pt_BR": "Um pilar na rua" }, - "snapToLayer": "cycleways_and_roads", + "snapToLayer": [ + "cycleways_and_roads" + ], "maxSnapDistance": 25 }, { @@ -154,7 +173,9 @@ "ca": "Una barrera ciclista que relanteix als ciclistes", "pt_BR": "Barreira para ciclistas, que reduz a velocidade dos ciclistas" }, - "snapToLayer": "cycleways_and_roads", + "snapToLayer": [ + "cycleways_and_roads" + ], "maxSnapDistance": 25 } ], @@ -607,17 +628,6 @@ "id": "Overlap (cyclebarrier)" } ], - "mapRendering": [ - { - "icon": "./assets/layers/barrier/barrier.svg", - "location": [ - "point" - ] - }, - { - "width": "5" - } - ], "deletion": { "softDeletionTags": { "and": [ diff --git a/assets/layers/bench/bench.json b/assets/layers/bench/bench.json index 15a431d19..d816ed2fd 100644 --- a/assets/layers/bench/bench.json +++ b/assets/layers/bench/bench.json @@ -24,10 +24,22 @@ "he": "ספסלים", "eu": "Bankuak" }, - "minzoom": 14, + "description": { + "nl": "Een zitbank is een houten, metalen, stenen, … oppervlak waar een mens kan zitten. Deze laag toont ze en stelt er enkele vragen over.", + "en": "A bench is a wooden, metal, stone, … surface where a human can sit. This layers visualises them and asks a few questions about them.", + "fr": "Un banc est une surface en bois, métal, pierre… sur laquelle un humain peut s'asseoir. Cette couche permet de les visualiser et pose des questions à leur sujet.", + "de": "Diese Karte stellt Sitzbänke aus Holz, Metall, Stein, … dar und stellt ein paar Fragen, um weitere Informationen zu ergänzen.", + "es": "Un banco es una superficie de madera, metal, piedra, ... donde un humano se puede sentar. Estas capas los visualizan y hacen algunas preguntas sobre ellos.", + "da": "En bænk er en træ-, metal-, sten-, ... overflade, hvor et menneske kan sidde. Dette lag visualiserer dem og stiller et par spørgsmål om dem.", + "cs": "Lavička je dřevěná, kovová, kamenná, ... plocha, na které může člověk sedět. Tato vrstva je vizualizuje a klade si o nich několik otázek.", + "ca": "Un banc és una superfície de madera, metall, pedra, … on un humà s’hi pot sentar. Aquesta capa els mostra i fa algunes preguntes sobre ells.", + "he": "ספסל הוא משטח עץ, מתכת, אבן, ... בו אדם יכול לשבת. השכבות הללו מדמות אותן ושואלות עליהן מספר שאלות.", + "pt_BR": "Um banco é uma superfície de madeira, metal, pedra, etc., onde uma pessoa pode se sentar. Essa camada os visualiza e faz algumas perguntas sobre eles." + }, "source": { "osmTags": "amenity=bench" }, + "minzoom": 14, "title": { "render": { "en": "Bench", @@ -54,18 +66,62 @@ "eu": "Bankua" } }, - "description": { - "nl": "Een zitbank is een houten, metalen, stenen, … oppervlak waar een mens kan zitten. Deze laag toont ze en stelt er enkele vragen over.", - "en": "A bench is a wooden, metal, stone, … surface where a human can sit. This layers visualises them and asks a few questions about them.", - "fr": "Un banc est une surface en bois, métal, pierre… sur laquelle un humain peut s'asseoir. Cette couche permet de les visualiser et pose des questions à leur sujet.", - "de": "Diese Karte stellt Sitzbänke aus Holz, Metall, Stein, … dar und stellt ein paar Fragen, um weitere Informationen zu ergänzen.", - "es": "Un banco es una superficie de madera, metal, piedra, ... donde un humano se puede sentar. Estas capas los visualizan y hacen algunas preguntas sobre ellos.", - "da": "En bænk er en træ-, metal-, sten-, ... overflade, hvor et menneske kan sidde. Dette lag visualiserer dem og stiller et par spørgsmål om dem.", - "cs": "Lavička je dřevěná, kovová, kamenná, ... plocha, na které může člověk sedět. Tato vrstva je vizualizuje a klade si o nich několik otázek.", - "ca": "Un banc és una superfície de madera, metall, pedra, … on un humà s’hi pot sentar. Aquesta capa els mostra i fa algunes preguntes sobre ells.", - "he": "ספסל הוא משטח עץ, מתכת, אבן, ... בו אדם יכול לשבת. השכבות הללו מדמות אותן ושואלות עליהן מספר שאלות.", - "pt_BR": "Um banco é uma superfície de madeira, metal, pedra, etc., onde uma pessoa pode se sentar. Essa camada os visualiza e faz algumas perguntas sobre eles." - }, + "pointRendering": [ + { + "iconSize": "35,35", + "iconBadges": [ + { + "if": "tourism=artwork", + "then": "circle:white;./assets/layers/artwork/artwork.svg" + } + ], + "location": [ + "point", + "centroid" + ], + "anchor": "center", + "marker": [ + { + "icon": "circle", + "color": "#99bd54" + }, + { + "icon": "./assets/layers/bench/bench.svg" + } + ] + } + ], + "lineRendering": [], + "presets": [ + { + "tags": [ + "amenity=bench" + ], + "title": { + "en": "a bench", + "de": "eine Sitzbank", + "fr": "une banc", + "nl": "een zitbank", + "es": "una banco", + "it": "una panchina", + "ru": "cкамейка", + "id": "bangku", + "zh_Hans": "长椅", + "nb_NO": "en benk", + "zh_Hant": "長椅", + "pt_BR": "um banco", + "fi": "penkki", + "pl": "Ławka", + "pt": "uma banco", + "ca": "un banc", + "da": "en bænk", + "cs": "lavička" + }, + "presiceInput": { + "preferredBackground": "photo" + } + } + ], "tagRenderings": [ "images", { @@ -124,6 +180,7 @@ }, { "if": "backrest=no", + "addExtraTags": ["two_sided="], "then": { "en": "Does not have a backrest", "de": "Die Sitzbank hat keine Rückenlehne", @@ -197,7 +254,8 @@ }, "freeform": { "key": "seats", - "type": "nat" + "type": "nat", + "addExtraTags": ["seats:separated="] }, "question": { "en": "How many seats does this bench have?", @@ -226,6 +284,7 @@ "mappings": [ { "if": "seats:separated=no", + "addExtraTags": ["seats="], "then": { "en": "This bench does not have separated seats", "nl": "Deze bank is niet ingedeeld in aparte zitplaatsen", @@ -996,7 +1055,8 @@ "pt_BR": "Esse banco é um memorial para alguém ou alguma coisa" }, "addExtraTags": [ - "memorial=bench" + "memorial=bench", + "not:historic=" ] }, { @@ -1030,66 +1090,6 @@ } } ], - "presets": [ - { - "tags": [ - "amenity=bench" - ], - "title": { - "en": "a bench", - "de": "eine Sitzbank", - "fr": "une banc", - "nl": "een zitbank", - "es": "una banco", - "it": "una panchina", - "ru": "cкамейка", - "id": "bangku", - "zh_Hans": "长椅", - "nb_NO": "en benk", - "zh_Hant": "長椅", - "pt_BR": "um banco", - "fi": "penkki", - "pl": "Ławka", - "pt": "uma banco", - "ca": "un banc", - "da": "en bænk", - "cs": "lavička" - }, - "presiceInput": { - "preferredBackground": "photo" - } - } - ], - "deletion": { - "softDeletionTags": { - "and": [ - "disused:amenity=bench", - "amenity=" - ] - }, - "neededChangesets": 1 - }, - "allowMove": { - "enableRelocation": false, - "enableImproveAccuraccy": true - }, - "mapRendering": [ - { - "icon": "circle:#99bd54;./assets/layers/bench/bench.svg", - "iconSize": "35,35", - "iconBadges": [ - { - "if": "tourism=artwork", - "then": "circle:white;./assets/layers/artwork/artwork.svg" - } - ], - "location": [ - "point", - "centroid" - ], - "anchor": "center" - } - ], "filter": [ { "id": "bench_is_memorial", @@ -1161,5 +1161,18 @@ ] }, "has_image" - ] + ], + "deletion": { + "softDeletionTags": { + "and": [ + "disused:amenity=bench", + "amenity=" + ] + }, + "neededChangesets": 1 + }, + "allowMove": { + "enableRelocation": false, + "enableImproveAccuraccy": true + } } diff --git a/assets/layers/bench_at_pt/bench_at_pt.json b/assets/layers/bench_at_pt/bench_at_pt.json index 702dd336a..1c9f8bc4b 100644 --- a/assets/layers/bench_at_pt/bench_at_pt.json +++ b/assets/layers/bench_at_pt/bench_at_pt.json @@ -19,7 +19,19 @@ "cs": "Lavičky na zastávkách veřejné dopravy", "ca": "Bancs en una parada de transport públic" }, - "minzoom": 14, + "description": { + "en": "A layer showing all public-transport-stops which do have a bench", + "es": "Una capa que muestra todas las paradas de transporte público que tienen bancos", + "nl": "Een laag die stopplaatsen van openbaar vervoer toont waar er een zitbank is", + "fr": "Une couche montrant tous les arrêts de transports publics qui ont un banc", + "de": "Eine Ebene mit allen Haltestellen des öffentlichen Nahverkehrs, die über eine Sitzbank verfügen", + "da": "Et lag, der viser alle offentlige stoppesteder, som har en bænk", + "cs": "Vrstva zobrazující všechny zastávky veřejné dopravy, které mají lavičku", + "ca": "Una capa que mostra totes les parades de transport públic que tenen bancs", + "pt": "Uma camada mostrando todas as paradas de transporte público que possuem um banco", + "pl": "Warstwa pokazująca wszystkie przystanki transportu publicznego, które mają ławki", + "pt_BR": "Uma camada mostrando todas as paradas de transporte público que têm um banco" + }, "source": { "osmTags": { "and": [ @@ -33,6 +45,7 @@ ] } }, + "minzoom": 14, "title": { "render": { "en": "Bench", @@ -114,6 +127,30 @@ } ] }, + "pointRendering": [ + { + "iconSize": "35,35", + "location": [ + "point" + ], + "anchor": "center", + "marker": [ + { + "icon": "circle", + "color": "white" + }, + { + "icon": "./assets/themes/benches/bench_public_transport.svg" + } + ] + } + ], + "lineRendering": [ + { + "color": "#00f", + "width": "8" + } + ], "tagRenderings": [ "images", { @@ -210,20 +247,6 @@ ] } ], - "mapRendering": [ - { - "icon": "circle:white;./assets/themes/benches/bench_public_transport.svg", - "iconSize": "35,35", - "location": [ - "point" - ], - "anchor": "center" - }, - { - "color": "#00f", - "width": "8" - } - ], "deletion": { "omitDefaultDeleteReasons": true, "nonDeleteMappings": [ @@ -264,18 +287,5 @@ "bench=no" ] } - }, - "description": { - "en": "A layer showing all public-transport-stops which do have a bench", - "es": "Una capa que muestra todas las paradas de transporte público que tienen bancos", - "nl": "Een laag die stopplaatsen van openbaar vervoer toont waar er een zitbank is", - "fr": "Une couche montrant tous les arrêts de transports publics qui ont un banc", - "de": "Eine Ebene mit allen Haltestellen des öffentlichen Nahverkehrs, die über eine Sitzbank verfügen", - "da": "Et lag, der viser alle offentlige stoppesteder, som har en bænk", - "cs": "Vrstva zobrazující všechny zastávky veřejné dopravy, které mají lavičku", - "ca": "Una capa que mostra totes les parades de transport públic que tenen bancs", - "pt": "Uma camada mostrando todas as paradas de transporte público que possuem um banco", - "pl": "Warstwa pokazująca wszystkie przystanki transportu publicznego, które mają ławki", - "pt_BR": "Uma camada mostrando todas as paradas de transporte público que têm um banco" } } diff --git a/assets/layers/bicycle_library/bicycle_library.json b/assets/layers/bicycle_library/bicycle_library.json index ba8403894..4200be8ea 100644 --- a/assets/layers/bicycle_library/bicycle_library.json +++ b/assets/layers/bicycle_library/bicycle_library.json @@ -15,10 +15,27 @@ "da": "Cykel bibliotek", "cs": "Půjčovna kol" }, - "minzoom": 8, + "description": { + "en": "A facility where bicycles can be lent for longer period of times", + "nl": "Een plaats waar men voor langere tijd een fiets kan lenen", + "fr": "Un lieu où des vélos peuvent être empruntés pour un temps plus long", + "hu": "Létesítmény, ahonnan kerékpár kölcsönözhető hosszabb időre", + "it": "Una struttura dove le biciclette possono essere prestate per periodi di tempo più lunghi", + "de": "Eine Einrichtung, in der Fahrräder für längere Zeit geliehen werden können", + "ru": "Учреждение, где велосипед может быть арендован на более длительный срок", + "zh_Hant": "能夠長期租用單車的設施", + "pt_BR": "Uma instalação onde as bicicletas podem ser emprestadas por períodos mais longos", + "pl": "Obiekt, w którym rowery można wypożyczyć na dłuższy okres", + "pt": "Uma instalação onde as bicicletas podem ser emprestadas por períodos mais longos", + "es": "Una instalación donde se pueden alquilar bicicletas durante largos periodos de tiempo", + "da": "En facilitet, hvor cykler kan lånes i længere perioder", + "cs": "Zařízení, kde si lze půjčit jízdní kola na delší dobu", + "ca": "Una instal·lació on es poden cedir bicicletes per llargs períodes de temps" + }, "source": { "osmTags": "amenity=bicycle_library" }, + "minzoom": 8, "title": { "render": { "en": "Bicycle library", @@ -54,23 +71,79 @@ }, "icons.defaults" ], - "description": { - "en": "A facility where bicycles can be lent for longer period of times", - "nl": "Een plaats waar men voor langere tijd een fiets kan lenen", - "fr": "Un lieu où des vélos peuvent être empruntés pour un temps plus long", - "hu": "Létesítmény, ahonnan kerékpár kölcsönözhető hosszabb időre", - "it": "Una struttura dove le biciclette possono essere prestate per periodi di tempo più lunghi", - "de": "Eine Einrichtung, in der Fahrräder für längere Zeit geliehen werden können", - "ru": "Учреждение, где велосипед может быть арендован на более длительный срок", - "zh_Hant": "能夠長期租用單車的設施", - "pt_BR": "Uma instalação onde as bicicletas podem ser emprestadas por períodos mais longos", - "pl": "Obiekt, w którym rowery można wypożyczyć na dłuższy okres", - "pt": "Uma instalação onde as bicicletas podem ser emprestadas por períodos mais longos", - "es": "Una instalación donde se pueden alquilar bicicletas durante largos periodos de tiempo", - "da": "En facilitet, hvor cykler kan lånes i længere perioder", - "cs": "Zařízení, kde si lze půjčit jízdní kola na delší dobu", - "ca": "Una instal·lació on es poden cedir bicicletes per llargs períodes de temps" - }, + "pointRendering": [ + { + "iconBadges": [ + { + "if": "opening_hours~*", + "then": "icons.isOpen" + }, + { + "if": "service:bicycle:pump=yes", + "then": "circle:#e2783d;./assets/layers/bike_repair_station/pump.svg" + } + ], + "iconSize": "50,50", + "location": [ + "point", + "centroid" + ], + "anchor": "bottom", + "marker": [ + { + "icon": "pin", + "color": "#22ff55" + }, + { + "icon": "./assets/layers/bicycle_library/bicycle_library.svg" + } + ] + } + ], + "lineRendering": [ + { + "color": "#c00", + "width": "1" + } + ], + "presets": [ + { + "title": { + "nl": "een fietsbibliotheek", + "en": "a bicycle library", + "ru": "Велосипедная библиотека", + "zh_Hant": "自行車圖書館 ( Fietsbibliotheek)", + "it": "una bici in prestito", + "fr": "une vélothèque", + "pt_BR": "uma biblioteca de bicicletas", + "de": "eine Fahrradbibliothek", + "pt": "uma biblioteca de bicicletas", + "eo": "Fietsbibliotheek", + "da": "et cykelbibliotek", + "es": "una biblioteca de bicicletas", + "cs": "půjčovna kol", + "ca": "una biblioteca de bicicletes" + }, + "tags": [ + "amenity=bicycle_library" + ], + "description": { + "nl": "Een fietsbieb heeft een collectie fietsen die leden mogen lenen", + "en": "A bicycle library has a collection of bikes which can be lent", + "fr": "Une vélothèque a une flotte de vélos qui peuvent être empruntés", + "it": "Una ciclo-teca o «bici in prestito» ha una collezione di bici che possno essere prestate", + "ru": "В велосипедной библиотеке есть велосипеды для аренды", + "zh_Hant": "單車圖書館有一大批單車供人租借", + "de": "Eine Fahrradbibliothek verfügt über eine Sammlung von Fahrrädern, die ausgeliehen werden können", + "es": "Una biblioteca de bicicletas tiene una colección de bicicletas que se pueden prestar", + "da": "Et cykelbibliotek har en samling cykler, som kan lånes", + "cs": "Cyklistická půjčovna má k dispozici sbírku kol, která lze zapůjčit", + "ca": "Una biblioteca de bicicletes té una col·lecció de bicicletes que es poden cedir", + "pt": "Uma \"biblioteca de bicicletas\" tem uma coleção de bicicletas que podem ser emprestadas", + "pt_BR": "Uma biblioteca de bicicletas tem uma coleção de bicicletas que podem ser emprestadas" + } + } + ], "tagRenderings": [ "images", { @@ -235,7 +308,6 @@ "nl": "Aanbod voor kinderen", "en": "Bikes for children available", "fr": "Vélos pour enfants disponibles", - "hu": "", "it": "Sono disponibili biciclette per bambini", "de": "Fahrräder für Kinder verfügbar", "ru": "Доступны детские велосипеды", @@ -288,68 +360,5 @@ }, "description" ], - "presets": [ - { - "title": { - "nl": "een fietsbibliotheek", - "en": "a bicycle library", - "ru": "Велосипедная библиотека", - "zh_Hant": "自行車圖書館 ( Fietsbibliotheek)", - "it": "una bici in prestito", - "fr": "une vélothèque", - "pt_BR": "uma biblioteca de bicicletas", - "de": "eine Fahrradbibliothek", - "pt": "uma biblioteca de bicicletas", - "eo": "Fietsbibliotheek", - "da": "et cykelbibliotek", - "es": "una biblioteca de bicicletas", - "cs": "půjčovna kol", - "ca": "una biblioteca de bicicletes" - }, - "tags": [ - "amenity=bicycle_library" - ], - "description": { - "nl": "Een fietsbieb heeft een collectie fietsen die leden mogen lenen", - "en": "A bicycle library has a collection of bikes which can be lent", - "fr": "Une vélothèque a une flotte de vélos qui peuvent être empruntés", - "it": "Una ciclo-teca o «bici in prestito» ha una collezione di bici che possno essere prestate", - "ru": "В велосипедной библиотеке есть велосипеды для аренды", - "zh_Hant": "單車圖書館有一大批單車供人租借", - "de": "Eine Fahrradbibliothek verfügt über eine Sammlung von Fahrrädern, die ausgeliehen werden können", - "es": "Una biblioteca de bicicletas tiene una colección de bicicletas que se pueden prestar", - "da": "Et cykelbibliotek har en samling cykler, som kan lånes", - "cs": "Cyklistická půjčovna má k dispozici sbírku kol, která lze zapůjčit", - "ca": "Una biblioteca de bicicletes té una col·lecció de bicicletes que es poden cedir", - "pt": "Uma \"biblioteca de bicicletas\" tem uma coleção de bicicletas que podem ser emprestadas", - "pt_BR": "Uma biblioteca de bicicletas tem uma coleção de bicicletas que podem ser emprestadas" - } - } - ], - "mapRendering": [ - { - "icon": "pin:#22ff55;./assets/layers/bicycle_library/bicycle_library.svg", - "iconBadges": [ - { - "if": "opening_hours~*", - "then": "icons.isOpen" - }, - { - "if": "service:bicycle:pump=yes", - "then": "circle:#e2783d;./assets/layers/bike_repair_station/pump.svg" - } - ], - "iconSize": "50,50", - "location": [ - "point", - "centroid" - ], - "anchor": "bottom" - }, - { - "color": "#c00", - "width": "1" - } - ], "deletion": true } diff --git a/assets/layers/bicycle_rental/bicycle_rental.json b/assets/layers/bicycle_rental/bicycle_rental.json index 9c3d04560..ff06ad930 100644 --- a/assets/layers/bicycle_rental/bicycle_rental.json +++ b/assets/layers/bicycle_rental/bicycle_rental.json @@ -11,6 +11,18 @@ "ca": "Lloguer de bicicletes", "pt_BR": "Aluguel de bicicletas" }, + "description": { + "en": "Bicycle rental stations", + "nl": "Fietsverhuurstations", + "fr": "Stations de location de vélo", + "de": "Fahrradverleihstationen", + "es": "Estaciones de alquiler de bicicletas", + "da": "Stationer til udlejning af cykler", + "cs": "Půjčovny jízdních kol", + "ca": "Estacions de lloguer de bicicletes", + "pl": "Stacje wypożyczania rowerów", + "pt_BR": "Estações de aluguel de bicicletas" + }, "source": { "osmTags": { "and": [ @@ -62,18 +74,73 @@ } ] }, - "description": { - "en": "Bicycle rental stations", - "nl": "Fietsverhuurstations", - "fr": "Stations de location de vélo", - "de": "Fahrradverleihstationen", - "es": "Estaciones de alquiler de bicicletas", - "da": "Stationer til udlejning af cykler", - "cs": "Půjčovny jízdních kol", - "ca": "Estacions de lloguer de bicicletes", - "pl": "Stacje wypożyczania rowerów", - "pt_BR": "Estações de aluguel de bicicletas" - }, + "pointRendering": [ + { + "iconSize": "40,40", + "location": [ + "point", + "centroid" + ], + "anchor": "center", + "marker": [ + { + "icon": "./assets/themes/bicycle_rental/logo.svg" + } + ] + } + ], + "lineRendering": [ + { + "color": "#3333aa88", + "width": "2" + } + ], + "presets": [ + { + "title": { + "en": "a bicycle rental shop", + "nl": "een fietsverhuurzaak", + "fr": "un magasin de location de vélos", + "de": "ein Geschäft mit Fahrradverleih", + "es": "una tienda de alquiler de bicicletas", + "da": "en cykeludlejningsforretning", + "cs": "půjčovna jízdních kol", + "ca": "una botiga de lloguer de bicicletes", + "pt_BR": "uma loja de aluguel de bicicletas" + }, + "tags": [ + "amenity=bicycle_rental", + "bicycle_rental=shop" + ], + "description": { + "en": "A manned shop which focuses on bicycle rental", + "nl": "Een bemande winkel die focust op fietsverhuur", + "fr": "Un magasin qui priorise la location de vélos", + "de": "Ein Geschäft, das sich auf den Fahrradverleih konzentriert", + "da": "En bemandet butik, der fokuserer på cykeludlejning", + "es": "Una tienda atendida que se centra en el alquiler de bicicletas", + "cs": "Obsluhovaný obchod zaměřený na půjčování jízdních kol", + "ca": "Una botiga atesa que es centra en el lloguer de bicicletes", + "pt_BR": "Uma loja com atendimento pessoal que foca no aluguel de bicicletas" + } + }, + { + "title": { + "en": "a bicycle rental", + "nl": "een fietsverhuur", + "de": "eine Fahrradleihstation", + "da": "cykeludlejning", + "es": "un alquiler de bicicletas", + "fr": "une location de vélos", + "cs": "půjčovna kol", + "ca": "un lloguer de bicicletes", + "pt_BR": "um aluguel de bicicletas" + }, + "tags": [ + "amenity=bicycle_rental" + ] + } + ], "tagRenderings": [ "images", { @@ -111,6 +178,7 @@ }, { "if": "shop=rental", + "then": { "en": "This is a rental business which rents out various objects and/or vehicles. It rents out bicycles too, but this is not the main focus", "nl": "Dit is een zaak die verschillende voorwerpen en/of voertuigen verhuurt, waaronder ook fietsen; al zijn fietsen niet de hoofdfocus", @@ -144,6 +212,7 @@ }, { "if": "bicycle_rental=docking_station", + "addExtraTags": ["service:bicycle:rental="], "then": { "en": "This is an automated docking station, where a bicycle is mechanically locked to a structure", "nl": "Dit is een docking station waar de fietsen mechanisch in een grotere structuur worden vastgemaakt", @@ -158,6 +227,7 @@ }, { "if": "bicycle_rental=key_dispensing_machine", + "addExtraTags": ["service:bicycle:rental="], "then": { "en": "A machine is present which dispenses and accepts keys, eventually after authentication and/or payment. The bicycles are parked nearby", "nl": "Hier is een machine die fietssleutels verdeelt en terugneemt, eventueel na aanmelden of betaling. De fietsen staan in de buurt geparkeerd", @@ -173,6 +243,7 @@ }, { "if": "bicycle_rental=dropoff_point", + "addExtraTags": ["service:bicycle:rental="], "then": { "en": "This is a dropoff point, e.g. a reserved parking to place the bicycles clearly marked as being for the rental service only", "nl": "Dit is een dropzone, bv. een fietsparkeerplaats die is voorbehouden voor fietsverhuur", @@ -524,71 +595,6 @@ ] } ], - "presets": [ - { - "title": { - "en": "a bicycle rental shop", - "nl": "een fietsverhuurzaak", - "fr": "un magasin de location de vélos", - "de": "ein Geschäft mit Fahrradverleih", - "es": "una tienda de alquiler de bicicletas", - "da": "en cykeludlejningsforretning", - "cs": "půjčovna jízdních kol", - "ca": "una botiga de lloguer de bicicletes", - "pt_BR": "uma loja de aluguel de bicicletas" - }, - "tags": [ - "amenity=bicycle_rental", - "bicycle_rental=shop" - ], - "description": { - "en": "A manned shop which focuses on bicycle rental", - "nl": "Een bemande winkel die focust op fietsverhuur", - "fr": "Un magasin qui priorise la location de vélos", - "de": "Ein Geschäft, das sich auf den Fahrradverleih konzentriert", - "da": "En bemandet butik, der fokuserer på cykeludlejning", - "es": "Una tienda atendida que se centra en el alquiler de bicicletas", - "cs": "Obsluhovaný obchod zaměřený na půjčování jízdních kol", - "ca": "Una botiga atesa que es centra en el lloguer de bicicletes", - "pt_BR": "Uma loja com atendimento pessoal que foca no aluguel de bicicletas" - } - }, - { - "title": { - "en": "a bicycle rental", - "nl": "een fietsverhuur", - "de": "eine Fahrradleihstation", - "da": "cykeludlejning", - "es": "un alquiler de bicicletas", - "fr": "une location de vélos", - "cs": "půjčovna kol", - "ca": "un lloguer de bicicletes", - "pt_BR": "um aluguel de bicicletas" - }, - "tags": [ - "amenity=bicycle_rental" - ] - } - ], - "mapRendering": [ - { - "icon": "./assets/themes/bicycle_rental/logo.svg", - "iconSize": "40,40", - "location": [ - "point", - "centroid" - ], - "anchor": "center" - }, - { - "color": "#3333aa88", - "width": "2" - } - ], - "allowMove": { - "enableImproveAccuracy": true, - "enableRelocation": true - }, "deletion": { "softDeletionTags": { "and": [ @@ -634,5 +640,9 @@ } } ] + }, + "allowMove": { + "enableImproveAccuracy": true, + "enableRelocation": true } } diff --git a/assets/layers/bicycle_tube_vending_machine/bicycle_tube_vending_machine.json b/assets/layers/bicycle_tube_vending_machine/bicycle_tube_vending_machine.json index cc917d37d..559b314dc 100644 --- a/assets/layers/bicycle_tube_vending_machine/bicycle_tube_vending_machine.json +++ b/assets/layers/bicycle_tube_vending_machine/bicycle_tube_vending_machine.json @@ -14,6 +14,25 @@ "cs": "Automat na cyklistické duše", "ca": "Màquina expenedora de tubs de bicicleta" }, + "description": { + "en": "A layer showing vending machines for bicycle tubes (either purpose-built bicycle tube vending machines or classical vending machines with bicycle tubes and optionally additional bicycle related objects such as lights, gloves, locks, …)", + "nl": "Een laag met verkoopsautomaten met binnenbanden voor fietsen (dit kan een automaat zijn met énkel fietsbanden, of een gewone automaat met fietsbanden en andere fietsaccessoires zoals lichten, handschoenen, sloten,...)", + "de": "Eine Ebene mit Automaten für Fahrradschläuche (entweder spezielle Fahrradschlauch-Automaten oder klassische Automaten mit Fahrradschläuchen und optional zusätzlichen fahrradbezogenen Gegenständen wie Lampen, Handschuhe, Schlösser, …)", + "da": "Et lag med automater til cykelslanger (enten specialbyggede cykelslangeautomater eller klassiske automater med cykelslanger og eventuelt andre cykelrelaterede genstande som f.eks. lys, handsker, låse, o.s.v)", + "fr": "Une couche affichant des distributeurs automatiques de chambre à air (que ce soit des distributeurs conçus spécifiquement pour les chambres à air ou des distributeurs classiques incluant des chambres à air ainsi des objets apparentés tels que de l'éclairage pour vélo, des gants, des cadenas, ...)", + "cs": "Vrstva zobrazující automaty na cyklistické duše (buď speciální automaty na cyklistické duše, nebo klasické automaty s cyklistickými dušemi a případně dalšími předměty souvisejícími s jízdními koly, jako jsou světla, rukavice, zámky, ...)", + "ca": "Una capa que mostra màquines expenedores per a tubs de bicicleta (ja siguin màquines expenedores de tubs de bicicleta o màquines expenedores clàssiques amb tubs de bicicleta i opcionalment objectes addicionals relacionats amb la bicicleta com ara llums, guants, panys, ...)", + "pt_BR": "Uma camada que mostra máquinas de venda de câmaras de ar de bicicleta (sejam máquinas de venda de câmaras de ar de bicicleta específicas ou máquinas de venda clássicas com câmaras de ar de bicicleta e opcionalmente objetos relacionados a bicicletas, como luzes, luvas, travas, ...)" + }, + "source": { + "osmTags": { + "and": [ + "amenity=vending_machine", + "vending~.*bicycle_tube.*" + ] + } + }, + "minzoom": 13, "title": { "render": { "en": "Bicycle tube vending machine", @@ -50,15 +69,41 @@ }, "icons.defaults" ], - "source": { - "osmTags": { - "and": [ - "amenity=vending_machine", - "vending~.*bicycle_tube.*" + "pointRendering": [ + { + "iconBadges": [ + { + "if": { + "or": [ + "operational_status=broken", + "operational_status=closed" + ] + }, + "then": "close:#c33" + } + ], + "iconSize": "50,50", + "location": [ + "point", + "centroid" + ], + "anchor": "bottom", + "marker": [ + { + "icon": "pin", + "color": "#ffffff" + }, + { + "icon": "./assets/layers/bicycle_tube_vending_machine/pinIcon.svg" + } ] } - }, - "minzoom": 13, + ], + "lineRendering": [ + { + "color": "#6bc4f7" + } + ], "presets": [ { "title": { @@ -383,40 +428,5 @@ "allowMove": { "enableRelocation": false, "enableImproveAccuraccy": true - }, - "mapRendering": [ - { - "icon": "pin:#ffffff;./assets/layers/bicycle_tube_vending_machine/pinIcon.svg", - "iconBadges": [ - { - "if": { - "or": [ - "operational_status=broken", - "operational_status=closed" - ] - }, - "then": "close:#c33" - } - ], - "iconSize": "50,50", - "location": [ - "point", - "centroid" - ], - "anchor": "bottom" - }, - { - "color": "#6bc4f7" - } - ], - "description": { - "en": "A layer showing vending machines for bicycle tubes (either purpose-built bicycle tube vending machines or classical vending machines with bicycle tubes and optionally additional bicycle related objects such as lights, gloves, locks, …)", - "nl": "Een laag met verkoopsautomaten met binnenbanden voor fietsen (dit kan een automaat zijn met énkel fietsbanden, of een gewone automaat met fietsbanden en andere fietsaccessoires zoals lichten, handschoenen, sloten,...)", - "de": "Eine Ebene mit Automaten für Fahrradschläuche (entweder spezielle Fahrradschlauch-Automaten oder klassische Automaten mit Fahrradschläuchen und optional zusätzlichen fahrradbezogenen Gegenständen wie Lampen, Handschuhe, Schlösser, …)", - "da": "Et lag med automater til cykelslanger (enten specialbyggede cykelslangeautomater eller klassiske automater med cykelslanger og eventuelt andre cykelrelaterede genstande som f.eks. lys, handsker, låse, o.s.v)", - "fr": "Une couche affichant des distributeurs automatiques de chambre à air (que ce soit des distributeurs conçus spécifiquement pour les chambres à air ou des distributeurs classiques incluant des chambres à air ainsi des objets apparentés tels que de l'éclairage pour vélo, des gants, des cadenas, ...)", - "cs": "Vrstva zobrazující automaty na cyklistické duše (buď speciální automaty na cyklistické duše, nebo klasické automaty s cyklistickými dušemi a případně dalšími předměty souvisejícími s jízdními koly, jako jsou světla, rukavice, zámky, ...)", - "ca": "Una capa que mostra màquines expenedores per a tubs de bicicleta (ja siguin màquines expenedores de tubs de bicicleta o màquines expenedores clàssiques amb tubs de bicicleta i opcionalment objectes addicionals relacionats amb la bicicleta com ara llums, guants, panys, ...)", - "pt_BR": "Uma camada que mostra máquinas de venda de câmaras de ar de bicicleta (sejam máquinas de venda de câmaras de ar de bicicleta específicas ou máquinas de venda clássicas com câmaras de ar de bicicleta e opcionalmente objetos relacionados a bicicletas, como luzes, luvas, travas, ...)" } -} \ No newline at end of file +} diff --git a/assets/layers/bike_cafe/bike_cafe.json b/assets/layers/bike_cafe/bike_cafe.json index 371d783f6..d87b439d6 100644 --- a/assets/layers/bike_cafe/bike_cafe.json +++ b/assets/layers/bike_cafe/bike_cafe.json @@ -16,7 +16,16 @@ "da": "Cykelcafé", "cs": "Cyklokavárna" }, - "minzoom": 13, + "description": { + "en": "A bike café is a café geared towards cyclists, for example with services such as a pump, with lots of bicycle-related decoration, …", + "nl": "Een fietscafé is een café dat gericht is op fietsers, bijvoorbeeld omdat het een fietspomp heeft, fietsgerelateerde decoratie heeft enzovoorts.", + "de": "Ein Fahrradcafé ist ein Café, das auf Radfahrer ausgerichtet ist, zum Beispiel mit Dienstleistungen wie einer Pumpe, mit viel fahrradbezogener Dekoration, …", + "da": "En cykelcafé er en café rettet mod cyklister, for eksempel med tjenester som en pumpe, med masser af cykelrelateret dekoration, o.s.v", + "fr": "Un vélo café est un café à destination des cyclistes avec, par exemple, des services tels qu’une pompe, et de nombreuses décorations liées aux vélos, etc.", + "cs": "Cyklokavárna je kavárna zaměřená na cyklisty, například se službami, jako je pumpa, se spoustou výzdoby související s jízdními koly, …", + "ca": "Un cafè ciclista és un cafè enfocat a ciclistes, per exemple, amb serveis com una manxa, amb molta decoració relacionada amb el ciclisme, …", + "pt_BR": "Um café para ciclistas é um café direcionado aos ciclistas, por exemplo, com serviços como uma bomba de ar, muita decoração relacionada a bicicletas, …" + }, "source": { "osmTags": { "and": [ @@ -41,6 +50,7 @@ ] } }, + "minzoom": 13, "title": { "render": { "en": "Bike cafe", @@ -80,6 +90,55 @@ } ] }, + "pointRendering": [ + { + "iconSize": "50,50", + "anchor": "bottom", + "location": [ + "point", + "centroid" + ], + "marker": [ + { + "icon": "pin", + "color": "#684c2b" + }, + { + "icon": "./assets/layers/bike_cafe/bike_cafe.svg" + } + ] + } + ], + "lineRendering": [ + { + "color": "#694E2D", + "width": "2" + } + ], + "presets": [ + { + "title": { + "en": "a bike cafe", + "nl": "een fietscafé", + "fr": "une café vélo", + "gl": "Café de ciclistas", + "de": "ein Fahrrad-Café", + "it": "un cafè per ciclisti", + "zh_Hans": "自行车咖啡", + "zh_Hant": "單車咖啡廳", + "ru": "Велосипедное кафе", + "pt_BR": "uma café de bicicleta", + "pt": "uma café de bicicleta", + "da": "en cykelcafé", + "cs": "kavárna pro cyklisty", + "ca": "un cafè ciclista" + }, + "tags": [ + "amenity=pub", + "pub=cycling" + ] + } + ], "tagRenderings": [ "images", { @@ -319,54 +378,5 @@ } } ], - "presets": [ - { - "title": { - "en": "a bike cafe", - "nl": "een fietscafé", - "fr": "une café vélo", - "gl": "Café de ciclistas", - "de": "ein Fahrrad-Café", - "it": "un cafè per ciclisti", - "zh_Hans": "自行车咖啡", - "zh_Hant": "單車咖啡廳", - "ru": "Велосипедное кафе", - "pt_BR": "uma café de bicicleta", - "pt": "uma café de bicicleta", - "da": "en cykelcafé", - "cs": "kavárna pro cyklisty", - "ca": "un cafè ciclista" - }, - "tags": [ - "amenity=pub", - "pub=cycling" - ] - } - ], - "mapRendering": [ - { - "icon": "pin:#684c2b;./assets/layers/bike_cafe/bike_cafe.svg", - "iconSize": "50,50", - "anchor": "bottom", - "location": [ - "point", - "centroid" - ] - }, - { - "color": "#694E2D", - "width": "2" - } - ], - "description": { - "en": "A bike café is a café geared towards cyclists, for example with services such as a pump, with lots of bicycle-related decoration, …", - "nl": "Een fietscafé is een café dat gericht is op fietsers, bijvoorbeeld omdat het een fietspomp heeft, fietsgerelateerde decoratie heeft enzovoorts.", - "de": "Ein Fahrradcafé ist ein Café, das auf Radfahrer ausgerichtet ist, zum Beispiel mit Dienstleistungen wie einer Pumpe, mit viel fahrradbezogener Dekoration, …", - "da": "En cykelcafé er en café rettet mod cyklister, for eksempel med tjenester som en pumpe, med masser af cykelrelateret dekoration, o.s.v", - "fr": "Un vélo café est un café à destination des cyclistes avec, par exemple, des services tels qu’une pompe, et de nombreuses décorations liées aux vélos, etc.", - "cs": "Cyklokavárna je kavárna zaměřená na cyklisty, například se službami, jako je pumpa, se spoustou výzdoby související s jízdními koly, …", - "ca": "Un cafè ciclista és un cafè enfocat a ciclistes, per exemple, amb serveis com una manxa, amb molta decoració relacionada amb el ciclisme, …", - "pt_BR": "Um café para ciclistas é um café direcionado aos ciclistas, por exemplo, com serviços como uma bomba de ar, muita decoração relacionada a bicicletas, …" - }, "deletion": true } diff --git a/assets/layers/bike_cleaning/bike_cleaning.json b/assets/layers/bike_cleaning/bike_cleaning.json index c200e2ea8..af9737757 100644 --- a/assets/layers/bike_cleaning/bike_cleaning.json +++ b/assets/layers/bike_cleaning/bike_cleaning.json @@ -15,6 +15,28 @@ "cs": "Služba mytí jízdních kol", "ca": "Servei de neteja de bicicletes" }, + "description": { + "en": "A layer showing facilities where one can clean their bike", + "nl": "Een laag die plaatsen toont waar je je fiets kunt wassen", + "de": "Eine Ebene mit Einrichtungen, in denen man sein Fahrrad reinigen kann", + "es": "Una capa que muestra instalaciones en las que uno puede limpiar su bici", + "da": "Et lag med faciliteter, hvor man kan rengøre sin cykel", + "fr": "Une couche affichant les lieux où l'on peut nettoyer son vélo", + "cs": "Vrstva zobrazující zařízení, kde si můžete umýt kolo", + "ca": "Una capa que mostra les instal·lacions on pots netejar la teva bicicleta", + "pt_BR": "Uma camada que mostra instalações onde é possível limpar a sua bicicleta" + }, + "source": { + "osmTags": { + "or": [ + "service:bicycle:cleaning=yes", + "service:bicycle:cleaning=diy", + "amenity=bicycle_wash", + "amenity=bike_wash" + ] + } + }, + "minzoom": 13, "title": { "render": { "en": "Bike cleaning service", @@ -51,17 +73,37 @@ } ] }, - "source": { - "osmTags": { - "or": [ - "service:bicycle:cleaning=yes", - "service:bicycle:cleaning=diy", - "amenity=bicycle_wash", - "amenity=bike_wash" + "pointRendering": [ + { + "iconBadges": [ + { + "if": { + "and": [ + "service:bicycle:cleaning~*", + "amenity!=bike_wash", + "amenity!=bicycle_wash" + ] + }, + "then": { + "render": "./assets/layers/bike_cleaning/bike_cleaning_icon.svg", + "roaming": true + } + } + ], + "iconSize": "50,50", + "location": [ + "point", + "centroid" + ], + "anchor": "bottom", + "marker": [ + { + "icon": "./assets/layers/bike_cleaning/bike_cleaning.svg" + } ] } - }, - "minzoom": 13, + ], + "lineRendering": [], "presets": [ { "title": { @@ -244,42 +286,5 @@ "allowMove": { "enableRelocation": false, "enableImproveAccuraccy": true - }, - "mapRendering": [ - { - "icon": "./assets/layers/bike_cleaning/bike_cleaning.svg", - "iconBadges": [ - { - "if": { - "and": [ - "service:bicycle:cleaning~*", - "amenity!=bike_wash", - "amenity!=bicycle_wash" - ] - }, - "then": { - "render": "./assets/layers/bike_cleaning/bike_cleaning_icon.svg", - "roaming": true - } - } - ], - "iconSize": "50,50", - "location": [ - "point", - "centroid" - ], - "anchor": "bottom" - } - ], - "description": { - "en": "A layer showing facilities where one can clean their bike", - "nl": "Een laag die plaatsen toont waar je je fiets kunt wassen", - "de": "Eine Ebene mit Einrichtungen, in denen man sein Fahrrad reinigen kann", - "es": "Una capa que muestra instalaciones en las que uno puede limpiar su bici", - "da": "Et lag med faciliteter, hvor man kan rengøre sin cykel", - "fr": "Une couche affichant les lieux où l'on peut nettoyer son vélo", - "cs": "Vrstva zobrazující zařízení, kde si můžete umýt kolo", - "ca": "Una capa que mostra les instal·lacions on pots netejar la teva bicicleta", - "pt_BR": "Uma camada que mostra instalações onde é possível limpar a sua bicicleta" } } diff --git a/assets/layers/bike_parking/bike_parking.json b/assets/layers/bike_parking/bike_parking.json index c07c3e5c0..47f32b3d3 100644 --- a/assets/layers/bike_parking/bike_parking.json +++ b/assets/layers/bike_parking/bike_parking.json @@ -18,7 +18,18 @@ "da": "Cykelparkering", "cs": "Parkování kol" }, - "minzoom": 17, + "description": { + "en": "A layer showing where you can park your bike", + "nl": "Een laag die toont waar je je fiets kunt parkeren", + "de": "Eine Ebene, die anzeigt, wo Sie Ihr Fahrrad abstellen können", + "es": "Una capa que muestra donde puedes aparcar tu bici", + "da": "Et lag, der viser, hvor man kan parkere sin cykel", + "fr": "Une couche montrant où stationner son vélo", + "cs": "Vrstva ukazující, kde můžete zaparkovat kolo", + "ca": "Una capa que mostra on pots aparcar la teva bicicleta", + "it": "Un livello che mostra dove puoi parcheggiare la tua bicicletta", + "pt_BR": "Uma camada mostrado onde você pode estacionar sua bicicleta" + }, "source": { "osmTags": { "and": [ @@ -26,6 +37,52 @@ ] } }, + "minzoom": 17, + "title": { + "render": { + "en": "Bike parking", + "nl": "Fietsparking", + "fr": "Parking à vélo", + "gl": "Aparcadoiro de bicicletas", + "de": "Fahrrad-Parkplätze", + "hu": "Kerékpártároló", + "it": "Parcheggio bici", + "zh_Hant": "單車停車場", + "ru": "Велосипедная парковка", + "pl": "Parking dla rowerów", + "pt_BR": "Estacionamento de bicicletas", + "pt": "Estacionamento de bicicletas", + "ca": "Aparcament per a bicicletes", + "es": "Aparcamiento de bicis", + "da": "Cykelparkering", + "cs": "Parkování kol" + } + }, + "pointRendering": [ + { + "iconSize": "40,40", + "location": [ + "point", + "centroid" + ], + "anchor": "bottom", + "marker": [ + { + "icon": "pin", + "color": "#5473de" + }, + { + "icon": "./assets/layers/bike_parking/parking.svg" + } + ] + } + ], + "lineRendering": [ + { + "color": "#00f", + "width": "1" + } + ], "presets": [ { "title": { @@ -51,26 +108,6 @@ ] } ], - "title": { - "render": { - "en": "Bike parking", - "nl": "Fietsparking", - "fr": "Parking à vélo", - "gl": "Aparcadoiro de bicicletas", - "de": "Fahrrad-Parkplätze", - "hu": "Kerékpártároló", - "it": "Parcheggio bici", - "zh_Hant": "單車停車場", - "ru": "Велосипедная парковка", - "pl": "Parking dla rowerów", - "pt_BR": "Estacionamento de bicicletas", - "pt": "Estacionamento de bicicletas", - "ca": "Aparcament per a bicicletes", - "es": "Aparcamiento de bicis", - "da": "Cykelparkering", - "cs": "Parkování kol" - } - }, "tagRenderings": [ "images", { @@ -711,32 +748,5 @@ "allowMove": { "enableRelocation": false, "enableImproveAccuracy": true - }, - "mapRendering": [ - { - "icon": "pin:#5473de;./assets/layers/bike_parking/parking.svg", - "iconSize": "40,40", - "location": [ - "point", - "centroid" - ], - "anchor": "bottom" - }, - { - "color": "#00f", - "width": "1" - } - ], - "description": { - "en": "A layer showing where you can park your bike", - "nl": "Een laag die toont waar je je fiets kunt parkeren", - "de": "Eine Ebene, die anzeigt, wo Sie Ihr Fahrrad abstellen können", - "es": "Una capa que muestra donde puedes aparcar tu bici", - "da": "Et lag, der viser, hvor man kan parkere sin cykel", - "fr": "Une couche montrant où stationner son vélo", - "cs": "Vrstva ukazující, kde můžete zaparkovat kolo", - "ca": "Una capa que mostra on pots aparcar la teva bicicleta", - "it": "Un livello che mostra dove puoi parcheggiare la tua bicicletta", - "pt_BR": "Uma camada mostrado onde você pode estacionar sua bicicleta" } } diff --git a/assets/layers/bike_repair_station/bike_repair_station.json b/assets/layers/bike_repair_station/bike_repair_station.json index 74fbe88d5..52c89c353 100644 --- a/assets/layers/bike_repair_station/bike_repair_station.json +++ b/assets/layers/bike_repair_station/bike_repair_station.json @@ -14,7 +14,17 @@ "cs": "Vzduchový kompresor a opravy jízdních kol", "ca": "Manxa i reparació de bicicletes" }, - "minzoom": 13, + "description": { + "en": "A layer showing bicycle pumps and bicycle repair tool stands", + "nl": "Deze laag toont fietspompen en herstelpunten voor fietsen", + "de": "Eine Ebene mit Fahrradpumpen und Werkzeugständern für die Fahrradreparatur", + "es": "Una capa que muestra bombas de bicicletas y puestos de herramientas de reparación de bicicletas", + "da": "Et lag med cykelpumper og cykelreværktøjsstativer", + "fr": "Une couche montrant les pompes à vélo et les centres de réparation", + "cs": "Vrstva zobrazující vzduchové kompresory na jízdní kola a stojany na nářadí pro opravu jízdních kol", + "ca": "Una capa que mostra bombes de bicicletes i suports d'eines de reparació de bicicletes", + "pt_BR": "Uma camada que mostra bombas de ar para bicicletas e suportes com ferramentas de reparo para bicicletas" + }, "source": { "osmTags": { "and": [ @@ -22,6 +32,7 @@ ] } }, + "minzoom": 13, "title": { "render": { "en": "Bike station (pump & repair)", @@ -170,6 +181,243 @@ }, "icons.defaults" ], + "pointRendering": [ + { + "marker": [ + { + "icon": "pin", + "color": { + "render": "#88d32c", + "mappings": [ + { + "if": { + "and": [ + "service:bicycle:pump=yes", + "service:bicycle:tools=yes", + "service:bicycle:pump:operational_status=broken" + ] + }, + "then": "#88d32c" + }, + { + "if": { + "and": [ + "service:bicycle:pump=yes", + "service:bicycle:tools=yes" + ] + }, + "then": "#30abf0" + }, + { + "if": { + "and": [ + "service:bicycle:pump:operational_status=broken", + "service:bicycle:tools=no" + ] + }, + "then": "black" + }, + { + "if": { + "and": [ + "service:bicycle:pump=yes", + { + "or": [ + "service:bicycle:tools=no", + "service:bicycle:tools=" + ] + } + ] + }, + "then": "#e1783a" + } + ] + } + }, + { + "icon": { + "render": "./assets/layers/bike_repair_station/repair_station.svg", + "mappings": [ + { + "if": { + "and": [ + "service:bicycle:pump=yes", + "service:bicycle:tools=yes", + "service:bicycle:pump:operational_status=broken" + ] + }, + "then": "./assets/layers/bike_repair_station/repair_station_broken_pump.svg" + }, + { + "if": { + "and": [ + "service:bicycle:pump=yes", + "service:bicycle:tools=yes" + ] + }, + "then": "./assets/layers/bike_repair_station/repair_station_pump.svg" + }, + { + "if": { + "and": [ + "service:bicycle:pump:operational_status=broken", + "service:bicycle:tools=no" + ] + }, + "then": "./assets/layers/bike_repair_station/broken_pump.svg" + }, + { + "if": { + "and": [ + "service:bicycle:pump=yes", + { + "or": [ + "service:bicycle:tools=no", + "service:bicycle:tools=" + ] + } + ] + }, + "then": "./assets/layers/bike_repair_station/pump.svg" + } + ] + } + } + ], + "iconBadges": [ + { + "if": "operator=De Fietsambassade Gent", + "then": "./assets/themes/cyclofix/fietsambassade_gent_logo_small.svg" + }, + { + "if": { + "or": [ + "access=no", + "access=private" + ] + }, + "then": "invalid" + } + ], + "iconSize": "50,50", + "location": [ + "point", + "centroid" + ], + "anchor": "bottom" + } + ], + "lineRendering": [], + "presets": [ + { + "title": { + "en": "a bike pump", + "nl": "een fietspomp", + "fr": "une pompe à vélo", + "gl": "bomba de ar", + "de": "eine Fahrradpumpe", + "it": "una pompa per bici", + "ru": "bелосипедный насос", + "fi": "pyöräpumppu", + "pl": "pompka do roweru", + "pt_BR": "uma bomba de bicicleta", + "es": "una bomba de bicicletas", + "da": "en cykelpumpe", + "cs": "pumpa na kolo", + "ca": "una manxa per a bicicletes" + }, + "tags": [ + "amenity=bicycle_repair_station", + "service:bicycle:tools=no", + "service:bicycle:pump=yes" + ], + "description": { + "en": "A device to inflate your tires on a fixed location in the public space.", + "nl": "Een fietspomp in de publieke ruimte zonder extra gereedschap. De fietspomp in je kelder telt dus niet.", + "it": "Un dispositivo per gonfiare le proprie gomme in un luogo fisso pubblicamente accessibile.", + "fr": "Un dispositif pour gonfler vos pneus sur un emplacement fixe dans l'espace public.", + "de": "Ein Gerät zum Aufpumpen von Reifen an einem festen Standort im öffentlichen Raum.", + "pl": "Urządzenie do pompowania opon w stałym miejscu w przestrzeni publicznej.", + "pt_BR": "Um dispositivo para encher seus pneus em um local fixa no espaço público.", + "pt": "Um aparelho para encher os seus pneus num local fixa no espaço público.", + "es": "Un dispositivo para inflar tus ruedas en una posición fija en el espacio público.", + "da": "En anordning til at fylde dine dæk op på et fast sted i det offentlige rum.", + "cs": "Zařízení pro huštění pneumatik na pevném místě na veřejném místě.", + "ca": "Un dispositiu per a unflar les teues rodes en una posició fixa a l'espai públic." + }, + "exampleImages": [ + "./assets/layers/bike_repair_station/pump_example_round.jpg", + "./assets/layers/bike_repair_station/pump_example.png", + "./assets/layers/bike_repair_station/pump_example_manual.jpg" + ] + }, + { + "title": { + "en": "a bike repair station and pump", + "nl": "een herstelpunt en pomp", + "fr": "une point de réparation vélo avec pompe", + "gl": "estación de arranxo de bicicletas con bomba de ar", + "de": "eine Fahrrad-Reparaturstation mit Pumpe", + "it": "una stazione di riparazione bici e pompa", + "pl": "stacja naprawy rowerów i pompka", + "es": "En estación de reparación de bicicletas y bomba", + "da": "en cykelreparationsstation og pumpe", + "cs": "opravna kol a vzduchový kompresor", + "ca": "una estació de reparació de bicicletes i una bomba" + }, + "tags": [ + "amenity=bicycle_repair_station", + "service:bicycle:tools=yes", + "service:bicycle:pump=yes" + ], + "description": { + "en": "A bicycle pump and tools to repair your bike in the public space. The tools are often secured with chains against theft.", + "nl": "Een fietspomp en gereedschap om je fiets te herstellen in de publieke ruimte. Deze zijn op een vastgemaakt, bijvoorbeeld aan een paal.", + "fr": "Un dispositif avec des outils pour réparer votre vélo combiné à une pompe a un emplacement fixe. Les outils sont souvent attachés par une chaîne pour empêcher le vol.", + "it": "Un dispositivo con attrezzi per riparare la tua bici e una pompa in un luogo fisso. Gli attrezzi sono spesso attaccati ad una catena per prevenire il furto.", + "de": "Ein Gerät mit Werkzeugen zur Reparatur von Fahrrädern kombiniert mit einer Pumpe an einem festen Standort. Die Werkzeuge sind oft mit Ketten gegen Diebstahl gesichert.", + "es": "Una bomba de bicicletas y herramientas para reparar tu bicicleta en el espacio público. Las herramientas habitualmente están aseguradas con cadenas contra el robo.", + "da": "En cykelpumpe og værktøj til at reparere din cykel i det offentlige rum. Værktøjet er ofte sikret med kæder mod tyveri.", + "cs": "Vzduchový kompresor na kolo a nářadí na opravu kola na veřejném místě. Nářadí je často zajištěno řetězy proti krádeži.", + "ca": "Una bomba per a bicicletes i eines per a reparar la teva bicicleta a l'espai públic. Les eines sovint estan assegurades amb cadenes contra robatoris.", + "pt_BR": "Uma bomba de ar para bicicletas e ferramentas para reparar sua bicicleta em espaço público. As ferramentas geralmente são protegidas com correntes contra furtos." + }, + "exampleImages": [ + "./assets/layers/bike_repair_station/repair_station_example_2.jpg", + "./assets/layers/bike_repair_station/repair_station_example_3.jpg" + ] + }, + { + "title": { + "en": "a bike repair station without pump", + "nl": "een herstelpunt zonder pomp", + "fr": "une point de réparation vélo sans pompe", + "gl": "estación de arranxo de bicicletas sin bomba de ar", + "de": "eine Fahrrad-Reparaturstation ohne Pumpe", + "it": "una stazione di riparazione bici senza pompa", + "ru": "Станция обслуживания велосипедов без накачки (насоса)", + "es": "una estación de reparación de bicicletas sin bomba", + "da": "en cykelreparationsstation uden pumpe", + "cs": "opravna kol bez vzduchového kompresoru", + "ca": "una estació de reparació de bicicletes sense bomba" + }, + "tags": [ + "amenity=bicycle_repair_station", + "service:bicycle:tools=yes", + "service:bicycle:pump=no" + ], + "description": { + "en": "Tools to repair your bike in the public space (without pump). The tools are secured against theft.", + "nl": "Gereedschap om je fiets te herstellen in de publieke ruimte (zonder pomp). Deze zijn op een vastgemaakt, bijvoorbeeld aan een paal.", + "de": "Werkzeug, um Ihr Fahrrad im öffentlichen Raum zu reparieren (ohne Pumpe). Die Werkzeuge sind gegen Diebstahl gesichert.", + "es": "Herramientas para reparar tu bici en el espacio público (sin bomba).Las herramientas están aseguradas contra el robo.", + "da": "Værktøj til at reparere din cykel i det offentlige rum (uden pumpe). Værktøjet er sikret mod tyveri.", + "fr": "Des outils pour réparer les vélos dans l’espace public (sans pompe). Les outils sont sécurisés contre le vol.", + "cs": "nářadí pro opravu kola na veřejném místě (bez vzduchového kompresoru) Nářadí je zabezpečeno proti krádeži.", + "ca": "Eines per reparar la teva bicicleta a l'espai públic (sense bomba). Les eines estan assegurades contra robatoris." + } + } + ], "tagRenderings": [ "images", { @@ -865,116 +1113,6 @@ }, "level" ], - "presets": [ - { - "title": { - "en": "a bike pump", - "nl": "een fietspomp", - "fr": "une pompe à vélo", - "gl": "bomba de ar", - "de": "eine Fahrradpumpe", - "it": "una pompa per bici", - "ru": "bелосипедный насос", - "fi": "pyöräpumppu", - "pl": "pompka do roweru", - "pt_BR": "uma bomba de bicicleta", - "es": "una bomba de bicicletas", - "da": "en cykelpumpe", - "cs": "pumpa na kolo", - "ca": "una manxa per a bicicletes" - }, - "tags": [ - "amenity=bicycle_repair_station", - "service:bicycle:tools=no", - "service:bicycle:pump=yes" - ], - "description": { - "en": "A device to inflate your tires on a fixed location in the public space.", - "nl": "Een fietspomp in de publieke ruimte zonder extra gereedschap. De fietspomp in je kelder telt dus niet.", - "it": "Un dispositivo per gonfiare le proprie gomme in un luogo fisso pubblicamente accessibile.", - "fr": "Un dispositif pour gonfler vos pneus sur un emplacement fixe dans l'espace public.", - "de": "Ein Gerät zum Aufpumpen von Reifen an einem festen Standort im öffentlichen Raum.", - "pl": "Urządzenie do pompowania opon w stałym miejscu w przestrzeni publicznej.", - "pt_BR": "Um dispositivo para encher seus pneus em um local fixa no espaço público.", - "pt": "Um aparelho para encher os seus pneus num local fixa no espaço público.", - "es": "Un dispositivo para inflar tus ruedas en una posición fija en el espacio público.", - "da": "En anordning til at fylde dine dæk op på et fast sted i det offentlige rum.", - "cs": "Zařízení pro huštění pneumatik na pevném místě na veřejném místě.", - "ca": "Un dispositiu per a unflar les teues rodes en una posició fixa a l'espai públic." - }, - "exampleImages": [ - "./assets/layers/bike_repair_station/pump_example_round.jpg", - "./assets/layers/bike_repair_station/pump_example.png", - "./assets/layers/bike_repair_station/pump_example_manual.jpg" - ] - }, - { - "title": { - "en": "a bike repair station and pump", - "nl": "een herstelpunt en pomp", - "fr": "une point de réparation vélo avec pompe", - "gl": "estación de arranxo de bicicletas con bomba de ar", - "de": "eine Fahrrad-Reparaturstation mit Pumpe", - "it": "una stazione di riparazione bici e pompa", - "pl": "stacja naprawy rowerów i pompka", - "es": "En estación de reparación de bicicletas y bomba", - "da": "en cykelreparationsstation og pumpe", - "cs": "opravna kol a vzduchový kompresor", - "ca": "una estació de reparació de bicicletes i una bomba" - }, - "tags": [ - "amenity=bicycle_repair_station", - "service:bicycle:tools=yes", - "service:bicycle:pump=yes" - ], - "description": { - "en": "A bicycle pump and tools to repair your bike in the public space. The tools are often secured with chains against theft.", - "nl": "Een fietspomp en gereedschap om je fiets te herstellen in de publieke ruimte. Deze zijn op een vastgemaakt, bijvoorbeeld aan een paal.", - "fr": "Un dispositif avec des outils pour réparer votre vélo combiné à une pompe a un emplacement fixe. Les outils sont souvent attachés par une chaîne pour empêcher le vol.", - "it": "Un dispositivo con attrezzi per riparare la tua bici e una pompa in un luogo fisso. Gli attrezzi sono spesso attaccati ad una catena per prevenire il furto.", - "de": "Ein Gerät mit Werkzeugen zur Reparatur von Fahrrädern kombiniert mit einer Pumpe an einem festen Standort. Die Werkzeuge sind oft mit Ketten gegen Diebstahl gesichert.", - "es": "Una bomba de bicicletas y herramientas para reparar tu bicicleta en el espacio público. Las herramientas habitualmente están aseguradas con cadenas contra el robo.", - "da": "En cykelpumpe og værktøj til at reparere din cykel i det offentlige rum. Værktøjet er ofte sikret med kæder mod tyveri.", - "cs": "Vzduchový kompresor na kolo a nářadí na opravu kola na veřejném místě. Nářadí je často zajištěno řetězy proti krádeži.", - "ca": "Una bomba per a bicicletes i eines per a reparar la teva bicicleta a l'espai públic. Les eines sovint estan assegurades amb cadenes contra robatoris.", - "pt_BR": "Uma bomba de ar para bicicletas e ferramentas para reparar sua bicicleta em espaço público. As ferramentas geralmente são protegidas com correntes contra furtos." - }, - "exampleImages": [ - "./assets/layers/bike_repair_station/repair_station_example_2.jpg", - "./assets/layers/bike_repair_station/repair_station_example_3.jpg" - ] - }, - { - "title": { - "en": "a bike repair station without pump", - "nl": "een herstelpunt zonder pomp", - "fr": "une point de réparation vélo sans pompe", - "gl": "estación de arranxo de bicicletas sin bomba de ar", - "de": "eine Fahrrad-Reparaturstation ohne Pumpe", - "it": "una stazione di riparazione bici senza pompa", - "ru": "Станция обслуживания велосипедов без накачки (насоса)", - "es": "una estación de reparación de bicicletas sin bomba", - "da": "en cykelreparationsstation uden pumpe", - "cs": "opravna kol bez vzduchového kompresoru", - "ca": "una estació de reparació de bicicletes sense bomba" - }, - "tags": [ - "amenity=bicycle_repair_station", - "service:bicycle:tools=yes", - "service:bicycle:pump=no" - ], - "description": { - "en": "Tools to repair your bike in the public space (without pump). The tools are secured against theft.", - "nl": "Gereedschap om je fiets te herstellen in de publieke ruimte (zonder pomp). Deze zijn op een vastgemaakt, bijvoorbeeld aan een paal.", - "de": "Werkzeug, um Ihr Fahrrad im öffentlichen Raum zu reparieren (ohne Pumpe). Die Werkzeuge sind gegen Diebstahl gesichert.", - "es": "Herramientas para reparar tu bici en el espacio público (sin bomba).Las herramientas están aseguradas contra el robo.", - "da": "Værktøj til at reparere din cykel i det offentlige rum (uden pumpe). Værktøjet er sikret mod tyveri.", - "fr": "Des outils pour réparer les vélos dans l’espace public (sans pompe). Les outils sont sécurisés contre le vol.", - "cs": "nářadí pro opravu kola na veřejném místě (bez vzduchového kompresoru) Nářadí je zabezpečeno proti krádeži.", - "ca": "Eines per reparar la teva bicicleta a l'espai públic (sense bomba). Les eines estan assegurades contra robatoris." - } - } - ], "deletion": { "softDeletionTags": { "and": [ @@ -987,88 +1125,5 @@ "allowMove": { "enableRelocation": false, "enableImproveAccuraccy": true - }, - "mapRendering": [ - { - "icon": { - "render": "pin:#88d32c;./assets/layers/bike_repair_station/repair_station.svg", - "mappings": [ - { - "if": { - "and": [ - "service:bicycle:pump=yes", - "service:bicycle:tools=yes", - "service:bicycle:pump:operational_status=broken" - ] - }, - "then": "pin:#88d32c;./assets/layers/bike_repair_station/repair_station_broken_pump.svg" - }, - { - "if": { - "and": [ - "service:bicycle:pump=yes", - "service:bicycle:tools=yes" - ] - }, - "then": "pin:#30abf0;./assets/layers/bike_repair_station/repair_station_pump.svg" - }, - { - "if": { - "and": [ - "service:bicycle:pump:operational_status=broken", - "service:bicycle:tools=no" - ] - }, - "then": "pin:black;./assets/layers/bike_repair_station/broken_pump.svg" - }, - { - "if": { - "and": [ - "service:bicycle:pump=yes", - { - "or": [ - "service:bicycle:tools=no", - "service:bicycle:tools=" - ] - } - ] - }, - "then": "pin:#e1783a;./assets/layers/bike_repair_station/pump.svg" - } - ] - }, - "iconBadges": [ - { - "if": "operator=De Fietsambassade Gent", - "then": "./assets/themes/cyclofix/fietsambassade_gent_logo_small.svg" - }, - { - "if": { - "or": [ - "access=no", - "access=private" - ] - }, - "then": "invalid" - } - ], - "iconSize": "50,50", - "location": [ - "point", - "centroid" - ], - "anchor": "bottom" - } - ], - "description": { - "en": "A layer showing bicycle pumps and bicycle repair tool stands", - "nl": "Deze laag toont fietspompen en herstelpunten voor fietsen", - "de": "Eine Ebene mit Fahrradpumpen und Werkzeugständern für die Fahrradreparatur", - "es": "Una capa que muestra bombas de bicicletas y puestos de herramientas de reparación de bicicletas", - "da": "Et lag med cykelpumper og cykelreværktøjsstativer", - "fr": "Une couche montrant les pompes à vélo et les centres de réparation", - "cs": "Vrstva zobrazující vzduchové kompresory na jízdní kola a stojany na nářadí pro opravu jízdních kol", - "ca": "Una capa que mostra bombes de bicicletes i suports d'eines de reparació de bicicletes", - "pt_BR": "Uma camada que mostra bombas de ar para bicicletas e suportes com ferramentas de reparo para bicicletas" } } diff --git a/assets/layers/bike_shop/bike_shop.json b/assets/layers/bike_shop/bike_shop.json index cf789a15b..340c48722 100644 --- a/assets/layers/bike_shop/bike_shop.json +++ b/assets/layers/bike_shop/bike_shop.json @@ -15,8 +15,20 @@ "da": "Cykelreparation/butik", "cs": "Opravna/obchod s jízdními koly" }, - "minzoom": 13, - "allowMove": true, + "description": { + "en": "A shop specifically selling bicycles or related items", + "nl": "Een winkel die hoofdzakelijk fietsen en fietstoebehoren verkoopt", + "fr": "Un magasin vendant spécifiquement des vélos ou des objets en lien", + "it": "Un negozio che vende specificatamente biciclette o articoli similari", + "ru": "Магазин, специализирующийся на продаже велосипедов или сопутствующих товаров", + "pt_BR": "Uma loja que vende especificamente bicicletas ou itens relacionados", + "de": "Ein Geschäft, das speziell Fahrräder oder verwandte Artikel verkauft", + "pt": "Uma loja que vende especificamente bicicletas ou itens relacionados", + "es": "Una tiene que vende específicamente bicis u objetos relacionados", + "da": "En butik, der specifikt sælger cykler eller relaterede varer", + "ca": "Una botiga que ven específicament bicicletes o articles relacionats", + "cs": "Obchod zaměřený na prodej jízdních kol nebo souvisejících předmětů" + }, "source": { "osmTags": { "#": "We select all bicycle shops, sports shops (but we try to weed out non-bicycle related shops), and any shop with a bicycle related tag", @@ -41,6 +53,7 @@ ] } }, + "minzoom": 13, "title": { "render": { "en": "Bike repair/shop", @@ -214,20 +227,97 @@ }, "icons.defaults" ], - "description": { - "en": "A shop specifically selling bicycles or related items", - "nl": "Een winkel die hoofdzakelijk fietsen en fietstoebehoren verkoopt", - "fr": "Un magasin vendant spécifiquement des vélos ou des objets en lien", - "it": "Un negozio che vende specificatamente biciclette o articoli similari", - "ru": "Магазин, специализирующийся на продаже велосипедов или сопутствующих товаров", - "pt_BR": "Uma loja que vende especificamente bicicletas ou itens relacionados", - "de": "Ein Geschäft, das speziell Fahrräder oder verwandte Artikel verkauft", - "pt": "Uma loja que vende especificamente bicicletas ou itens relacionados", - "es": "Una tiene que vende específicamente bicis u objetos relacionados", - "da": "En butik, der specifikt sælger cykler eller relaterede varer", - "ca": "Una botiga que ven específicament bicicletes o articles relacionats", - "cs": "Obchod zaměřený na prodej jízdních kol nebo souvisejících předmětů" - }, + "pointRendering": [ + { + "marker": [ + { + "icon": { + "render": "pin", + "mappings": [ + { + "if": "operator=De Fietsambassade Gent", + "then": null + } + ] + }, + "color": { + "render": "#f04c4c", + "mappings": [ + { + "if": "operator=De Fietsambassade Gent", + "then": null + }, + { + "if": "service:bicycle:retail=yes", + "then": "#353d57" + } + ] + } + }, + { + "icon": { + "render": "./assets/layers/bike_shop/repair_shop.svg", + "mappings": [ + { + "if": "operator=De Fietsambassade Gent", + "then": "./assets/themes/cyclofix/fietsambassade_gent_logo_small.svg" + }, + { + "if": "service:bicycle:retail=yes", + "then": "./assets/layers/bike_shop/shop.svg" + } + ] + } + } + ], + "iconBadges": [ + { + "if": "opening_hours~*", + "then": "icons.isOpen" + }, + { + "if": "service:bicycle:pump=yes", + "then": "circle:#e2783d;./assets/layers/bike_repair_station/pump.svg" + }, + { + "if": "service:bicycle:cleaning~*", + "then": "./assets/layers/bike_cleaning/bike_cleaning_icon.svg" + } + ], + "iconSize": "50,50", + "anchor": "bottom", + "location": [ + "point", + "centroid" + ] + } + ], + "lineRendering": [ + { + "color": "#c00", + "width": "1" + } + ], + "presets": [ + { + "title": { + "en": "a bike repair/shop", + "nl": "een fietszaak", + "fr": "une magasin et réparateur de vélo", + "gl": "Tenda/arranxo de bicicletas", + "de": "eine Fahrradwerkstatt bzw. ein Fahrradgeschäft", + "it": "una negozio/riparatore di bici", + "ru": "Обслуживание велосипедов/магазин", + "es": "un taller/tienda de bicis", + "da": "en cykelværksted/butik", + "ca": "una botiga/reparació de bicicletes", + "cs": "opravna/obchod s jízdními koly" + }, + "tags": [ + "shop=bicycle" + ] + } + ], "tagRenderings": [ "images", { @@ -797,67 +887,6 @@ "bike_cleaning.bike_cleaning-service:bicycle:cleaning:charge", "description" ], - "presets": [ - { - "title": { - "en": "a bike repair/shop", - "nl": "een fietszaak", - "fr": "une magasin et réparateur de vélo", - "gl": "Tenda/arranxo de bicicletas", - "de": "eine Fahrradwerkstatt bzw. ein Fahrradgeschäft", - "it": "una negozio/riparatore di bici", - "ru": "Обслуживание велосипедов/магазин", - "es": "un taller/tienda de bicis", - "da": "en cykelværksted/butik", - "ca": "una botiga/reparació de bicicletes", - "cs": "opravna/obchod s jízdními koly" - }, - "tags": [ - "shop=bicycle" - ] - } - ], - "mapRendering": [ - { - "icon": { - "render": "pin:#f04c4c;./assets/layers/bike_shop/repair_shop.svg", - "mappings": [ - { - "if": "operator=De Fietsambassade Gent", - "then": "./assets/themes/cyclofix/fietsambassade_gent_logo_small.svg" - }, - { - "if": "service:bicycle:retail=yes", - "then": "pin:#353d57;./assets/layers/bike_shop/shop.svg" - } - ] - }, - "iconBadges": [ - { - "if": "opening_hours~*", - "then": "icons.isOpen" - }, - { - "if": "service:bicycle:pump=yes", - "then": "circle:#e2783d;./assets/layers/bike_repair_station/pump.svg" - }, - { - "if": "service:bicycle:cleaning~*", - "then": "./assets/layers/bike_cleaning/bike_cleaning_icon.svg" - } - ], - "iconSize": "50,50", - "anchor": "bottom", - "location": [ - "point", - "centroid" - ] - }, - { - "color": "#c00", - "width": "1" - } - ], "filter": [ "open_now", { @@ -905,5 +934,6 @@ ] } ], - "deletion": true + "deletion": true, + "allowMove": true } diff --git a/assets/layers/bike_themed_object/bike_themed_object.json b/assets/layers/bike_themed_object/bike_themed_object.json index 4413001d9..d6e7472fe 100644 --- a/assets/layers/bike_themed_object/bike_themed_object.json +++ b/assets/layers/bike_themed_object/bike_themed_object.json @@ -12,7 +12,16 @@ "cs": "Objekt související s jízdním kolem", "pl": "Obiekt związany z rowerami" }, - "minzoom": 13, + "description": { + "en": "A layer with bike-themed objects but who don't match any other layer", + "nl": "Een laag met fietsgerelateerde diensten, die in geen enkele andere laag konden ondergebracht worden", + "de": "Eine Ebene mit Objekten zum Thema Fahrrad, die zu keiner anderen Ebene passen", + "es": "Una capa con los objetos relacionados con bicis pero que no coinciden con ninguna otra capa", + "fr": "Une couche sur le thème des vélos mais qui ne correspondent à aucune autre couche", + "da": "Et lag med objekter med cykeltema, men som ikke matcher noget andet lag", + "ca": "Una capa amb els objectes relacionats amb bicis però que no coinxideixen amb cap altra capa", + "cs": "Vrstva s objekty s tématikou jízdních kol, které však neodpovídají žádné jiné vrstvě" + }, "source": { "osmTags": { "or": [ @@ -28,6 +37,7 @@ ] } }, + "minzoom": 13, "title": { "render": { "en": "Bike-related object", @@ -63,6 +73,28 @@ } ] }, + "pointRendering": [ + { + "iconSize": "50,50", + "location": [ + "point", + "centroid" + ], + "anchor": "bottom", + "marker": [ + { + "icon": "./assets/layers/bike_themed_object/other_services.svg" + } + ] + } + ], + "lineRendering": [ + { + "color": "#AB76D5", + "width": "2" + } + ], + "presets": [], "tagRenderings": [ "images", "description", @@ -70,31 +102,5 @@ "email", "phone", "opening_hours" - ], - "presets": [], - "mapRendering": [ - { - "icon": "./assets/layers/bike_themed_object/other_services.svg", - "iconSize": "50,50", - "location": [ - "point", - "centroid" - ], - "anchor": "bottom" - }, - { - "color": "#AB76D5", - "width": "2" - } - ], - "description": { - "en": "A layer with bike-themed objects but who don't match any other layer", - "nl": "Een laag met fietsgerelateerde diensten, die in geen enkele andere laag konden ondergebracht worden", - "de": "Eine Ebene mit Objekten zum Thema Fahrrad, die zu keiner anderen Ebene passen", - "es": "Una capa con los objetos relacionados con bicis pero que no coinciden con ninguna otra capa", - "fr": "Une couche sur le thème des vélos mais qui ne correspondent à aucune autre couche", - "da": "Et lag med objekter med cykeltema, men som ikke matcher noget andet lag", - "ca": "Una capa amb els objectes relacionats amb bicis però que no coinxideixen amb cap altra capa", - "cs": "Vrstva s objekty s tématikou jízdních kol, které však neodpovídají žádné jiné vrstvě" - } + ] } diff --git a/assets/layers/binocular/binocular.json b/assets/layers/binocular/binocular.json index 117729d70..574298c92 100644 --- a/assets/layers/binocular/binocular.json +++ b/assets/layers/binocular/binocular.json @@ -13,6 +13,26 @@ "cs": "Dalekohledy", "eu": "Prismatikoak" }, + "description": { + "en": "Binoculars", + "nl": "Verrekijkers", + "de": "Ferngläser", + "ru": "Бинокли", + "ca": "Prismàtics", + "da": "Kikkerter", + "es": "Prismáticos", + "fr": "Jumelles", + "pa_PK": "بائینوکولر", + "cs": "Dalekohledy", + "eu": "Prismatikoak" + }, + "source": { + "osmTags": { + "and": [ + "amenity=binoculars" + ] + } + }, "minzoom": 0, "title": { "render": { @@ -29,19 +49,58 @@ "cs": "Dalekohledy" } }, - "description": { - "en": "Binoculars", - "nl": "Verrekijkers", - "de": "Ferngläser", - "ru": "Бинокли", - "ca": "Prismàtics", - "da": "Kikkerter", - "es": "Prismáticos", - "fr": "Jumelles", - "pa_PK": "بائینوکولر", - "cs": "Dalekohledy", - "eu": "Prismatikoak" - }, + "pointRendering": [ + { + "iconSize": "40,40", + "location": [ + "point" + ], + "anchor": "center", + "marker": [ + { + "icon": "circle", + "color": "white" + }, + { + "icon": "./assets/layers/binocular/telescope.svg" + } + ] + } + ], + "lineRendering": [ + { + "color": "#00f", + "width": "8" + } + ], + "presets": [ + { + "tags": [ + "amenity=binoculars" + ], + "title": { + "en": "a binocular", + "nl": "een verrekijker", + "de": "ein Fernglas", + "ru": "бинокль", + "ca": "uns prismàtics", + "da": "en kikkert", + "es": "unos prismáticos", + "fr": "des jumelles", + "cs": "dalekohled" + }, + "description": { + "en": "A telescope or pair of binoculars mounted on a pole, available to the public to look around. ", + "nl": "Een telescoop of verrekijker die op een vaste plaats gemonteerd staat waar iedereen door mag kijken. ", + "de": "Ein fest installiertes Teleskop oder Fernglas, für die öffentliche Nutzung. ", + "fr": "Une longue-vue ou une paire de jumelles montée sur un poteau, disponible au public pour scruter les environs. ", + "da": "Et teleskop eller en kikkert monteret på en stang, som offentligheden kan se sig omkring med. ", + "es": "Un telescopio o unos prismáticos montados en un poste, disponible para que el público mire alrededor. ", + "ca": "Un telescopi o un parell de prismàtics muntats en un pal, a disposició del públic per mirar al seu voltant. ", + "cs": "Jednooký teleskop nebo dalekohled umístěný na stožáru, který je k dispozici veřejnosti k prohlídce. " + } + } + ], "tagRenderings": [ "images", { @@ -121,41 +180,6 @@ "id": "binocular-direction" } ], - "presets": [ - { - "tags": [ - "amenity=binoculars" - ], - "title": { - "en": "a binocular", - "nl": "een verrekijker", - "de": "ein Fernglas", - "ru": "бинокль", - "ca": "uns prismàtics", - "da": "en kikkert", - "es": "unos prismáticos", - "fr": "des jumelles", - "cs": "dalekohled" - }, - "description": { - "en": "A telescope or pair of binoculars mounted on a pole, available to the public to look around. ", - "nl": "Een telescoop of verrekijker die op een vaste plaats gemonteerd staat waar iedereen door mag kijken. ", - "de": "Ein fest installiertes Teleskop oder Fernglas, für die öffentliche Nutzung. ", - "fr": "Une longue-vue ou une paire de jumelles montée sur un poteau, disponible au public pour scruter les environs. ", - "da": "Et teleskop eller en kikkert monteret på en stang, som offentligheden kan se sig omkring med. ", - "es": "Un telescopio o unos prismáticos montados en un poste, disponible para que el público mire alrededor. ", - "ca": "Un telescopi o un parell de prismàtics muntats en un pal, a disposició del públic per mirar al seu voltant. ", - "cs": "Jednooký teleskop nebo dalekohled umístěný na stožáru, který je k dispozici veřejnosti k prohlídce. " - } - } - ], - "source": { - "osmTags": { - "and": [ - "amenity=binoculars" - ] - } - }, "deletion": { "softDeletionTags": { "and": [ @@ -168,19 +192,5 @@ "allowMove": { "enableRelocation": false, "enableImproveAccuraccy": true - }, - "mapRendering": [ - { - "icon": "circle:white;./assets/layers/binocular/telescope.svg", - "iconSize": "40,40", - "location": [ - "point" - ], - "anchor": "center" - }, - { - "color": "#00f", - "width": "8" - } - ] + } } diff --git a/assets/layers/birdhide/birdhide.json b/assets/layers/birdhide/birdhide.json index dbeed728b..bd78e30b8 100644 --- a/assets/layers/birdhide/birdhide.json +++ b/assets/layers/birdhide/birdhide.json @@ -11,7 +11,15 @@ "pl": "Miejsca do obserwacji ptaków", "cs": "Místa pro pozorování ptáků" }, - "minzoom": 14, + "description": { + "en": "A birdhide", + "nl": "Een vogelkijkhut", + "da": "Et fugleskjul", + "de": "Ein Vogelbeobachtungsturm", + "fr": "Un observatoire ornithologique", + "ca": "Un observatori d'ocells", + "cs": "Pozorovatelna" + }, "source": { "osmTags": { "and": [ @@ -19,6 +27,7 @@ ] } }, + "minzoom": 14, "title": { "render": { "en": "Bird watching place", @@ -81,15 +90,88 @@ } ] }, - "description": { - "en": "A birdhide", - "nl": "Een vogelkijkhut", - "da": "Et fugleskjul", - "de": "Ein Vogelbeobachtungsturm", - "fr": "Un observatoire ornithologique", - "ca": "Un observatori d'ocells", - "cs": "Pozorovatelna" - }, + "pointRendering": [ + { + "marker": [ + { + "icon": { + "render": "./assets/layers/birdhide/birdhide.svg", + "mappings": [ + { + "if": { + "or": [ + "building=yes", + "shelter=yes", + "amenity=shelter" + ] + }, + "then": "./assets/layers/birdhide/birdshelter.svg" + } + ] + } + } + ], + "location": [ + "point", + "centroid" + ] + } + ], + "lineRendering": [], + "presets": [ + { + "tags": [ + "leisure=bird_hide", + "building=yes", + "shelter=yes", + "amenity=shelter" + ], + "title": { + "en": "a birdhide", + "nl": "een vogelkijkhut", + "da": "et fugleskjul", + "de": "ein Gebäude zur Vogelbeobachtung", + "fr": "un observatoire ornithologique", + "ca": "un observatori d'ocells", + "cs": "pozorovatelna" + }, + "description": { + "en": "A covered shelter where one can watch birds comfortably", + "nl": "Een overdekte hut waarbinnen er warm en droog naar vogels gekeken kan worden", + "de": "Ein überdachter Unterstand, in dem man bequem Vögel beobachten kann", + "es": "Un refugio cubierto donde se pueden ver pájaros confortablemente", + "da": "Et overdækket ly, hvor man kan se fugle i ro og mag", + "fr": "Un abris couvert pour observer les oiseaux confortablement", + "ca": "Un refugi cobert on es poden veure ocells confortablement", + "cs": "Krytý přístřešek, kde lze pohodlně pozorovat ptáky" + } + }, + { + "tags": [ + "leisure=bird_hide", + "building=no", + "shelter=no" + ], + "title": { + "en": "a bird blind", + "nl": "een vogelkijkwand", + "de": "einen Sichtschutz zur Vogelbeobachtung", + "fr": "un camouflage d’observation ornithologique", + "da": "et fugletårn", + "ca": "un observatori d'ocells" + }, + "description": { + "en": "A screen or wall with openings to watch birds", + "nl": "Een vogelkijkwand waarachter men kan staan om vogels te kijken", + "es": "Una pantalla o pared con aperturas para ver pájaros", + "da": "En skærm eller væg med åbninger til at se på fugle", + "de": "Ein Schirm oder eine Wand mit Öffnungen zum Beobachten von Vögeln", + "fr": "Un écran ou un mur avec des ouvertures pour observer les oiseaux", + "ca": "Una pantalla o paret amb obertures per a observar ocells", + "cs": "Obrazovka nebo stěna s otvory pro sledování ptáků" + } + } + ], "tagRenderings": [ "images", { @@ -311,60 +393,6 @@ "id": "birdhide-operator" } ], - "presets": [ - { - "tags": [ - "leisure=bird_hide", - "building=yes", - "shelter=yes", - "amenity=shelter" - ], - "title": { - "en": "a birdhide", - "nl": "een vogelkijkhut", - "da": "et fugleskjul", - "de": "ein Gebäude zur Vogelbeobachtung", - "fr": "un observatoire ornithologique", - "ca": "un observatori d'ocells", - "cs": "pozorovatelna" - }, - "description": { - "en": "A covered shelter where one can watch birds comfortably", - "nl": "Een overdekte hut waarbinnen er warm en droog naar vogels gekeken kan worden", - "de": "Ein überdachter Unterstand, in dem man bequem Vögel beobachten kann", - "es": "Un refugio cubierto donde se pueden ver pájaros confortablemente", - "da": "Et overdækket ly, hvor man kan se fugle i ro og mag", - "fr": "Un abris couvert pour observer les oiseaux confortablement", - "ca": "Un refugi cobert on es poden veure ocells confortablement", - "cs": "Krytý přístřešek, kde lze pohodlně pozorovat ptáky" - } - }, - { - "tags": [ - "leisure=bird_hide", - "building=no", - "shelter=no" - ], - "title": { - "en": "a bird blind", - "nl": "een vogelkijkwand", - "de": "einen Sichtschutz zur Vogelbeobachtung", - "fr": "un camouflage d’observation ornithologique", - "da": "et fugletårn", - "ca": "un observatori d'ocells" - }, - "description": { - "en": "A screen or wall with openings to watch birds", - "nl": "Een vogelkijkwand waarachter men kan staan om vogels te kijken", - "es": "Una pantalla o pared con aperturas para ver pájaros", - "da": "En skærm eller væg med åbninger til at se på fugle", - "de": "Ein Schirm oder eine Wand mit Öffnungen zum Beobachten von Vögeln", - "fr": "Un écran ou un mur avec des ouvertures pour observer les oiseaux", - "ca": "Una pantalla o paret amb obertures per a observar ocells", - "cs": "Obrazovka nebo stěna s otvory pro sledování ptáků" - } - } - ], "filter": [ { "id": "wheelchair", @@ -429,28 +457,5 @@ "allowMove": { "enableRelocation": false, "enableImproveAccuracy": true - }, - "mapRendering": [ - { - "icon": { - "render": "./assets/layers/birdhide/birdhide.svg", - "mappings": [ - { - "if": { - "or": [ - "building=yes", - "shelter=yes", - "amenity=shelter" - ] - }, - "then": "./assets/layers/birdhide/birdshelter.svg" - } - ] - }, - "location": [ - "point", - "centroid" - ] - } - ] + } } diff --git a/assets/layers/cafe_pub/cafe_pub.json b/assets/layers/cafe_pub/cafe_pub.json index 3146225bb..9eae9e1b0 100644 --- a/assets/layers/cafe_pub/cafe_pub.json +++ b/assets/layers/cafe_pub/cafe_pub.json @@ -13,6 +13,17 @@ "pl": "Kawiarnie i puby", "cs": "Kavárny a hospody" }, + "description": { + "en": "A layer showing cafés and pubs where one can gather around a drink. The layer asks for some relevant questions", + "hu": "Egy olyan réteg, amely kávézókat és kocsmákat jelenít meg, ahol össze lehet gyűlni egy ital köré. A réteg néhány lényeges kérdést tesz fel", + "nl": "Een laag die kroegen en koffiehuizen toont waar je iets kunt drinken. De laag zal je enkele vragen stellen", + "de": "Eine Ebene mit Cafés und Kneipen, in denen man sich auf ein Getränk treffen kann. Die Ebene fragt nach einigen relevanten Eigenschaften", + "es": "Una capa que muestra cafeterías y bares donde uno se puede reunir con una bebida. La capa hace algunas preguntas relevantes", + "da": "Et lag med caféer og pubber, hvor man kan samles omkring en drink. Laget stiller nogle relevante spørgsmål", + "fr": "Une couche montrants les cafés et pubs où l’on peut prendre un verre. Cette couche pose des questions y afférentes.", + "ca": "Una capa que mostra cafeteries i bars on un es pot reunir amb una beguda. La capa demana algunes preguntes rellevants", + "cs": "Vrstva s kavárnami a hospodami, kde se můžete sejít u skleničky. Vrstva se ptá na několik důležitých otázek" + }, "source": { "osmTags": { "or": [ @@ -24,6 +35,87 @@ ] } }, + "minzoom": 12, + "title": { + "render": { + "en": "Pub", + "nl": "Café", + "ca": "Bar", + "de": "Kneipe", + "da": "Pub", + "es": "Bar", + "fr": "Bar", + "pa_PK": "پب", + "eu": "Edaritegia", + "pl": "Pub", + "cs": "Hospoda" + }, + "mappings": [ + { + "if": { + "and": [ + "name~*" + ] + }, + "then": { + "nl": "{name}", + "en": "{name}", + "de": "{name}", + "ru": "{name}", + "ca": "{name}", + "da": "{name}", + "es": "{name}", + "fr": "{name}", + "eu": "{name}", + "cs": "{name}" + } + } + ] + }, + "pointRendering": [ + { + "iconBadges": [ + { + "if": "opening_hours~*", + "then": "icons.isOpen" + } + ], + "label": { + "mappings": [ + { + "if": "name~*", + "then": "
{name}
" + } + ] + }, + "location": [ + "point", + "centroid" + ], + "marker": [ + { + "icon": "circle", + "color": "white" + }, + { + "icon": { + "render": "./assets/layers/cafe_pub/pub.svg", + "mappings": [ + { + "if": "amenity=cafe", + "then": "./assets/layers/cafe_pub/cafe.svg" + }, + { + "if": "amenity=nightclub", + "then": "./assets/layers/cafe_pub/nightclub.svg" + } + ] + } + } + ] + } + ], + "lineRendering": [], "presets": [ { "tags": [ @@ -136,42 +228,6 @@ } } ], - "title": { - "render": { - "en": "Pub", - "nl": "Café", - "ca": "Bar", - "de": "Kneipe", - "da": "Pub", - "es": "Bar", - "fr": "Bar", - "pa_PK": "پب", - "eu": "Edaritegia", - "pl": "Pub", - "cs": "Hospoda" - }, - "mappings": [ - { - "if": { - "and": [ - "name~*" - ] - }, - "then": { - "nl": "{name}", - "en": "{name}", - "de": "{name}", - "ru": "{name}", - "ca": "{name}", - "da": "{name}", - "es": "{name}", - "fr": "{name}", - "eu": "{name}", - "cs": "{name}" - } - } - ] - }, "tagRenderings": [ "images", "level", @@ -313,7 +369,6 @@ "internet-ssid", "reviews" ], - "minzoom": 12, "filter": [ "open_now", "accepts_cash", @@ -344,51 +399,5 @@ } ] }, - "allowMove": true, - "mapRendering": [ - { - "icon": { - "render": "circle:white;./assets/layers/cafe_pub/pub.svg", - "mappings": [ - { - "if": "amenity=cafe", - "then": "circle:white;./assets/layers/cafe_pub/cafe.svg" - }, - { - "if": "amenity=nightclub", - "then": "circle:white;./assets/layers/cafe_pub/nightclub.svg" - } - ] - }, - "iconBadges": [ - { - "if": "opening_hours~*", - "then": "icons.isOpen" - } - ], - "label": { - "mappings": [ - { - "if": "name~*", - "then": "
{name}
" - } - ] - }, - "location": [ - "point", - "centroid" - ] - } - ], - "description": { - "en": "A layer showing cafés and pubs where one can gather around a drink. The layer asks for some relevant questions", - "hu": "Egy olyan réteg, amely kávézókat és kocsmákat jelenít meg, ahol össze lehet gyűlni egy ital köré. A réteg néhány lényeges kérdést tesz fel", - "nl": "Een laag die kroegen en koffiehuizen toont waar je iets kunt drinken. De laag zal je enkele vragen stellen", - "de": "Eine Ebene mit Cafés und Kneipen, in denen man sich auf ein Getränk treffen kann. Die Ebene fragt nach einigen relevanten Eigenschaften", - "es": "Una capa que muestra cafeterías y bares donde uno se puede reunir con una bebida. La capa hace algunas preguntas relevantes", - "da": "Et lag med caféer og pubber, hvor man kan samles omkring en drink. Laget stiller nogle relevante spørgsmål", - "fr": "Une couche montrants les cafés et pubs où l’on peut prendre un verre. Cette couche pose des questions y afférentes.", - "ca": "Una capa que mostra cafeteries i bars on un es pot reunir amb una beguda. La capa demana algunes preguntes rellevants", - "cs": "Vrstva s kavárnami a hospodami, kde se můžete sejít u skleničky. Vrstva se ptá na několik důležitých otázek" - } + "allowMove": true } diff --git a/assets/layers/car_rental/car_rental.json b/assets/layers/car_rental/car_rental.json index 80719f884..b3b8bf381 100644 --- a/assets/layers/car_rental/car_rental.json +++ b/assets/layers/car_rental/car_rental.json @@ -9,6 +9,15 @@ "pl": "Wypożyczalnia samochodów", "cs": "Půjčovna aut" }, + "description": { + "en": "Places where you can rent a car", + "nl": "Plaatsen waar je een auto kunt huren", + "de": "Orte, an denen Sie ein Auto mieten können", + "fr": "Lieu où vous pouvez louer une voiture", + "ca": "Llocs on pots llogar un cotxe", + "pl": "Miejsca, w których można wypożyczyć samochód", + "cs": "Místa, kde si můžete pronajmout auto" + }, "source": { "osmTags": "amenity=car_rental" }, @@ -30,69 +39,29 @@ } ] }, - "description": { - "en": "Places where you can rent a car", - "nl": "Plaatsen waar je een auto kunt huren", - "de": "Orte, an denen Sie ein Auto mieten können", - "fr": "Lieu où vous pouvez louer une voiture", - "ca": "Llocs on pots llogar un cotxe", - "pl": "Miejsca, w których można wypożyczyć samochód", - "cs": "Místa, kde si můžete pronajmout auto" - }, - "tagRenderings": [ - "images", + "pointRendering": [ { - "id": "name", - "freeform": { - "key": "name", - "type": "string", - "placeholder": { - "en": "Name of the car rental", - "nl": "Naam van de autoverhuur", - "de": "Name der Autovermietung", - "fr": "Nom de la société de location de véhicules", - "ca": "Nom del lloguer de cotxes", - "pl": "Nazwa wypożyczalni samochodów", - "cs": "Název autopůjčovny" - } - }, - "question": { - "en": "What is the name of this car rental?", - "nl": "Wat is de naam van deze autoverhuur?", - "de": "Wie lautet der Name dieser Autovermietung?", - "fr": "Quel est le nom de cette société de location de véhicules ?", - "ca": "Com es diu aquest lloguer de cotxes?", - "pl": "Jaka jest nazwa tej wypożyczalni samochodów?", - "cs": "Jak se jmenuje tato půjčovna aut?" - }, - "mappings": [ - { - "if": "noname=yes", - "then": { - "en": "This car rental has no name", - "nl": "Deze autoverhuur heeft geen naam", - "de": "Diese Autovermietung hat keinen Namen", - "fr": "Cette société de location de véhicules n'a pas de nom", - "ca": "Aquest lloguer de cotxes no té nom", - "pl": "Ta wypożyczalnia samochodów nie ma nazwy", - "cs": "Tato autopůjčovna nemá jméno" - } - } + "location": [ + "point", + "centroid" ], - "render": { - "en": "This car rental is called {name}", - "nl": "Deze autoverhuur heet {name}", - "de": "Der Name der Autovermietung lautet {name}", - "fr": "Cette société de location de véhicules est appelée {name}", - "ca": "Aquest lloguer de cotxes es diu {name}", - "pl": "Ta wypożyczalnia samochodów nazywa się {name}", - "cs": "Tato autopůjčovna se jmenuje {name}" - } - }, - "website", - "email", - "phone", - "opening_hours" + "label": "
{name}
", + "marker": [ + { + "icon": "circle", + "color": "white" + }, + { + "icon": "./assets/layers/car_rental/car_rental.svg" + } + ] + } + ], + "lineRendering": [ + { + "color": "darkblue", + "width": 2 + } ], "presets": [ { @@ -119,24 +88,67 @@ } } ], - "mapRendering": [ + "tagRenderings": [ + "images", { - "icon": "circle:white;./assets/layers/car_rental/car_rental.svg", - "location": [ - "point", - "centroid" + "id": "name", + "freeform": { + "key": "name", + "type": "string", + "addExtraTags": ["noname="], + "placeholder": { + "en": "Name of the car rental", + "nl": "Naam van de autoverhuur", + "de": "Name der Autovermietung", + "fr": "Nom de la société de location de véhicules", + "ca": "Nom del lloguer de cotxes", + "pl": "Nazwa wypożyczalni samochodów", + "cs": "Název autopůjčovny" + } + }, + "question": { + "en": "What is the name of this car rental?", + "nl": "Wat is de naam van deze autoverhuur?", + "de": "Wie lautet der Name dieser Autovermietung?", + "fr": "Quel est le nom de cette société de location de véhicules ?", + "ca": "Com es diu aquest lloguer de cotxes?", + "pl": "Jaka jest nazwa tej wypożyczalni samochodów?", + "cs": "Jak se jmenuje tato půjčovna aut?" + }, + "mappings": [ + { + "if": "noname=yes", + "addExtraTags": ["name="], + "then": { + "en": "This car rental has no name", + "nl": "Deze autoverhuur heeft geen naam", + "de": "Diese Autovermietung hat keinen Namen", + "fr": "Cette société de location de véhicules n'a pas de nom", + "ca": "Aquest lloguer de cotxes no té nom", + "pl": "Ta wypożyczalnia samochodów nie ma nazwy", + "cs": "Tato autopůjčovna nemá jméno" + } + } ], - "label": "
{name}
" + "render": { + "en": "This car rental is called {name}", + "nl": "Deze autoverhuur heet {name}", + "de": "Der Name der Autovermietung lautet {name}", + "fr": "Cette société de location de véhicules est appelée {name}", + "ca": "Aquest lloguer de cotxes es diu {name}", + "pl": "Ta wypożyczalnia samochodów nazywa się {name}", + "cs": "Tato autopůjčovna se jmenuje {name}" + } }, - { - "color": "darkblue", - "width": 2 - } + "website", + "email", + "phone", + "opening_hours" + ], + "filter": [ + "open_now" ], "allowMove": { "enableImproveAccuracy": true - }, - "filter": [ - "open_now" - ] + } } diff --git a/assets/layers/charging_station/charging_station.json b/assets/layers/charging_station/charging_station.json index b9d7cf2da..1878f1ffe 100644 --- a/assets/layers/charging_station/charging_station.json +++ b/assets/layers/charging_station/charging_station.json @@ -5026,30 +5026,39 @@ } } ], - "mapRendering": [ + "lineRendering": [], + "pointRendering": [ { "location": [ "point", "centroid" ], - "icon": { - "render": "pin:#fff;./assets/themes/charging_stations/plug.svg", - "mappings": [ - { - "if": "bicycle=yes", - "then": "pin:#fff;./assets/themes/charging_stations/bicycle.svg" - }, - { - "if": { - "or": [ - "car=yes", - "motorcar=yes" - ] - }, - "then": "pin:#fff;./assets/themes/charging_stations/car.svg" + "marker": [ + { + "icon": "pin", + "color": "#fff" + }, + { + "icon": { + "render": "./assets/themes/charging_stations/plug.svg", + "mappings": [ + { + "if": "bicycle=yes", + "then": "./assets/themes/charging_stations/bicycle.svg" + }, + { + "if": { + "or": [ + "car=yes", + "motorcar=yes" + ] + }, + "then": "./assets/themes/charging_stations/car.svg" + } + ] } - ] - }, + } + ], "iconBadges": [ { "if": { diff --git a/assets/layers/charging_station/charging_station.protojson b/assets/layers/charging_station/charging_station.protojson index 48a36e70d..828045f39 100644 --- a/assets/layers/charging_station/charging_station.protojson +++ b/assets/layers/charging_station/charging_station.protojson @@ -728,30 +728,37 @@ } } ], - "mapRendering": [ + "lineRendering": [], + "pointRendering": [ { "location": [ "point", "centroid" ], - "icon": { - "render": "pin:#fff;./assets/themes/charging_stations/plug.svg", - "mappings": [ - { - "if": "bicycle=yes", - "then": "pin:#fff;./assets/themes/charging_stations/bicycle.svg" - }, - { - "if": { - "or": [ - "car=yes", - "motorcar=yes" - ] + "marker": [{ + "icon": "pin", + "color": "#fff" + },{ + "icon": { + "render":"./assets/themes/charging_stations/plug.svg", + "mappings": [ + { + "if": "bicycle=yes", + "then": "./assets/themes/charging_stations/bicycle.svg" }, - "then": "pin:#fff;./assets/themes/charging_stations/car.svg" - } - ] - }, + { + "if": { + "or": [ + "car=yes", + "motorcar=yes" + ] + }, + "then": "./assets/themes/charging_stations/car.svg" + } + ] + + } + }], "iconBadges": [ { "if": { diff --git a/assets/layers/climbing/climbing.json b/assets/layers/climbing/climbing.json index de60056ed..1f7d1bed9 100644 --- a/assets/layers/climbing/climbing.json +++ b/assets/layers/climbing/climbing.json @@ -1,6 +1,5 @@ { "id": "climbing", - "title": null, "description": { "en": "A dummy layer which contains tagrenderings, shared among the climbing layers", "nl": "Een dummy-laag die tagrenderings bevat, gedeeld over de verschillende klimsport lagen", @@ -8,10 +7,11 @@ "cs": "Falešná vrstva, která obsahuje tagrenderingy sdílené mezi lezeckými vrstvami", "ca": "Una capa fictícia que conté renderització d'etiquetes compartides entre les capes d'escalada" }, - "minzoom": 19, - "source": { - "osmTags": "sport=climbing" - }, + "source": "special:library", + "minzoom": 18, + "title": null, + "pointRendering": null, + "lineRendering": null, "tagRenderings": [ { "id": "website", @@ -444,6 +444,5 @@ } ] } - ], - "mapRendering": null + ] } diff --git a/assets/layers/climbing_area/climbing_area.json b/assets/layers/climbing_area/climbing_area.json index 9d8d073cb..4e77dfac7 100644 --- a/assets/layers/climbing_area/climbing_area.json +++ b/assets/layers/climbing_area/climbing_area.json @@ -17,7 +17,6 @@ "ca": "Una àrea on l'escalada és possible, p.e. una penya, lloc, bloc, … Conté l'agregació de rutes", "cs": "Oblast, kde je možné lezení, např. skalisko, místo, balvan, … Obsahuje agregaci cest" }, - "minzoom": 10, "source": { "osmTags": { "and": [ @@ -29,6 +28,22 @@ ] } }, + "calculatedTags": [ + "_contained_climbing_routes_properties=overlapWith(feat)('climbing_route').map(f => f.feat.properties).map(p => {return {id: p.id, name: p.name, 'climbing:grade:french': p['climbing:grade:french'], 'climbing:length': p['climbing:length']} })", + "_contained_climbing_routes=get(feat)('_contained_climbing_routes_properties')?.map(p => `
  • ${p.name ?? 'climbing route'} (${p['climbing:grade:french'] ?? 'unknown difficulty'}, ${p['climbing:length'] ?? 'unkown length'} meter)
  • `).join('')", + "_contained_climbing_route_ids=get(feat)('_contained_climbing_routes_properties')?.map(p => p.id)", + "_difficulty_hist=get(feat)('_contained_climbing_routes_properties')?.map(p => p['climbing:grade:french'])?.filter(p => (p ?? null) !== null)?.sort()", + "_difficulty_max=get(feat)('_difficulty_hist')?.at(-1)", + "_difficulty_min=get(feat)('_difficulty_hist')?.at(0)", + "_length_hist=get(feat)('_contained_climbing_routes_properties')?.map(p => p['climbing:length'])?.filter(p => (p ?? null) !== null)?.sort()", + "_length_max=get(feat)('_length_hist')?.at(-1)", + "_length_min=get(feat)('_length_hist')?.at(0)", + "_bolts_hist=get(feat)('_contained_climbing_routes_properties')?.map(p => p['climbing:bolts'])?.filter(p => (p ?? null) !== null)?.sort()", + "_bolts_max=get(feat)('_bolts_hist')?.at(-1)", + "_bolts_min=get(feat)('_bolts_hist')?.at(0)", + "_contained_climbing_routes_count=get(feat)('_contained_climbing_routes_properties')?.length" + ], + "minzoom": 10, "title": { "render": { "en": "Climbing opportunity", @@ -105,20 +120,58 @@ } ] }, - "calculatedTags": [ - "_contained_climbing_routes_properties=overlapWith(feat)('climbing_route').map(f => f.feat.properties).map(p => {return {id: p.id, name: p.name, 'climbing:grade:french': p['climbing:grade:french'], 'climbing:length': p['climbing:length']} })", - "_contained_climbing_routes=get(feat)('_contained_climbing_routes_properties')?.map(p => `
  • ${p.name ?? 'climbing route'} (${p['climbing:grade:french'] ?? 'unknown difficulty'}, ${p['climbing:length'] ?? 'unkown length'} meter)
  • `).join('')", - "_contained_climbing_route_ids=get(feat)('_contained_climbing_routes_properties')?.map(p => p.id)", - "_difficulty_hist=get(feat)('_contained_climbing_routes_properties')?.map(p => p['climbing:grade:french'])?.filter(p => (p ?? null) !== null)?.sort()", - "_difficulty_max=get(feat)('_difficulty_hist')?.at(-1)", - "_difficulty_min=get(feat)('_difficulty_hist')?.at(0)", - "_length_hist=get(feat)('_contained_climbing_routes_properties')?.map(p => p['climbing:length'])?.filter(p => (p ?? null) !== null)?.sort()", - "_length_max=get(feat)('_length_hist')?.at(-1)", - "_length_min=get(feat)('_length_hist')?.at(0)", - "_bolts_hist=get(feat)('_contained_climbing_routes_properties')?.map(p => p['climbing:bolts'])?.filter(p => (p ?? null) !== null)?.sort()", - "_bolts_max=get(feat)('_bolts_hist')?.at(-1)", - "_bolts_min=get(feat)('_bolts_hist')?.at(0)", - "_contained_climbing_routes_count=get(feat)('_contained_climbing_routes_properties')?.length" + "pointRendering": [ + { + "iconSize": "40,40", + "location": [ + "point", + "centroid" + ], + "anchor": "center", + "marker": [ + { + "icon": "./assets/themes/climbing/climbing_no_rope.svg" + } + ] + } + ], + "lineRendering": [ + { + "dashArray": "8 16", + "lineCap": "square", + "color": "#d38d5fAA", + "fill": "no", + "width": "8" + } + ], + "presets": [ + { + "tags": [ + "sport=climbing" + ], + "title": { + "en": "a climbing opportunity", + "nl": "een klimgelegenheid", + "de": "eine Klettereinrichtung", + "ja": "登坂教室", + "nb_NO": "en klatremulighet", + "fr": "une opportunité d’escalade", + "it": "una opportunità di arrampicata", + "ca": "una oportuinitat d'escalada", + "cs": "lezecká příležitost" + }, + "description": { + "nl": "Een klimgelegenheid", + "de": "Eine Klettereinrichtung", + "en": "A climbing opportunity", + "ja": "登坂教室", + "nb_NO": "En klatremulighet", + "fr": "Opportunité d’escalade", + "it": "Un’opportunità di arrampicata", + "ca": "Una oportunitat d'escalada", + "cs": "Lezecká příležitost" + } + } ], "tagRenderings": [ "images", @@ -298,52 +351,5 @@ "climbing.bouldering" ] } - ], - "presets": [ - { - "tags": [ - "sport=climbing" - ], - "title": { - "en": "a climbing opportunity", - "nl": "een klimgelegenheid", - "de": "eine Klettereinrichtung", - "ja": "登坂教室", - "nb_NO": "en klatremulighet", - "fr": "une opportunité d’escalade", - "it": "una opportunità di arrampicata", - "ca": "una oportuinitat d'escalada", - "cs": "lezecká příležitost" - }, - "description": { - "nl": "Een klimgelegenheid", - "de": "Eine Klettereinrichtung", - "en": "A climbing opportunity", - "ja": "登坂教室", - "nb_NO": "En klatremulighet", - "fr": "Opportunité d’escalade", - "it": "Un’opportunità di arrampicata", - "ca": "Una oportunitat d'escalada", - "cs": "Lezecká příležitost" - } - } - ], - "mapRendering": [ - { - "icon": "./assets/themes/climbing/climbing_no_rope.svg", - "iconSize": "40,40", - "location": [ - "point", - "centroid" - ], - "anchor": "center" - }, - { - "dashArray": "8 16", - "lineCap": "square", - "color": "#d38d5fAA", - "fill": "no", - "width": "8" - } ] } diff --git a/assets/layers/climbing_club/climbing_club.json b/assets/layers/climbing_club/climbing_club.json index 05b971d3f..2a8ce131f 100644 --- a/assets/layers/climbing_club/climbing_club.json +++ b/assets/layers/climbing_club/climbing_club.json @@ -14,7 +14,19 @@ "ca": "Club d'escalada", "cs": "Lezecký klub" }, - "minzoom": 10, + "description": { + "de": "Ein Kletterverein oder -organisation", + "nl": "Een klimclub of organisatie", + "en": "A climbing club or organisation", + "ja": "クライミングクラブや団体", + "zh_Hant": "攀岩社團或組織", + "nb_NO": "En klatreklubb eller organisasjoner", + "fr": "Club ou association d’escalade", + "it": "Un club o associazione di arrampacata", + "hu": "Mászóegyesület vagy -szervezet", + "ca": "Un club d'escalada o organització", + "cs": "Lezecký klub nebo organizace" + }, "source": { "osmTags": { "or": [ @@ -33,6 +45,7 @@ ] } }, + "minzoom": 10, "title": { "render": { "en": "Climbing club", @@ -64,55 +77,36 @@ } ] }, - "description": { - "de": "Ein Kletterverein oder -organisation", - "nl": "Een klimclub of organisatie", - "en": "A climbing club or organisation", - "ja": "クライミングクラブや団体", - "zh_Hant": "攀岩社團或組織", - "nb_NO": "En klatreklubb eller organisasjoner", - "fr": "Club ou association d’escalade", - "it": "Un club o associazione di arrampacata", - "hu": "Mászóegyesület vagy -szervezet", - "ca": "Un club d'escalada o organització", - "cs": "Lezecký klub nebo organizace" - }, - "tagRenderings": [ + "pointRendering": [ { - "render": { - "en": "{name}", - "nl": "{name}", - "de": "{name}", - "ca": "{name}", - "fr": "{name}", - "id": "{name}", - "ru": "{name}", - "ja": "{name}", - "zh_Hant": "{name}", - "it": "{name}", - "hu": "{name}", - "cs": "{name}" + "iconBadges": [ + { + "if": "opening_hours~*", + "then": "icons.isOpen" + } + ], + "iconSize": "40,40", + "location": [ + "point", + "centroid" + ], + "label": { + "mappings": [ + { + "if": "name~*", + "then": "
    {name}
    " + } + ] }, - "question": { - "en": "What is the name of this climbing club or NGO?", - "de": "Wie lautet der Name dieses Vereins oder Organisation?", - "nl": "Wat is de naam van deze klimclub?", - "ja": "この登山クラブやNGOの名前は何ですか?", - "fr": "Quel est le nom du club ou de l’association ?", - "it": "Qual è il nome di questo club o associazione di arrampicata?", - "hu": "Mi a neve ennek a mászóegyesületnek vagy szervezetnek?", - "cs": "Jak se jmenuje tento lezecký klub nebo nevládní organizace?" - }, - "freeform": { - "key": "name" - }, - "id": "climbing_club-name" - }, - "website", - "email", - "phone", - "opening_hours" + "anchor": "center", + "marker": [ + { + "icon": "./assets/themes/climbing/club.svg" + } + ] + } ], + "lineRendering": [], "presets": [ { "tags": [ @@ -173,29 +167,40 @@ } } ], - "mapRendering": [ + "tagRenderings": [ { - "icon": "./assets/themes/climbing/club.svg", - "iconBadges": [ - { - "if": "opening_hours~*", - "then": "icons.isOpen" - } - ], - "iconSize": "40,40", - "location": [ - "point", - "centroid" - ], - "label": { - "mappings": [ - { - "if": "name~*", - "then": "
    {name}
    " - } - ] + "render": { + "en": "{name}", + "nl": "{name}", + "de": "{name}", + "ca": "{name}", + "fr": "{name}", + "id": "{name}", + "ru": "{name}", + "ja": "{name}", + "zh_Hant": "{name}", + "it": "{name}", + "hu": "{name}", + "cs": "{name}" }, - "anchor": "center" - } + "question": { + "en": "What is the name of this climbing club or NGO?", + "de": "Wie lautet der Name dieses Vereins oder Organisation?", + "nl": "Wat is de naam van deze klimclub?", + "ja": "この登山クラブやNGOの名前は何ですか?", + "fr": "Quel est le nom du club ou de l’association ?", + "it": "Qual è il nome di questo club o associazione di arrampicata?", + "hu": "Mi a neve ennek a mászóegyesületnek vagy szervezetnek?", + "cs": "Jak se jmenuje tento lezecký klub nebo nevládní organizace?" + }, + "freeform": { + "key": "name" + }, + "id": "climbing_club-name" + }, + "website", + "email", + "phone", + "opening_hours" ] } diff --git a/assets/layers/climbing_gym/climbing_gym.json b/assets/layers/climbing_gym/climbing_gym.json index 17175277e..476845d0d 100644 --- a/assets/layers/climbing_gym/climbing_gym.json +++ b/assets/layers/climbing_gym/climbing_gym.json @@ -11,7 +11,17 @@ "ca": "Gimnasos d'escalada", "cs": "Lezecké tělocvičny" }, - "minzoom": 10, + "description": { + "de": "Eine Kletterhalle", + "en": "A climbing gym", + "ja": "クライミングジム", + "nl": "Een klimzaal", + "fr": "Une salle d’escalade", + "it": "Una palestra di arrampicata", + "ru": "Комплекс скалолазания", + "ca": "Un gimnàs d'escalada", + "cs": "Lezecká tělocvična" + }, "source": { "osmTags": { "and": [ @@ -20,6 +30,7 @@ ] } }, + "minzoom": 10, "title": { "render": { "nl": "Klimzaal", @@ -46,17 +57,50 @@ } ] }, - "description": { - "de": "Eine Kletterhalle", - "en": "A climbing gym", - "ja": "クライミングジム", - "nl": "Een klimzaal", - "fr": "Une salle d’escalade", - "it": "Una palestra di arrampicata", - "ru": "Комплекс скалолазания", - "ca": "Un gimnàs d'escalada", - "cs": "Lezecká tělocvična" - }, + "pointRendering": [ + { + "iconBadges": [ + { + "if": "opening_hours~*", + "then": "icons.isOpen" + } + ], + "iconSize": "40,40", + "location": [ + "point", + "centroid" + ], + "label": { + "mappings": [ + { + "if": "name~*", + "then": "
    {name}
    " + } + ] + }, + "anchor": "center", + "marker": [ + { + "icon": "./assets/themes/climbing/climbing_gym.svg" + } + ] + } + ], + "lineRendering": [], + "presets": [ + { + "title": { + "en": "Climbing gym", + "nl": "Klimzaal", + "de": "Kletterhalle", + "cs": "Lezecká tělocvična" + }, + "tags": [ + "leisure=sports_centre", + "sport=climbing" + ] + } + ], "tagRenderings": [ "images", { @@ -495,44 +539,5 @@ "internet", "internet-fee", "internet-ssid" - ], - "mapRendering": [ - { - "icon": "./assets/themes/climbing/climbing_gym.svg", - "iconBadges": [ - { - "if": "opening_hours~*", - "then": "icons.isOpen" - } - ], - "iconSize": "40,40", - "location": [ - "point", - "centroid" - ], - "label": { - "mappings": [ - { - "if": "name~*", - "then": "
    {name}
    " - } - ] - }, - "anchor": "center" - } - ], - "presets": [ - { - "title": { - "en": "Climbing gym", - "nl": "Klimzaal", - "de": "Kletterhalle", - "cs": "Lezecká tělocvična" - }, - "tags": [ - "leisure=sports_centre", - "sport=climbing" - ] - } ] } diff --git a/assets/layers/climbing_opportunity/climbing_opportunity.json b/assets/layers/climbing_opportunity/climbing_opportunity.json index 03c559dfa..89fd5d679 100644 --- a/assets/layers/climbing_opportunity/climbing_opportunity.json +++ b/assets/layers/climbing_opportunity/climbing_opportunity.json @@ -16,7 +16,6 @@ "nl": "Laag met plaatsen waar klimmen _misschien_ mogelijk is. Deze wordt geladen als je ver inzoomt, om te voorkomen dat je per ongeluk dubbels maakt", "cs": "Záložní vrstva s předměty, na které je _možné_ lézt. Načítá se při velkém přiblížení, aby se zabránilo přidávání duplicitních položek" }, - "minzoom": 19, "source": { "osmTags": { "and": [ @@ -34,6 +33,7 @@ ] } }, + "minzoom": 19, "title": { "render": { "en": "Climbing opportunity?", @@ -46,6 +46,25 @@ "cs": "Lezecká příležitost?" } }, + "pointRendering": [ + { + "marker": [ + { + "icon": "./assets/themes/climbing/climbing_unknown.svg" + } + ], + "location": [ + "point", + "centroid" + ] + } + ], + "lineRendering": [ + { + "color": "#ddff55AA", + "width": "2" + } + ], "tagRenderings": [ { "id": "climbing-opportunity-name", @@ -127,18 +146,5 @@ } ] } - ], - "mapRendering": [ - { - "icon": "./assets/themes/climbing/climbing_unknown.svg", - "location": [ - "point", - "centroid" - ] - }, - { - "color": "#ddff55AA", - "width": "2" - } ] } diff --git a/assets/layers/climbing_route/climbing_route.json b/assets/layers/climbing_route/climbing_route.json index 6500e1136..1015dcb32 100644 --- a/assets/layers/climbing_route/climbing_route.json +++ b/assets/layers/climbing_route/climbing_route.json @@ -18,7 +18,6 @@ "fr": "Une seule voie d'escalade et ses propriétés. Certaines propriétés sont dérivées des objets qui les contiennent", "cs": "Jedna lezecká cesta a její vlastnosti. Některé vlastnosti jsou odvozeny z obsahujících prvků" }, - "minzoom": 18, "source": { "osmTags": { "and": [ @@ -26,6 +25,7 @@ ] } }, + "minzoom": 18, "title": { "render": { "de": "Kleterroute", @@ -56,6 +56,68 @@ } ] }, + "pointRendering": [ + { + "iconSize": "28,28", + "location": [ + "point", + "centroid" + ], + "label": { + "mappings": [ + { + "if": { + "and": [ + "climbing:grade:french~*", + "name~*" + ] + }, + "then": "
    {name} {climbing:grade:french}
    " + }, + { + "if": "name~*", + "then": "
    {name}
    " + } + ] + }, + "anchor": "center", + "marker": [ + { + "icon": "circle", + "color": "white" + }, + { + "icon": "./assets/themes/climbing/climbing_route.svg" + } + ] + } + ], + "lineRendering": [ + { + "color": "#0f0", + "width": "4" + } + ], + "presets": [ + { + "title": { + "en": "a climbing route", + "nl": "een klimroute", + "fr": "une voie d’escalade", + "de": "eine Kletterroute", + "it": "una via di arrampicata", + "ca": "una ruta d'escalada", + "cs": "lezecká trasa" + }, + "snapToLayer": [ + "climbing_opportunity" + ], + "tags": [ + "sport=climbing", + "climbing=route" + ] + } + ], "tagRenderings": [ "images", { @@ -220,57 +282,5 @@ "key": "_embedding_features_with_rock:rock" } } - ], - "presets": [ - { - "title": { - "en": "a climbing route", - "nl": "een klimroute", - "fr": "une voie d’escalade", - "de": "eine Kletterroute", - "it": "una via di arrampicata", - "ca": "una ruta d'escalada", - "cs": "lezecká trasa" - }, - "snapToLayer": [ - "climbing_opportunity" - ], - "tags": [ - "sport=climbing", - "climbing=route" - ] - } - ], - "mapRendering": [ - { - "icon": "circle:white;./assets/themes/climbing/climbing_route.svg", - "iconSize": "28,28", - "location": [ - "point", - "centroid" - ], - "label": { - "mappings": [ - { - "if": { - "and": [ - "climbing:grade:french~*", - "name~*" - ] - }, - "then": "
    {name} {climbing:grade:french}
    " - }, - { - "if": "name~*", - "then": "
    {name}
    " - } - ] - }, - "anchor": "center" - }, - { - "color": "#0f0", - "width": "4" - } ] } diff --git a/assets/layers/clock/clock.json b/assets/layers/clock/clock.json index 2f0472105..09423842b 100644 --- a/assets/layers/clock/clock.json +++ b/assets/layers/clock/clock.json @@ -17,6 +17,10 @@ "cs": "Vrstva s veřejnými hodinami", "pl": "Warstwa z zegarami publicznymi" }, + "source": { + "osmTags": "amenity=clock" + }, + "minzoom": 13, "title": { "render": { "en": "Clock", @@ -28,10 +32,88 @@ "cs": "Hodiny" } }, - "source": { - "osmTags": "amenity=clock" - }, - "minzoom": 13, + "pointRendering": [ + { + "location": [ + "point", + "centroid" + ], + "marker": [ + { + "icon": { + "render": "./assets/layers/clock/clock.svg", + "mappings": [ + { + "if": "display=digital", + "then": "./assets/layers/clock/clock_digital.svg" + } + ] + } + } + ], + "iconSize": { + "render": "40,40,center", + "mappings": [ + { + "if": "display=digital", + "then": "50,20,center" + } + ] + } + } + ], + "lineRendering": [], + "presets": [ + { + "tags": [ + "amenity=clock" + ], + "title": { + "en": "a clock", + "nl": "een klok", + "de": "eine Uhr", + "ca": "un rellotge", + "fr": "une horloge", + "pl": "zegar", + "cs": "hodiny" + }, + "description": { + "en": "A publicly visible clock", + "nl": "Een publiekelijk zichtbare klok", + "de": "Eine öffentlich sichtbare Uhr", + "ca": "Un rellotge visible públicament", + "fr": "Une horloge visible de l'espace public", + "cs": "Veřejně viditelné hodiny" + } + }, + { + "tags": [ + "amenity=clock", + "support=wall_mounted" + ], + "title": { + "en": "a wall-mounted clock", + "nl": "een klok aan een muur", + "de": "eine an der Wand montierte Uhr", + "ca": "un rellotge muntat en un paret", + "fr": "une horloge fixée au mur", + "pl": "zegar na ścianie", + "cs": "hodiny na stěně" + }, + "description": { + "en": "A publicly visible clock mounted on a wall", + "nl": "Een publiekelijk zichtbare klok aan een muur", + "de": "Eine öffentlich sichtbare Uhr an einer Wand", + "ca": "Un rellotge visible públicament muntat en una paret", + "fr": "Une horloge publique fixée sur un mur", + "pl": "Publicznie widoczny zegar zamontowany na ścianie", + "cs": "Veřejně viditelné hodiny umístěné na stěně" + }, + "snapToLayer": [ + "walls_and_buildings" + ] + } + ], "tagRenderings": [ "images", { @@ -479,81 +561,6 @@ ] } ], - "presets": [ - { - "tags": [ - "amenity=clock" - ], - "title": { - "en": "a clock", - "nl": "een klok", - "de": "eine Uhr", - "ca": "un rellotge", - "fr": "une horloge", - "pl": "zegar", - "cs": "hodiny" - }, - "description": { - "en": "A publicly visible clock", - "nl": "Een publiekelijk zichtbare klok", - "de": "Eine öffentlich sichtbare Uhr", - "ca": "Un rellotge visible públicament", - "fr": "Une horloge visible de l'espace public", - "cs": "Veřejně viditelné hodiny" - } - }, - { - "tags": [ - "amenity=clock", - "support=wall_mounted" - ], - "title": { - "en": "a wall-mounted clock", - "nl": "een klok aan een muur", - "de": "eine an der Wand montierte Uhr", - "ca": "un rellotge muntat en un paret", - "fr": "une horloge fixée au mur", - "pl": "zegar na ścianie", - "cs": "hodiny na stěně" - }, - "description": { - "en": "A publicly visible clock mounted on a wall", - "nl": "Een publiekelijk zichtbare klok aan een muur", - "de": "Eine öffentlich sichtbare Uhr an einer Wand", - "ca": "Un rellotge visible públicament muntat en una paret", - "fr": "Une horloge publique fixée sur un mur", - "pl": "Publicznie widoczny zegar zamontowany na ścianie", - "cs": "Veřejně viditelné hodiny umístěné na stěně" - }, - "snapToLayer": "walls_and_buildings" - } - ], - "allowMove": true, "deletion": true, - "mapRendering": [ - { - "location": [ - "point", - "centroid" - ], - "icon": { - "render": "./assets/layers/clock/clock.svg", - "mappings": [ - { - "if": "display=digital", - "then": "./assets/layers/clock/clock_digital.svg" - } - ] - }, - "iconSize": { - "render": "40,40,center", - "mappings": [ - { - "if": "display=digital", - "then": "50,20,center" - } - ] - } - } - ] + "allowMove": true } diff --git a/assets/layers/conflation/conflation.json b/assets/layers/conflation/conflation.json index 3af2b482d..f21b5f715 100644 --- a/assets/layers/conflation/conflation.json +++ b/assets/layers/conflation/conflation.json @@ -1,54 +1,114 @@ { "id": "conflation", - "description": "If the import-button moves OSM points, the imported way points or conflates, a preview is shown. This layer defines how this preview is rendered. This layer cannot be included in a theme.", - "minzoom": 1, - "source": "special", "name": "Conflation", + "description": "If the import-button moves OSM points, the imported way points or conflates, a preview is shown. This layer defines how this preview is rendered. This layer cannot be included in a theme.", + "source": "special", + "minzoom": 1, "title": "Conflation", - "mapRendering": [ + "pointRendering": [ { - "location": "point", - "icon": { - "render": "addSmall:#000", - "mappings": [ - { - "if": "detach=yes", - "then": "circle:white;close:#c33" - } - ] - }, - "iconSize": "10,10", - "anchor": "center" - }, - { - "location": "end", - "icon": { - "render": "circle:#0f0", - "mappings": [ - { - "if": "reprojection=yes", - "then": "none:#f00" + "location": [ + "point" + ], + "marker": [ + { + "color": { + "render": "#000", + "mappings": [ + { + "if": "detach=yes", + "then": "white" + } + ] }, - { - "if": "move=no", - "then": "ring:#0f0" + "icon": { + "render": "addSmall:#000", + "mappings": [ + { + "if": "detach=yes", + "then": "white" + } + ] } - ] - }, + }, + { + "icon": { + "mappings": [ + { + "if": "detach=yes", + "then": "close" + } + ] + }, + "color": "#C33" + } + ], "iconSize": "10,10", "anchor": "center" }, { - "location": "start", - "icon": { - "render": "square:#f00", - "mappings": [ - { - "if": "reprojection=yes", - "then": "reload:#f00" + "location": [ + "end" + ], + "marker": [ + { + "icon": { + "render": "circle", + "mappings": [ + { + "if": "reprojection=yes", + "then": "none" + }, + { + "if": "move=no", + "then": "ring" + } + ] + }, + "color": { + "render": "#0f0", + "mappings": [ + { + "if": "reprojection=yes", + "then": "#f00" + }, + { + "if": "move=no", + "then": "#0f0" + } + ] } - ] - }, + } + ], + "iconSize": "10,10", + "anchor": "center" + }, + { + "location": [ + "start" + ], + "marker": [ + { + "icon": { + "render": "square", + "mappings": [ + { + "if": "reprojection=yes", + "then": "reload" + } + ] + }, + "color": { + "render": "#f00", + "mappings": [ + { + "if": "reprojection=yes", + "then": "#f00" + } + ] + } + } + ], "iconSize": { "render": "10,10,center", "mappings": [ @@ -58,7 +118,9 @@ } ] } - }, + } + ], + "lineRendering": [ { "width": { "render": "3", @@ -69,16 +131,7 @@ } ] }, - "color": "#00f", - "dasharray": { - "render": "", - "mappings": [ - { - "if": "resulting-geometry=yes", - "then": "6 6" - } - ] - } + "color": "#00f" } ] } diff --git a/assets/layers/crab_address/crab_address.json b/assets/layers/crab_address/crab_address.json index a90bd2bd6..86805c235 100644 --- a/assets/layers/crab_address/crab_address.json +++ b/assets/layers/crab_address/crab_address.json @@ -1,5 +1,6 @@ { "id": "crab_address", + "name": "CRAB-addressen", "description": "Address data for Flanders by the governement, suited for import into OpenStreetMap. Datadump from 2021-10-26. This layer contains only visualisation logic. Import buttons should be added via an override. Note that HNRLABEL contains the original value, whereas _HNRLABEL contains a slightly cleaned version", "source": { "osmTags": "HUISNR~*", @@ -7,29 +8,31 @@ "geoJsonZoomLevel": 18, "maxCacheAge": 0 }, - "name": "CRAB-addressen", + "calculatedTags": [ + "_HNRLABEL=(() => {const lbl = feat.properties.HNRLABEL?.split('-')?.map(l => Number(l))?.filter(i => !isNaN (i)) ;if(lbl?.length != 2) {return feat.properties.HNRLABEL}; const addresses = []; for(let i = lbl[0]; i <= lbl[1]; i += 1){addresses.push(''+i);}; return addresses.join(';') })()" + ], "title": "CRAB-adres", - "mapRendering": [ + "pointRendering": [ { "location": [ "point", "centroid" ], "iconSize": "50,50", - "icon": "./assets/layers/crab_address/housenumber_blank.svg", "label": "
    {_HNRLABEL}
    ", - "anchor": "center" + "anchor": "center", + "marker": [ + { + "icon": "./assets/layers/crab_address/housenumber_blank.svg" + } + ] } ], - "calculatedTags": [ - "_HNRLABEL=(() => {const lbl = feat.properties.HNRLABEL?.split('-')?.map(l => Number(l))?.filter(i => !isNaN (i)) ;if(lbl?.length != 2) {return feat.properties.HNRLABEL}; const addresses = []; for(let i = lbl[0]; i <= lbl[1]; i += 1){addresses.push(''+i);}; return addresses.join(';') })()" - ], + "lineRendering": [], "tagRenderings": [ { "id": "render_crab", - "render": { - "nl": "Volgens het CRAB ligt hier {STRAATNM} {HUISNR} (label: {HNRLABEL})" - } + "render": "Volgens het CRAB ligt hier {STRAATNM} {HUISNR} (label: {HNRLABEL})" } ] } diff --git a/assets/layers/crossings/crossings.json b/assets/layers/crossings/crossings.json index bf9a5b84c..760d2be5b 100644 --- a/assets/layers/crossings/crossings.json +++ b/assets/layers/crossings/crossings.json @@ -69,6 +69,36 @@ } ] }, + "pointRendering": [ + { + "marker": [ + { + "icon": { + "render": "./assets/layers/crossings/pedestrian_crossing.svg", + "mappings": [ + { + "if": { + "or": [ + "highway=traffic_signals", + "crossing=traffic_signals" + ] + }, + "then": "./assets/layers/crossings/traffic_lights.svg" + } + ] + } + } + ], + "location": [ + "point" + ] + } + ], + "lineRendering": [ + { + "width": "5" + } + ], "presets": [ { "title": { @@ -94,7 +124,9 @@ "ca": "Creuament per a vianants i/o ciclistes", "cs": "Přechod pro chodce a/nebo cyklisty" }, - "snapToLayer": "cycleways_and_roads", + "snapToLayer": [ + "cycleways_and_roads" + ], "maxSnapDistance": 25 }, { @@ -122,7 +154,9 @@ "ca": "Semàfor en una carretera", "cs": "Semafor na silnici" }, - "snapToLayer": "cycleways_and_roads", + "snapToLayer": [ + "cycleways_and_roads" + ], "maxSnapDistance": 25 } ], @@ -690,30 +724,6 @@ ] } ], - "mapRendering": [ - { - "icon": { - "render": "./assets/layers/crossings/pedestrian_crossing.svg", - "mappings": [ - { - "if": { - "or": [ - "highway=traffic_signals", - "crossing=traffic_signals" - ] - }, - "then": "./assets/layers/crossings/traffic_lights.svg" - } - ] - }, - "location": [ - "point" - ] - }, - { - "width": "5" - } - ], "filter": [ "tactile_paving_advanced" ] diff --git a/assets/layers/current_view/current_view.json b/assets/layers/current_view/current_view.json index 42a1769a6..70b0b5e83 100644 --- a/assets/layers/current_view/current_view.json +++ b/assets/layers/current_view/current_view.json @@ -4,11 +4,12 @@ "source": "special", "shownByDefault": false, "title": "Current View", - "tagRenderings": [], "popupInFloatover": true, - "mapRendering": [ + "pointRendering": [], + "lineRendering": [ { "color": "#cccc0088" } - ] + ], + "tagRenderings": [] } diff --git a/assets/layers/cycleways_and_roads/cycleways_and_roads.json b/assets/layers/cycleways_and_roads/cycleways_and_roads.json index a29a5d9eb..e27cb0579 100644 --- a/assets/layers/cycleways_and_roads/cycleways_and_roads.json +++ b/assets/layers/cycleways_and_roads/cycleways_and_roads.json @@ -9,7 +9,15 @@ "ca": "Vies ciclistes i carreteres", "cs": "Cyklostezky a silnice" }, - "minzoom": 16, + "description": { + "en": "All infrastructure that someone can cycle over, accompanied with questions about this infrastructure", + "nl": "Alle infrastructuur waar je over kunt fietsen, met vragen over die infrastructuur", + "de": "Infrastruktur, die man mit dem Fahrrad befahren kann, begleitet von diesbezüglichen Fragen", + "es": "Toda la infraestructura sobre la que alguien puede ir en bici, acompañado de preguntas sobre esta infraestructura\"", + "fr": "Toutes les infrastructures sur lesquelles quelqu'un peut rouler, accompagnées de questions sur cette infrastructure", + "ca": "Totes les infraestructures per les quals algú pot ciclar, acompanyades de preguntes sobre aquesta infraestructura", + "cs": "Veškerá infrastruktura, kterou může někdo projet na kole, doplněná o otázky týkající se této infrastruktury" + }, "source": { "osmTags": { "or": [ @@ -39,6 +47,7 @@ ] } }, + "minzoom": 16, "title": { "render": { "en": "Way", @@ -207,6 +216,92 @@ } ] }, + "pointRendering": [ + { + "iconSize": "40,40", + "location": [ + "point" + ], + "marker": [ + { + "icon": "./assets/themes/cycle_infra/bicycleway.svg" + } + ] + } + ], + "lineRendering": [ + { + "color": { + "render": "rgba(170, 170, 170, 0.7)", + "mappings": [ + { + "if": "highway=cycleway", + "then": "rgba(0, 189, 141, 0.7)" + }, + { + "if": "highway=path", + "then": "rgba(204, 74, 207, 0.7)" + }, + { + "if": "cycleway=track", + "then": "rgba(113, 3, 200, 0.7)" + }, + { + "if": "cycleway=shared_lane", + "then": "rgba(74, 59, 247, 0.7)" + }, + { + "if": "cycleway=lane", + "then": "rgba(254, 155, 6, 0.9)" + }, + { + "if": "cyclestreet=yes", + "then": "rgba(57, 159, 191, 0.7)" + }, + { + "if": "cycleway=no", + "then": "rgba(0, 0, 0, 0.7)" + } + ] + }, + "width": "8", + "dashArray": { + "render": "", + "mappings": [ + { + "if": { + "or": [ + "oneway=yes", + { + "or": [ + "highway=cycleway", + "highway=path" + ] + } + ] + }, + "then": "" + }, + { + "if": "cycleway=track", + "then": "" + }, + { + "if": "cycleway=shared_lane", + "then": "15 30" + }, + { + "if": "cycleway=lane", + "then": "25 15 15 15 25" + }, + { + "if": "cyclestreet=yes", + "then": "" + } + ] + } + } + ], "tagRenderings": [ { "question": { @@ -1807,94 +1902,5 @@ ] } ], - "allowSplit": true, - "mapRendering": [ - { - "icon": "./assets/themes/cycle_infra/bicycleway.svg", - "iconSize": "40,40", - "location": [ - "point" - ] - }, - { - "color": { - "render": "rgba(170, 170, 170, 0.7)", - "mappings": [ - { - "if": "highway=cycleway", - "then": "rgba(0, 189, 141, 0.7)" - }, - { - "if": "highway=path", - "then": "rgba(204, 74, 207, 0.7)" - }, - { - "if": "cycleway=track", - "then": "rgba(113, 3, 200, 0.7)" - }, - { - "if": "cycleway=shared_lane", - "then": "rgba(74, 59, 247, 0.7)" - }, - { - "if": "cycleway=lane", - "then": "rgba(254, 155, 6, 0.9)" - }, - { - "if": "cyclestreet=yes", - "then": "rgba(57, 159, 191, 0.7)" - }, - { - "if": "cycleway=no", - "then": "rgba(0, 0, 0, 0.7)" - } - ] - }, - "width": "8", - "dashArray": { - "render": "", - "mappings": [ - { - "if": { - "or": [ - "oneway=yes", - { - "or": [ - "highway=cycleway", - "highway=path" - ] - } - ] - }, - "then": "" - }, - { - "if": "cycleway=track", - "then": "" - }, - { - "if": "cycleway=shared_lane", - "then": "15 30" - }, - { - "if": "cycleway=lane", - "then": "25 15 15 15 25" - }, - { - "if": "cyclestreet=yes", - "then": "" - } - ] - } - } - ], - "description": { - "en": "All infrastructure that someone can cycle over, accompanied with questions about this infrastructure", - "nl": "Alle infrastructuur waar je over kunt fietsen, met vragen over die infrastructuur", - "de": "Infrastruktur, die man mit dem Fahrrad befahren kann, begleitet von diesbezüglichen Fragen", - "es": "Toda la infraestructura sobre la que alguien puede ir en bici, acompañado de preguntas sobre esta infraestructura\"", - "fr": "Toutes les infrastructures sur lesquelles quelqu'un peut rouler, accompagnées de questions sur cette infrastructure", - "ca": "Totes les infraestructures per les quals algú pot ciclar, acompanyades de preguntes sobre aquesta infraestructura", - "cs": "Veškerá infrastruktura, kterou může někdo projet na kole, doplněná o otázky týkající se této infrastruktury" - } + "allowSplit": true } diff --git a/assets/layers/defibrillator/defibrillator.json b/assets/layers/defibrillator/defibrillator.json index 6502a411f..07a4ea92c 100644 --- a/assets/layers/defibrillator/defibrillator.json +++ b/assets/layers/defibrillator/defibrillator.json @@ -46,6 +46,35 @@ "cs": "Defibrilátor" } }, + "pointRendering": [ + { + "marker": [ + { + "icon": "square", + "color": { + "render": "#008754", + "mappings": [ + { + "if": "_recently_surveyed=true", + "then": "#28ba3d" + } + ] + } + }, + { + "icon": "./assets/layers/defibrillator/defibrillator.svg" + } + ], + "location": [ + "point" + ] + } + ], + "lineRendering": [ + { + "color": "#0000ff" + } + ], "presets": [ { "title": { @@ -81,7 +110,9 @@ "tags": [ "emergency=defibrillator" ], - "snapToLayer": "walls_and_buildings", + "snapToLayer": [ + "walls_and_buildings" + ], "maxSnapDistance": 5 } ], @@ -714,6 +745,10 @@ "id": "defibrillator-fixme" } ], + "filter": [ + "has_image", + "open_now" + ], "deletion": { "softDeletionTags": { "and": [ @@ -725,29 +760,6 @@ }, "allowMove": { "enableRelocation": false, - "enableImproveAccuraccy": true - }, - "mapRendering": [ - { - "icon": { - "render": "square:#008754;./assets/layers/defibrillator/defibrillator.svg", - "mappings": [ - { - "if": "_recently_surveyed=true", - "then": "square:#28ba3d;./assets/layers/defibrillator/defibrillator.svg" - } - ] - }, - "location": [ - "point" - ] - }, - { - "color": "#0000ff" - } - ], - "filter": [ - "has_image", - "open_now" - ] + "enableImproveAccuracy": true + } } diff --git a/assets/layers/dentist/dentist.json b/assets/layers/dentist/dentist.json index 86887a475..ef880f296 100644 --- a/assets/layers/dentist/dentist.json +++ b/assets/layers/dentist/dentist.json @@ -20,6 +20,7 @@ "source": { "osmTags": "amenity=dentist" }, + "minzoom": 13, "title": { "render": { "en": "Dentist Office {name}", @@ -30,7 +31,41 @@ "cs": "Zubní ordinace {name}" } }, - "minzoom": 13, + "pointRendering": [ + { + "iconSize": "40,40", + "location": [ + "point", + "centroid" + ], + "anchor": "center", + "marker": [ + { + "icon": "circle", + "color": "white" + }, + { + "icon": "./assets/layers/dentist/dentist.svg" + } + ] + } + ], + "lineRendering": [], + "presets": [ + { + "title": { + "en": "a dentists office", + "de": "eine Zahnarztpraxis", + "nl": "een tandartspraktijk", + "fr": "un cabinet de dentistes", + "ca": "una clínica dental", + "cs": "zubní ordinace" + }, + "tags": [ + "amenity=dentist" + ] + } + ], "tagRenderings": [ "images", "opening_hours", @@ -60,35 +95,9 @@ "id": "name" } ], - "presets": [ - { - "title": { - "en": "a dentists office", - "de": "eine Zahnarztpraxis", - "nl": "een tandartspraktijk", - "fr": "un cabinet de dentistes", - "ca": "una clínica dental", - "cs": "zubní ordinace" - }, - "tags": [ - "amenity=dentist" - ] - } - ], "filter": [ "open_now" ], - "mapRendering": [ - { - "icon": "circle:white;./assets/layers/dentist/dentist.svg", - "iconSize": "40,40", - "location": [ - "point", - "centroid" - ], - "anchor": "center" - } - ], "deletion": true, "allowMove": true } diff --git a/assets/layers/direction/direction.json b/assets/layers/direction/direction.json index e57970e68..ae6138c44 100644 --- a/assets/layers/direction/direction.json +++ b/assets/layers/direction/direction.json @@ -10,18 +10,6 @@ "ca": "Direcció de la visualització", "cs": "Vizualizace směru" }, - "minzoom": 16, - "source": { - "osmTags": { - "or": [ - "camera:direction~*", - "direction~*" - ] - } - }, - "doNotDownload": true, - "passAllFeatures": true, - "title": null, "description": { "en": "This layer visualizes directions", "nl": "Deze laag toont de oriëntatie van een object", @@ -32,22 +20,41 @@ "ca": "Aquesta capa visualitza direccions", "cs": "Tato vrstva zobrazuje směry" }, - "tagRenderings": [], - "stroke": "0", - "presets": [], - "mapRendering": [ + "source": { + "osmTags": { + "or": [ + "camera:direction~*", + "direction~*" + ] + } + }, + "minzoom": 16, + "title": null, + "pointRendering": [ { - "icon": "direction_gradient:var(--catch-detail-color)", "iconSize": "200,200", "location": [ "point", "centroid" ], "rotation": "{_direction:numerical}deg", - "anchor": "center" - }, + "anchor": "center", + "marker": [ + { + "icon": "direction_gradient", + "color": "var(--catch-detail-color)" + } + ] + } + ], + "lineRendering": [ { "color": "--catch-detail-color" } - ] + ], + "passAllFeatures": true, + "doNotDownload": true, + "presets": [], + "tagRenderings": [], + "stroke": "0" } diff --git a/assets/layers/doctors/doctors.json b/assets/layers/doctors/doctors.json index a5dbffb53..199dbfc74 100644 --- a/assets/layers/doctors/doctors.json +++ b/assets/layers/doctors/doctors.json @@ -21,6 +21,7 @@ "source": { "osmTags": "amenity=doctors" }, + "minzoom": 13, "title": { "render": { "en": "Doctors Office {name}", @@ -31,7 +32,41 @@ "cs": "Lékařská ordinace {name}" } }, - "minzoom": 13, + "pointRendering": [ + { + "iconSize": "40,40", + "location": [ + "point", + "centroid" + ], + "anchor": "center", + "marker": [ + { + "icon": "circle", + "color": "white" + }, + { + "icon": "./assets/layers/doctors/doctors.svg" + } + ] + } + ], + "lineRendering": [], + "presets": [ + { + "title": { + "en": "a doctors office", + "de": "eine Arztpraxis", + "nl": "een dokterspraktijk", + "fr": "un cabinet médical", + "ca": "un consultori mèdic", + "cs": "lékařská ordinace" + }, + "tags": [ + "amenity=doctors" + ] + } + ], "tagRenderings": [ "images", { @@ -137,35 +172,9 @@ ] } ], - "presets": [ - { - "title": { - "en": "a doctors office", - "de": "eine Arztpraxis", - "nl": "een dokterspraktijk", - "fr": "un cabinet médical", - "ca": "un consultori mèdic", - "cs": "lékařská ordinace" - }, - "tags": [ - "amenity=doctors" - ] - } - ], "filter": [ "open_now" ], - "mapRendering": [ - { - "icon": "circle:white;./assets/layers/doctors/doctors.svg", - "iconSize": "40,40", - "location": [ - "point", - "centroid" - ], - "anchor": "center" - } - ], "deletion": true, "allowMove": true } diff --git a/assets/layers/dogpark/dogpark.json b/assets/layers/dogpark/dogpark.json index fef307517..441df8a2e 100644 --- a/assets/layers/dogpark/dogpark.json +++ b/assets/layers/dogpark/dogpark.json @@ -1,5 +1,14 @@ { "id": "dogpark", + "name": { + "en": "dog parks", + "da": "hundeskove", + "de": "Hundeparks", + "es": "parques de perros", + "nl": "hondenweides", + "ca": "parcs de gossos", + "cs": "psí parky" + }, "description": "A layer showing dogparks, which are areas where dog are allowed to run without a leash", "source": { "osmTags": { @@ -15,6 +24,54 @@ } }, "minzoom": 10, + "title": { + "render": { + "en": "dog park", + "da": "hundeskov", + "de": "Hundepark", + "es": "parque para perros", + "nl": "hondenweide", + "ca": "parc per a gossos", + "cs": "psí park" + }, + "mappings": [ + { + "if": "name~*", + "then": { + "*": "{name}" + } + } + ] + }, + "pointRendering": [ + { + "location": [ + "point", + "centroid" + ], + "iconSize": "40,40", + "label": { + "mappings": [ + { + "if": "name~*", + "then": "
    {name}
    " + } + ] + }, + "anchor": "center", + "marker": [ + { + "icon": "./assets/layers/dogpark/dog-park.svg" + } + ] + } + ], + "lineRendering": [ + { + "color": "#ff0", + "width": 5 + } + ], "presets": [ { "title": { @@ -40,57 +97,6 @@ } } ], - "name": { - "en": "dog parks", - "da": "hundeskove", - "de": "Hundeparks", - "es": "parques de perros", - "nl": "hondenweides", - "ca": "parcs de gossos", - "cs": "psí parky" - }, - "title": { - "render": { - "en": "dog park", - "da": "hundeskov", - "de": "Hundepark", - "es": "parque para perros", - "nl": "hondenweide", - "ca": "parc per a gossos", - "cs": "psí park" - }, - "mappings": [ - { - "if": "name~*", - "then": { - "*": "{name}" - } - } - ] - }, - "mapRendering": [ - { - "location": [ - "point", - "centroid" - ], - "icon": "./assets/layers/dogpark/dog-park.svg", - "iconSize": "40,40", - "label": { - "mappings": [ - { - "if": "name~*", - "then": "
    {name}
    " - } - ] - }, - "anchor": "center" - }, - { - "color": "#ff0", - "width": 5 - } - ], "tagRenderings": [ { "id": "dogpark-fenced", diff --git a/assets/layers/drinking_water/drinking_water.json b/assets/layers/drinking_water/drinking_water.json index 6bf765813..f02d90815 100644 --- a/assets/layers/drinking_water/drinking_water.json +++ b/assets/layers/drinking_water/drinking_water.json @@ -14,21 +14,15 @@ "es": "Agua potable", "cs": "Pitná voda" }, - "title": { - "render": { - "en": "Drinking water", - "nl": "Drinkbaar water", - "fr": "Eau potable", - "gl": "Auga potábel", - "de": "Trinkwasserstelle", - "it": "Acqua potabile", - "ru": "Питьевая вода", - "id": "Air minum", - "hu": "Ivóvíz", - "ca": "Aigua potable", - "es": "Agua potable", - "cs": "Pitná voda" - } + "description": { + "en": "A layer showing drinking water fountains", + "nl": "Deze laag toont drinkwaterpunten", + "hu": "Ivóvizet adó kutakat megjelenítő réteg", + "de": "Eine Ebene mit Trinkwasserbrunnen", + "es": "Una capa que muestra fuentes de agua potable", + "fr": "Une couche montrant les fontaines d'eau potable", + "ca": "Una capa que mostra fonts d'aigua potable", + "cs": "Vrstva zobrazující fontány s pitnou vodou" }, "source": { "osmTags": { @@ -50,7 +44,53 @@ "_closest_other_drinking_water_id=get(feat)('_closest_other_drinking_water')?.id", "_closest_other_drinking_water_distance=Math.floor(Number(get(feat)('_closest_other_drinking_water')?.distance))" ], - "minzoom": 13, + "title": { + "render": { + "en": "Drinking water", + "nl": "Drinkbaar water", + "fr": "Eau potable", + "gl": "Auga potábel", + "de": "Trinkwasserstelle", + "it": "Acqua potabile", + "ru": "Питьевая вода", + "id": "Air minum", + "hu": "Ivóvíz", + "ca": "Aigua potable", + "es": "Agua potable", + "cs": "Pitná voda" + } + }, + "pointRendering": [ + { + "iconBadges": [ + { + "if": { + "or": [ + "operational_status=broken", + "operational_status=closed" + ] + }, + "then": "close:#c33" + } + ], + "iconSize": "40,40", + "location": [ + "point", + "centroid" + ], + "anchor": "bottom", + "marker": [ + { + "icon": "pin", + "color": "#6BC4F7" + }, + { + "icon": "./assets/layers/drinking_water/drips.svg" + } + ] + } + ], + "lineRendering": [], "presets": [ { "title": { @@ -66,6 +106,9 @@ "ca": "una font d'aigua potable", "cs": "pitná voda" }, + "description": { + "en": "Typically a drinking fountain, water tap, water well or natural spring" + }, "tags": [ "amenity=drinking_water" ] @@ -215,7 +258,6 @@ "amenity=" ] }, - "neededChangesets": 1, "nonDeleteMappings": [ { "if": { @@ -255,37 +297,5 @@ "allowMove": { "enableRelocation": false, "enableImproveAccuraccy": true - }, - "mapRendering": [ - { - "icon": "pin:#6BC4F7;./assets/layers/drinking_water/drips.svg", - "iconBadges": [ - { - "if": { - "or": [ - "operational_status=broken", - "operational_status=closed" - ] - }, - "then": "close:#c33" - } - ], - "iconSize": "40,40", - "location": [ - "point", - "centroid" - ], - "anchor": "bottom" - } - ], - "description": { - "en": "A layer showing drinking water fountains", - "nl": "Deze laag toont drinkwaterpunten", - "hu": "Ivóvizet adó kutakat megjelenítő réteg", - "de": "Eine Ebene mit Trinkwasserbrunnen", - "es": "Una capa que muestra fuentes de agua potable", - "fr": "Une couche montrant les fontaines d'eau potable", - "ca": "Una capa que mostra fonts d'aigua potable", - "cs": "Vrstva zobrazující fontány s pitnou vodou" } } diff --git a/assets/layers/elevator/elevator.json b/assets/layers/elevator/elevator.json index c051773aa..0d59e125d 100644 --- a/assets/layers/elevator/elevator.json +++ b/assets/layers/elevator/elevator.json @@ -10,10 +10,6 @@ "pl": "Winda", "cs": "Výtah" }, - "source": { - "osmTags": "highway=elevator" - }, - "minzoom": 13, "description": { "en": "This layer show elevators and asks for operational status and elevator dimensions. Useful for wheelchair accessibility information", "fr": "Ce calque montre les ascenseurs et demande l'état opérationnel et les dimensions de l'ascenseur. Utile pour les informations sur l'accessibilité en fauteuil roulant", @@ -22,6 +18,10 @@ "ca": "Aquesta capa mostra ascensors i demana l'estat operatiu i les dimensions de l'ascensor. Útil per obtenir informació sobre l'accessibilitat en cadira de rodes", "cs": "Tato vrstva zobrazuje výtahy a ptá se na provozní stav a rozměry výtahu. Užitečné pro informace o bezbariérovém přístupu" }, + "source": { + "osmTags": "highway=elevator" + }, + "minzoom": 13, "title": { "render": { "en": "Elevator", @@ -34,6 +34,53 @@ "cs": "Výtah" } }, + "pointRendering": [ + { + "iconSize": "40,40", + "location": [ + "point", + "centroid" + ], + "iconBadges": [ + { + "if": { + "or": [ + "operational_status=broken", + "operational_status=closed" + ] + }, + "then": "close:#c33" + } + ], + "anchor": "center", + "marker": [ + { + "icon": "circle", + "color": "white" + }, + { + "icon": "./assets/layers/elevator/elevator_wheelchair.svg" + } + ] + } + ], + "lineRendering": [], + "presets": [ + { + "title": { + "en": "an elevator", + "nl": "een lift", + "fr": "un ascenseur", + "de": "einen Aufzug", + "ca": "un ascensor", + "pl": "winda", + "cs": "výtah" + }, + "tags": [ + "highway=elevator" + ] + } + ], "tagRenderings": [ "images", "multilevels", @@ -300,44 +347,6 @@ } } ], - "mapRendering": [ - { - "icon": "circle:white;./assets/layers/elevator/elevator_wheelchair.svg", - "iconSize": "40,40", - "location": [ - "point", - "centroid" - ], - "iconBadges": [ - { - "if": { - "or": [ - "operational_status=broken", - "operational_status=closed" - ] - }, - "then": "close:#c33" - } - ], - "anchor": "center" - } - ], - "presets": [ - { - "title": { - "en": "an elevator", - "nl": "een lift", - "fr": "un ascenseur", - "de": "einen Aufzug", - "ca": "un ascensor", - "pl": "winda", - "cs": "výtah" - }, - "tags": [ - "highway=elevator" - ] - } - ], "units": [ { "appliesToKey": [ diff --git a/assets/layers/elongated_coin/elongated_coin.json b/assets/layers/elongated_coin/elongated_coin.json index fd3457be5..41e2e5b87 100644 --- a/assets/layers/elongated_coin/elongated_coin.json +++ b/assets/layers/elongated_coin/elongated_coin.json @@ -31,6 +31,46 @@ "cs": "Ražba mincí" } }, + "pointRendering": [ + { + "location": [ + "point", + "centroid" + ], + "iconBadges": [ + { + "if": "opening_hours~*", + "then": "icons.isOpen" + } + ], + "marker": [ + { + "icon": "circle", + "color": "#FFFFFF00" + }, + { + "icon": "./assets/themes/elongated_coin/penny.svg" + } + ] + } + ], + "lineRendering": [], + "presets": [ + { + "title": { + "en": "a penny press", + "de": "Einen Münzprägeautomaten", + "es": "una prensa de centavo", + "ca": "una premsa de cèntim", + "cs": "ražba mincí" + }, + "tags": [ + "amenity=vending_machine", + "vending=elongated_coin", + "payment:coins=yes" + ] + } + ], "tagRenderings": [ "images", "opening_hours_24_7", @@ -394,45 +434,14 @@ "level", "check_date" ], - "mapRendering": [ - { - "icon": "circle:#FFFFFF00;./assets/themes/elongated_coin/penny.svg", - "location": [ - "point", - "centroid" - ], - "iconBadges": [ - { - "if": "opening_hours~*", - "then": "icons.isOpen" - } - ] - } - ], - "presets": [ - { - "title": { - "en": "a penny press", - "de": "Einen Münzprägeautomaten", - "es": "una prensa de centavo", - "ca": "una premsa de cèntim", - "cs": "ražba mincí" - }, - "tags": [ - "amenity=vending_machine", - "vending=elongated_coin", - "payment:coins=yes" - ] - } - ], - "allowMove": { - "enableImproveAccuracy": true, - "enableRelocation": true - }, - "deletion": true, "filter": [ "open_now", "accepts_debit_cards", "accepts_credit_cards" - ] + ], + "deletion": true, + "allowMove": { + "enableImproveAccuracy": true, + "enableRelocation": true + } } diff --git a/assets/layers/entrance/entrance.json b/assets/layers/entrance/entrance.json index fae7d39b7..3d5f77edc 100644 --- a/assets/layers/entrance/entrance.json +++ b/assets/layers/entrance/entrance.json @@ -43,6 +43,66 @@ "cs": "Vchod" } }, + "pointRendering": [ + { + "location": [ + "point", + "centroid" + ], + "marker": [ + { + "icon": "circle", + "color": "white" + }, + { + "icon": { + "render": "./assets/layers/entrance/entrance.svg", + "mappings": [ + { + "if": "entrance=emergency", + "then": "./assets/layers/entrance/emergency_door.svg" + } + ] + } + } + ] + } + ], + "lineRendering": [], + "presets": [ + { + "title": { + "en": "an entrance", + "fr": "une entrée", + "de": "einen Eingang", + "nl": "een toegang", + "ca": "una entrada", + "cs": "vchod" + }, + "tags": [ + "entrance=yes" + ], + "snapToLayer": [ + "walls_and_buildings", + "pedestrian_path" + ] + }, + { + "title": { + "en": "an indoor door", + "de": "eine Innentür", + "nl": "een binnendeur", + "ca": "una porta interior", + "cs": "vnitřní dveře" + }, + "tags": [ + "indoor=door" + ], + "snapToLayer": [ + "indoors" + ] + } + ], "tagRenderings": [ "images", "level", @@ -505,57 +565,6 @@ ] } ], - "mapRendering": [ - { - "location": [ - "point", - "centroid" - ], - "icon": { - "render": "circle:white;./assets/layers/entrance/entrance.svg", - "mappings": [ - { - "if": "entrance=emergency", - "then": "circle:white;./assets/layers/entrance/emergency_door.svg" - } - ] - } - } - ], - "presets": [ - { - "title": { - "en": "an entrance", - "fr": "une entrée", - "de": "einen Eingang", - "nl": "een toegang", - "ca": "una entrada", - "cs": "vchod" - }, - "tags": [ - "entrance=yes" - ], - "snapToLayer": [ - "walls_and_buildings", - "pedestrian_path" - ] - }, - { - "title": { - "en": "an indoor door", - "de": "eine Innentür", - "nl": "een binnendeur", - "ca": "una porta interior", - "cs": "vnitřní dveře" - }, - "tags": [ - "indoor=door" - ], - "snapToLayer": [ - "indoors" - ] - } - ], "units": [ { "appliesToKey": [ diff --git a/assets/layers/etymology/etymology.json b/assets/layers/etymology/etymology.json index 863c798aa..aefe8f6ed 100644 --- a/assets/layers/etymology/etymology.json +++ b/assets/layers/etymology/etymology.json @@ -1,6 +1,5 @@ { "id": "etymology", - "#": "A layer showing all objects having etymology info (either via `name:etymology:wikidata` or `name:etymology`. The intention is that this layer is reused for a certain category to also _ask_ for information", "name": { "en": "Has etymology", "nl": "Heeft etymology info", @@ -9,7 +8,15 @@ "ca": "Té etimologia", "cs": "Má etymologii" }, - "minzoom": 12, + "description": { + "en": "All objects which have an etymology known", + "nl": "Alle lagen met een gelinkt etymology", + "de": "Alle Objekte, die eine bekannte Namensherkunft haben", + "hu": "Minden olyan objektum, amelynél ismert a nevének az eredete", + "fr": "Tous les objets dont l’étymologie est connue", + "ca": "Tots els objectes que tenen una etimologia coneguda", + "cs": "Všechny objekty, které mají známou etymologii" + }, "source": { "osmTags": { "and": [ @@ -22,22 +29,70 @@ ] } }, + "calculatedTags": [ + "_same_name_ids=closestn(feat)('*', 250, undefined, 5000)?.filter(f => f.feat.properties.name === feat.properties.name)?.map(f => f.feat.properties.id)??[]" + ], + "minzoom": 12, "title": { "render": { "*": "{name}" } }, - "description": { - "en": "All objects which have an etymology known", - "nl": "Alle lagen met een gelinkt etymology", - "de": "Alle Objekte, die eine bekannte Namensherkunft haben", - "hu": "Minden olyan objektum, amelynél ismert a nevének az eredete", - "fr": "Tous les objets dont l’étymologie est connue", - "ca": "Tots els objectes que tenen una etimologia coneguda", - "cs": "Všechny objekty, které mají známou etymologii" - }, - "calculatedTags": [ - "_same_name_ids=closestn(feat)('*', 250, undefined, 5000)?.filter(f => f.feat.properties.name === feat.properties.name)?.map(f => f.feat.properties.id)??[]" + "pointRendering": [ + { + "iconSize": "40,40", + "location": [ + "point" + ], + "anchor": "center", + "marker": [ + { + "icon": "pin", + "color": { + "render": "#05d7fcaa", + "mappings": [ + { + "if": { + "and": [ + "name:etymology=", + "name:etymology:wikidata=" + ] + }, + "then": "#fcca05aa" + } + ] + } + } + ] + } + ], + "lineRendering": [ + { + "color": { + "render": "#05d7fcaa", + "mappings": [ + { + "if": { + "and": [ + "name:etymology=", + "name:etymology:wikidata=" + ] + }, + "then": "#fcca05aa" + } + ] + }, + "fill": "no", + "width": { + "render": "8", + "mappings": [ + { + "if": "_geometry:type=Polygon", + "then": "16" + } + ] + } + } ], "tagRenderings": [ { @@ -277,53 +332,5 @@ "condition": "wikidata~*" } ], - "mapRendering": [ - { - "icon": { - "render": "pin:#05d7fcaa", - "mappings": [ - { - "if": { - "and": [ - "name:etymology=", - "name:etymology:wikidata=" - ] - }, - "then": "pin:#fcca05aa" - } - ] - }, - "iconSize": "40,40", - "location": [ - "point" - ], - "anchor": "center" - }, - { - "color": { - "render": "#05d7fcaa", - "mappings": [ - { - "if": { - "and": [ - "name:etymology=", - "name:etymology:wikidata=" - ] - }, - "then": "#fcca05aa" - } - ] - }, - "fill": "no", - "width": { - "render": "8", - "mappings": [ - { - "if": "_geometry:type=Polygon", - "then": "16" - } - ] - } - } - ] + "#": "A layer showing all objects having etymology info (either via `name:etymology:wikidata` or `name:etymology`. The intention is that this layer is reused for a certain category to also _ask_ for information" } diff --git a/assets/layers/extinguisher/extinguisher.json b/assets/layers/extinguisher/extinguisher.json index e19fbf3b7..57c5b6c8a 100644 --- a/assets/layers/extinguisher/extinguisher.json +++ b/assets/layers/extinguisher/extinguisher.json @@ -14,30 +14,6 @@ "pl": "Mapa gaśnic", "cs": "Mapa hasicích přístrojů" }, - "minzoom": 14, - "source": { - "osmTags": { - "and": [ - "emergency=fire_extinguisher" - ] - } - }, - "title": { - "render": { - "en": "Extinguishers", - "ru": "Огнетушители", - "ja": "消火器", - "nb_NO": "Brannslokkere", - "fr": "Exctincteurs", - "de": "Feuerlöscher", - "it": "Estintori", - "nl": "Brandblussers", - "ca": "Extintors", - "es": "Extintores", - "pl": "Gaśnice", - "cs": "Hasicí přístroje" - } - }, "description": { "en": "Map layer to show fire extinguishers.", "ja": "消火栓を表示するマップレイヤ。", @@ -54,6 +30,82 @@ "pl": "Warstwa mapy pokazująca gaśnice.", "cs": "Mapová vrstva pro zobrazení hasicích přístrojů." }, + "source": { + "osmTags": { + "and": [ + "emergency=fire_extinguisher" + ] + } + }, + "minzoom": 14, + "title": { + "render": { + "en": "Extinguishers", + "ru": "Огнетушители", + "ja": "消火器", + "nb_NO": "Brannslokkere", + "fr": "Exctincteurs", + "de": "Feuerlöscher", + "it": "Estintori", + "nl": "Brandblussers", + "ca": "Extintors", + "es": "Extintores", + "pl": "Gaśnice", + "cs": "Hasicí přístroje" + } + }, + "pointRendering": [ + { + "iconSize": "20,20", + "location": [ + "point", + "centroid" + ], + "anchor": "center", + "marker": [ + { + "icon": "./assets/themes/hailhydrant/Twemoji12_1f9ef.svg" + } + ] + } + ], + "lineRendering": [], + "presets": [ + { + "tags": [ + "emergency=fire_extinguisher" + ], + "title": { + "en": "a fire extinguisher", + "ja": "消火器", + "nb_NO": "en brannslukker", + "ru": "огнетушитель", + "fr": "une extincteur", + "de": "einen Feuerlöscher", + "it": "una estintore", + "nl": "een brandblusser", + "da": "en ildslukker", + "es": "un extintor", + "ca": "un extintor", + "pl": "gaśnica", + "cs": "hasicí přístroj" + }, + "description": { + "en": "A fire extinguisher is a small, portable device used to stop a fire", + "ja": "消火器は、火災を止めるために使用される小型で携帯可能な装置である", + "ru": "Огнетушитель - небольшое переносное устройство для тушения огня", + "fr": "Un extincteur est un appareil portatif servant à éteindre un feu", + "de": "Ein Feuerlöscher ist ein kleines, tragbares Gerät, das dazu dient, ein Feuer zu löschen", + "it": "Un estintore è un dispositivo portatile di piccole dimensioni usato per spegnere un incendio", + "nl": "Een brandblusser is een klein, draagbaar apparaat om een brand te blussen", + "da": "En ildslukker er en lille, bærbar beholder, der bruges til at stoppe en brand", + "es": "Un extintor es un dispositivo pequeño y portátil utilizado para parar un fuego", + "ca": "Un extintor és un dispositiu petit i portàtil utilitzat per a para un foc", + "pl": "Gaśnica to małe, przenośne urządzenie do gaszenia ognia", + "cs": "Hasicí přístroj je malé přenosné zařízení používané k zastavení požáru" + } + } + ], "tagRenderings": [ { "id": "extinguisher-location", @@ -134,52 +186,5 @@ } }, "images" - ], - "presets": [ - { - "tags": [ - "emergency=fire_extinguisher" - ], - "title": { - "en": "a fire extinguisher", - "ja": "消火器", - "nb_NO": "en brannslukker", - "ru": "огнетушитель", - "fr": "une extincteur", - "de": "einen Feuerlöscher", - "it": "una estintore", - "nl": "een brandblusser", - "da": "en ildslukker", - "es": "un extintor", - "ca": "un extintor", - "pl": "gaśnica", - "cs": "hasicí přístroj" - }, - "description": { - "en": "A fire extinguisher is a small, portable device used to stop a fire", - "ja": "消火器は、火災を止めるために使用される小型で携帯可能な装置である", - "ru": "Огнетушитель - небольшое переносное устройство для тушения огня", - "fr": "Un extincteur est un appareil portatif servant à éteindre un feu", - "de": "Ein Feuerlöscher ist ein kleines, tragbares Gerät, das dazu dient, ein Feuer zu löschen", - "it": "Un estintore è un dispositivo portatile di piccole dimensioni usato per spegnere un incendio", - "nl": "Een brandblusser is een klein, draagbaar apparaat om een brand te blussen", - "da": "En ildslukker er en lille, bærbar beholder, der bruges til at stoppe en brand", - "es": "Un extintor es un dispositivo pequeño y portátil utilizado para parar un fuego", - "ca": "Un extintor és un dispositiu petit i portàtil utilitzat per a para un foc", - "pl": "Gaśnica to małe, przenośne urządzenie do gaszenia ognia", - "cs": "Hasicí přístroj je malé přenosné zařízení používané k zastavení požáru" - } - } - ], - "mapRendering": [ - { - "icon": "./assets/themes/hailhydrant/Twemoji12_1f9ef.svg", - "iconSize": "20,20", - "location": [ - "point", - "centroid" - ], - "anchor": "center" - } ] } diff --git a/assets/layers/filters/filters.json b/assets/layers/filters/filters.json index 07437d4c2..20173e4eb 100644 --- a/assets/layers/filters/filters.json +++ b/assets/layers/filters/filters.json @@ -1,8 +1,9 @@ { "id": "filters", "description": "This layer acts as library for common filters", - "mapRendering": null, "source": "special:library", + "pointRendering": null, + "lineRendering": null, "filter": [ { "id": "open_now", diff --git a/assets/layers/fire_station/fire_station.json b/assets/layers/fire_station/fire_station.json index b65a77711..399841191 100644 --- a/assets/layers/fire_station/fire_station.json +++ b/assets/layers/fire_station/fire_station.json @@ -13,7 +13,18 @@ "ca": "Mapa de parcs de bombers", "cs": "Mapa požárních stanic" }, - "minzoom": 12, + "description": { + "en": "Map layer to show fire stations.", + "ja": "消防署を表示するためのマップレイヤ。", + "it": "Livello che mostra le caserme dei vigili del fuoco.", + "ru": "Слой карты, отображающий пожарные части.", + "fr": "Couche des stations de pompiers.", + "de": "Kartenebene zur Darstellung von Feuerwachen.", + "nl": "Kaartlaag die de brandweerstations toont.", + "es": "Capa del mapa que muestra parques de bomberos.", + "ca": "Capa del mapa que mostra els parcs de bombers.", + "cs": "Vrstva mapy zobrazující požární stanice." + }, "source": { "osmTags": { "and": [ @@ -21,6 +32,7 @@ ] } }, + "minzoom": 12, "title": { "render": { "en": "Fire Station", @@ -36,18 +48,58 @@ "cs": "Hasičská stanice" } }, - "description": { - "en": "Map layer to show fire stations.", - "ja": "消防署を表示するためのマップレイヤ。", - "it": "Livello che mostra le caserme dei vigili del fuoco.", - "ru": "Слой карты, отображающий пожарные части.", - "fr": "Couche des stations de pompiers.", - "de": "Kartenebene zur Darstellung von Feuerwachen.", - "nl": "Kaartlaag die de brandweerstations toont.", - "es": "Capa del mapa que muestra parques de bomberos.", - "ca": "Capa del mapa que mostra els parcs de bombers.", - "cs": "Vrstva mapy zobrazující požární stanice." - }, + "pointRendering": [ + { + "iconSize": "35,35", + "location": [ + "point", + "centroid" + ], + "anchor": "center", + "marker": [ + { + "icon": "./assets/themes/hailhydrant/Twemoji12_1f692.svg" + } + ] + } + ], + "lineRendering": [ + { + "color": "#c22", + "width": "1" + } + ], + "presets": [ + { + "tags": [ + "amenity=fire_station" + ], + "title": { + "en": "a fire station", + "ja": "消防署", + "ru": "пожарная часть", + "fr": "une caserne de pompiers", + "de": "eine Feuerwache", + "it": "una caserma dei vigili del fuoco", + "nb_NO": "en brannstasjon", + "nl": "een brandweerstation", + "es": "un parque de bomberos", + "ca": "un parc de bombers", + "cs": "požární stanice" + }, + "description": { + "en": "A fire station is a place where the fire trucks and firefighters are located when not in operation.", + "ja": "消防署は、運転していないときに消防車や消防士がいる場所です。", + "fr": "Une caserne de pompiers est un lieu où les pompiers et leur équipements sont situés en dehors des missions.", + "de": "Eine Feuerwache ist ein Ort, an dem Feuerwehrfahrzeuge und Feuerwehrleute untergebracht sind, wenn sie nicht im Einsatz sind.", + "it": "Una caserma dei pompieri è un luogo dove si trovano i mezzi antincendio e i pompieri tra una missione e l’altra.", + "nl": "Een brandweerstation is een plaats waar brandweerwagens en brandweerlieden gebaseerd zijn.", + "es": "Un parque de bomberos es donde los bomberos y los camiones de incendios se encuentran cuando no están en uso.", + "ca": "Un parc de bombers és on els bombers i els camions es troben quan no estan en ús.", + "cs": "Hasičská zbrojnice je místo, kde se nacházejí hasičská vozidla a hasiči." + } + } + ], "tagRenderings": [ { "id": "station-name", @@ -283,51 +335,5 @@ ] }, "images" - ], - "presets": [ - { - "tags": [ - "amenity=fire_station" - ], - "title": { - "en": "a fire station", - "ja": "消防署", - "ru": "пожарная часть", - "fr": "une caserne de pompiers", - "de": "eine Feuerwache", - "it": "una caserma dei vigili del fuoco", - "nb_NO": "en brannstasjon", - "nl": "een brandweerstation", - "es": "un parque de bomberos", - "ca": "un parc de bombers", - "cs": "požární stanice" - }, - "description": { - "en": "A fire station is a place where the fire trucks and firefighters are located when not in operation.", - "ja": "消防署は、運転していないときに消防車や消防士がいる場所です。", - "fr": "Une caserne de pompiers est un lieu où les pompiers et leur équipements sont situés en dehors des missions.", - "de": "Eine Feuerwache ist ein Ort, an dem Feuerwehrfahrzeuge und Feuerwehrleute untergebracht sind, wenn sie nicht im Einsatz sind.", - "it": "Una caserma dei pompieri è un luogo dove si trovano i mezzi antincendio e i pompieri tra una missione e l’altra.", - "nl": "Een brandweerstation is een plaats waar brandweerwagens en brandweerlieden gebaseerd zijn.", - "es": "Un parque de bomberos es donde los bomberos y los camiones de incendios se encuentran cuando no están en uso.", - "ca": "Un parc de bombers és on els bombers i els camions es troben quan no estan en ús.", - "cs": "Hasičská zbrojnice je místo, kde se nacházejí hasičská vozidla a hasiči." - } - } - ], - "mapRendering": [ - { - "icon": "./assets/themes/hailhydrant/Twemoji12_1f692.svg", - "iconSize": "35,35", - "location": [ - "point", - "centroid" - ], - "anchor": "center" - }, - { - "color": "#c22", - "width": "1" - } ] } diff --git a/assets/layers/fitness_centre/fitness_centre.json b/assets/layers/fitness_centre/fitness_centre.json index a0b0b7535..9a49bfd6c 100644 --- a/assets/layers/fitness_centre/fitness_centre.json +++ b/assets/layers/fitness_centre/fitness_centre.json @@ -33,6 +33,48 @@ } ] }, + "pointRendering": [ + { + "location": [ + "point", + "centroid" + ], + "iconSize": "40,40", + "label": "
    {name}
    ", + "iconBadges": [ + { + "if": "opening_hours~*", + "then": "icons.isOpen" + } + ], + "anchor": "center", + "marker": [ + { + "icon": "circle", + "color": "white" + }, + { + "icon": "./assets/layers/fitness_centre/gym.svg" + } + ] + } + ], + "lineRendering": [], + "presets": [ + { + "tags": [ + "leisure=fitness_centre" + ], + "title": { + "en": "a fitness centre", + "de": "ein Fitnessstudio", + "nl": "een fitness-centrum", + "ca": "un centre de fitness", + "cs": "fitness centra" + }, + "icon": "./assets/layers/fitness_centre/gym.svg" + } + ], "tagRenderings": [ { "id": "name", @@ -83,39 +125,6 @@ "level", "reviews" ], - "presets": [ - { - "tags": [ - "leisure=fitness_centre" - ], - "title": { - "en": "a fitness centre", - "de": "ein Fitnessstudio", - "nl": "een fitness-centrum", - "ca": "un centre de fitness", - "cs": "fitness centra" - }, - "icon": "./assets/layers/fitness_centre/gym.svg" - } - ], - "mapRendering": [ - { - "location": [ - "point", - "centroid" - ], - "icon": "circle:white;./assets/layers/fitness_centre/gym.svg", - "iconSize": "40,40", - "label": "
    {name}
    ", - "iconBadges": [ - { - "if": "opening_hours~*", - "then": "icons.isOpen" - } - ], - "anchor": "center" - } - ], "filter": [ "open_now" ] diff --git a/assets/layers/fitness_station/fitness_station.json b/assets/layers/fitness_station/fitness_station.json index b00fda19f..f13d6d47e 100644 --- a/assets/layers/fitness_station/fitness_station.json +++ b/assets/layers/fitness_station/fitness_station.json @@ -37,6 +37,53 @@ } ] }, + "pointRendering": [ + { + "location": [ + "point", + "centroid" + ], + "iconSize": "40,40", + "iconBadges": [ + { + "if": { + "and": [ + "opening_hours!=24/7", + "opening_hours~*" + ] + }, + "then": "icons.isOpen" + } + ], + "anchor": "center", + "marker": [ + { + "icon": "circle", + "color": "white" + }, + { + "icon": "./assets/layers/fitness_station/fitness.svg" + } + ] + } + ], + "lineRendering": [], + "presets": [ + { + "tags": [ + "leisure=fitness_station", + "sport=fitness" + ], + "title": { + "en": "a fitness station", + "de": "eine Fitness-Station", + "nl": "een fitness-toestel", + "ca": "una estació de fitness", + "cs": "fitness stanice" + }, + "icon": "./assets/layers/fitness_station/fitness.svg" + } + ], "tagRenderings": [ "images", { @@ -434,44 +481,6 @@ }, "opening_hours_24_7" ], - "presets": [ - { - "tags": [ - "leisure=fitness_station", - "sport=fitness" - ], - "title": { - "en": "a fitness station", - "de": "eine Fitness-Station", - "nl": "een fitness-toestel", - "ca": "una estació de fitness", - "cs": "fitness stanice" - }, - "icon": "./assets/layers/fitness_station/fitness.svg" - } - ], - "mapRendering": [ - { - "location": [ - "point", - "centroid" - ], - "icon": "circle:white;./assets/layers/fitness_station/fitness.svg", - "iconSize": "40,40", - "iconBadges": [ - { - "if": { - "and": [ - "opening_hours!=24/7", - "opening_hours~*" - ] - }, - "then": "icons.isOpen" - } - ], - "anchor": "center" - } - ], "filter": [ "open_now" ], diff --git a/assets/layers/fixme/fixme.json b/assets/layers/fixme/fixme.json index 6fa882f34..c02eafbe6 100644 --- a/assets/layers/fixme/fixme.json +++ b/assets/layers/fixme/fixme.json @@ -7,14 +7,12 @@ "ca": "Objectes d'OSM amb etiquetes FIXME", "cs": "Objekty OSM se značkami FIXME" }, - "minzoom": 16, "description": { "en": "OSM objects that likely need to be fixed, based on a FIXME tag.", "de": "OSM-Objekte, die wahrscheinlich korrigiert werden müssen, basierend auf einem FIXME-Tag.", "ca": "Objectes OSM que probablement s'han de solucionar, basats en una etiqueta FIXME.", "cs": "Objekty OSM, které je pravděpodobně nutné opravit na základě značky FIXME." }, - "syncSelection": "theme-only", "source": { "osmTags": { "or": [ @@ -23,6 +21,7 @@ ] } }, + "minzoom": 16, "title": { "render": { "en": "OSM object with FIXME tag", @@ -32,6 +31,27 @@ "cs": "Objekt OSM s tagem FIXME" } }, + "pointRendering": [ + { + "location": [ + "centroid", + "point" + ], + "label": "
    {fixme}
    ", + "marker": [ + { + "icon": "./assets/svg/bug.svg" + } + ] + } + ], + "lineRendering": [ + { + "color": "#ff0000", + "dashArray": "5,5", + "width": 2 + } + ], "tagRenderings": [ { "id": "fixme", @@ -79,19 +99,5 @@ }, "all_tags" ], - "mapRendering": [ - { - "location": [ - "centroid", - "point" - ], - "icon": "./assets/svg/bug.svg", - "label": "
    {fixme}
    " - }, - { - "color": "#ff0000", - "dashArray": "5,5", - "width": 2 - } - ] + "syncSelection": "theme-only" } diff --git a/assets/layers/food/food.json b/assets/layers/food/food.json index 04c483eab..e3dcfa814 100644 --- a/assets/layers/food/food.json +++ b/assets/layers/food/food.json @@ -11,6 +11,16 @@ "pl": "Restauracje i fast-foody", "cs": "Restaurace a rychlé občerstvení" }, + "description": { + "en": "A layer showing restaurants and fast-food amenities (with a special rendering for friteries)", + "nl": "Een laag die restaurants en fast food toont (met een speciale weergave van frituren)", + "de": "Eine Ebene mit Restaurants und Fast-Food-Einrichtungen (mit speziellem Rendering für Pommesbuden)", + "es": "Una capa mostrando restaurantes y locales de comida rápida (con un renderizado especial para friterías)", + "fr": "Un claque montrant les restaurants et les endroits de nourriture rapide (avec un rendu spécial pour les friteries)", + "ca": "Una capa que mostra restaurants i locals de menjar ràpid (amb un renderitzat especial per a fregiduries)", + "cs": "Vrstva zobrazující restaurace a zařízení rychlého občerstvení (se speciálním vykreslením pro fritézy)", + "pl": "Warstwa przedstawiająca restauracje i obiekty typu fast-food (ze specjalnym renderowaniem dla frytek)" + }, "source": { "osmTags": { "or": [ @@ -20,78 +30,6 @@ } }, "minzoom": 12, - "presets": [ - { - "title": { - "en": "a restaurant", - "nl": "een restaurant", - "ru": "ресторан", - "de": "ein Restaurant", - "ca": "un restaurant", - "es": "un restaurante", - "fr": "un restaurant", - "pl": "restauracja", - "cs": "restaurace" - }, - "tags": [ - "amenity=restaurant" - ], - "description": { - "nl": "Een eetgegelegenheid waar je aan tafel wordt bediend", - "en": "A formal eating place with sit-down facilities selling full meals served by waiters", - "de": "Ein klassisches Speiselokal mit Sitzgelegenheiten, in dem vollständige Mahlzeiten von Kellnern serviert werden", - "es": "Un lugar de comidas formal, con mesas y sillas y que vende comidas completas servidas por camareros", - "fr": "Un lieu de restauration formel avec des installations pour s'asseoir vendant des repas complets servis par des serveurs", - "ca": "Un lloc per menjar formal amb instal·lacions per seure que venen àpats complets servits per cambrers", - "cs": "Formální jídelna s posezením, kde se prodávají kompletní jídla podávaná číšníky" - } - }, - { - "title": { - "en": "a fastfood", - "nl": "een fastfood-zaak", - "ru": "быстрое питание", - "de": "ein Schnellimbiss", - "ca": "un negoci de menjar ràpid", - "fr": "un fast-food", - "cs": "rychlé občerstvení" - }, - "tags": [ - "amenity=fast_food" - ], - "description": { - "nl": "Een zaak waar je snel bediend wordt, vaak met de focus op afhalen. Zitgelegenheid is eerder beperkt (of zelfs afwezig)", - "en": "A food business concentrating on fast counter-only service and take-away food", - "de": "Ein Lebensmittelunternehmen, das sich auf schnellen Thekendienst und Essen zum Mitnehmen konzentriert", - "es": "Un negocio de comida centrado en servicio rápido solo en mostrador y comida para llevar", - "fr": "Une entreprise alimentaire se concentrant sur le service rapide au comptoir et les plats à emporter", - "ca": "Un negoci de menjar centrat en el servei ràpid sols en mostrador i menjar per a endur", - "cs": "Potravinářský podnik se zaměřením na rychlou obsluhu u pultu a jídlo s sebou" - } - }, - { - "title": { - "en": "a fries shop", - "nl": "een frituur", - "de": "eine Pommesbude", - "fr": "Une friterie", - "ca": "una botiga de patates fregides", - "cs": "obchod s hranolky" - }, - "tags": [ - "amenity=fast_food", - "cuisine=friture" - ], - "description": { - "en": "A fast-food business focused on french fries", - "nl": "Een fastfood-zaak waar je frieten koopt", - "de": "Eine Pommesbude", - "fr": "Une restauration rapide centré sur la vente de frites", - "ca": "Un local de menjar ràpid centrat en les patates fregides", - "cs": "Podnik s rychlým občerstvením zaměřený na hranolky" - } - } - ], "title": { "render": { "en": "Restaurant", @@ -158,6 +96,150 @@ } ] }, + "pointRendering": [ + { + "iconBadges": [ + { + "if": "opening_hours~*", + "then": "icons.isOpen" + }, + { + "if": { + "or": [ + "diet:vegetarian=yes", + "diet:vegan=yes" + ] + }, + "then": { + "render": "circle:white;./assets/layers/food/Vegetarian-mark.svg" + } + }, + { + "if": { + "or": [ + "organic=yes", + "organic=only" + ] + }, + "then": { + "render": "./assets/layers/food/organic.svg" + } + } + ], + "label": { + "mappings": [ + { + "if": "name~*", + "then": "
    {name}
    " + } + ] + }, + "location": [ + "point", + "centroid" + ], + "marker": [ + { + "icon": "circle", + "color": "white" + }, + { + "icon": { + "render": "./assets/layers/food/restaurant.svg", + "mappings": [ + { + "if": { + "and": [ + "amenity=fast_food", + "cuisine=friture" + ] + }, + "then": "./assets/layers/food/fries.svg" + }, + { + "if": "amenity=fast_food", + "then": "./assets/layers/food/fastfood.svg" + } + ] + } + } + ] + } + ], + "lineRendering": [], + "presets": [ + { + "title": { + "en": "a restaurant", + "nl": "een restaurant", + "ru": "ресторан", + "de": "ein Restaurant", + "ca": "un restaurant", + "es": "un restaurante", + "fr": "un restaurant", + "pl": "restauracja", + "cs": "restaurace" + }, + "tags": [ + "amenity=restaurant" + ], + "description": { + "nl": "Een eetgegelegenheid waar je aan tafel wordt bediend", + "en": "A formal eating place with sit-down facilities selling full meals served by waiters", + "de": "Ein klassisches Speiselokal mit Sitzgelegenheiten, in dem vollständige Mahlzeiten von Kellnern serviert werden", + "es": "Un lugar de comidas formal, con mesas y sillas y que vende comidas completas servidas por camareros", + "fr": "Un lieu de restauration formel avec des installations pour s'asseoir vendant des repas complets servis par des serveurs", + "ca": "Un lloc per menjar formal amb instal·lacions per seure que venen àpats complets servits per cambrers", + "cs": "Formální jídelna s posezením, kde se prodávají kompletní jídla podávaná číšníky", + "pl": "Warstwa przedstawiająca restauracje i obiekty typu fast-food (ze specjalnym renderowaniem dla frytek)" + } + }, + { + "title": { + "en": "a fastfood", + "nl": "een fastfood-zaak", + "ru": "быстрое питание", + "de": "ein Schnellimbiss", + "ca": "un negoci de menjar ràpid", + "fr": "un fast-food", + "cs": "rychlé občerstvení" + }, + "tags": [ + "amenity=fast_food" + ], + "description": { + "nl": "Een zaak waar je snel bediend wordt, vaak met de focus op afhalen. Zitgelegenheid is eerder beperkt (of zelfs afwezig)", + "en": "A food business concentrating on fast counter-only service and take-away food", + "de": "Ein Lebensmittelunternehmen, das sich auf schnellen Thekendienst und Essen zum Mitnehmen konzentriert", + "es": "Un negocio de comida centrado en servicio rápido solo en mostrador y comida para llevar", + "fr": "Une entreprise alimentaire se concentrant sur le service rapide au comptoir et les plats à emporter", + "ca": "Un negoci de menjar centrat en el servei ràpid sols en mostrador i menjar per a endur", + "cs": "Potravinářský podnik se zaměřením na rychlou obsluhu u pultu a jídlo s sebou" + } + }, + { + "title": { + "en": "a fries shop", + "nl": "een frituur", + "de": "eine Pommesbude", + "fr": "Une friterie", + "ca": "una botiga de patates fregides", + "cs": "obchod s hranolky" + }, + "tags": [ + "amenity=fast_food", + "cuisine=friture" + ], + "description": { + "en": "A fast-food business focused on french fries", + "nl": "Een fastfood-zaak waar je frieten koopt", + "de": "Eine Pommesbude", + "fr": "Une restauration rapide centré sur la vente de frites", + "ca": "Un local de menjar ràpid centrat en les patates fregides", + "cs": "Podnik s rychlým občerstvením zaměřený na hranolky" + } + } + ], "tagRenderings": [ "images", { @@ -1256,77 +1338,5 @@ } ] }, - "allowMove": true, - "mapRendering": [ - { - "icon": { - "render": "circle:white;./assets/layers/food/restaurant.svg", - "mappings": [ - { - "if": { - "and": [ - "amenity=fast_food", - "cuisine=friture" - ] - }, - "then": "circle:white;./assets/layers/food/fries.svg" - }, - { - "if": "amenity=fast_food", - "then": "circle:white;./assets/layers/food/fastfood.svg" - } - ] - }, - "iconBadges": [ - { - "if": "opening_hours~*", - "then": "icons.isOpen" - }, - { - "if": { - "or": [ - "diet:vegetarian=yes", - "diet:vegan=yes" - ] - }, - "then": { - "render": "circle:white;./assets/layers/food/Vegetarian-mark.svg" - } - }, - { - "if": { - "or": [ - "organic=yes", - "organic=only" - ] - }, - "then": { - "render": "./assets/layers/food/organic.svg" - } - } - ], - "label": { - "mappings": [ - { - "if": "name~*", - "then": "
    {name}
    " - } - ] - }, - "location": [ - "point", - "centroid" - ] - } - ], - "description": { - "en": "A layer showing restaurants and fast-food amenities (with a special rendering for friteries)", - "nl": "Een laag die restaurants en fast food toont (met een speciale weergave van frituren)", - "de": "Eine Ebene mit Restaurants und Fast-Food-Einrichtungen (mit speziellem Rendering für Pommesbuden)", - "es": "Una capa mostrando restaurantes y locales de comida rápida (con un renderizado especial para friterías)", - "fr": "Un claque montrant les restaurants et les endroits de nourriture rapide (avec un rendu spécial pour les friteries)", - "ca": "Una capa que mostra restaurants i locals de menjar ràpid (amb un renderitzat especial per a fregiduries)", - "cs": "Vrstva zobrazující restaurace a zařízení rychlého občerstvení (se speciálním vykreslením pro fritézy)", - "pl": "Warstwa przedstawiająca restauracje i obiekty typu fast-food (ze specjalnym renderowaniem dla frytek)" - } + "allowMove": true } diff --git a/assets/layers/ghost_bike/ghost_bike.json b/assets/layers/ghost_bike/ghost_bike.json index e8eb76a28..c1ffc2e77 100644 --- a/assets/layers/ghost_bike/ghost_bike.json +++ b/assets/layers/ghost_bike/ghost_bike.json @@ -22,6 +22,15 @@ "ca": "Bicicleta fantasma", "cs": "Kola duchů" }, + "description": { + "en": "A layer showing memorials for cyclists, killed in road accidents", + "nl": "Een laag die herdenkingsplaatsen voor verongelukte fietsers toont", + "de": "Eine Ebene mit Gedenkstätten für Radfahrer, die bei Verkehrsunfällen ums Leben gekommen sind", + "fr": "Une couche affichant les mémoriaux en l'hommage de cyclistes tuées lors d'accidents de la route", + "pl": "Warstwa pokazujące miejsca upamiętnienia rowerzystów, którzy zginęli w wypadkach drogowych", + "ca": "Una capa que mostra monuments commemoratius als ciclistes morts en accidents de trànsit", + "cs": "Vrstva zobrazující pomníky pro cyklisty zabité při dopravních nehodách" + }, "source": { "osmTags": "memorial=ghost_bike" }, @@ -76,6 +85,22 @@ } ] }, + "pointRendering": [ + { + "iconSize": "40,40", + "location": [ + "point", + "centroid" + ], + "anchor": "bottom", + "marker": [ + { + "icon": "./assets/layers/ghost_bike/ghost_bike.svg" + } + ] + } + ], + "lineRendering": [], "presets": [ { "title": { @@ -289,25 +314,5 @@ "allowMove": { "enableRelocation": false, "enableImproveAccuraccy": true - }, - "mapRendering": [ - { - "icon": "./assets/layers/ghost_bike/ghost_bike.svg", - "iconSize": "40,40", - "location": [ - "point", - "centroid" - ], - "anchor": "bottom" - } - ], - "description": { - "en": "A layer showing memorials for cyclists, killed in road accidents", - "nl": "Een laag die herdenkingsplaatsen voor verongelukte fietsers toont", - "de": "Eine Ebene mit Gedenkstätten für Radfahrer, die bei Verkehrsunfällen ums Leben gekommen sind", - "fr": "Une couche affichant les mémoriaux en l'hommage de cyclistes tuées lors d'accidents de la route", - "pl": "Warstwa pokazujące miejsca upamiętnienia rowerzystów, którzy zginęli w wypadkach drogowych", - "ca": "Una capa que mostra monuments commemoratius als ciclistes morts en accidents de trànsit", - "cs": "Vrstva zobrazující pomníky pro cyklisty zabité při dopravních nehodách" } } diff --git a/assets/layers/governments/governments.json b/assets/layers/governments/governments.json index 0214e3b8f..376da3802 100644 --- a/assets/layers/governments/governments.json +++ b/assets/layers/governments/governments.json @@ -22,6 +22,7 @@ ] } }, + "minzoom": 13, "title": { "render": { "en": "Governmental Office {name}", @@ -31,7 +32,40 @@ "cs": "Vládní úřad {name}" } }, - "minzoom": 13, + "pointRendering": [ + { + "iconSize": "40,40", + "location": [ + "point", + "centroid" + ], + "anchor": "center", + "marker": [ + { + "icon": "circle", + "color": "white" + }, + { + "icon": "./assets/layers/governments/government.svg" + } + ] + } + ], + "lineRendering": [], + "presets": [ + { + "title": { + "en": "a Governmental Office", + "de": "ein Büro der öffentlichen Verwaltung", + "nl": "een overheidsdienst", + "ca": "una oficina Governamental", + "cs": "vládní úřad" + }, + "tags": [ + "office=government" + ] + } + ], "tagRenderings": [ "images", "phone", @@ -57,30 +91,5 @@ }, "id": "name" } - ], - "presets": [ - { - "title": { - "en": "a Governmental Office", - "de": "ein Büro der öffentlichen Verwaltung", - "nl": "een overheidsdienst", - "ca": "una oficina Governamental", - "cs": "vládní úřad" - }, - "tags": [ - "office=government" - ] - } - ], - "mapRendering": [ - { - "icon": "circle:white;./assets/layers/governments/government.svg", - "iconSize": "40,40", - "location": [ - "point", - "centroid" - ], - "anchor": "center" - } ] } diff --git a/assets/layers/gps_location/gps_location.json b/assets/layers/gps_location/gps_location.json index 15740cbd8..0a4a689bd 100644 --- a/assets/layers/gps_location/gps_location.json +++ b/assets/layers/gps_location/gps_location.json @@ -1,19 +1,24 @@ { "id": "gps_location", "description": "Meta layer showing the current location of the user. Add this to your theme and override the icon to change the appearance of the current location. The object will always have `id=gps` and will have _all_ the properties included in the [`Coordinates`-object](https://developer.mozilla.org/en-US/docs/Web/API/GeolocationCoordinates) (except latitude and longitude) returned by the browser, such as `speed`, `altitude`, `heading`, ....", - "minzoom": 0, "source": "special", - "mapRendering": [ + "minzoom": 0, + "pointRendering": [ { - "icon": { - "render": "crosshair:var(--catch-detail-color)", - "mappings": [ - { - "if": "speed>2", - "then": "gps_arrow" + "marker": [ + { + "color": "--catch-detail-color", + "icon": { + "render": "crosshair", + "mappings": [ + { + "if": "speed>2", + "then": "gps_arrow" + } + ] } - ] - }, + } + ], "iconSize": "40,40", "pitchAlignment": "map", "rotation": { @@ -36,5 +41,6 @@ ], "anchor": "center" } - ] + ], + "lineRendering": [] } diff --git a/assets/layers/gps_location_history/gps_location_history.json b/assets/layers/gps_location_history/gps_location_history.json index ecde04534..686b17d9b 100644 --- a/assets/layers/gps_location_history/gps_location_history.json +++ b/assets/layers/gps_location_history/gps_location_history.json @@ -1,19 +1,25 @@ { "id": "gps_location_history", - "description": "Meta layer which contains the previous locations of the user as single points. This is mainly for technical reasons, e.g. to keep match the distance to the modified object", - "minzoom": 1, "name": null, + "description": "Meta layer which contains the previous locations of the user as single points. This is mainly for technical reasons, e.g. to keep match the distance to the modified object", "source": "special", + "minzoom": 1, "shownByDefault": false, - "mapRendering": [ + "pointRendering": [ { "location": [ "point", "centroid" ], - "icon": "square:red", "iconSize": "5,5", - "anchor": "center" + "anchor": "center", + "marker": [ + { + "icon": "square", + "color": "red" + } + ] } - ] + ], + "lineRendering": [] } diff --git a/assets/layers/gps_track/gps_track.json b/assets/layers/gps_track/gps_track.json index 715294842..d3797f616 100644 --- a/assets/layers/gps_track/gps_track.json +++ b/assets/layers/gps_track/gps_track.json @@ -1,8 +1,18 @@ { "id": "gps_track", + "name": { + "en": "Your travelled track", + "nl": "Jouw afgelegde route", + "de": "Zurückgelegte Strecke", + "fr": "Votre chemin parcouru", + "da": "Dit tilbagelagte spor", + "ca": "La teva traça recorreguda", + "cs": "Vaše procestovaná trasa" + }, "description": "Meta layer showing the previous locations of the user as single line with controls, e.g. to erase, upload or download this track. Add this to your theme and override the maprendering to change the appearance of the travelled track.", - "minzoom": 0, "source": "special", + "minzoom": 0, + "shownByDefault": false, "title": { "render": { "en": "Your travelled path", @@ -13,7 +23,13 @@ "cs": "Ujetá cesta" } }, - "shownByDefault": false, + "pointRendering": [], + "lineRendering": [ + { + "width": 3, + "color": "#bb000077" + } + ], "tagRenderings": [ { "id": "Privacy notice", @@ -38,20 +54,5 @@ "render": "{clear_location_history()}" } ], - "name": { - "en": "Your travelled track", - "nl": "Jouw afgelegde route", - "de": "Zurückgelegte Strecke", - "fr": "Votre chemin parcouru", - "da": "Dit tilbagelagte spor", - "ca": "La teva traça recorreguda", - "cs": "Vaše procestovaná trasa" - }, - "mapRendering": [ - { - "width": 3, - "color": "#bb000077" - } - ], "syncSelection": "global" } diff --git a/assets/layers/guidepost/guidepost.json b/assets/layers/guidepost/guidepost.json index 8bd90e012..f96f0a53a 100644 --- a/assets/layers/guidepost/guidepost.json +++ b/assets/layers/guidepost/guidepost.json @@ -14,6 +14,25 @@ "osmTags": "information=guidepost" }, "minzoom": 14, + "title": { + "en": "Guideposts", + "cs": "Rozcestník", + "de": "Wegweiser" + }, + "pointRendering": [ + { + "location": [ + "centroid", + "point" + ], + "marker": [ + { + "icon": "./assets/layers/guidepost/guidepost.svg" + } + ], + "anchor": "bottom" + } + ], "presets": [ { "title": { @@ -35,29 +54,56 @@ ] } ], - "deletion": true, - "allowMove": { - "enableImproveAccuracy": "true", - "enableRelocation": "false" - }, - "title": { - "render": { - "en": "Guidepost", - "cs": "Rozcestník", - "de": "Wegweiser" - } - }, - "mapRendering": [ + "tagRenderings": [ + "images", { - "location": [ - "centroid", - "point" - ], - "icon": "./assets/layers/guidepost/guidepost.svg", - "anchor": "bottom" + "id": "type", + "question": { + "en": "What kind of routes are shown on this guidepost?" + }, + "multiAnswer": true, + "mappings": [ + { + "if": "bicycle=yes", + "ifnot": "bicycle=", + "then": { + "en": "This guidepost shows bicycle routes" + } + }, + { + "if": "hiking=yes", + "ifnot": "hiking=", + "then": { + "en": "This guidepost shows hiking routes" + } + }, + { + "if": "mtb=yes", + "ifnot": "mtb=", + "then": { + "en": "This guidepost shows mountain bike routes" + } + }, + { + "if": "horse=yes", + "ifnot": "horse=", + "then": { + "en": "This guidepost shows horse riding routes" + } + }, + { + "if": "ski=yes", + "ifnot": "ski=", + "then": { + "en": "This guidepost shows ski routes" + } + } + ] } ], - "tagRenderings": [ - "images" - ] + "deletion": true, + "allowMove": { + "enableImproveAccuracy": true, + "enableRelocation": false + } } diff --git a/assets/layers/guidepost/signpost_example.jpg.license b/assets/layers/guidepost/signpost_example.jpg.license deleted file mode 100644 index cd1b48769..000000000 --- a/assets/layers/guidepost/signpost_example.jpg.license +++ /dev/null @@ -1,2 +0,0 @@ -SPDX-FileCopyrightText: Mschaeuble -SPDX-License-Identifier: CC0-1.0 \ No newline at end of file diff --git a/assets/layers/hackerspace/hackerspace.json b/assets/layers/hackerspace/hackerspace.json index 8a25c8560..92ded04d6 100644 --- a/assets/layers/hackerspace/hackerspace.json +++ b/assets/layers/hackerspace/hackerspace.json @@ -12,6 +12,25 @@ "ca": "Espai hacker", "cs": "Hackerspace" }, + "description": { + "en": "Hackerspace", + "de": "Hackerspace", + "ru": "Хакерспейс", + "zh_Hant": "駭客空間", + "hu": "Hackerspace", + "es": "Espacio hacker", + "nl": "Hackerspace", + "pa_PK": "ہیکر دا تھاں", + "ca": "Espai hacker", + "cs": "Hackerspace" + }, + "source": { + "osmTags": { + "and": [ + "leisure=hackerspace" + ] + } + }, "minzoom": 8, "title": { "render": { @@ -46,18 +65,92 @@ } ] }, - "description": { - "en": "Hackerspace", - "de": "Hackerspace", - "ru": "Хакерспейс", - "zh_Hant": "駭客空間", - "hu": "Hackerspace", - "es": "Espacio hacker", - "nl": "Hackerspace", - "pa_PK": "ہیکر دا تھاں", - "ca": "Espai hacker", - "cs": "Hackerspace" - }, + "pointRendering": [ + { + "marker": [ + { + "icon": { + "render": "./assets/themes/hackerspaces/glider.svg", + "mappings": [ + { + "if": { + "and": [ + "hackerspace=makerspace" + ] + }, + "then": "./assets/themes/hackerspaces/led.png" + } + ] + } + } + ], + "iconSize": "40,40", + "location": [ + "point", + "centroid" + ], + "anchor": "center" + } + ], + "lineRendering": [ + { + "color": "#00f", + "width": "8" + } + ], + "presets": [ + { + "tags": [ + "leisure=hackerspace" + ], + "title": { + "en": "a hackerspace", + "de": "einen Hackerspace", + "ru": "Хакерспейс", + "zh_Hant": "駭客空間", + "hu": "Hackerspace", + "es": "un espacio hacker", + "nl": "een hackerspace", + "ca": "un espai hacker", + "cs": "hackerspace" + }, + "description": { + "en": "A hackerspace is an area where people interested in software gather", + "de": "Ein Hackerspace ist ein Ort, an dem sich Menschen treffen, die sich für Software interessieren", + "zh_Hant": "駭客空間是對軟體有興趣的人聚集的地方", + "hu": "A hackerspace egy olyan hely, ahol szoftverek iránt érdeklő emberek találkoznak", + "es": "Un espacio hacker es un lugar en el que gente interesada en software se reúne", + "nl": "Een hackerspace is een ruimte waar mensen met een interesse in software samenkomen", + "ca": "Un espai hacker és un lloc on la gent interesada en el software es reuneix", + "cs": "Hackerspace je oblast, kde se shromažďují lidé se zájmem o software" + } + }, + { + "tags": [ + "leisure=hackerspace", + "hackerspace=makerspace" + ], + "title": { + "en": "a makerspace", + "de": "einen Makerspace", + "zh_Hant": "創客空間", + "hu": "Makerspace", + "es": "un espacio maker", + "nl": "een makerspace", + "ca": "un espai maker" + }, + "description": { + "en": "A makerspace is a place where DIY-enthusiasts gather to experiment with electronics such as arduino, LEDstrips, …", + "de": "Ein Makerspace ist ein Ort, an dem Heimwerker-Enthusiasten zusammenkommen, um mit Elektronik zu experimentieren, wie Arduino, LED-Strips, …", + "zh_Hant": "創客空間是 DIY 愛好者聚集在一起弄電子零件實驗,例如用 arduino、LEDstrips 等...", + "hu": "A makerspace olyan hely, ahol a barkácsolás szerelmesei találkoznak, hogy olyan elektronikai eszközökkel kísérletezzenek, mint például az Arduino vagy a LEDstrips…", + "es": "Un espacio maker es un lugar donde entusiastas del DIY se reúnen para experimentar con electrónica, como arduino, …", + "nl": "Een makerspace is een ruimte waar makers en creatievelingen samenkomen om met electronica te experimenteren en te bouwen, bv. met Arduino, LED-strips, 3D-printers, lasercutters, …", + "ca": "Un espai maker és un lloc on entusiastes del DIY es reuneixen per a experimentar amb electrònica com arudino, tires LED, …", + "cs": "Makerspace je místo, kde se scházejí kutilové, aby experimentovali s elektronikou, jako je arduino, LED pásky,…" + } + } + ], "tagRenderings": [ "images", { @@ -310,93 +403,6 @@ "questions", "reviews" ], - "presets": [ - { - "tags": [ - "leisure=hackerspace" - ], - "title": { - "en": "a hackerspace", - "de": "einen Hackerspace", - "ru": "Хакерспейс", - "zh_Hant": "駭客空間", - "hu": "Hackerspace", - "es": "un espacio hacker", - "nl": "een hackerspace", - "ca": "un espai hacker", - "cs": "hackerspace" - }, - "description": { - "en": "A hackerspace is an area where people interested in software gather", - "de": "Ein Hackerspace ist ein Ort, an dem sich Menschen treffen, die sich für Software interessieren", - "zh_Hant": "駭客空間是對軟體有興趣的人聚集的地方", - "hu": "A hackerspace egy olyan hely, ahol szoftverek iránt érdeklő emberek találkoznak", - "es": "Un espacio hacker es un lugar en el que gente interesada en software se reúne", - "nl": "Een hackerspace is een ruimte waar mensen met een interesse in software samenkomen", - "ca": "Un espai hacker és un lloc on la gent interesada en el software es reuneix", - "cs": "Hackerspace je oblast, kde se shromažďují lidé se zájmem o software" - } - }, - { - "tags": [ - "leisure=hackerspace", - "hackerspace=makerspace" - ], - "title": { - "en": "a makerspace", - "de": "einen Makerspace", - "zh_Hant": "創客空間", - "hu": "Makerspace", - "es": "un espacio maker", - "nl": "een makerspace", - "ca": "un espai maker" - }, - "description": { - "en": "A makerspace is a place where DIY-enthusiasts gather to experiment with electronics such as arduino, LEDstrips, …", - "de": "Ein Makerspace ist ein Ort, an dem Heimwerker-Enthusiasten zusammenkommen, um mit Elektronik zu experimentieren, wie Arduino, LED-Strips, …", - "zh_Hant": "創客空間是 DIY 愛好者聚集在一起弄電子零件實驗,例如用 arduino、LEDstrips 等...", - "hu": "A makerspace olyan hely, ahol a barkácsolás szerelmesei találkoznak, hogy olyan elektronikai eszközökkel kísérletezzenek, mint például az Arduino vagy a LEDstrips…", - "es": "Un espacio maker es un lugar donde entusiastas del DIY se reúnen para experimentar con electrónica, como arduino, …", - "nl": "Een makerspace is een ruimte waar makers en creatievelingen samenkomen om met electronica te experimenteren en te bouwen, bv. met Arduino, LED-strips, 3D-printers, lasercutters, …", - "ca": "Un espai maker és un lloc on entusiastes del DIY es reuneixen per a experimentar amb electrònica com arudino, tires LED, …", - "cs": "Makerspace je místo, kde se scházejí kutilové, aby experimentovali s elektronikou, jako je arduino, LED pásky,…" - } - } - ], - "source": { - "osmTags": { - "and": [ - "leisure=hackerspace" - ] - } - }, - "mapRendering": [ - { - "icon": { - "render": "./assets/themes/hackerspaces/glider.svg", - "mappings": [ - { - "if": { - "and": [ - "hackerspace=makerspace" - ] - }, - "then": "./assets/themes/hackerspaces/led.png" - } - ] - }, - "iconSize": "40,40", - "location": [ - "point", - "centroid" - ], - "anchor": "center" - }, - { - "color": "#00f", - "width": "8" - } - ], - "allowMove": true, - "deletion": true + "deletion": true, + "allowMove": true } diff --git a/assets/layers/home_location/home_location.json b/assets/layers/home_location/home_location.json index d0ab06638..8b7d23b56 100644 --- a/assets/layers/home_location/home_location.json +++ b/assets/layers/home_location/home_location.json @@ -1,16 +1,25 @@ { "id": "home_location", "description": "Meta layer showing the home location of the user. The home location can be set in the [profile settings](https://www.openstreetmap.org/profile/edit) of OpenStreetMap.", - "minzoom": 0, "source": "special", - "mapRendering": [ + "minzoom": 0, + "pointRendering": [ { - "icon": "circle:white;./assets/svg/home.svg", "iconSize": "20,20", "location": [ "point", "centroid" + ], + "marker": [ + { + "icon": "circle", + "color": "white" + }, + { + "icon": "./assets/svg/home.svg" + } ] } - ] + ], + "lineRendering": [] } diff --git a/assets/layers/hospital/hospital.json b/assets/layers/hospital/hospital.json index ffd8c00fc..030ee7f12 100644 --- a/assets/layers/hospital/hospital.json +++ b/assets/layers/hospital/hospital.json @@ -9,6 +9,22 @@ "ru": "Больницы", "cs": "Nemocnice" }, + "description": { + "en": "A layer showing hospital grounds", + "de": "Eine Ebene mit Krankenhäusern", + "nl": "Een laag die ziekehuizen toont", + "ca": "Una capa que mostra els terrenys de l'hospital", + "cs": "Vrstva zobrazující areál nemocnice" + }, + "source": { + "osmTags": { + "or": [ + "amenity=hospital", + "amenity=clinic" + ] + } + }, + "minzoom": 12, "title": { "render": { "en": "Hospital", @@ -26,22 +42,31 @@ } ] }, - "description": { - "en": "A layer showing hospital grounds", - "de": "Eine Ebene mit Krankenhäusern", - "nl": "Een laag die ziekehuizen toont", - "ca": "Una capa que mostra els terrenys de l'hospital", - "cs": "Vrstva zobrazující areál nemocnice" - }, - "minzoom": 12, - "source": { - "osmTags": { - "or": [ - "amenity=hospital", - "amenity=clinic" + "pointRendering": [ + { + "iconSize": "40,40", + "location": [ + "point", + "centroid" + ], + "anchor": "center", + "marker": [ + { + "icon": "circle", + "color": "white" + }, + { + "icon": "./assets/layers/hospital/hospital.svg" + } ] } - }, + ], + "lineRendering": [ + { + "color": "#fcd862", + "width": 1 + } + ], "tagRenderings": [ { "id": "name", @@ -126,20 +151,5 @@ "cs": "

    Otevírací doba pro návštěvníky

    Běžným návštěvníkům je vstup povolen v následujících časech: {opening_hours_table(opening_hours:visitors)}

    Některá oddělení mohou mít jinou otevírací dobu. Mnohé nemocnice povolují návštěvy i v době pohotovosti.

    " } } - ], - "mapRendering": [ - { - "icon": "circle:white;./assets/layers/hospital/hospital.svg", - "iconSize": "40,40", - "location": [ - "point", - "centroid" - ], - "anchor": "center" - }, - { - "color": "#fcd862", - "width": 1 - } ] } diff --git a/assets/layers/hotel/hotel.json b/assets/layers/hotel/hotel.json index bb6438686..e5b3f1dd6 100644 --- a/assets/layers/hotel/hotel.json +++ b/assets/layers/hotel/hotel.json @@ -46,6 +46,26 @@ } ] }, + "pointRendering": [ + { + "location": [ + "point", + "centroid" + ], + "iconSize": "40,40", + "anchor": "center", + "marker": [ + { + "icon": "circle", + "color": "white" + }, + { + "icon": "./assets/layers/hotel/hotel.svg" + } + ] + } + ], + "lineRendering": [], "presets": [ { "title": { @@ -62,17 +82,6 @@ ] } ], - "mapRendering": [ - { - "location": [ - "point", - "centroid" - ], - "icon": "circle:white;./assets/layers/hotel/hotel.svg", - "iconSize": "40,40", - "anchor": "center" - } - ], "tagRenderings": [ "images", "reviews", diff --git a/assets/layers/hydrant/hydrant.json b/assets/layers/hydrant/hydrant.json index df25ae294..9049ee9e9 100644 --- a/assets/layers/hydrant/hydrant.json +++ b/assets/layers/hydrant/hydrant.json @@ -14,7 +14,20 @@ "ca": "Mapa d'hidrants", "cs": "Mapa hydrantů" }, - "minzoom": 14, + "description": { + "en": "Map layer to show fire hydrants.", + "ja": "消火栓を表示するマップレイヤ。", + "zh_Hant": "顯示消防栓的地圖圖層。", + "nb_NO": "Kartlag for å vise brannhydranter.", + "ru": "Слой карты, отображающий пожарные гидранты.", + "fr": "Couche des bornes incendie.", + "de": "Kartenebene zur Anzeige von Hydranten.", + "it": "Livello della mappa che mostra gli idranti antincendio.", + "nl": "Kaartlaag met brandkranen.", + "es": "Un mapa que muestra bocas de incendios.", + "ca": "Una capa que mostra hidrants.", + "cs": "Mapová vrstva zobrazující požární hydranty." + }, "source": { "osmTags": { "and": [ @@ -22,6 +35,7 @@ ] } }, + "minzoom": 14, "title": { "render": { "en": "Hydrant", @@ -38,20 +52,59 @@ "cs": "Hydrant" } }, - "description": { - "en": "Map layer to show fire hydrants.", - "ja": "消火栓を表示するマップレイヤ。", - "zh_Hant": "顯示消防栓的地圖圖層。", - "nb_NO": "Kartlag for å vise brannhydranter.", - "ru": "Слой карты, отображающий пожарные гидранты.", - "fr": "Couche des bornes incendie.", - "de": "Kartenebene zur Anzeige von Hydranten.", - "it": "Livello della mappa che mostra gli idranti antincendio.", - "nl": "Kaartlaag met brandkranen.", - "es": "Un mapa que muestra bocas de incendios.", - "ca": "Una capa que mostra hidrants.", - "cs": "Mapová vrstva zobrazující požární hydranty." - }, + "pointRendering": [ + { + "iconSize": "20,20", + "location": [ + "point", + "centroid" + ], + "anchor": "center", + "marker": [ + { + "icon": "./assets/themes/hailhydrant/hydrant.svg" + } + ] + } + ], + "lineRendering": [ + { + "color": "#00f", + "width": "8" + } + ], + "presets": [ + { + "tags": [ + "emergency=fire_hydrant" + ], + "title": { + "en": "a fire hydrant", + "ru": "Пожарный гидрант", + "ja": "消火栓", + "nb_NO": "en brannhydrant", + "fr": "une borne incendie", + "de": "einen Hydranten", + "it": "una idrante antincendio", + "nl": "een brandkraan", + "es": "una boca de incendios", + "ca": "un hidrant", + "cs": "požární hydrant" + }, + "description": { + "en": "A hydrant is a connection point where firefighters can tap water. It might be located underground.", + "ja": "消火栓は消防士が水を汲み上げることができる接続点です。地下にあるかもしれません。", + "fr": "Une borne incendie est un point où les pompiers peuvent s’alimenter en eau. Elle peut être enterrée.", + "de": "Ein Hydrant ist ein Anschlusspunkt, an dem die Feuerwehr Wasser zapfen kann. Er kann sich unterirdisch befinden.", + "it": "Un idrante è un punto di collegamento dove i pompieri possono estrarre acqua. Potrebbe trovarsi sottoterra.", + "nl": "Een brandkraan is een kraan waar brandweerlieden een brandslang kunnen aansluiten. Soms zit deze ondergronds.", + "es": "Una boca de incendios es un punto de conexión en el que los bomberos pueden conseguir agua. Puede situarse bajo tierra.", + "ca": "Un hidrant és un punt de connexió on els bombers poden aconseguir aigua. Pot estar baix terra.", + "ru": "Гидрант – приспособление, с помощью которого пожарные могут подключаться к водопроводу. Гидранты могут быть под землёй.", + "cs": "Hydrant je přípojné místo, odkud mohou hasiči čerpat vodu. Může být umístěn pod zemí." + } + } + ], "tagRenderings": [ { "id": "hydrant-color", @@ -494,53 +547,6 @@ }, "images" ], - "presets": [ - { - "tags": [ - "emergency=fire_hydrant" - ], - "title": { - "en": "a fire hydrant", - "ru": "Пожарный гидрант", - "ja": "消火栓", - "nb_NO": "en brannhydrant", - "fr": "une borne incendie", - "de": "einen Hydranten", - "it": "una idrante antincendio", - "nl": "een brandkraan", - "es": "una boca de incendios", - "ca": "un hidrant", - "cs": "požární hydrant" - }, - "description": { - "en": "A hydrant is a connection point where firefighters can tap water. It might be located underground.", - "ja": "消火栓は消防士が水を汲み上げることができる接続点です。地下にあるかもしれません。", - "fr": "Une borne incendie est un point où les pompiers peuvent s’alimenter en eau. Elle peut être enterrée.", - "de": "Ein Hydrant ist ein Anschlusspunkt, an dem die Feuerwehr Wasser zapfen kann. Er kann sich unterirdisch befinden.", - "it": "Un idrante è un punto di collegamento dove i pompieri possono estrarre acqua. Potrebbe trovarsi sottoterra.", - "nl": "Een brandkraan is een kraan waar brandweerlieden een brandslang kunnen aansluiten. Soms zit deze ondergronds.", - "es": "Una boca de incendios es un punto de conexión en el que los bomberos pueden conseguir agua. Puede situarse bajo tierra.", - "ca": "Un hidrant és un punt de connexió on els bombers poden aconseguir aigua. Pot estar baix terra.", - "ru": "Гидрант – приспособление, с помощью которого пожарные могут подключаться к водопроводу. Гидранты могут быть под землёй.", - "cs": "Hydrant je přípojné místo, odkud mohou hasiči čerpat vodu. Může být umístěn pod zemí." - } - } - ], - "mapRendering": [ - { - "icon": "./assets/themes/hailhydrant/hydrant.svg", - "iconSize": "20,20", - "location": [ - "point", - "centroid" - ], - "anchor": "center" - }, - { - "color": "#00f", - "width": "8" - } - ], "units": [ { "applicableUnits": [ diff --git a/assets/layers/ice_cream/ice_cream.json b/assets/layers/ice_cream/ice_cream.json new file mode 100644 index 000000000..da26f3656 --- /dev/null +++ b/assets/layers/ice_cream/ice_cream.json @@ -0,0 +1,86 @@ +{ + "id": "ice_cream", + "name": { + "en": "Ice cream parlors" + }, + "description": { + "en": "A place where ice cream is sold over the counter" + }, + "source": { + "osmTags": "amenity=ice_cream" + }, + "title": { + "render": { + "en": "Ice cream parlor" + }, + "mappings": [ + { + "if": "name~*", + "then": { + "en": "{name}" + } + } + ] + }, + "pointRendering": [ + { + "location": [ + "point", + "centroid" + ], + "marker": [ + { + "icon": "circle", + "color": "white" + }, + { + "icon": "./assets/layers/ice_cream/ice_cream.svg" + } + ] + } + ], + "lineRendering": [ + { + "width": 1, + "color": "blue" + } + ], + "presets": [ + { + "title": { + "en": "an ice cream parlor" + }, + "tags": [ + "amenity=ice_cream" + ], + "description": { + "en": "A shop where one can buy only icecream and related items. Ice cream is normally hand-scooped." + } + } + ], + "tagRenderings": [ + "images", + { + "question": { + "en": "What is the name of this ice cream parlor?", + "nl": "Wat is de naam van dit ijssalon?" + }, + "id": "1", + "freeform": { + "key": "name" + }, + "render": { + "en": "This ice cream parlor is named {name}", + "nl": "Dit ijssalon heet {name}" + } + }, + "opening_hours", + "contact", + "diets", + "payment-options", + "wheelchair-access" + ], + "credits": [ + "Pieter Vander Vennet" + ] +} diff --git a/assets/layers/ice_cream/ice_cream.svg b/assets/layers/ice_cream/ice_cream.svg new file mode 100644 index 000000000..f40ca6c48 --- /dev/null +++ b/assets/layers/ice_cream/ice_cream.svg @@ -0,0 +1,40 @@ + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/assets/layers/ice_cream/ice_cream.svg.license b/assets/layers/ice_cream/ice_cream.svg.license new file mode 100644 index 000000000..bb226dbab --- /dev/null +++ b/assets/layers/ice_cream/ice_cream.svg.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: OSM Carto +SPDX-License-Identifier: CC0-1.0 \ No newline at end of file diff --git a/assets/layers/ice_cream/license_info.json b/assets/layers/ice_cream/license_info.json new file mode 100644 index 000000000..750facfab --- /dev/null +++ b/assets/layers/ice_cream/license_info.json @@ -0,0 +1,12 @@ +[ + { + "path": "ice_cream.svg", + "license": "CC0-1.0", + "authors": [ + "OSM Carto" + ], + "sources": [ + "https://wiki.openstreetmap.org/wiki/File:Ice-cream-14.svg" + ] + } +] \ No newline at end of file diff --git a/assets/layers/icons/icons.json b/assets/layers/icons/icons.json index aeda4bc1a..88e112b99 100644 --- a/assets/layers/icons/icons.json +++ b/assets/layers/icons/icons.json @@ -8,6 +8,8 @@ }, "source": "special:library", "title": null, + "pointRendering": null, + "lineRendering": null, "tagRenderings": [ { "id": "wikipedialink", @@ -194,6 +196,5 @@ }, "render": "{rating()}" } - ], - "mapRendering": null + ] } diff --git a/assets/layers/id_presets/fas-bowl-rice.svg b/assets/layers/id_presets/fas-bowl-rice.svg new file mode 100644 index 000000000..338d333aa --- /dev/null +++ b/assets/layers/id_presets/fas-bowl-rice.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/layers/id_presets/fas-bowl-rice.svg.license b/assets/layers/id_presets/fas-bowl-rice.svg.license new file mode 100644 index 000000000..fb6d4d684 --- /dev/null +++ b/assets/layers/id_presets/fas-bowl-rice.svg.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: Font-Awesome icon set +SPDX-License-Identifier: CC-BY 4.0 \ No newline at end of file diff --git a/assets/layers/id_presets/fas-jar.svg b/assets/layers/id_presets/fas-jar.svg new file mode 100644 index 000000000..9cb936dd6 --- /dev/null +++ b/assets/layers/id_presets/fas-jar.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/layers/id_presets/fas-jar.svg.license b/assets/layers/id_presets/fas-jar.svg.license new file mode 100644 index 000000000..fb6d4d684 --- /dev/null +++ b/assets/layers/id_presets/fas-jar.svg.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: Font-Awesome icon set +SPDX-License-Identifier: CC-BY 4.0 \ No newline at end of file diff --git a/assets/layers/id_presets/fas-plate-wheat.svg b/assets/layers/id_presets/fas-plate-wheat.svg new file mode 100644 index 000000000..75a7010f9 --- /dev/null +++ b/assets/layers/id_presets/fas-plate-wheat.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/layers/id_presets/fas-plate-wheat.svg.license b/assets/layers/id_presets/fas-plate-wheat.svg.license new file mode 100644 index 000000000..fb6d4d684 --- /dev/null +++ b/assets/layers/id_presets/fas-plate-wheat.svg.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: Font-Awesome icon set +SPDX-License-Identifier: CC-BY 4.0 \ No newline at end of file diff --git a/assets/layers/id_presets/id_presets.json b/assets/layers/id_presets/id_presets.json index 152dbc7be..541bca7b9 100644 --- a/assets/layers/id_presets/id_presets.json +++ b/assets/layers/id_presets/id_presets.json @@ -3,26 +3,40 @@ "description": { "en": "Layer containing various presets and questions generated by ID. These are meant to be reused in other layers by importing the tagRenderings with `id_preset." }, - "#dont-translate": "*", "source": "special:library", "title": null, - "mapRendering": null, + "pointRendering": null, + "lineRendering": null, "tagRenderings": [ { "id": "shop_types", "mappings": [ + { + "if": "shop=vacant", + "then": { + "en": "Vacant Shop" + }, + "searchTerms": {}, + "icon": { + "path": "./assets/layers/id_presets/maki-shop.svg", + "class": "medium" + } + }, { "if": "shop=agrarian", "then": { "en": "Farm Supply Shop", "ca": "Agrobotiga", + "cs": "Farmářská prodejna", "da": "Grovvareforretning", "de": "Agrarmarkt", "eo": "Terkultur-investaĵa vendejo", "es": "Tienda de suministros agrícolas", + "eu": "Nekazal-tresna denda", "fi": "Maataloustarvikeliike", "fr": "Magasin d'agriculture", "gl": "Tenda de subministracións agrícolas", + "he": "חנות אביזרי חקלאות", "hu": "Gazdabolt", "it": "Negozio di attrezzatura agricola", "ja": "農業用品店", @@ -41,6 +55,20 @@ "fertilizer", "agricultural tools" ], + "ca": [ + "botiga de suministres agrícoles", + "tenda de suministres agrícoles", + "agrotenda", + "cooperativa agrícola" + ], + "cs": [ + "zemědělské vstupy", + "zemědělské stroje", + "semena", + "pesticidy", + "hnojiva", + "zemědělské nástroje" + ], "da": [ "korn", "landbrug", @@ -75,6 +103,14 @@ "agrícola", "agricola" ], + "eu": [ + "nekazal-tresnak", + "traktoreak", + "ongarriak", + "aitzurrak", + "atxurrak", + "makinaria" + ], "fi": [ "maatila", "maatalous", @@ -91,6 +127,9 @@ "graines", "engins agricoles" ], + "he": [ + "חנות אביזרי חקלאות" + ], "hu": [ "mezőgazdasági szaküzlet" ], @@ -111,7 +150,11 @@ "肥料", "駆除剤", "農機具", - "除草剤" + "除草剤", + "店舗", + "種子", + "種苗", + "お店" ], "nl": [ "landbouwwinkel", @@ -128,7 +171,7 @@ "landbouwwerktuigenwinkel" ], "pl": [ - "rolniczy", + "sklep rolniczy", "produkcja rolna", "pasze", "nasiona", @@ -179,13 +222,15 @@ "then": { "en": "Liquor Store", "ca": "Botiga de licors", - "da": "Vinforhandler", + "cs": "Prodejna alkoholu", + "da": "Spiritusforretning", "de": "Spirituosenladen", "eo": "Alkohola vendejo", "es": "Licorería", "fi": "Alkoholimyymälä", "fr": "Magasin de vente d'alcool", "gl": "Licoraría", + "he": "חנות משקאות חריפים", "hu": "Alkoholüzlet", "id": "Toko Minuman", "it": "Negozio di liquori", @@ -208,10 +253,20 @@ "licoreria", "botiga de licors" ], + "cs": [ + "alkohol", + "alkoholický" + ], "da": [ + "spiritusforretning", + "sprutforretning", + "spritbutik", "vinforhandler", "vinbutik", - "vinforretning" + "vinforretning", + "alkoholforretning", + "ølsalg", + "ølbutik" ], "de": [ "alkoholika", @@ -248,6 +303,9 @@ "magasin de vin", "vins & spiritueux" ], + "he": [ + "חנות משקאות" + ], "hu": [ "unikum", "pálinka", @@ -321,12 +379,15 @@ "then": { "en": "Anime / Manga Shop", "ca": "Botiga de manga / anime", + "cs": "Obchod s Anime / Mangou", + "da": "Anime/Manga-buik", "de": "Anime- / Manga-Geschäft", "eo": "Anime-/manga-vendejo", "es": "Tienda de anime / manga", "fi": "Anime-/mangaliike", "fr": "Boutique de manga et anime", "gl": "Tenda de anime / manga", + "he": "חנות אנימה/מנגה", "hu": "Anime képregényekkel kapcsolatos bolt", "it": "Negozio di Anime / Manga", "ja": "アニメショップ", @@ -338,10 +399,26 @@ }, "searchTerms": { "en": [ - "manga", - "japan", "cosplay", + "dakimakura", "figurine", + "hobby", + "japan", + "manga" + ], + "ca": [ + "tenda de manga / anime", + "otaku", + "manga", + "japó", + "kawaii", + "comic" + ], + "cs": [ + "manga", + "japonské", + "cosplay", + "figurína", "dakimakura" ], "de": [ @@ -370,6 +447,16 @@ "bd", "figurine" ], + "he": [ + "חנות אנימה", + "מנגה", + "פנאי", + "קוואי", + "קוספליי", + "משחקי תפקידים", + "פנטזיה", + "יפן" + ], "hu": [ "képregénybolt" ], @@ -380,15 +467,20 @@ "コスプレ", "マンガ", "まんが", - "アニメ店" + "アニメ店", + "店舗", + "お店", + "サブカル" ], "nl": [ "anime", "manga" ], "pl": [ + "sklep z mangą i anime", "anime", "manga", + "komiksy", "cosplay" ], "pt": [ @@ -416,30 +508,32 @@ { "if": "shop=antiques", "then": { - "en": "Antiques Shop", + "en": "Antique Shop", "ca": "Botiga d'antiguitats", + "cs": "Starožitnictví", "da": "Antikvitetsforretning", "de": "Antiquitätenhändler", - "eo": "Antikvaĵa vendejo", "es": "Tienda de antigüedades", - "fi": "Antiikkiliike", + "fi": "Antikvariaatti", "fr": "Antiquaire", - "gl": "Tenda de antigüidades", + "he": "חנות עתיקות", "hu": "Régiségkereskedés", - "id": "Toko Barang Antik", - "it": "Antiquario", + "it": "Negozio di oggetti antichi", "ja": "古美術品店", - "nl": "Antiquair", - "pl": "Antykwariat", + "nl": "Antiekwinkel", + "pl": "Sklep z antykami", "pt": "Loja de antiguidades", - "ru": "Магазин антиквариата", - "sl": "Starinarnica", + "ru": "Антиквариат", "sv": "Antikaffär" }, "searchTerms": { - "da": [ - "antikvitetsforretning", - "antikvitetsbutik" + "ca": [ + "tenda d'antiguitats", + "antiquari", + "vintage", + "història", + "vell", + "antic" ], "de": [ "antiquitätengeschäft", @@ -447,46 +541,54 @@ "antiquitätenhandel", "antiquitätenladen" ], - "eo": [ - "antikvaĵejo", - "antikvajhejo", - "antikvajxejo" - ], "es": [ "antigüedades", + "antiguedades", "anticuario", - "colecciones", - "muebles antiguos", - "objetos antiguos", - "cuadros", - "pinturas", - "subastas" + "antiguo", + "antigualla" ], "fr": [ + "anticaire", + "magasin", + "antiquité", + "vieillerie", "brocante" ], + "he": [ + "חנות ענתיקות", + "ישן", + "ענתיקה", + "מיושן", + "עתיק" + ], "hu": [ - "antikvitás", - "antikvárium", - "ószeres" + "antikvitás" ], "it": [ + "anticaglia", + "antichi", "antichità", - "mobili antichi" + "desueti", + "disuso" ], "ja": [ "古美術品店", - "アンティークショップ", - "美術", - "アート", - "古美術", - "骨董品店" + "古美術商", + "骨董品店", + "店舗", + "お店", + "アンティーク" ], "nl": [ - "antiekwinkel" + "antiekhandelaar", + "antiquair", + "antiquaar", + "antiquariaat" ], "pl": [ "sklep z antykami", + "antykwariat", "antyki" ], "pt": [ @@ -497,13 +599,6 @@ "relíquia", "relíquias" ], - "ru": [ - "атниквариат" - ], - "sl": [ - "starinarnica", - "antikvariat" - ], "sv": [ "antikaffär", "antikshop", @@ -521,6 +616,8 @@ "if": "shop=appliance", "then": { "en": "Appliance Store", + "ca": "Botiga d'electrodomèstics", + "cs": "Prodejna spotřební elektroniky", "da": "Hvidevareforretning", "de": "Haushaltselektrogerätegeschäft", "eo": "Elektronikaĵega vendejo", @@ -528,6 +625,7 @@ "fi": "Kodinkonemyymälä", "fr": "Magasin d'électroménager", "gl": "Tenda de electrodomésticos", + "he": "חנות כלים חשמלים", "hu": "Háztartásigép-bolt", "it": "Negozio di elettrodomestici", "ja": "白物家電販売店(大型製品)", @@ -552,7 +650,38 @@ "refrigerator", "stove", "washer", - "washing machine" + "washing machine", + "white goods" + ], + "ca": [ + "tenda d'electrodomèstics", + "electrodomèstic", + "aire condicionat", + "secadora", + "rentadora", + "llavadora", + "congelador", + "nevera", + "forn", + "estufa", + "refrigerador", + "cafetera", + "televisió" + ], + "cs": [ + "klimatizace", + "spotřebič", + "myčka", + "sušička", + "mraznička", + "lednička", + "gril", + "kuchyně", + "trouba", + "lednice", + "sporák", + "pračka", + "prací stroj" ], "da": [ "hvidevare", @@ -666,6 +795,9 @@ "réfrigérateur", "climatiseur" ], + "he": [ + "חנות כלים חשמלים" + ], "hu": [ "háztartási", "gép", @@ -693,7 +825,11 @@ "生活家電", "冷蔵庫", "洗濯機", - "電機屋" + "電機屋", + "家電", + "電気店", + "電器店", + "お店" ], "nl": [ "huisraadwinkel", @@ -773,6 +909,7 @@ "then": { "en": "Art Store", "ca": "Botiga d'art", + "cs": "Obchod s uměním", "da": "Kunstbutik", "de": "Kunsthandlung", "eo": "Artaĵa vendejo", @@ -780,6 +917,7 @@ "fi": "Taideliike", "fr": "Marchand d'art", "gl": "Tenda de arte", + "he": "חנות לחפצי אומנות", "hu": "Művészeti bolt", "it": "Negozio di opere d'arte", "ja": "美術品販売店", @@ -792,10 +930,24 @@ }, "searchTerms": { "en": [ - "art*", - "exhibit*", + "art", + "exhibition", "gallery" ], + "ca": [ + "art", + "exhibit", + "galeria", + "galeria d'art", + "exhibició" + ], + "cs": [ + "obchod s uměním", + "umění", + "galerie", + "umělecká galerie", + "prodejní galerie" + ], "da": [ "kunstbutik", "galleributik" @@ -827,6 +979,9 @@ "artiste", "exposition" ], + "he": [ + "חנות למוצרי אומנות" + ], "hu": [ "művészbolt", "művészellátó" @@ -900,6 +1055,7 @@ "then": { "en": "Baby Goods Store", "ca": "Botiga per a nadons", + "cs": "Potřeby pro děti", "da": "Babyudstyrsbutik", "de": "Babysachengeschäft", "eo": "Bebaĵa vendejo", @@ -907,6 +1063,7 @@ "fi": "Vauvatarvikeliike", "fr": "Magasin de produits pour bébés", "gl": "Tenda de produtos para meniños", + "he": "חנות לדברי תינוקות", "hu": "Bababolt", "id": "Toko Perlengkapan Bayi", "it": "Negozio di prodotti per l'infanzia", @@ -919,6 +1076,27 @@ "sv": "Babyprodukter" }, "searchTerms": { + "ca": [ + "botiga per a bebès", + "tenda per a bebès", + "tenda per a nadons", + "bebè", + "nadó", + "bebé", + "puericultura" + ], + "cs": [ + "děti", + "dítě", + "miminko", + "mimino", + "plína", + "plíny", + "plínka", + "plínky", + "kojenecké potřeby", + "dětská výživa" + ], "da": [ "babyudstyrsbutik", "babyudstyrsforretning" @@ -961,6 +1139,9 @@ "meniños", "bebés" ], + "he": [ + "חנות לציוד תינוקות" + ], "hu": [ "babaruha", "babakocsi", @@ -983,6 +1164,7 @@ "babykledijwinkel" ], "pl": [ + "sklep z artykułami dla dzieci i niemowląt", "akcesoria dla dzieci i niemowląt", "sklep dziecięcy", "artykuły dziecięce", @@ -1034,14 +1216,16 @@ "if": "shop=bag", "then": { "en": "Bag/Luggage Store", - "ca": "Botiga d'equipatges", + "ca": "Botiga d'equipatges o bosses", + "cs": "Obchod se zavazadly", "da": "Taske/Kuffertbutik", - "de": "Taschenladen", + "de": "Taschengeschäft", "eo": "Saka/valiza vendejo", "es": "Tienda de bolsos / equipaje", "fi": "Matkalaukkumyymälä", "fr": "Bagagerie", "gl": "Tenda de maletas", + "he": "חנות מזוודות", "hu": "Táska- és bőröndbolt", "id": "Toko Tas/Koper", "it": "Negozio di borse e valigie", @@ -1058,15 +1242,41 @@ "handbag", "purse" ], + "ca": [ + "bolso", + "maleta", + "bossa", + "complements", + "cartera", + "equipatge", + "moneder", + "tenda d'equipatges o bosses" + ], + "cs": [ + "zavazadlo", + "zavazadla", + "kufr", + "kufry", + "batoh", + "batohy", + "brašna", + "brašny", + "brašnář", + "cestovní" + ], "da": [ "taskebutik", "kuffertbutik", "lædervareforretning" ], "de": [ - "taschengeschäft", - "taschen/koffer-geschäft", - "reisegepäckgeschäft" + "taschen", + "koffer", + "reisegepäck", + "rollkoffer", + "reisetaschen", + "handtaschen", + "umhängetaschen" ], "eo": [ "sakoj", @@ -1100,6 +1310,9 @@ "fr": [ "vente de bagages" ], + "he": [ + "חנות מזוודות" + ], "hu": [ "bőrdíszmű és táskabolt", "koffer", @@ -1123,6 +1336,8 @@ "reiskofferwinkel" ], "pl": [ + "sklep z torebkami", + "sklep z walizkami", "torebki", "torby", "walizki", @@ -1163,13 +1378,16 @@ "then": { "en": "Bakery", "ca": "Fleca", + "cs": "Pekařství", "da": "Bager", "de": "Bäckerei", "eo": "Panejo", "es": "Panadería", + "eu": "Okindegia", "fi": "Leipomo", "fr": "Boulangerie", "gl": "Panadaría", + "he": "מאפייה", "hu": "Pékség", "id": "Toko Roti", "it": "Panificio", @@ -1193,6 +1411,11 @@ "pastisseria", "forn" ], + "cs": [ + "chleba", + "dorty", + "rohlíky" + ], "da": [ "bager", "bageri" @@ -1218,9 +1441,20 @@ "bollería", "bollo" ], + "eu": [ + "okindegia", + "ogia", + "okina" + ], + "fi": [ + "leipomo" + ], "fr": [ "boulangerie" ], + "he": [ + "מאפייה" + ], "hu": [ "pogácsa", "kifli", @@ -1252,6 +1486,7 @@ ], "pl": [ "piekarnia", + "sklep z pieczywem", "pieczywo", "chleb", "bułki" @@ -1270,7 +1505,10 @@ ], "sl": [ "pekarija", - "pek" + "pek", + "kruh", + "pecivo", + "hrana" ], "sv": [ "bageri", @@ -1290,6 +1528,7 @@ "then": { "en": "Bathroom Furnishing Store", "ca": "Botiga de mobles de bany", + "cs": "Vybavení koupelen", "da": "Badeværelseindretningsbutik", "de": "Badeinrichtungsgeschäft", "eo": "Lavĉambr-akcesoraĵa vendejo", @@ -1297,6 +1536,7 @@ "fi": "Kylpyhuoneliike", "fr": "Fournitures pour salles de bain", "gl": "Tenda de mobles de baño", + "he": "חנות רהיטי שירותים/מקלחת", "hu": "Fürdőszobafelszerelés-bolt", "id": "Toko Perlengkapan Kamar Mandi", "it": "Negozio di prodotti per il bagno", @@ -1309,6 +1549,11 @@ "sv": "Badrumsinredning" }, "searchTerms": { + "cs": [ + "koupelna", + "koupelny", + "vybavení koupelen" + ], "da": [ "badeværelseindretningsbutik" ], @@ -1341,6 +1586,9 @@ "fr": [ "fournitures pour salles de bain" ], + "he": [ + "חנות ריהוט לשירותים/מקלחת" + ], "hu": [ "szaniter", "csaptelep", @@ -1358,6 +1606,7 @@ "sanitairwinkel" ], "pl": [ + "sklep z wyposażeniem łazienek", "łazienki", "wyposażenie łazienek", "meble łazienkowe", @@ -1399,7 +1648,8 @@ "if": "shop=beauty", "then": { "en": "Beauty Shop", - "ca": "Botiga de cosmètics", + "ca": "Saló de bellesa", + "cs": "Kosmetický salón", "da": "Skønhedsforhandler", "de": "Schönheitssalon", "eo": "Salono de beligado", @@ -1407,6 +1657,7 @@ "fi": "Kauneushoitola", "fr": "Salon de beauté", "gl": "Salón de beleza", + "he": "חנות מוצרי יופי/טיפוח", "hu": "Szépségszalon", "id": "Salon Kecantikan", "it": "Salone di bellezza", @@ -1424,6 +1675,21 @@ "salon", "tanning" ], + "ca": [ + "estètica", + "spa", + "saló", + "broncejat" + ], + "cs": [ + "kosmetický salón", + "kadeřnictví", + "vizážista", + "kosmetika", + "salón krásy", + "nehty", + "depilace" + ], "da": [ "parfume", "skønhed", @@ -1454,7 +1720,11 @@ ], "fr": [ "salon de beauté", - "institut de beauté" + "institut de beauté", + "épilation" + ], + "he": [ + "חנות מוצרי יופיטיפוח" ], "hu": [ "kozmetikus" @@ -1483,15 +1753,18 @@ "ja": [ "美容サービス", "エステサロン", - "ネイルサロン" + "ネイルサロン", + "サービス", + "店舗", + "お店" ], "nl": [ "schoonheidswinkel", "schoonheidsspeciaalzaak" ], "pl": [ - "salon piękności", "salon urody", + "salon piękności", "salon kosmetyczny", "gabinet kosmetyczny", "zakład kosmetyczny", @@ -1553,6 +1826,7 @@ "then": { "en": "Bedding/Mattress Store", "ca": "Botiga de matalassos", + "cs": "Prodejna postelí", "da": "Sengetøj / Madras forhandler", "de": "Betten/Matratzengeschäft", "eo": "Lita/matraca vendejo", @@ -1560,6 +1834,7 @@ "fi": "Vuodetarvikeliike", "fr": "Magasin de literie", "gl": "Tenda de colchóns/roupa de cama", + "he": "חנות מזרנים", "hu": "Ágy- és matracbolt", "id": "Toko Selimut/Matras", "it": "Negozio di letti/materassi", @@ -1572,8 +1847,24 @@ "sv": "Sängaffär" }, "searchTerms": { + "en": [ + "bed", + "duvet", + "mattress", + "pillow" + ], + "cs": [ + "postel", + "postele", + "matrace", + "lůžko", + "lůžka", + "spaní", + "spánek" + ], "da": [ - "sengetøj / madras forhandler" + "sengetøj / madras forhandler", + "sengeforhandler" ], "de": [ "matratzengeschäft", @@ -1619,6 +1910,10 @@ "vente de literie", "vente de matelas" ], + "he": [ + "חנות אביזרי שינה", + "חנות מזרנים" + ], "hu": [ "hálószobabútor", "ágy", @@ -1647,7 +1942,13 @@ "ふとん", "布団", "ふとん店", - "ベッド" + "ベッド", + "毛布", + "お店", + "店舗", + "寝具", + "シーツ", + "マットレス" ], "nl": [ "beddenzaak", @@ -1657,6 +1958,7 @@ "matrassenwinkel" ], "pl": [ + "sklep z łóżkami/materacami", "łóżka", "materace", "pościel", @@ -1696,13 +1998,15 @@ "then": { "en": "Beverage Store", "ca": "Botiga de begudes", - "da": "Vinforhandler", + "cs": "Prodejna nápojů", + "da": "Drikkevarebutik", "de": "Getränkehandel", "eo": "Trinkaĵa vendejo", "es": "Tienda de bebidas", "fi": "Viinakauppa", "fr": "Magasin de boissons", "gl": "Tenda de bebidas", + "he": "חנות משקאות", "hu": "Italbolt", "id": "Toko Minuman", "it": "Negozio di bevande", @@ -1721,9 +2025,20 @@ "ca": [ "licoreria" ], + "cs": [ + "prodejna nápojů", + "obchod s nápoji", + "nápoje", + "pití", + "malinovka", + "kofola", + "občerstvení", + "nealkoholické nápoje" + ], "da": [ - "vinforhandler", - "vinforretning" + "drikkevarebutik", + "drikkevareforretning", + "flaskebutik" ], "de": [ "getränkehandlung", @@ -1745,6 +2060,9 @@ "fr": [ "magasin de vins et spiritueux" ], + "he": [ + "חנות משקאות" + ], "hu": [ "pálinka", "whiskey", @@ -1805,13 +2123,15 @@ "then": { "en": "Bicycle Shop", "ca": "Botiga de bicicletes", - "da": "Cykelbutik", + "cs": "Cykloprodejna", + "da": "Cykelhandler", "de": "Fahrradladen", "eo": "Bicikla vendejo", "es": "Tienda de bicicletas", "fi": "Pyöräliike", "fr": "Magasin de vélos", "gl": "Tenda de bicicletas", + "he": "חנות אופניים", "hu": "Kerékpárbolt", "id": "Toko Sepeda", "it": "Negozio di biciclette", @@ -1828,12 +2148,25 @@ "bicycle store", "bike", "bike store", + "hobby", "repair", "tricycle", "unicycle" ], "ca": [ - "botiga de bicicletes" + "tenda de bicicletes", + "ciclisme", + "bicicleta", + "reparació", + "taller" + ], + "cs": [ + "obchod s koly", + "kola", + "horská kola", + "jízdní kola", + "cyklistika", + "cykloprodejna" ], "da": [ "cykelforretning", @@ -1875,6 +2208,9 @@ "fr": [ "magasin de vélo" ], + "he": [ + "חנות אופניים" + ], "hu": [ "bicaj", "bringa", @@ -1893,7 +2229,12 @@ "自転車店", "自転車", "自転車屋", - "二輪" + "二輪", + "パンク修理", + "空気入れ", + "店舗", + "お店", + "サービス" ], "nl": [ "fietsenwinkel", @@ -1939,6 +2280,7 @@ "then": { "en": "Boat Store", "ca": "Botiga de nàutica", + "cs": "Prodejna lodí", "da": "Bådforhandler", "de": "Bootsgeschäft", "eo": "Boat‑vendejo", @@ -1946,6 +2288,7 @@ "fi": "Venekauppa", "fr": "Magasin de bateaux", "gl": "Tenda de embarcacións", + "he": "חנות סירות", "hu": "Hajósbolt", "it": "Negozio di barche", "ja": "ボート店", @@ -1958,6 +2301,7 @@ "searchTerms": { "en": [ "fishing boat", + "hobby", "jetski", "motorboat", "rowboat", @@ -1965,6 +2309,15 @@ "vessel", "watercraft" ], + "cs": [ + "rybářský člun", + "vodní skútr", + "motorový člun", + "veslice", + "plachetnice", + "nádoba", + "plavidlo" + ], "da": [ "fiskebåd", "kutter", @@ -2016,12 +2369,19 @@ "embarcacion", "barcos" ], + "he": [ + "חנות שייט", + "סירות" + ], "ja": [ "ボート店", "お店", "店舗", "ショッピング", - "小売" + "小売", + "ボート", + "船", + "舟" ], "nl": [ "visboot", @@ -2083,7 +2443,8 @@ "if": "shop=bookmaker", "then": { "en": "Bookmaker", - "ca": "Cusidor de llibres", + "ca": "Casa d'apostes", + "cs": "Sázková kancelář", "da": "Bookmaker", "de": "Wettbüro", "eo": "Vetperistejo", @@ -2091,12 +2452,13 @@ "fi": "Kirjapaino", "fr": "Bookmaker", "gl": "Corredor de apostas", + "he": "כורך ספרים", "hu": "Fogadóiroda", "id": "Juru Taruh", "it": "Agenzia di scommesse", "ja": "公営競技投票券売り場", "nl": "Bookmaker (gokkantoor)", - "pl": "Zakład bukmacherski", + "pl": "Bukmacher", "pt": "Casa de apostas", "ru": "Букмекерская контора", "sl": "Stavnica", @@ -2105,10 +2467,28 @@ "searchTerms": { "en": [ "betting", - "bookie", "gamble", - "gambling", - "turf accountant" + "gambling" + ], + "ca": [ + "apostes", + "joc d'atzar", + "escurabujaques", + "jocs d'atzar", + "apostar", + "joc", + "saló", + "sala" + ], + "cs": [ + "sázková kancelář", + "sázky", + "sázení", + "kurzové sázení", + "bookmaker", + "sazka", + "tipsport", + "fortuna" ], "da": [ "bookmaker" @@ -2123,7 +2503,10 @@ "es": [ "apuesta", "dinero", - "apostador" + "apostador", + "juego", + "casa de apuestas", + "corredor de apuestas" ], "fr": [ "preneur de paris", @@ -2136,6 +2519,9 @@ "luckia", "apostas" ], + "he": [ + "כורכת ספרים" + ], "hu": [ "bukméker" ], @@ -2161,8 +2547,8 @@ "bookmaker" ], "pl": [ - "zakład bukmacherski", "bukmacher", + "zakłady bukmacherskie", "zakłady sportowe", "hazard" ], @@ -2204,79 +2590,77 @@ { "if": "shop=books", "then": { - "en": "Book Store", + "en": "Bookstore", "ca": "Llibreria", - "da": "Boghandler", - "de": "Buchladen", - "eo": "Libra vendejo", - "es": "Librería (venta de libros)", + "cs": "Knihkupectví", + "da": "Boghandel", + "de": "Buchhandlung", + "es": "Librería", "fi": "Kirjakauppa", "fr": "Librairie", "gl": "Libraría", + "he": "חנות ספרים", "hu": "Könyvesbolt", "id": "Toko Buku", "it": "Libreria", "ja": "本屋", - "nl": "Boekwinkel", + "nl": "Boekenwinkel", "pl": "Księgarnia", "pt": "Livraria", "ru": "Книжный магазин", - "sl": "Knjigarna", "sv": "Bokhandel" }, "searchTerms": { + "en": [ + "hobby" + ], "da": [ - "boghandler" + "antikvariat", + "boglade", + "bogudsalg" ], "de": [ - "buchhandlung", - "buchhändler" - ], - "eo": [ - "librejo", - "librovendejo" + "buchladen", + "buchhändler", + "bücher" ], "es": [ "libro", - "obra", - "novela", - "cuento", - "revista", - "tienda", - "venta" + "librería", + "libreria" + ], + "fi": [ + "kirjakauppa" ], "fr": [ - "bouquiniste", - "livres d'occasion" - ], - "gl": [ - "libraría", - "venda de libros" - ], - "hu": [ - "antikvárium" + "librairie", + "papeterie" ], "it": [ "negozio di libri" ], "ja": [ "本屋", - "ブックストア", - "古書店", - "古書", - "書籍販売", "書店", - "本" - ], - "nl": [ - "boek", - "bibliotheek", - "boekenwinkel", - "boekhandel" + "本", + "書籍", + "雑誌", + "新刊", + "文庫本", + "漫画", + "まんが", + "マンガ", + "週刊誌", + "実用書", + "技術書", + "辞書", + "参考書", + "店舗", + "お店", + "ブック" ], "pl": [ "księgarnia", - "książki", "komiksy", "antykwariat" ], @@ -2287,16 +2671,6 @@ "livros", "livreiro" ], - "ru": [ - "магазин книг", - "книжный магазин", - "книги" - ], - "sl": [ - "knjigarna", - "trgovina s knjigami", - "založba" - ], "sv": [ "bokhandel", "bokförsäljning", @@ -2312,25 +2686,33 @@ "if": "shop=brewing_supplies", "then": { "en": "Brewing Supply Store", + "cs": "Pivovarnický obchod", "da": "Bryggeudstyrsbutik", "de": "Brauzubehörgeschäft", "eo": "Bier-/vin-farendaĵa vendejo", "es": "Tienda de suministros de cerveza", "fr": "Magasin de matériel de brasserie", "gl": "Tenda de cervexaría artesanal", + "he": "חנות ציוד למבשלות", "hu": "Borászati, sör- és párlafőzési felszereléseket árusító üzlet", "it": "Negozio di forniture per la produzione di birra", "ja": "醸造用品店", "nl": "Winkel voor brouwbenodigdheden", "pl": "Sklep dla piwowarów domowych", "pt": "Loja de material de fermentação", + "ru": "Магазин пивоваренного оборудования", "sv": "Affär för hembryggningstillbehör" }, "searchTerms": { "en": [ "brew shop", + "hobby", "homebrew supply store" ], + "cs": [ + "pivovar", + "obchod s domácími potřebami" + ], "da": [ "brygning", "øl", @@ -2361,6 +2743,12 @@ "brasserie", "brasseur" ], + "he": [ + "חנות תחביבים קולינריים", + "חנות מוצרי מבשלה", + "חנות בירה", + "אספקה למבשלות" + ], "ja": [ "醸造用品店", "醸造", @@ -2373,6 +2761,7 @@ "brouwerijbenodigdheden" ], "pl": [ + "sklep dla piwowarów domowych", "piwowarstwo domowe", "browar domowy", "domowy browar", @@ -2411,13 +2800,15 @@ "then": { "en": "Butcher", "ca": "Carnisseria", + "cs": "Řeznictví", "da": "Slagter", "de": "Metzgerei", "eo": "Vianda vendejo", "es": "Carnicería", "fi": "Lihakauppa", - "fr": "Boucher", + "fr": "Boucherie", "gl": "Carnizaría", + "he": "קצב", "hu": "Hentes", "id": "Penjagalan", "it": "Macellaio", @@ -2437,6 +2828,13 @@ "meat", "pork" ], + "cs": [ + "kuře", + "hovězí", + "jehněčí", + "maso", + "vepřové" + ], "da": [ "slagter", "slagterbutik", @@ -2467,6 +2865,9 @@ "charcutier", "boucher" ], + "he": [ + "קצבית" + ], "hu": [ "mészáros", "húsbolt" @@ -2541,6 +2942,7 @@ "if": "shop=camera", "then": { "en": "Camera Equipment Store", + "cs": "Prodejna kamer", "da": "Fotoforhandler", "de": "Fotofachgeschäft", "eo": "Vendejo kun fotiloj kaj lensoj", @@ -2548,11 +2950,12 @@ "fi": "Kameraliike", "fr": "Boutique de matériel photographique", "gl": "Tenda de fotografía", + "he": "חנות ציוד צילום", "hu": "Fényképezőgép-üzlet", "it": "Negozio di materiale fotografico", "ja": "カメラ店", "nl": "Winkel voor camerabenodigdheden", - "pl": "Sklep z kamerami i aparatami", + "pl": "Sklep z aparatami fotograficznymi i kamerami", "pt": "Loja de equipamento fotográfico", "sv": "Affär för kameratillbehör" }, @@ -2563,6 +2966,12 @@ "lens", "photo" ], + "cs": [ + "kamera", + "film", + "čočka", + "foto" + ], "da": [ "foto", "kamera", @@ -2600,6 +3009,9 @@ "cámara", "vídeo" ], + "he": [ + "חנות ציוד צילומי/היקפי" + ], "hu": [ "fotósbolt" ], @@ -2615,7 +3027,7 @@ "foto" ], "pl": [ - "sklep z kamerami i aparatami fotograficznymi", + "sklep z aparatami fotograficznymi i kamerami", "sprzęt fotograficzny", "kamery", "aparaty fotograficzne", @@ -2652,6 +3064,7 @@ "then": { "en": "Candle Shop", "ca": "Botiga d'espelmes", + "cs": "Obchod se svíčkami", "da": "Stearinlysforhandler", "de": "Kerzengeschäft", "eo": "Kandela vendejo", @@ -2659,6 +3072,7 @@ "fi": "Kynttiläkauppa", "fr": "Magasin de bougies", "gl": "Tenda de velas", + "he": "חנות נרות", "hu": "Gyertyabolt", "id": "Toko Lilin", "it": "Negozio di candele", @@ -2674,6 +3088,22 @@ "en": [ "wax" ], + "ca": [ + "tenda de ciris", + "ciris", + "cera", + "espelma", + "foc" + ], + "cs": [ + "svíčky", + "svíčka", + "svícen", + "svícny", + "lampa", + "lampy", + "lampičky" + ], "da": [ "stearinlysforhandler", "stearinlysbutik", @@ -2694,6 +3124,9 @@ "fr": [ "vente de bougies et d'accessoires" ], + "he": [ + "חנות נרות" + ], "hu": [ "mécsesbolt", "viasz" @@ -2706,7 +3139,9 @@ "ロウソク", "蝋燭", "蠟燭", - "インテリア" + "インテリア", + "店舗", + "お店" ], "nl": [ "kaarsen", @@ -2716,6 +3151,7 @@ "lont" ], "pl": [ + "sklep ze świecami", "świece" ], "pt": [ @@ -2750,28 +3186,52 @@ "then": { "en": "Cannabis Shop", "ca": "Botiga cannàbica", + "cs": "Prodejna konopí", "de": "Cannabisgeschäft", "eo": "Mariĥuana vendejo", "es": "Tienda de cannabis", "fi": "Kannabiskauppa", - "fr": "Magasin de canabis", + "fr": "Magasin de cannabis", "gl": "Tenda de cannabis", + "he": "חנות קנביס", "hu": "Marihuánabolt", "it": "Negozio di cannabis", "ja": "Cannabis Shop(illegal in Japan)", "nl": "Cannabiswinkel", "pl": "Sklep z produktami z konopi", "pt": "Loja de canábis", + "ru": "Магазин марихуаны", "sv": "Cannabisaffär" }, "searchTerms": { "en": [ "420", + "cannabis dispensary", "marijuana", "pot", "reefer", "weed" ], + "ca": [ + "tenda cannàbica", + "420", + "marihuana", + "canàbis", + "cannàbis", + "herba", + "tulipans", + "maria", + "porro" + ], + "cs": [ + "420", + "konopí", + "marihuana", + "kořenáč", + "cigareta", + "tráva", + "weed" + ], "de": [ "cannabis", "marihuana", @@ -2797,6 +3257,15 @@ "marijuana", "herbe" ], + "he": [ + "חנות עישון", + "מוצרי עישון", + "סמים", + "סמים קלים", + "מריחואנה", + "גראס", + "חשיש" + ], "hu": [ "kannabisz", "vadkender", @@ -2815,7 +3284,8 @@ "konopie", "marihuana", "cannabis", - "kanabis" + "kanabis", + "cbd" ], "pt": [ "cannabis", @@ -2849,6 +3319,7 @@ "then": { "en": "Car Dealership", "ca": "Concessionari de cotxes", + "cs": "Prodejna aut", "da": "Bilforhandler", "de": "Autohändler", "eo": "Aŭtomobila vendejo", @@ -2856,12 +3327,13 @@ "fi": "Autokauppa", "fr": "Concessionnaire automobile", "gl": "Concesionario de automóbiles", + "he": "סוכנות רכב", "hu": "Autókereskedés", "id": "Dealer Mobil", "it": "Concessionario", "ja": "カーディーラー", "nl": "Autoshowroom", - "pl": "Sprzedaż samochodów", + "pl": "Salon sprzedaży samochodów", "pt": "Loja de automóveis", "ru": "Автодилер", "sl": "Avtomobilski salon", @@ -2872,6 +3344,11 @@ "automobile", "automotive" ], + "cs": [ + "prodejna aut", + "autosalón", + "autobazar" + ], "da": [ "bilforhandler", "autoforhandler", @@ -2899,11 +3376,19 @@ "concesionario de coches", "concesionario de autos" ], + "fi": [ + "autokauppa", + "automyyjä", + "vaihtoautokauppa" + ], "fr": [ "concessionnaire", "garage", "garagiste" ], + "he": [ + "סוכנות רכב" + ], "hu": [ "autószalon", "márkakereskedés" @@ -2914,7 +3399,9 @@ "ja": [ "自動車販売店", "カーディーラー", - "中古車販売店" + "中古車販売店", + "自動車", + "カー" ], "nl": [ "autodealer", @@ -2925,6 +3412,7 @@ "autogarage" ], "pl": [ + "salon sprzedaży samochodów", "sprzedawca samochodów", "dealer samochodowy", "salon samochodowy", @@ -2962,10 +3450,6 @@ "bilreparatör", "biltillbehör" ] - }, - "icon": { - "path": "./assets/layers/id_presets/maki-car.svg", - "class": "medium" } }, { @@ -2973,6 +3457,7 @@ "then": { "en": "Car Parts Store", "ca": "Botiga de recanvis de cotxe", + "cs": "Náhradní díly pro auta", "da": "Bilreservedelsforhandler", "de": "Autoteilehandel", "eo": "Aŭtomobil-parta vendejo", @@ -2980,6 +3465,7 @@ "fi": "Varaosamyymälä", "fr": "Magasin de pièces automobiles", "gl": "Tenda de recambios de automóbiles", + "he": "חנות חלקי מכוניות", "hu": "Autóalkatrész-üzlet", "id": "Toko Peralatan Mobil", "it": "Negozio di autoricambi", @@ -2996,6 +3482,12 @@ "automobile", "automotive" ], + "cs": [ + "prodejna autodílů", + "autodíly", + "automobilový", + "auto" + ], "da": [ "autoudstyrsbutik", "biludstyrsbutik", @@ -3036,6 +3528,9 @@ "fr": [ "magasin de pièces automobiles" ], + "he": [ + "חנות חלקי חילוף" + ], "hu": [ "gépkocsi", "gépjármű", @@ -3048,7 +3543,10 @@ "自動車部品店", "カーパーツショップ", "カー用品", - "自動車用品" + "自動車用品", + "カー用品店", + "自動車", + "カー" ], "nl": [ "automaterialenwinkel", @@ -3056,6 +3554,7 @@ "auto-onderdelenhandel" ], "pl": [ + "sklep z częściami do samochodów", "sklep z częściami samochodowymi", "części samochodowe", "sklep motoryzacyjny", @@ -3100,6 +3599,7 @@ "then": { "en": "Car Repair Shop", "ca": "Taller d'automòbils", + "cs": "Autoopravna", "da": "Bilværksted", "de": "Autowerkstatt", "eo": "Aŭtomobil-riparejo", @@ -3107,6 +3607,7 @@ "fi": "Autokorjaamo", "fr": "Garage de réparation automobile", "gl": "Taller de arranxo de automóbiles", + "he": "מוסך", "hu": "Autószerelő", "id": "Bengkel Mobil", "it": "Autofficina", @@ -3120,15 +3621,35 @@ }, "searchTerms": { "en": [ - "auto mechanic", "automechanic", - "automobile", "automotive", "garage", "inspection", + "mechanic", "oil change", + "panelbeater", + "panel beater", "service" ], + "ca": [ + "taller", + "electromecànica", + "garaig", + "itv", + "inspecció", + "canvi d'oli", + "servei", + "servici", + "cotxe", + "taller de cotxes" + ], + "cs": [ + "opravna aut", + "autoservis", + "servis", + "pneuservis", + "opravna" + ], "da": [ "autoværksted", "bilværksted", @@ -3198,6 +3719,9 @@ "taller de coches", "taller de reparación" ], + "he": [ + "מוסך" + ], "hu": [ "autószerviz", "autójavító" @@ -3206,7 +3730,13 @@ "officina" ], "ja": [ - "自動車修理工場" + "自動車修理工場", + "自動車", + "カー", + "修理", + "板金", + "塗装", + "サービス" ], "nl": [ "garage", @@ -3261,12 +3791,15 @@ "if": "shop=caravan", "then": { "en": "RV Dealership", + "cs": "Prodejna karavanů", + "da": "Autocamperforhandler", "de": "Wohnwagengeschäft", "eo": "Vendejo de kampad-veturiloj", "es": "Concesionario de autocaravanas", "fi": "Asuntovaunukauppa", "fr": "Concessionnaire de véhicules de tourisme", "gl": "Concesionario de autocaravanas", + "he": "סוכנות קרוואנים", "hu": "Lakókocsi kereskedés", "it": "Concessionario caravan", "ja": "キャラバンカー販売店", @@ -3282,6 +3815,16 @@ "camper", "recreational vehicle" ], + "cs": [ + "auto", + "karavan", + "rekreační vozidlo" + ], + "da": [ + "autocamperforhandler", + "rv-forhandler", + "campingvognsforhandler" + ], "de": [ "wohnwagengeschäft", "caravangeschäft" @@ -3308,6 +3851,12 @@ "caravane", "camping-car" ], + "he": [ + "רכב", + "מכונית", + "נגרר", + "אוטו" + ], "it": [ "auto", "camper" @@ -3327,6 +3876,7 @@ "caravan" ], "pl": [ + "sklep z kamperami i przyczepami", "kamper", "camper", "karawan", @@ -3368,6 +3918,7 @@ "then": { "en": "Carpet Store", "ca": "Botiga de catifes", + "cs": "Prodejna koberců", "da": "Tæppeforhandler", "de": "Teppichgeschäft", "eo": "Tapiŝa vendejo", @@ -3375,10 +3926,11 @@ "fi": "Mattokauppa", "fr": "Magasin de tapis", "gl": "Tenda de alfombras", + "he": "חנות שטיחים", "hu": "Szőnyegbolt", "id": "Toko Karpet", "it": "Negozio di tappeti", - "ja": "カーペット専門店", + "ja": "カーペット店", "nl": "Tapijtwinkel", "pl": "Sklep z dywanami", "pt": "Loja de tapetes", @@ -3390,6 +3942,14 @@ "en": [ "rug" ], + "cs": [ + "koberce", + "koberec", + "podlahové", + "podlahový", + "krytina", + "krytiny" + ], "da": [ "tæppeforhandler", "tæppeforretning" @@ -3412,6 +3972,9 @@ "fr": [ "magasin de tapis" ], + "he": [ + "חנות שטיחים" + ], "hu": [ "szőnyegház", "padlószőnyeg áruház", @@ -3426,7 +3989,14 @@ "敷物", "表具店", "表具", - "インテリア" + "インテリア", + "絨毯", + "じゅうたん", + "カーペット店", + "店舗", + "お店", + "買い物", + "ショッピング" ], "nl": [ "vloerbedekkingswinkel", @@ -3464,11 +4034,13 @@ "if": "shop=catalogue", "then": { "en": "Catalog Shop", + "cs": "Katalogový obchod", "de": "Versandhandel", "eo": "Ricevejo de aĉetaĵoj (per katalogo)", "es": "Tienda de catálogo", "fr": "Magasin à catalogue", "gl": "Tenda de catálogo", + "he": "חנות קטלוגים", "hu": "Katalógus-áruház", "it": "Produzione di Cataloghi", "ja": "カタログショップ", @@ -3492,6 +4064,13 @@ "fr": [ "catalogue" ], + "he": [ + "בחירה קטלוגית", + "בחירה מקטלוג", + "חנות ללא מלאי", + "חנות הזמנות", + "חנות קטלוג" + ], "hu": [ "webshop" ], @@ -3529,6 +4108,7 @@ "then": { "en": "Charity Store", "ca": "Botiga de Caritat", + "cs": "Charitativní obchod", "da": "Velgørenhedsbutik", "de": "Sozialkaufhaus", "eo": "Almoza vendejo", @@ -3536,9 +4116,10 @@ "fi": "Hyväntekeväisyyskauppa", "fr": "Magasin d'organisme caritatif", "gl": "Tenda solidaria", + "he": "חנות צדקה", "hu": "Adománybolt", "it": "Mercatino dell'usato", - "ja": "チャリティーショップ", + "ja": "チャリティショップ", "nl": "Winkel van goed doel", "pl": "Sklep charytatywny", "pt": "Loja solidária", @@ -3551,6 +4132,11 @@ "op shop", "nonprofit" ], + "cs": [ + "charitativní obchod", + "dobročinný obchod", + "charita" + ], "da": [ "genbrugsbutik", "velgørenhedsbutik" @@ -3569,6 +4155,9 @@ "fr": [ "boutique caritative" ], + "he": [ + "חנות צדקה" + ], "hu": [ "jótékonysági bolt" ], @@ -3577,13 +4166,15 @@ "robivecchi" ], "ja": [ - "スリフトショップ", + "チャリティショップ", "チャリティ店", "チャリティ販売店", "慈善販売店", "慈善活動", "寄贈", - "寄付" + "寄付", + "中古", + "スリフトショップ" ], "nl": [ "kringloopwinkel", @@ -3634,13 +4225,15 @@ "then": { "en": "Cheese Store", "ca": "Botiga de formatge", + "cs": "Prodejna sýrů", "da": "Ostehandler", "de": "Käseladen", "eo": "Fromaĝa vendejo", "es": "Tienda de quesos", "fi": "Juustopuoti", - "fr": "Fromager", + "fr": "Fromagerie", "gl": "Queixaría", + "he": "חנות גבינות", "hu": "Sajtbolt", "id": "Toko Keju", "it": "Negozio di formaggi", @@ -3653,6 +4246,12 @@ "sv": "Ostaffär" }, "searchTerms": { + "cs": [ + "sýrařství", + "sýrař", + "sýry", + "sýr" + ], "da": [ "ostehandler", "ostebutik", @@ -3672,13 +4271,17 @@ "lácteos" ], "fr": [ - "vente de fromages" + "vente de fromages", + "fromager" ], "gl": [ "tenda de queixos", "queixería", "queixo" ], + "he": [ + "פרומז׳רי" + ], "hu": [ "kecskesajtbolt", "francia sajtok boltja" @@ -3699,6 +4302,7 @@ "kaashandel" ], "pl": [ + "sklep z serami", "sery" ], "pt": [ @@ -3738,7 +4342,8 @@ "if": "shop=chemist", "then": { "en": "Drugstore", - "ca": "Farmàcia", + "ca": "Drogueria", + "cs": "Drogerie", "da": "Materialist", "de": "Drogerie", "eo": "Kosmetikaĵa (ankaŭ purigaĵoj) vendejo", @@ -3746,7 +4351,9 @@ "fi": "Apteekki-luontaistuotemyymälä", "fr": "Parapharmacie", "gl": "Drogaría", + "he": "בית מרקחת", "hu": "Drogéria", + "id": "Toko Obat", "it": "Drogheria", "ja": "ドラッグストア・化粧品・薬品店(薬剤師がいない店)", "nl": "Drogisterij", @@ -3760,14 +4367,35 @@ "en": [ "apothecary", "beauty", + "chemist", + "dispensary", "drug store", "gift", "hair", - "med*", + "medicine", "pharmacy", "prescription", "tooth" ], + "ca": [ + "perfumeria", + "bellesa", + "cosmètics", + "monyo", + "pèl", + "farmàcia", + "dents", + "higiene" + ], + "cs": [ + "drogerie", + "parfumerie", + "kosmetika", + "hygiena", + "čisticí prostředky", + "lékárna", + "léky" + ], "da": [ "materialist" ], @@ -3812,6 +4440,9 @@ "gl": [ "botica" ], + "he": [ + "בית מרקחת" + ], "hu": [ "illatszer", "kozmetikum", @@ -3831,7 +4462,10 @@ "薬", "くすり屋", "健康", - "薬店" + "薬店", + "医薬品", + "店舗", + "お店" ], "nl": [ "apotheek", @@ -3882,6 +4516,7 @@ "then": { "en": "Chocolate Store", "ca": "Botiga de xocolata", + "cs": "Prodejna čokolády", "da": "Chokoladeforretning", "de": "Schokoladenladen", "eo": "Ĉokolada vendejo", @@ -3889,6 +4524,7 @@ "fi": "Suklaapuoti", "fr": "Chocolatier", "gl": "Chocolataría", + "he": "חנות שוקולד", "hu": "Csokoládébolt", "id": "Toko Cokelat", "it": "Cioccolateria", @@ -3897,13 +4533,20 @@ "pl": "Sklep z czekoladą", "pt": "Loja de chocolates", "ru": "Магазин шоколада", - "sl": "Trgovina s čokolado", + "sl": "Čokoladnica", "sv": "Chokladaffär" }, "searchTerms": { "en": [ "cocoa" ], + "cs": [ + "čokoláda", + "čokolády", + "čokoládovna", + "cukrářství", + "cukrář" + ], "da": [ "chokoladeforretning", "chokoladebutik" @@ -3935,6 +4578,9 @@ "chocolatada", "chocolateiro" ], + "he": [ + "חנות שוקולד" + ], "hu": [ "kézműves csokoládébolt", "csokibolt", @@ -3950,7 +4596,12 @@ "食べ物", "食料品", "店舗", - "お店" + "お店", + "お菓子", + "スイーツ", + "スナック", + "チョコ", + "チョコレート" ], "nl": [ "chocolatier", @@ -3992,6 +4643,7 @@ "then": { "en": "Clothing Store", "ca": "Botiga de roba", + "cs": "Oblečení", "da": "Tøjbutik", "de": "Bekleidungsgeschäft", "eo": "Vesta vendejo", @@ -3999,6 +4651,7 @@ "fi": "Vaatekauppa", "fr": "Magasin de vêtements", "gl": "Tenda de roupa", + "he": "חנות בגדים", "hu": "Ruházati bolt", "id": "Toko Baju", "it": "Negozio di abbigliamento", @@ -4018,6 +4671,7 @@ "clothes", "dresses", "fashion", + "outfits", "pants", "shirts", "shorts", @@ -4030,6 +4684,15 @@ "ca": [ "botiga de roba" ], + "cs": [ + "oděvy", + "oděv", + "šaty", + "oblečení", + "obchod s oblečením", + "móda", + "módní" + ], "da": [ "tøjbutik", "herretøjsbutik", @@ -4101,6 +4764,9 @@ "fr": [ "magasin de vêtements" ], + "he": [ + "חנות בגדים" + ], "hu": [ "fehérneműbolt", "öltönyáruház", @@ -4120,7 +4786,14 @@ "スーツ", "和服", "着物", - "古着" + "古着", + "衣料", + "ブティック", + "店舗", + "お店", + "アパレル", + "ショッピング", + "買い物" ], "nl": [ "kledingwinkel", @@ -4128,6 +4801,7 @@ "kledij" ], "pl": [ + "sklep odzieżowy", "odzież", "ubrania", "ciuchy", @@ -4181,6 +4855,7 @@ "then": { "en": "Coffee Store", "ca": "Botiga de cafè", + "cs": "Obchod prodávající kávu", "da": "Kaffebutik", "de": "Kaffeegeschäft", "eo": "Kafa vendejo", @@ -4188,6 +4863,7 @@ "fi": "Kahvikauppa", "fr": "Boutique de vente de cafés", "gl": "Tenda de café", + "he": "חנות קפה", "hu": "Kávébolt", "it": "Negozio di caffè", "ja": "コーヒー豆販売店", @@ -4199,6 +4875,20 @@ "sv": "Kaffeaffär" }, "searchTerms": { + "ca": [ + "tenda de cafè", + "cafe", + "cafè", + "expresso", + "flat white", + "cappuchino" + ], + "cs": [ + "káva", + "obchod kávou", + "obchod s kávou", + "pražírna" + ], "da": [ "kaffebutik", "kaffeforretning" @@ -4225,6 +4915,9 @@ "fr": [ "magasin de café" ], + "he": [ + "חנות קפה" + ], "hu": [ "kávébolt", "kávéüzlet", @@ -4242,7 +4935,9 @@ "飲み物", "食料品", "店舗", - "お店" + "お店", + "コーヒーパウダー", + "コーヒー豆" ], "nl": [ "koffiebonen", @@ -4284,17 +4979,21 @@ "if": "shop=collector", "then": { "en": "Collectibles Shop", + "ca": "Botiga de coleccionabes", + "cs": "Sběratel", "de": "Sammlergeschäft", "eo": "Kolektaĵa vendejo", "es": "Tienda de coleccionables", "fr": "Magasin d'objets de collection", "gl": "Tenda de colecionismo", + "he": "חנות אספנים", "hu": "Gyűjthető tárgyak boltja", "it": "Negozio di articoli da collezione", "ja": "コレクター店", "nl": "Winkel voor verzamelobjecten", "pl": "Sklep kolekcjonerski", "pt": "Loja de colecionismo", + "ru": "Коллекционный магазин", "sv": "Affär med samlarobjekt" }, "searchTerms": { @@ -4306,11 +5005,38 @@ "comics", "dolls", "figurines", + "hobby", "numismatics", "philately", "stamps", "thrift" ], + "ca": [ + "tenda de coleccionables", + "colecció", + "comics", + "coleccionista", + "figures", + "antiguitats", + "sellos", + "estamps" + ], + "cs": [ + "sběratelské potřeby", + "sběratelství", + "obchod se známkami", + "obchod se sběratelskými předměty", + "známky", + "mince", + "komix", + "panenky", + "antikvariát", + "filaterista", + "filaterie", + "razítka", + "sběratelský", + "sbírat" + ], "de": [ "antiquitäten", "münzen", @@ -4368,6 +5094,11 @@ "manga", "pin's" ], + "he": [ + "חנות עתיקות", + "חנות עבוט", + "חנות משכון" + ], "ja": [ "コレクター店", "コレクターズショップ", @@ -4436,6 +5167,7 @@ "then": { "en": "Computer Store", "ca": "Botiga d'informàtica", + "cs": "Počítače", "da": "Computerforhandler", "de": "Computerfachhandel", "eo": "Komputila vendejo", @@ -4443,6 +5175,7 @@ "fi": "Tietokoneliike", "fr": "Magasin d'informatique", "gl": "Tenda de informática", + "he": "חנות מחשבים", "hu": "Számítógépbolt", "id": "Toko Komputer", "it": "Negozio di informatica", @@ -4466,6 +5199,13 @@ "botiga d'informàtica", "botiga d'ordinadors" ], + "cs": [ + "obchod s výpočetní technikou", + "počítače", + "elektro", + "elektronika", + "výpočetní technika" + ], "da": [ "computerbutik", "pc-butik", @@ -4495,11 +5235,14 @@ "fr": [ "magasin d'informatique" ], + "he": [ + "חנות מחשבים" + ], "hu": [ - "számítástechnikai üzlet", - "notebook bolt", - "laptop bolt", - "apple bolt" + "számítástechnika", + "hardver", + "szoftver", + "laptop" ], "it": [ "negozio di computer" @@ -4561,13 +5304,16 @@ "then": { "en": "Candy Store", "ca": "Botiga de llaminadures", + "cs": "Cukrovinky", "da": "Slikbutik", "de": "Süßwarenladen", "eo": "Sukeraĵa vendejo", "es": "Tienda de dulces", + "eu": "Gozodenda", "fi": "Karkkipuoti", "fr": "Confiserie", "gl": "Tenda de larpeiradas", + "he": "חנות ממתקים", "hu": "Édességbolt", "id": "Toko Permen", "it": "Negozio di dolciumi", @@ -4581,6 +5327,9 @@ }, "searchTerms": { "en": [ + "fudge", + "lollipop", + "sugar", "sweet" ], "ca": [ @@ -4592,6 +5341,12 @@ "caramels", "llepolies" ], + "cs": [ + "cukrovinky", + "cukrovinka", + "cukrář", + "cukrářství" + ], "da": [ "slikbutik", "slikforretning" @@ -4619,6 +5374,12 @@ "chucherías", "tienda de chucherías" ], + "eu": [ + "gozodenda", + "goxokiak", + "azukrea", + "txutxeak" + ], "fr": [ "confiserie", "confiseur", @@ -4643,6 +5404,9 @@ "gominolas", "tenda de larpeiradas" ], + "he": [ + "חנות ממתקים" + ], "hu": [ "süteménybolt", "tortaszaküzlet", @@ -4669,7 +5433,8 @@ "食べ物", "食料品", "店舗", - "お店" + "お店", + "スイーツ" ], "nl": [ "confectionery", @@ -4717,6 +5482,7 @@ "then": { "en": "Convenience Store", "ca": "Botiga d'ultramarins", + "cs": "Obchod se smíšeným zbožím", "da": "Minimarked", "de": "Minimarkt", "eo": "Butiko oportuna", @@ -4724,6 +5490,7 @@ "fi": "Lähikauppa", "fr": "Épicerie / Supérette", "gl": "Tenda de ultramarinos", + "he": "חנות נוחות", "hu": "Kis élelmiszerbolt", "id": "Toko Kelontong", "it": "Minimarket", @@ -4736,15 +5503,29 @@ "sv": "Närbutik" }, "searchTerms": { + "en": [ + "mini-mart", + "mini-market" + ], "ca": [ "botiga de queviures", "ultramarins", "queviures", "colmado" ], + "cs": [ + "smíšené zboží", + "krám", + "obchod", + "potraviny", + "večerka" + ], "da": [ "minimarked", - "minikøbmand" + "minikøbmand", + "nærbutik", + "købmand", + "kiosk" ], "de": [ "minimarkt", @@ -4778,6 +5559,9 @@ "supérette", "petite épicerie du coin" ], + "he": [ + "חנות נוחות" + ], "hu": [ "abc", "sarki élelmiszer", @@ -4810,8 +5594,7 @@ "spożywczak", "delikatesy", "żywność", - "żabka", - "freshmarket" + "żabka" ], "pt": [ "pequena loja", @@ -4849,6 +5632,7 @@ "then": { "en": "Copy Store", "ca": "Copisteria", + "cs": "Kopírování", "da": "Fotokopishop", "de": "Kopierladen", "eo": "Fotokopiilejo", @@ -4856,6 +5640,7 @@ "fi": "Kopiointiliike", "fr": "Photocopie et impression", "gl": "Copistaría", + "he": "חנות העתקות", "hu": "Fénymásoló", "id": "Tempat Fotokopi", "it": "Copisteria", @@ -4878,6 +5663,16 @@ "fulls", "impressora" ], + "cs": [ + "kopírování", + "kopírka", + "kopírky", + "copy centrum", + "copy studio", + "kopírovací centrum", + "kopírárna", + "xerox" + ], "da": [ "fotokopishop" ], @@ -4909,6 +5704,10 @@ "photocopies", "impression" ], + "he": [ + "חנות עותקים", + "חנות שכפולים" + ], "hu": [ "nyomtatás", "diplomakötés", @@ -4967,6 +5766,7 @@ "then": { "en": "Cosmetics Store", "ca": "Botiga de cosmètics", + "cs": "Obchod s kosmetikou", "da": "Kosmetikbutik", "de": "Kosmetikladen", "eo": "Kosmetikaĵa (persona higieno) vendejo", @@ -4974,6 +5774,7 @@ "fi": "Kosmetiikkamyymälä", "fr": "Magasin de cosmétiques", "gl": "Tenda de cosméticos", + "he": "חנות קוסמטיקה", "hu": "Kozmetikai bolt", "id": "Toko Kosmetik", "it": "Negozio di cosmetici", @@ -4997,6 +5798,13 @@ "perfums", "perfumeria" ], + "cs": [ + "kosmetika", + "kosmetický", + "makeup", + "parfém", + "parfumerie" + ], "da": [ "kosmetikbutik", "kosmetikforretning" @@ -5028,6 +5836,9 @@ "vente de cosmétiques", "parfumerie" ], + "he": [ + "חנות קוסמטיקה" + ], "hu": [ "szépségápolási szaküzlet", "sminkbolt", @@ -5048,6 +5859,7 @@ "parfumerie" ], "pl": [ + "sklep z kosmetykami", "kosmetyki", "makijaż", "make-up", @@ -5061,7 +5873,9 @@ "cosméticos", "produtos de beleza", "beleza", - "belesa" + "belesa", + "maquiagem", + "maquilhagem" ], "ru": [ "косметика", @@ -5082,66 +5896,42 @@ { "if": "shop=country_store", "then": { - "en": "Country Store", - "de": "Ländlicher Laden", - "eo": "Ĝenerala vendejo en vilaĝo", - "es": "Tienda de campo", - "fr": "Magasin de campagne", - "gl": "Tenda do agro ou campo", - "hu": "Vidéki élet kellékeinek boltja", - "it": "Negozio locale di articoli vari", - "ja": "よろずや", - "nl": "Outdoorzaak", - "pl": "Country Store", + "en": "Rural Supplies Store", + "cs": "Venkovské potřeby", + "de": "Dorfladen", + "es": "Tienda de suministros rurales", + "fr": "Quincaillerie", + "he": "חנות הספקה כפרית", + "ja": "農山村用品店", + "nl": "Plattelandswinkel", + "pl": "Sklep z artykułami wiejskimi", "pt": "Loja para proprietários rurais", - "sv": "Lanthandel" + "sv": "Butik med landsbygdsförnödenheter" }, "searchTerms": { "de": [ - "ländlicher laden", "dorfladen" ], - "eo": [ - "ĝenerala vendejo", - "vilaĝa vendejo", - "ghenerala vendejo", - "gxenerala vendejo", - "vilagha vendejo", - "vilagxa vendejo", - "butiko oportuna" - ], "es": [ + "tienda de suministros rurales", + "suministros rurales", "campo", - "tienda", "rural" ], "fr": [ - "campagne", - "chasse", - "pêche", - "équitation", - "cheval", - "chevaux" + "quincaillerie rurale", + "épicerie rurale", + "épicerie de campagne", + "quincaillerie de campagne" ], "ja": [ - "よろずや", - "万屋", + "農山村用品店", "店舗", - "お店", - "ショッピング", - "小売" - ], - "nl": [ - "kampeerzaak", - "landelijk", - "scoutingwinkel", - "jacht", - "ruiter", - "paardrijden", - "tuinmachines" + "田舎", + "狩猟" ], "pl": [ - "country store" + "sklep z artykułami wiejskimi" ], "pt": [ "campo", @@ -5156,8 +5946,24 @@ "maquinaria" ], "sv": [ + "butik med landsbygdsförnödenheter", + "landsbygdsförnödenheter", + "lantmannaföreningen", + "granngården", "lanthandel", - "landet" + "landsbyggdsbutik", + "utomhuskläder", + "jakt", + "jaktutrustning", + "ridutrustning", + "ridtillbehör", + "trädgårdsbutik", + "trädgårdsmaskiner", + "husdjur", + "foder", + "djurfoder", + "bonde", + "bönder" ] }, "icon": { @@ -5170,6 +5976,7 @@ "then": { "en": "Arts & Crafts Store", "ca": "Botiga d'art i artesania", + "cs": "Obchod s uměleckými a řemeslnými potřebami", "da": "Kunst & hobbybutik", "de": "Geschäft für Künstlerbedarf", "eo": "Vendejo de materialoj por metio", @@ -5177,19 +5984,35 @@ "fi": "Käsityöliike", "fr": "Magasin d'arts et loisirs créatifs", "gl": "Tenda de artes e oficios", + "he": "חנות חפצי אומנות", "hu": "Kézműves bolt", "it": "Negozio di arti e mestieri", "ja": "美術・工芸用品店", "nl": "Winkel voor schilder- en tekengereedschap", "pl": "Sklep z artykułami dla artystów", "pt": "Loja de acessórios para artes manuais", + "ru": "Магазин художественных принадлежностей", "sv": "Konst- & hantverksbutik" }, "searchTerms": { "en": [ - "art*", - "paint*", + "art", + "canvas", + "crafting", + "crafts", + "draw", "frame", + "handicraft", + "hobby", + "paint", + "paper", + "pencil", + "wood" + ], + "cs": [ + "umění*", + "barva*", + "rám", "hobby" ], "da": [ @@ -5235,6 +6058,12 @@ "loisir", "peinture" ], + "he": [ + "חנות דברי אומנות", + "חנות אומנות", + "פריטי אומנות", + "חנות פריטי אומנות" + ], "hu": [ "hobbi", "kreatív hobbi" @@ -5245,7 +6074,8 @@ "画材", "絵の具", "美術用品", - "クラフト" + "クラフト", + "工房" ], "nl": [ "kunst*", @@ -5296,6 +6126,7 @@ "then": { "en": "Curtain Store", "ca": "Botiga de cortines", + "cs": "Obchod se závěsy", "da": "Gardinbutik", "de": "Vorhanggeschäft", "eo": "Kurtena vendejo", @@ -5303,6 +6134,7 @@ "fi": "Verhomyymälä", "fr": "Magasin de rideaux", "gl": "Tenda de cortinas", + "he": "חנות וילונות", "hu": "Függönybolt", "id": "Toko Gorden", "it": "Negozio di tende", @@ -5316,7 +6148,8 @@ }, "searchTerms": { "en": [ - "drape*", + "drape", + "drapery", "window" ], "ca": [ @@ -5324,6 +6157,14 @@ "cortines", "coixins" ], + "cs": [ + "závěs", + "závěsy", + "potah", + "potahy", + "ubrus", + "ubrusy" + ], "da": [ "gardinbutik", "gardinforretning" @@ -5353,6 +6194,9 @@ "fr": [ "magasin de rideaux" ], + "he": [ + "חנות וילונות" + ], "hu": [ "karnis", "függöny", @@ -5369,13 +6213,19 @@ ], "ja": [ "カーテン店", - "家具" + "家具", + "カーテン", + "インテリア", + "布", + "お店", + "店舗" ], "nl": [ "gordijnenwinkel", "gordijnenzaak" ], "pl": [ + "sklep z zasłonami", "zasłony", "zasłonki", "firany", @@ -5414,6 +6264,7 @@ "then": { "en": "Dairy Store", "ca": "Botiga de productes làctics", + "cs": "Mléčné výrobky", "da": "Ismejeri", "de": "Milchgeschäft", "eo": "Laktaĵa vendejo", @@ -5421,6 +6272,7 @@ "fi": "Maitotuotemyymälä", "fr": "Crèmerie", "gl": "Tenda de produtos frescos", + "he": "חנות מוצרי חלב", "hu": "Tejtermékbolt", "id": "Toko Susu", "it": "Negozio di latticini", @@ -5438,6 +6290,15 @@ "egg", "cheese" ], + "cs": [ + "mléčné výrobky", + "mlékařství", + "mléko", + "mléčné produkty", + "sýr", + "jogurt", + "smetana" + ], "da": [ "ismejeri", "mejeri", @@ -5486,6 +6347,9 @@ "queixaría", "central leiteira" ], + "he": [ + "חנות דברי חלב" + ], "hu": [ "tejtermék", "kecsketej", @@ -5512,12 +6376,14 @@ "バター", "食料品", "店舗", - "お店" + "お店", + "デイリーストア" ], "nl": [ "zuivelwinkel" ], "pl": [ + "sklep z nabiałem", "nabiał" ], "pt": [ @@ -5548,85 +6414,75 @@ { "if": "shop=deli", "then": { - "en": "Deli", - "ca": "Botiga de comestibles", - "da": "Deli", + "en": "Delicatessen", + "cs": "Lahůdkářství", + "da": "Delikatesse", "de": "Feinkostladen", - "eo": "Delikataĵa vendejo", "es": "Delicatessen", - "fi": "Deli", - "fr": "Épicerie de luxe", - "gl": "Delicatessen", + "fr": "Épicerie fine", + "he": "מעדניה", "hu": "Csemegebolt", - "id": "Delikatesen", - "it": "Gastronomia", - "ja": "惣菜屋", - "nl": "Delicatessenwinkel", + "it": "Negozio di specialità gastronomiche", + "ja": "高級食材店", + "nl": "Delicatessen", "pl": "Ekskluzywne delikatesy", "pt": "Loja gourmet", - "ru": "Магазин деликатесов", - "sl": "Delikatesa", + "ru": "Деликатесы", "sv": "Delikatessaffär" }, "searchTerms": { "en": [ - "lunch", - "meat", - "sandwich" + "deli" ], - "da": [ - "deli", - "delikatesse" + "cs": [ + "delikatesy" ], "de": [ "feinkost-geschäft", "delikatessen-laden" ], - "eo": [ - "delikataĵoj", - "delikatajhoj", - "delikatajxoj", - "frandaĵoj", - "bongustaĵoj" - ], "es": [ "delicatessen", "gourmet", - "exquisiteces", - "charcutería" + "charcutería", + "rotisería", + "salsamentaria", + "salchichonería" ], "fr": [ - "epicerie fine", - "traiteur" - ], - "hu": [ - "delikát", - "csemege" + "épicerie fine", + "traiteur", + "charcuterie", + "plat à emporter" ], "it": [ - "cibi e bevande pregiate" + "gastronomia", + "tipico", + "tipici", + "prodotti", + "prodotti tipici" ], "ja": [ - "惣菜屋", - "弁当屋", - "デリカ", + "デリカテッセン", + "デリ", + "高級食品", + "グルメ食品", + "チーズ", + "ソーセージ", + "キャビア", + "フォアグラ", + "パテ", + "オリーブ", + "ワイン", "食品", - "食べ物", - "おかず", - "豆腐", - "蒟蒻", + "つまみ", "食料品", + "小売", "店舗", "お店" ], - "nl": [ - "delicatesse", - "speciaalzaak", - "delicatessenwinkel", - "delicatessen", - "winkel" - ], "pl": [ + "delikatesy", "wyroby delikatesowe", "wykwintne artykuły spożywcze", "specjały", @@ -5639,14 +6495,8 @@ "mercearia", "dop", "produtos de qualidade", - "origem protegida" - ], - "ru": [ - "деликатесы" - ], - "sl": [ - "špecerija", - "delikatesna trgovina" + "origem protegida", + "iguarias" ], "sv": [ "delikatessaffär", @@ -5659,7 +6509,7 @@ ] }, "icon": { - "path": "./assets/layers/id_presets/temaki-meat.svg", + "path": "./assets/layers/id_presets/fas-jar.svg", "class": "medium" } }, @@ -5668,6 +6518,7 @@ "then": { "en": "Department Store", "ca": "Grans magatzems", + "cs": "Obchodní dům", "da": "Stormagasin", "de": "Kaufhaus", "eo": "Ĉiovendejo", @@ -5675,6 +6526,7 @@ "fi": "Tavaratalo", "fr": "Grand magasin", "gl": "Grandes almacéns", + "he": "חנות כלבו", "hu": "Nagyáruház", "id": "Pasar Swalayan", "it": "Grande magazzino", @@ -5687,6 +6539,12 @@ "sv": "Varuhus" }, "searchTerms": { + "cs": [ + "obchodní dům", + "nákupní středisko", + "obchodní středisko", + "nákupní centrum" + ], "da": [ "stormagasin" ], @@ -5716,6 +6574,9 @@ "grand magasin", "magasin par départements" ], + "he": [ + "חנות כלבו" + ], "hu": [ "áruház", "városi áruház", @@ -5776,6 +6637,7 @@ "then": { "en": "DIY Store", "ca": "Botiga de bricolatge", + "cs": "Obchod pro kutily", "da": "Byggemarked", "de": "Heimwerkerladen", "eo": "Memfaradila vendejo", @@ -5783,10 +6645,11 @@ "fi": "Askartelukauppa", "fr": "Magasin de bricolage", "gl": "Tenda de bricolaxe", + "he": "חנות עשה זאת בעצמך", "hu": "Barkácsáruház", "id": "Toko Swakriya", "it": "Negozio per il fai-da-te", - "ja": "ホームセンター", + "ja": "ホームセンター(DIY)", "nl": "Bouwmarkt, doe-het-zelfwinkel", "pl": "Market budowlany / sklep dla majsterkowiczów", "pt": "Loja de bricolagem", @@ -5800,12 +6663,24 @@ "diy", "do it yourself", "hardware", + "hobby", "home improvement", "tools" ], "ca": [ "botiga de bricolatge" ], + "cs": [ + "obchod pro kutily", + "stavební materiál", + "stavebniny", + "staviva", + "potřeby pro kutily", + "zahradní potřeby", + "železářství", + "kutil", + "hobby" + ], "da": [ "værktøj", "materiale", @@ -5836,6 +6711,9 @@ "bricolaxe", "diy" ], + "he": [ + "חנות עשה זאת בעצמך" + ], "hu": [ "ezermester", "barkácsbolt", @@ -5863,7 +6741,8 @@ "園芸", "工芸用品", "家庭菜園", - "植木" + "植木", + "diy店" ], "nl": [ "dhz-winkel", @@ -5930,6 +6809,7 @@ "then": { "en": "Door Shop", "ca": "Botiga de portes", + "cs": "Prodejna dveří", "da": "Dørforhandler", "de": "Türgeschäft", "eo": "Vendejo de pordoj", @@ -5937,6 +6817,7 @@ "fi": "Oviliike", "fr": "Magasin de portes", "gl": "Tenda de portas", + "he": "חנות דלתות", "hu": "Ajtószaküzlet", "it": "Negozio di porte", "ja": "ドア販売店", @@ -5947,6 +6828,11 @@ "sv": "Affär med dörrar" }, "searchTerms": { + "ca": [ + "tenda de portes", + "portes", + "entrada" + ], "da": [ "dør", "karm", @@ -5973,13 +6859,22 @@ "porte-fenêtre", "porte-fenetre" ], + "he": [ + "חנות לדלתות", + "דלתות פנים", + "דלתות חוץ", + "דלתות מעוצבות" + ], "it": [ "porte" ], "ja": [ "ドア販売店", "ドア", - "扉" + "扉", + "店舗", + "お店", + "建材店" ], "nl": [ "deurbeslag", @@ -6017,6 +6912,7 @@ "then": { "en": "Dry Cleaner", "ca": "Bugaderia", + "cs": "Čistírna", "da": "Renseri", "de": "Chemische Reinigung", "eo": "Vest-lavejo (nepolara solvilo)", @@ -6024,6 +6920,7 @@ "fi": "Kuivapesula", "fr": "Pressing", "gl": "Tinturaría", + "he": "ניקוי יבש", "hu": "Vegytisztitó", "id": "Jasa Cuci Kering", "it": "Lavanderia", @@ -6042,6 +6939,12 @@ "neteja", "neteja en sec" ], + "cs": [ + "čistírna", + "čistírna oděvů", + "prádelna", + "praní" + ], "da": [ "renseri" ], @@ -6061,6 +6964,9 @@ "teinturerie", "blanchisserie" ], + "he": [ + "ניקוי יבש" + ], "hu": [ "száraztisztító", "patyolat", @@ -6112,6 +7018,7 @@ "then": { "en": "E-Cigarette Shop", "ca": "Botiga de cigars electrònics", + "cs": "Obchod s e-cigaretami", "da": "E-cigaretbutik", "de": "E-Zigarettengeschäft", "eo": "Elektronik-cigareda vendejo", @@ -6119,6 +7026,7 @@ "fi": "Sähkösavukemyymälä", "fr": "Magasin de cigarettes électroniques", "gl": "Tenda de cigarros electrónicos", + "he": "חנות מוצרי עישון", "hu": "E-cigaretta bolt", "it": "Negozio di sigarette elettroniche", "ja": "電子タバコ店", @@ -6135,6 +7043,22 @@ "vaping", "vapor" ], + "ca": [ + "tenda de cigars electrònics", + "vapeig", + "vaper", + "electrònica", + "cigarret electrònic", + "tabaco", + "tabac", + "cigarro electrònic" + ], + "cs": [ + "elektronické", + "cigarety", + "kouřit", + "kouř" + ], "da": [ "e-cigaretbutik", "e-cigaretforretning" @@ -6165,6 +7089,9 @@ "fr": [ "boutique de cigarettes électroniques" ], + "he": [ + "חנות דברי עישון" + ], "hu": [ "e-cigaretta", "elektromos cigaretta" @@ -6180,13 +7107,17 @@ "嗜好品", "タバコ", "たばこ", - "煙草" + "煙草", + "店舗", + "お店" ], "nl": [ "e-cigarettewinkel" ], "pl": [ - "e-papierosy" + "sklep z e-papierosami", + "e-papierosy", + "vape shop" ], "pt": [ "e-cigarette", @@ -6217,12 +7148,15 @@ "if": "shop=electrical", "then": { "en": "Electrical Equipment Store", + "ca": "Tenda d'equipament elèctric", + "cs": "Prodejna elektoniky", "de": "Elektrofachgeschaft", "eo": "Elektraĵa vendejo", "es": "Tienda de equipos eléctricos", "fi": "Sähkötarvikekauppa", "fr": "Magasin d'équipements électriques", "gl": "Tenda de material eléctrico", + "he": "חנות מוצרי חשמל", "hu": "Villamossági szaküzlet", "it": "Negozio di materiale elettrico", "ja": "電気店", @@ -6242,6 +7176,23 @@ "power", "wire" ], + "ca": [ + "cable", + "elèctric", + "electricitat", + "ventilador", + "il·luminació", + "potència" + ], + "cs": [ + "kabel", + "elektrický", + "ventilátor", + "vedení", + "osvětlení", + "napájení", + "drát" + ], "de": [ "kabel", "elektrik", @@ -6280,6 +7231,17 @@ "éclairage", "lampes" ], + "he": [ + "חנות חשמל", + "חנות תאורה", + "מאווררים", + "כבל", + "חשמל", + "תאורה" + ], + "hu": [ + "villanyszerelés" + ], "it": [ "cavi", "prese", @@ -6350,6 +7312,7 @@ "then": { "en": "Electronics Store", "ca": "Botiga d'electrònica", + "cs": "Elektro", "da": "Elektronikbutik", "de": "Elektronikfachgeschäft", "eo": "Elektronika vendejo", @@ -6357,12 +7320,13 @@ "fi": "Elektroniikkamyymälä", "fr": "Magasin d'électronique et d'électroménager", "gl": "Tenda de electrodomésticos", + "he": "חנות אלקטרוניקה", "hu": "Szórakoztató elektronikai bolt", "id": "Toko Elektronik", "it": "Negozio di elettronica", "ja": "家電販売店(小型製品)", "nl": "Huishoudtoestellen-/Witgoedwinkel", - "pl": "Sklep z elektroniką/RTV/AGD", + "pl": "Sklep z elektroniką (RTV/AGD)", "pt": "Loja de eletrodomésticos", "ru": "Магазин бытовой электроники", "sl": "Elektronska trgovina", @@ -6386,6 +7350,19 @@ "botiga d'electrònica", "botiga de components electrònics" ], + "cs": [ + "spotřebič", + "audio", + "blueray", + "fotoaparát", + "počítač", + "dvd", + "domácí kino", + "rádio", + "reproduktor", + "televize", + "video" + ], "da": [ "elektronikbutik" ], @@ -6409,6 +7386,9 @@ "fr": [ "magasin d'électronique et d'électroménager" ], + "he": [ + "חנות אלקטרוניקה" + ], "hu": [ "háztartási gép", "tévé", @@ -6439,6 +7419,7 @@ "afwasmachine" ], "pl": [ + "sklep z elektroniką", "rtv", "agd", "artykuły gospodarstwa domowego", @@ -6529,6 +7510,7 @@ "then": { "en": "Erotic Store", "ca": "Botiga d'articles eròtics", + "cs": "Sex shop", "da": "Erotikbutik", "de": "Erotikgeschäft", "eo": "Seksumila vendejo", @@ -6536,6 +7518,7 @@ "fi": "Erotiikkamyymälä", "fr": "Sex-shop", "gl": "Tenda erótica", + "he": "חנות ארוטיקה", "hu": "Szexbolt", "it": "Sexy shop", "ja": "アダルトショップ", @@ -6556,6 +7539,13 @@ "shop", "sexshop" ], + "cs": [ + "sex shop", + "sexshop", + "erotické zboží", + "erotické pomůcky", + "erotické prádlo" + ], "da": [ "erotikbutik", "sexlegetøjsbutik", @@ -6596,6 +7586,9 @@ "fr": [ "sex-shop" ], + "he": [ + "חנות סקס" + ], "hu": [ "erotikus bolt", "szexuális segédeszköz" @@ -6667,6 +7660,7 @@ "then": { "en": "Fabric Store", "ca": "Botiga de teles", + "cs": "Obchod s textilem", "da": "Stofforretning", "de": "Stoffgeschäft", "eo": "Teksaĵa vendejo", @@ -6674,6 +7668,7 @@ "fi": "Kangaskauppa", "fr": "Magasin de tissus", "gl": "Tenda de teas", + "he": "חנות אריגה", "hu": "Méteráru-bolt", "id": "Toko Kain", "it": "Negozio di tessuti", @@ -6694,6 +7689,14 @@ "teles", "robes" ], + "cs": [ + "textil", + "textilní", + "látka", + "látky", + "bytový textil", + "metrový textil" + ], "da": [ "stofforretning" ], @@ -6717,6 +7720,9 @@ "fr": [ "mercerie" ], + "he": [ + "חנות אריגה" + ], "hu": [ "röltex", "lakástextil", @@ -6743,13 +7749,15 @@ "お店", "ショッピング", "小売", - "アパレル" + "アパレル", + "店舗" ], "nl": [ "kledij", "naaien" ], "pl": [ + "sklep z tkaninami", "tkaniny" ], "pt": [ @@ -6778,7 +7786,7 @@ "if": "shop=farm", "then": { "en": "Produce Stand", - "ca": "Estand productiu", + "cs": "Stánek s ovocem, zeleninou", "da": "Gårdbutik", "de": "Hofladen", "eo": "Terfrukta vendotablo", @@ -6786,11 +7794,13 @@ "fi": "Maatilan suoramyynti", "fr": "Magasin de producteurs", "gl": "Tenda de produtos agrícolas", + "he": "דוכן ירקות", "hu": "Termelői bolt", + "id": "Kios Tanaman", "it": "Bancarella agricola", "ja": "農産物直売所", "nl": "Boerderijwinkel voor groente en fruit", - "pl": "Stragan świeżych produktów", + "pl": "Stragan z owocami i warzywami", "pt": "Loja de produtos agrícolas locais", "ru": "Магазин свежих продуктов", "sl": "Prodaja domačih pridelkov", @@ -6809,6 +7819,16 @@ "ca": [ "grades" ], + "cs": [ + "stánek", + "ovoce", + "zelenina", + "trh", + "tržiště", + "farmářský trh", + "farmářské tržiště", + "farma" + ], "da": [ "fødevarestand", "frugtstand", @@ -6853,6 +7873,9 @@ "vente à la ferme", "vente producteurs" ], + "he": [ + "ירקן" + ], "hu": [ "farm bolt", "árus", @@ -6873,7 +7896,11 @@ "食べ物", "食料品", "店舗", - "お店" + "お店", + "農場", + "販売所", + "野菜", + "直売所" ], "nl": [ "groentekraam", @@ -6881,8 +7908,7 @@ "groente- en fruitkraam" ], "pl": [ - "stragan świeżych produktów", - "sklep wiejski", + "stragan z owocami i warzywami", "świeże płody rolne", "świeża żywność", "warzywa", @@ -6927,12 +7953,15 @@ "then": { "en": "Fashion Accessories Store", "ca": "Botiga d'accessoris de moda", + "cs": "Prodejna módních doplňků", + "da": "Butik for modetilbehør", "de": "Geschäft für Modeaccessoires", "eo": "Galanteria (vestaj akcesoraĵoj) vendejo", "es": "Tienda de accesorios de moda", "fi": "Muotitarvikekauppa", "fr": "Boutique d'accessoires de mode", "gl": "Tenda de accesorios de moda", + "he": "חנות אביזרי אופנה", "hu": "Divat kiegészítők boltja", "it": "Negozio di accessori di moda", "ja": "ファッション小物店", @@ -6957,6 +7986,24 @@ "wallet", "watch" ], + "cs": [ + "taška", + "kolínská voda", + "vůně", + "klobouk", + "šperky", + "parfém", + "peněženka", + "šátek", + "sluneční brýle", + "deštník", + "náprsní taška", + "hodinky" + ], + "da": [ + "butik for modetilbehør", + "accessories" + ], "de": [ "tasche", "parfum", @@ -7001,6 +8048,23 @@ "parapluie", "montres" ], + "he": [ + "אקססוריז", + "תיק", + "בושם", + "קולון", + "כובע", + "תכשיט", + "תכשיטים", + "פרפום", + "ארנק", + "צעיף", + "משקפיים", + "מטריה", + "שעון", + "תיק יד", + "תיק צד" + ], "ja": [ "アクセサリー店", "アクセサリーショップ", @@ -7014,7 +8078,9 @@ "おしゃれ", "ファッション小物店", "ショッピング", - "小売" + "小売", + "買い物", + "アクセサリー" ], "nl": [ "handtas", @@ -7030,6 +8096,7 @@ "sklep z galanterią", "galanteria", "akcesoria modowe", + "dodatki modowe", "dodatki do ubrania", "dodatki do odzieży", "paski", @@ -7087,12 +8154,15 @@ "then": { "en": "Fireplace Store", "ca": "Botiga de llars de foc", + "cs": "Prodej krbů a kamen", + "da": "Brændeovnsforretning", "de": "Kachelofenladen", "eo": "Kamen-vendejo", "es": "Tienda de chimeneas", "fi": "Takkamyymälä", "fr": "Magasin de cheminées", "gl": "Tenda de chemineas", + "he": "חנות חימום", "hu": "Cserépkályha- és kandalló-szaküzlet", "it": "Negozio di caminetti", "ja": "暖房具店", @@ -7108,6 +8178,21 @@ "stove", "masonry heater" ], + "cs": [ + "krb", + "kamna", + "zděné topení" + ], + "da": [ + "ovn", + "kamin", + "brænde", + "ild", + "ildsted", + "pejs", + "skorsten", + "opvarmning" + ], "de": [ "kachelofenladen", "kamin", @@ -7131,6 +8216,12 @@ "lume", "fumeira" ], + "he": [ + "אח", + "קמין", + "תנור", + "חימום" + ], "it": [ "camino", "caminetto", @@ -7154,6 +8245,7 @@ "kachelwinkel" ], "pl": [ + "sklep z kominkami", "kominek", "kominki", "piece", @@ -7167,7 +8259,15 @@ "fogões", "fogão", "salamandra", - "calor" + "calor", + "fogao", + "fogoes", + "aquecer", + "stove", + "fireplace", + "heat", + "heating", + "heater" ], "sv": [ "eldstad", @@ -7187,12 +8287,15 @@ "then": { "en": "Fishing Shop", "ca": "Botiga de pesca", + "cs": "Rybářské potřeby", + "da": "Fiskebutik", "de": "Angelgeschäft", "eo": "Fiŝkaptil-vendejo", "es": "Tienda de pesca", "fi": "Kalastuskauppa", "fr": "Magasin de pêche", "gl": "Tenda de pesca", + "he": "חנות דיג", "hu": "Horgászbolt", "it": "Negozio di pesca", "ja": "釣具店", @@ -7208,11 +8311,38 @@ "fishing line", "flies", "fly", + "hobby", "lure", "reel", "rod", "tackle" ], + "ca": [ + "tenda de pesca", + "cebo", + "canya", + "sedal", + "esquer", + "am", + "ams", + "peix", + "pesca", + "mar" + ], + "cs": [ + "návnada", + "vlasec", + "mouchy", + "muška", + "lákadlo", + "naviják", + "prut", + "náčiní" + ], + "da": [ + "fiskeforretning", + "lystfiskerbutik" + ], "de": [ "angelgeschäft", "angelsportzentrum" @@ -7238,6 +8368,16 @@ "fr": [ "pêche" ], + "he": [ + "פיתיונות", + "דגה", + "דייג", + "דיג", + "חכה", + "חוטי דיג", + "פיתיון", + "מצערת" + ], "it": [ "pesca", "pescatori", @@ -7258,7 +8398,9 @@ "フィッシング", "釣り道具", "スポーツ", - "ホビー" + "ホビー", + "店舗", + "お店" ], "nl": [ "visserswinkel", @@ -7268,6 +8410,7 @@ "vislijnen" ], "pl": [ + "sklep wędkarski", "wędki", "przynęty", "ryby", @@ -7311,11 +8454,14 @@ "if": "shop=flooring", "then": { "en": "Flooring Supply Shop", + "ca": "Botiga de sòls", + "cs": "Podlahové krytiny", "de": "Fußbodengeschäft", "eo": "Plank-vendejo", "es": "Tienda de suministros para pisos", "fr": "Magasin de revêtements de sol", "gl": "Tenda de chans", + "he": "חנות ריצוף", "hu": "Burkoló bolt", "it": "Negozio di articoli per pavimentazioni", "ja": "床用品店", @@ -7328,6 +8474,18 @@ "en": [ "tile" ], + "ca": [ + "tenda de sòls", + "manises", + "piso", + "màrmol", + "suelo", + "pis", + "terra" + ], + "cs": [ + "dlaždice" + ], "de": [ "fliese" ], @@ -7352,6 +8510,15 @@ "vinyle", "pvc" ], + "he": [ + "רצפות", + "אריחים", + "ריצוף", + "בלטות" + ], + "hu": [ + "hidegburkoló" + ], "it": [ "pavimenti", "piastrelle" @@ -7359,7 +8526,10 @@ "ja": [ "床用品店", "フロア", - "フローリング" + "フローリング", + "店舗", + "お店", + "建材店" ], "nl": [ "tegel" @@ -7398,6 +8568,7 @@ "then": { "en": "Florist", "ca": "Floristeria", + "cs": "Květinářství", "da": "Blomsterbutik", "de": "Blumenhändler", "eo": "Florvendejo", @@ -7405,6 +8576,7 @@ "fi": "Kukkakauppa", "fr": "Fleuriste", "gl": "Floraría", + "he": "חנות פרחים", "hu": "Virágbolt", "id": "Toko Bunga", "it": "Fioraio", @@ -7425,6 +8597,13 @@ "botiga de plantes", "botiga de jardineria" ], + "cs": [ + "květinář", + "květinářství", + "květy", + "květiny", + "kytice" + ], "da": [ "blomsterbutik", "blomsterforretning" @@ -7449,6 +8628,9 @@ "fr": [ "fleuriste" ], + "he": [ + "חנות פרחים" + ], "hu": [ "virágos", "virágárus", @@ -7508,6 +8690,7 @@ "then": { "en": "Framing Shop", "ca": "Botiga de marcs", + "cs": "Rámařství", "da": "Rammebutik", "de": "Bilderrahmengeschäft", "eo": "Bild-kadra vendejo", @@ -7515,11 +8698,12 @@ "fi": "Kehystämö", "fr": "Magasin d'encadrements", "gl": "Tenda de enmarcado", + "he": "חנות חקלאות", "hu": "Képkeret-bolt", "id": "Toko Bingkai", "it": "Negozio di cornici", "ja": "額縁店", - "nl": "Kaderwinkel", + "nl": "Lijstenmakerij", "pl": "Sklep z ramami", "pt": "Loja de molduras", "ru": "Магазин рамок для фотографий и картин", @@ -7527,10 +8711,26 @@ }, "searchTerms": { "en": [ - "art*", - "paint*", - "photo*", - "frame" + "art", + "frame", + "painting", + "photograph" + ], + "ca": [ + "tenda de marcs", + "art", + "pintura", + "pintor", + "fotografia" + ], + "cs": [ + "rámař", + "rámařství", + "rám", + "rámy", + "rámování", + "rámeček", + "rámečky" ], "da": [ "rammebutik", @@ -7568,6 +8768,9 @@ "enmarcar", "cadro" ], + "he": [ + "חנות חקלאות" + ], "hu": [ "képkeretező" ], @@ -7575,14 +8778,21 @@ "corniceria" ], "ja": [ - "額縁店" + "額縁店", + "店舗", + "お店", + "絵画" ], "nl": [ "schilderijen", "kunst", - "kadrering" + "kadering", + "inlijsten", + "lijsten", + "lijstenmaker" ], "pl": [ + "sklep z ramami", "ramy", "oprawa obrazów", "oprawy obrazów", @@ -7616,11 +8826,13 @@ "then": { "en": "Frozen Food Store", "ca": "Botiga de menjars congelats", + "cs": "Prodejna mražených potravin", "de": "Geschäft für Tiefkühlprodukte", "eo": "Frostigit-manĝaĵa vendejo", "es": "Tienda de alimentos congelados", "fr": "Magasin de produits surgelés", "gl": "Tenda de conxelados", + "he": "חנות מזון קפוא", "hu": "Fagyasztottélelmiszer-bolt", "it": "Negozio di cibo surgelato", "ja": "冷凍食品店", @@ -7631,6 +8843,16 @@ "sv": "Affär för fryst mat" }, "searchTerms": { + "cs": [ + "obchod s mraženými potravinami", + "mražené potraviny", + "mražené jídlo", + "mrazák", + "zmražené", + "zmrazit", + "potraviny", + "obchod" + ], "de": [ "tiefkühllebensmittel", "tiefkühlkost", @@ -7654,6 +8876,16 @@ "surgeles", "glaces" ], + "he": [ + "קפואים", + "סנפרוסט", + "קיפאון", + "הקפאה", + "מקרר", + "פריג'ידר", + "פריזר", + "קרח" + ], "hu": [ "mirelit" ], @@ -7677,6 +8909,7 @@ "diepvriesvoedsel" ], "pl": [ + "sklep z mrożonkami", "mrożonki" ], "pt": [ @@ -7699,31 +8932,48 @@ "mat", "lunch" ] - }, - "icon": { - "path": "./assets/layers/id_presets/maki-shop.svg", - "class": "medium" } }, { "if": "shop=fuel", "then": { "en": "Fuel Shop", + "ca": "Botiga de combustibles", + "cs": "Obchod s palivem", + "da": "Brændstofbutik", "de": "Tankstelle", "eo": "Brulaĵ-vendejo", "es": "Tienda de combustible", "fi": "Polttoainemyymälä", "fr": "Revendeur de carburant", "gl": "Tenda de combustíbel", + "he": "חנות נוחות", "hu": "Üzemanyag-szaküzlet", "it": "Negozio di carburanti", "ja": "燃料店", "nl": "Brandstofwinkel", - "pl": "Sklep z paliwami", + "pl": "Sklep z paliwem", "pt": "Loja de combustíveis", "sv": "Bränsleaffär" }, "searchTerms": { + "ca": [ + "gas", + "butà", + "butano", + "metà", + "propà", + "metano", + "propano", + "paella", + "tenda de combustibles", + "cepsa", + "repsol", + "cuina", + "gasòil", + "gasolina", + "diesel" + ], "de": [ "treibstoffverkaufsstelle" ], @@ -7768,6 +9018,12 @@ "butano", "propano" ], + "he": [ + "חומרי בערה", + "אנרגיה", + "דלק", + "גז" + ], "it": [ "benzina", "diesel", @@ -7800,6 +9056,7 @@ "kerosine" ], "pl": [ + "sklep z paliwem", "paliwo", "paliwa", "skład opału", @@ -7863,6 +9120,7 @@ "then": { "en": "Funeral Home", "ca": "Tanatori", + "cs": "Pohřební služba", "da": "Bedemandsforretning", "de": "Beerdigungsinstitut", "eo": "Tombistejo", @@ -7870,6 +9128,7 @@ "fi": "Hautaustoimisto", "fr": "Pompes funèbres", "gl": "Funeraria", + "he": "קברן", "hu": "Temetkezési iroda", "id": "Rumah Pemakaman", "it": "Casa funeraria", @@ -7884,7 +9143,19 @@ "searchTerms": { "en": [ "undertaker", - "memorial home" + "memorial home", + "mortuary" + ], + "ca": [ + "funerària", + "mortuori" + ], + "cs": [ + "pohřební služba", + "pohřebák", + "hřbitovní služby", + "hřbitovní služba", + "hrobař" ], "da": [ "bedemandsforretning", @@ -7928,6 +9199,9 @@ "velorio", "abellón" ], + "he": [ + "קברנית" + ], "hu": [ "temetkezési ügyintézés", "temetkezési intézet", @@ -7951,6 +9225,8 @@ "rouwcentrum" ], "pl": [ + "zakład pogrzebowy", + "dom pogrzebowy", "pochówek", "pogrzeb" ], @@ -7992,6 +9268,7 @@ "then": { "en": "Furniture Store", "ca": "Botiga de mobles", + "cs": "Nábytek", "da": "Møbelforhandler", "de": "Möbelhaus", "eo": "Mebla vendejo", @@ -7999,6 +9276,7 @@ "fi": "Huonekaluliike", "fr": "Magasin de meubles", "gl": "Moblaría", + "he": "חנות רהיטים", "hu": "Bútorbolt", "id": "Toko Furnitur", "it": "Negozio di mobili", @@ -8020,6 +9298,11 @@ "botiga de mobles", "moblista" ], + "cs": [ + "obchod s nábytkem", + "nábytek", + "domácnost" + ], "da": [ "møbelbutik", "møbelhandler", @@ -8049,9 +9332,17 @@ "muebles", "tienda de muebles" ], + "fi": [ + "huonekalumyymälä", + "huonekalukauppa", + "huonekaluliike" + ], "fr": [ "magasin de meubles" ], + "he": [ + "חנות ריהוט" + ], "hu": [ "bútor", "lakberendezés" @@ -8065,7 +9356,16 @@ ], "ja": [ "家具店", - "インテリア用品店" + "インテリア用品店", + "店舗", + "お店", + "机", + "テーブル", + "ラック", + "本棚", + "椅子", + "箪笥", + "タンス" ], "nl": [ "woonwarenhuis", @@ -8115,12 +9415,14 @@ "if": "shop=games", "then": { "en": "Tabletop Game Store", + "cs": "Deskové hry", "de": "Brettspielgeschäft", "eo": "Tabullud‑vendejo", "es": "Tienda de juegos de mesa", "fi": "Lautapeliliike", "fr": "Magasin de jeux de plateau", "gl": "Tenda de xogos de mesa", + "he": "חנות משחקי קופסה", "hu": "Társasjáték-bolt", "it": "Negozio di giochi da tavolo", "ja": "ボードゲーム販売店", @@ -8136,9 +9438,25 @@ "card game", "dice game", "game shop", + "hobby", + "larp", "live action role-playing game", - "miniatures wargame", - "strategy game" + "miniature wargame", + "role-playing", + "strategy game", + "wargame" + ], + "cs": [ + "desková hra", + "karetní hra", + "hra s kostkami", + "obchod s hrami", + "larp", + "živá akční hra na hrdiny", + "miniaturní válečná hra", + "hraní rolí", + "strategická hra", + "válečná hra" ], "de": [ "brettspielgeschäft" @@ -8181,6 +9499,21 @@ "cartes", "figurines" ], + "he": [ + "חנות גיקים", + "חנות פנזטיה", + "פנטזיה", + "הרפתקאות מבוכים ודרקונים", + "קלפים", + "קלפי משחק", + "משחקי תפקידים", + "משחקי אסטרטגיה", + "משחקי מלחמה", + "חנות משחקים" + ], + "hu": [ + "játék" + ], "it": [ "giochi da tavolo", "carte da gioco", @@ -8250,6 +9583,7 @@ "then": { "en": "Garden Center", "ca": "Centre de jardineria", + "cs": "Zahradnictví", "da": "Havecenter", "de": "Gartenzentrum", "eo": "Ĝarden-vendejo", @@ -8257,6 +9591,7 @@ "fi": "Puutarhamyymälä", "fr": "Jardinerie", "gl": "Centro de xardinaría", + "he": "חנות גננות", "hu": "Kertészet", "id": "Toko Tanaman", "it": "Vivaio", @@ -8272,9 +9607,18 @@ "en": [ "landscape", "mulch", + "nursery", + "plant nursery", + "retail plant nursery", "shrub", "tree" ], + "cs": [ + "zahradnictví", + "zahradní centrum", + "zahradnické středisko", + "zahradnické centrum" + ], "da": [ "havecenter", "plantecenter" @@ -8299,6 +9643,14 @@ "jardinerie", "magasin de jardinage" ], + "he": [ + "חנות ציוד לגן" + ], + "hu": [ + "táj", + "bokor", + "fa" + ], "id": [ "bunga", "tanaman hias", @@ -8374,6 +9726,8 @@ "if": "shop=gas", "then": { "en": "Bottled Gas Shop", + "ca": "Punt de venta de Gas embotellat", + "cs": "Obchod s lahvovým plynem", "da": "Gasflaskebutik", "de": "Gasflaschenverkauf", "eo": "Gasuja vendejo", @@ -8381,6 +9735,7 @@ "fi": "Kaasupulloliike", "fr": "Magasin de bouteilles de gaz", "gl": "Tenda de bombonas de gas", + "he": "חנות גז", "hu": "Palackozottgáz-bolt", "it": "Negozio di bombole", "ja": "ガスボンベ店", @@ -8400,6 +9755,32 @@ "refill", "tank" ], + "ca": [ + "gas", + "butà", + "butano", + "metà", + "propà", + "metano", + "propano", + "paella", + "repsol", + "cepsa", + "botella", + "punt de venta de gas", + "botiga de gas", + "tenda de gas" + ], + "cs": [ + "cng", + "lpg", + "svítiplyn", + "zemní plyn", + "propan", + "butan", + "doplnit", + "zásobník" + ], "da": [ "gasflaskebutik" ], @@ -8444,6 +9825,9 @@ "butane", "propane" ], + "he": [ + "חנות גז" + ], "hu": [ "gáztöltő", "pb gáz", @@ -8466,7 +9850,11 @@ "ricarica" ], "ja": [ - "ガスボンベ店" + "ガスボンベ店", + "店舗", + "お店", + "ガス", + "小売" ], "nl": [ "methaan", @@ -8479,6 +9867,7 @@ "lpg" ], "pl": [ + "sklep z butlami gazowymi", "butle gazowe", "gaz płynny", "propan", @@ -8525,12 +9914,14 @@ "then": { "en": "General Store", "ca": "Botiga generalista", + "cs": "Smíšené zboží", "de": "Gemischtwarenhandlung", "eo": "Ĝenerala vendejo", "es": "Tienda general", "fi": "Sekatavarakauppa", "fr": "Magasin général", "gl": "Tenda xeral", + "he": "חנות כללית", "hu": "Vegyesbolt", "id": "Warung", "it": "Emporio", @@ -8542,8 +9933,13 @@ }, "searchTerms": { "en": [ + "small-town store", "village shop" ], + "cs": [ + "maloměstský obchod", + "vesnický obchod" + ], "de": [ "gemischtwarenhandlung", "dorfladen", @@ -8569,6 +9965,12 @@ "magasin général", "magasin de village" ], + "he": [ + "כלבו", + "חנות קיבוצית", + "חנות יישובית", + "חנות אזורית" + ], "hu": [ "szatócs" ], @@ -8579,7 +9981,16 @@ "ja": [ "よろずや", "よろず屋", - "万屋" + "万屋", + "なんでも屋", + "雑貨店", + "食料品", + "日用品", + "日用雑貨", + "家庭用品", + "小売", + "店舗", + "お店" ], "nl": [ "winkeltje" @@ -8608,6 +10019,7 @@ "then": { "en": "Gift Shop", "ca": "Botiga de regals", + "cs": "Dárky, suvenýry", "da": "Gavebutik", "de": "Geschenkeladen", "eo": "Suvenira vendejo", @@ -8615,6 +10027,7 @@ "fi": "Lahjamyymälä", "fr": "Boutique de cadeaux", "gl": "Tenda de agasallos", + "he": "חנות מתנות", "hu": "Ajándékbolt", "id": "Toko Hadiah", "it": "Negozio souvenir", @@ -8628,11 +10041,16 @@ }, "searchTerms": { "en": [ - "souvenir" + "tourist trap" ], "ca": [ - "botiga de regals", - "botiga d'objectes de regal" + "botiga d'objectes de regal", + "tenda de regals", + "tenda d'objectes de regal" + ], + "cs": [ + "obchod s dárky", + "suvenýry" ], "da": [ "gavebutik", @@ -8665,6 +10083,9 @@ "fr": [ "boutique de souvenirs" ], + "he": [ + "חנות מתנות" + ], "hu": [ "meglepetés", "ajándéktárgy", @@ -8683,7 +10104,11 @@ "ギフト用品店", "土産店", "お土産", - "贈答品" + "贈答品", + "店舗", + "お店", + "ギフト", + "プレゼント" ], "nl": [ "cadeauzaak", @@ -8744,17 +10169,20 @@ "then": { "en": "Greengrocer", "ca": "Fruiteria", + "cs": "Ovoce a zelenina", "da": "Grønthandler", "de": "Obst- und Gemüseladen", "eo": "Legom-butiko", "es": "Verdulería / Frutería", + "eu": "Fruta eta barazki-saltzailea", "fi": "Kasviskauppa", "fr": "Marchand de fruits et légumes", "gl": "Froitaría", + "he": "ירקן", "hu": "Zöldséges", "id": "Toko Buah dan Sayuran", "it": "Fruttivendolo", - "ja": "八百屋・果物屋", + "ja": "青果店", "nl": "Groenteboer", "pl": "Warzywniak", "pt": "Loja de frutas e verduras", @@ -8768,6 +10196,14 @@ "produce", "vegetable" ], + "cs": [ + "zelinář", + "zelinářství", + "prodejna zeleniny", + "zelenina", + "ovoce", + "ovoce a zelenina" + ], "da": [ "grønthandler", "frugtbutik" @@ -8795,6 +10231,13 @@ "verdulero", "frutero" ], + "eu": [ + "frutadenda", + "barazkiak", + "frutak", + "fruituak", + "entsalada" + ], "fi": [ "vihanneskauppias", "vihannes", @@ -8835,6 +10278,9 @@ "verduleria", "verdularia" ], + "he": [ + "חנות ירקות" + ], "hu": [ "zöldség", "gyümölcs" @@ -8843,16 +10289,18 @@ "fruttivendolo" ], "ja": [ - "八百屋", "青果店", + "八百屋", + "果物屋", + "食料品", "食品", "食べ物", "野菜", - "フルーツ", + "ベジタブル", "果物", "くだもの", - "ベジタブル", - "食料品", + "フルーツ", + "小売", "店舗", "お店" ], @@ -8869,10 +10317,11 @@ "zieleniak", "sklep warzywny", "sklep z warzywami", + "sklep z owocami", "stoisko z warzywami", "stragan z warzywami", "owoce", - "owocami" + "warzywa" ], "pt": [ "greengrocer", @@ -8910,13 +10359,16 @@ "then": { "en": "Hairdresser", "ca": "Perruqueria", + "cs": "Kadeřnictví", "da": "Frisør", "de": "Friseur", "eo": "Frizejo", "es": "Peluquería", + "eu": "Ile-apaintzailea", "fi": "Parturi-kampaamo", "fr": "Salon de coiffure", "gl": "Perrucaría", + "he": "מעצב שיער", "hu": "Fodrász", "id": "Salon", "it": "Parrucchiere", @@ -8930,7 +10382,13 @@ }, "searchTerms": { "en": [ - "barber" + "beard" + ], + "cs": [ + "kadeřník", + "holič", + "vizážista", + "kadeřnictví" ], "da": [ "frisør", @@ -8975,10 +10433,15 @@ "parta" ], "fr": [ - "coiffeur" + "coiffeur", + "barbier" + ], + "he": [ + "מעצב שער" ], "hu": [ - "hajvágás" + "hajvágás", + "fodrász" ], "it": [ "parrucchiere", @@ -9003,7 +10466,8 @@ "fryzjer", "fryzjernia", "salon fryzjerski", - "zakład fryzjerski" + "zakład fryzjerski", + "barber" ], "pt": [ "hairdresser", @@ -9059,27 +10523,40 @@ "if": "shop=hairdresser_supply", "then": { "en": "Hairdresser Supply Store", + "cs": "Kadeřnické potřeby", "da": "Butik med udstyr til frisører", "de": "Friseurbedarf", "eo": "Frizist-ilara vendejo", "es": "Tienda de suministros para peluquería", + "eu": "Ile-apaindegiko hornidura-denda", "fi": "Hiustarvikemyymälä", "fr": "Magasin de matériel de coiffure", "gl": "Tenda de accesorios de salón de peiteado", + "he": "חנות ציוד לספרים", "hu": "Fodrászkellék-bolt", "it": "Negozio di prodotti per parrucchiere", "ja": "理容用品店", "nl": "Haarbenodigdhedenwinkel", "pl": "Sklep z artykułami fryzjerskimi", "pt": "Loja de acessórios de cabeleireiro", + "ru": "Парикмахерские принадлежности", "sv": "Affär för hårprodukter" }, "searchTerms": { "en": [ "barber", + "razor", "shampoo", + "shaver", "conditioner" ], + "cs": [ + "holič", + "holící strojek", + "šampon", + "holítko", + "kondicionér" + ], "de": [ "friseurbedarf", "frisörbedarf" @@ -9114,6 +10591,16 @@ "shampoings", "barbier" ], + "he": [ + "תספורת", + "שמפו", + "מרכך", + "עיצוב שיער", + "מספרה", + "ספר", + "סלון יופי", + "סלון טיפוח" + ], "hu": [ "fodrászcikk" ], @@ -9136,6 +10623,7 @@ "kapperswinkel" ], "pl": [ + "sklep z artykułami fryzjerskimi", "artykuły fryzjerskie", "szampony", "odżywki", @@ -9175,6 +10663,7 @@ "then": { "en": "Hardware Store", "ca": "Ferreteria", + "cs": "Železářství", "da": "Håndværkerbutik", "de": "Eisenwarenhandel", "eo": "Laborila vendejo", @@ -9182,6 +10671,7 @@ "fi": "Rautakauppa", "fr": "Quincaillerie", "gl": "Ferraxaría", + "he": "חנות אספקה טכנית", "hu": "Vas-műszaki bolt", "id": "Toko Perkakas", "it": "Ferramenta", @@ -9202,6 +10692,14 @@ "home improvement", "tools" ], + "cs": [ + "řemeslo", + "kutilství", + "udělej si sám", + "hardware", + "domácí kutily", + "nástroje" + ], "da": [ "værktøj", "håndværker", @@ -9229,9 +10727,15 @@ "herramientas", "herrajes" ], + "fi": [ + "rautakauppa" + ], "fr": [ "quincaillerie" ], + "he": [ + "חנות כלי חומרה" + ], "hu": [ "csavarbolt", "villanyszerelés", @@ -9243,13 +10747,15 @@ ], "ja": [ "金物屋", - "金物店" + "金物店", + "工具" ], "nl": [ "bouwcentrum", "bouwmaterialenspeciaalzaak" ], "pl": [ + "sklep z narzędziami", "sklep narzędziowy", "narzędzia", "elektronarzędzia", @@ -9319,40 +10825,60 @@ { "if": "shop=health_food", "then": { - "en": "Health Food Shop", + "en": "Health Food Store", + "cs": "Obchod zdravé výživy", + "da": "Helsekostbutik", "de": "Reformhaus", - "eo": "Sanig-manĝaĵa vendejo", - "es": "Tienda de comida saludable", - "fi": "Terveysravinnemyymälä", - "fr": "Magasin d'alimentation de santé", - "gl": "Tenda de produtos saudábeis", - "hu": "Egészséges élelmiszerek boltja", - "it": "Prodotti per il benessere", + "es": "Tienda de alimentos saludables", + "fr": "Magasin d'alimentation diététique/bio", + "he": "חנות מזון בריאות", + "hu": "Biobolt", + "it": "Negozio di cibi sani", "ja": "健康食品店", - "nl": "Gezondheidswinkel", + "nl": "Natuurvoedingswinkel", "pl": "Sklep ze zdrową żywnością", "pt": "Loja de comida saudável", - "ru": "Магазин здорового питания", "sv": "Hälsokostbutik" }, "searchTerms": { "en": [ - "wholefood", - "vitamins", + "groceries", + "nutritional", + "organic", + "raw food", + "unprocessed", "vegetarian", - "vegan" + "vegan", + "vitamins", + "wholefood" + ], + "cs": [ + "potraviny", + "výživové", + "bio", + "syrové potraviny", + "nezpracované", + "vegetariánské", + "veganské", + "vitamíny", + "celkové potraviny" + ], + "da": [ + "helsekostbutik", + "helsekostforretning", + "naturkostbutik", + "kosttilskud" ], "de": [ - "reformhaus" - ], - "eo": [ - "saniga manĝaĵo", - "sana manĝaĵo", - "ekologia manĝaĵo", - "vegetarisma manĝaĵo" + "reformhaus", + "gesundheit", + "naturkost" ], "es": [ + "tienda de alimentos saludables", + "alimentos saludables", "tienda de comida saludable", + "comida saludable", "alimentos integrales", "vitaminas", "vegetariano", @@ -9361,15 +10887,24 @@ "dietetica" ], "fr": [ - "magasin d'alimentation de santé", - "vitamines" + "magasin", + "alimentation", + "produits", + "aliments", + "bio", + "biologique", + "diététique", + "naturel", + "végétarien", + "végan" + ], + "he": [ + "מזון בריא", + "אוכל", + "אוכל בריא" ], "it": [ - "prodotti genuini", - "benessere", - "negozio di prodotti biologici", - "negozio di prodotti per la salute", - "prodotti per la salute" + "negozio di cibi salutari" ], "ja": [ "健康食品店", @@ -9380,17 +10915,33 @@ "ビタミン", "栄養剤", "店舗", - "お店" + "お店", + "健康食品" ], "nl": [ - "supervoedselwinkel", - "superfoodwinkel" + "biologisch", + "reformwinkel", + "gezondheid", + "vitamines", + "supplementen", + "vegetarisch", + "onbewerkt" ], "pl": [ + "sklep ze zdrową żywnością", + "sklep dietetyczny", + "sklep bezglutenowy", "zdrowa żywność", "żywność ekologiczna", "żywność regionalna", - "produkty regionalne" + "produkty regionalne", + "spożywcze", + "odżywcze", + "żywność surowa", + "żywność nieprzetworzona", + "wegetariańskie", + "wegańskie", + "witaminy" ], "pt": [ "alimentos naturais", @@ -9407,12 +10958,6 @@ "biológico", "vegano" ], - "ru": [ - "здоровая еда", - "здоровая пища", - "органические продукты", - "чистая продукция" - ], "sv": [ "hälsokostbutik", "hälsokost", @@ -9438,6 +10983,7 @@ "then": { "en": "Hearing Aids Store", "ca": "Centre d'audició", + "cs": "Obchod s naslouchátky", "da": "Høreapparatbutik", "de": "Hörgerätegeschäft", "eo": "Aŭd-helpila vendejo", @@ -9445,6 +10991,7 @@ "fi": "Kuuloapumyymälä", "fr": "Audioprothésiste", "gl": "Tenda de audífonos", + "he": "חנות מכשירי שמיעה", "hu": "Hallókészülékbolt", "id": "Toko Alat Bantu Dengar", "it": "Negozio di apparecchi acustici", @@ -9457,6 +11004,15 @@ "sv": "Hörapparater" }, "searchTerms": { + "cs": [ + "naslouchátko", + "naslouchátka", + "naslouchadlo", + "naslouchadla", + "neslyšící", + "nedoslýchavý", + "nedoslýchavost" + ], "da": [ "høreapparatbutik", "audiolog", @@ -9500,6 +11056,9 @@ "fr": [ "vente de prothèses auditives" ], + "he": [ + "חנות מכשירי שמיעה" + ], "hu": [ "hallókészülékek" ], @@ -9521,6 +11080,7 @@ "hoorhulp" ], "pl": [ + "sklep z aparatami słuchowymi", "aparaty słuchowe" ], "pt": [ @@ -9550,6 +11110,7 @@ "then": { "en": "Herbalist", "ca": "Herbolari", + "cs": "Bylinkářství", "da": "Helseforretning", "de": "Kräuterladen", "eo": "Herba vendejo", @@ -9557,6 +11118,7 @@ "fi": "Luontaistuotemyymälä", "fr": "Herboristerie", "gl": "Herboristaría", + "he": "חנות צמחי מרפא", "hu": "Gyógynövénybolt", "it": "Erboristeria", "ja": "薬草店", @@ -9568,6 +11130,31 @@ "sv": "Medicinalväxter" }, "searchTerms": { + "en": [ + "ayurveda", + "ayurvedic", + "medicinal plants", + "paraherbal", + "phytomedicine", + "plant medicine", + "traditional medicine" + ], + "cs": [ + "bylinkář", + "bylinkářka", + "bylinář", + "bylinářka", + "bylinkářství", + "bylinářství", + "kořenář", + "kořenářka", + "kořenářství", + "herbalista", + "bylinky", + "byliny", + "bylinka", + "bylina" + ], "da": [ "helseforretning" ], @@ -9600,6 +11187,9 @@ "fármaco", "parafarmacia" ], + "he": [ + "הרבליסט" + ], "hu": [ "gyógynövény", "tea", @@ -9657,6 +11247,7 @@ "then": { "en": "Hifi Store", "ca": "Botiga d'alta fidelitat", + "cs": "Hifi elektronika", "da": "Radioforhandler", "de": "HiFi-Laden", "eo": "Aldfidela-sona vendejo", @@ -9664,6 +11255,7 @@ "fi": "Hifimyymälä", "fr": "Magasin de matériel hi-fi", "gl": "Tenda de equipamento de son", + "he": "חנות הגברה", "hu": "HiFi-szaküzlet", "id": "Toko Hifi", "it": "Negozio Hifi", @@ -9683,6 +11275,12 @@ "stereo", "video" ], + "cs": [ + "obchod se zvukovými systémy", + "obchod s ozvučením", + "ozvučení", + "hifi" + ], "da": [ "radioforhandler", "hifi-butik" @@ -9709,6 +11307,9 @@ "fr": [ "magasin d'appareils audio-visuel" ], + "he": [ + "חנות ציוד הגברה" + ], "hu": [ "akusztika", "extreme audio", @@ -9736,6 +11337,7 @@ "stereoinstallatie" ], "pl": [ + "sklep ze sprzętem hi-fi", "hi-fi", "hifi", "audio", @@ -9783,107 +11385,65 @@ } }, { - "if": "shop=hobby", + "if": "shop=honey", "then": { - "en": "Hobby Shop", - "da": "Hobbybutik", - "de": "Bastelgeschäft", - "eo": "Hobia vendejo", - "es": "Tienda de pasatiempos", - "fi": "Harrastuskauppa", - "fr": "Magasin pour hobby (non spécifié)", - "gl": "Tenda de pasatempos", - "hu": "Hobbibolt", - "it": "Negozio di hobbystica", - "ja": "ホビーショップ", - "nl": "Hobbywinkel", - "pl": "Sklep hobbystyczny", - "pt": "Loja de modelismo", - "sv": "Hobbyaffär" + "en": "Honey Store", + "cs": "Obchod s medem", + "de": "Honiggeschäft", + "es": "Tienda de miel", + "fr": "Magasin de miel", + "he": "חנות דבש", + "ja": "蜂蜜販売店", + "nl": "Honingwinkel", + "pl": "Sklep z miodem", + "pt": "Loja de mel", + "sv": "Honungsaffär" }, "searchTerms": { - "en": [ - "manga", - "figurine", - "model" - ], "de": [ - "bastelgeschäft", - "hobbyshop" - ], - "eo": [ - "hobio", - "ŝatokupo", - "modelfarado", - "figuroj", - "animeo" + "honig", + "biene", + "wachs", + "propolis", + "mel" ], "es": [ - "manga", - "figuras", - "modelo" - ], - "fi": [ - "harrastus", - "harrastukset", - "harrastaa", - "kauppa", - "liike", - "myymälä", - "putiikki", - "puoti" + "tienda de miel", + "miel", + "apicultura" ], "fr": [ - "manga", - "figurine", - "modèle", - "modélisme" - ], - "it": [ - "manga", - "figurine", - "modellini", - "hobby" + "magasin de miel", + "miel", + "apiculture", + "apiculteur", + "apicultrice" ], "ja": [ - "ホビーショップ", - "ホビー店", - "プラモデル", - "フィギュア", - "マンガ", - "ミリタリー", - "模型" - ], - "nl": [ - "hobbywinkel" + "蜂蜜販売店", + "ハチミツ", + "はちみつ" ], "pl": [ - "sklep hobbystyczny" + "sklep z miodem", + "miód", + "miody" ], "pt": [ - "modelos", - "passatempo", - "hobby", - "aviões", - "carros", - "comboios", - "helicópteros" - ], - "ru": [ - "хобби" + "honey", + "mel", + "abelhas", + "apicultura" ], "sv": [ - "hobbyaffär", - "hobby", - "manga", - "model", - "modellbygge", - "modellflyg", - "modelljärnväg" + "honung", + "honing", + "honungsbutik", + "honungsaffär" ] }, "icon": { - "path": "./assets/layers/id_presets/fas-dragon.svg", + "path": "./assets/layers/id_presets/maki-shop.svg", "class": "medium" } }, @@ -9891,11 +11451,14 @@ "if": "shop=household_linen", "then": { "en": "Household Linen Shop", + "ca": "Botiga de roba per a la llar", + "cs": "Bytový textil", "de": "Haushaltswäschegeschäft", "eo": "Tuka vendejo", "es": "Tienda de ropa de hogar", "fr": "Magasin de linge de maison", "gl": "Tenda de roupa de fogar", + "he": "חנות מצעים", "hu": "Lakástextil-szaküzlet", "it": "Negozio di biancheria per la casa", "ja": "家庭用布製品店", @@ -9917,6 +11480,30 @@ "sheets", "towels" ], + "ca": [ + "tenda de roba per a la llar", + "llar", + "casa", + "hogar", + "llençols", + "llançols", + "pijama", + "coixins", + "torcamans" + ], + "cs": [ + "látky", + "prodejna látek", + "povlečení", + "záclony", + "závěsy", + "ručníky", + "prostěradla", + "hadry", + "textil", + "domácí", + "bytový" + ], "de": [ "leintücher", "bettwäsche", @@ -9975,6 +11562,19 @@ "torchon", "nappe" ], + "he": [ + "חנות מצעים", + "כלי מיטה", + "מיטה", + "מצעים", + "שמיכה", + "כרית", + "ציפית", + "ציפה", + "מפה", + "מפות", + "עיצוב" + ], "it": [ "lenzuola", "coperte", @@ -9995,7 +11595,9 @@ "ローブ", "パジャマ", "ショッピング", - "小売" + "小売", + "布", + "木綿" ], "nl": [ "lakens", @@ -10010,6 +11612,7 @@ ], "pl": [ "sklep z pościelą", + "sklep z ręcznikami", "pościel", "prześcieradła", "kołdry", @@ -10072,7 +11675,8 @@ "if": "shop=houseware", "then": { "en": "Houseware Store", - "ca": "Botiga de la llar", + "ca": "Botiga d'articles per a la llar", + "cs": "Domácí potřeby", "da": "Køkkenudstyr", "de": "Haushaltswarengeschäft", "eo": "Mastrum-aparata vendejo", @@ -10080,6 +11684,7 @@ "fi": "Kotitarvikekauppa", "fr": "Magasin d’articles ménagers", "gl": "Tenda de artigos do fogar", + "he": "חנות כלי בית", "hu": "Háztartási bolt", "it": "Casalinghi", "ja": "家庭用品店", @@ -10092,9 +11697,21 @@ "searchTerms": { "en": [ "home", - "household", "kitchenware" ], + "ca": [ + "tenda d'articles per a la llar", + "hogar", + "llar", + "casa", + "cuina" + ], + "cs": [ + "domácí potřeby", + "kuchyňské potřeby", + "potřeby pro domácnost", + "nádobí" + ], "da": [ "køkkenudstyr" ], @@ -10119,6 +11736,9 @@ "fr": [ "vente d'articles de cuisine" ], + "he": [ + "חנות כלי בית" + ], "hu": [ "edények", "evőeszközök", @@ -10149,7 +11769,8 @@ "包丁", "ナイフ", "フォーク", - "箸" + "箸", + "雑貨" ], "nl": [ "huiswaar", @@ -10160,6 +11781,7 @@ "gebruiksvoorwerpen" ], "pl": [ + "sklep z małymi artykułami gospodarstwa domowego", "małe agd", "artykuły kuchenne", "przybory kuchenne", @@ -10205,6 +11827,7 @@ "then": { "en": "Hunting Shop", "ca": "Botiga de caça", + "cs": "Lovecké potřeby", "da": "Jagtbutik", "de": "Jagdgeschäft", "eo": "Ĉasil-vendejo", @@ -10212,6 +11835,7 @@ "fi": "Metsästyskauppa", "fr": "Magasin de chasse", "gl": "Tenda de caza", + "he": "חנות ציד", "hu": "Vadászati bolt", "it": "Negozio di caccia", "ja": "狩猟用品店", @@ -10227,9 +11851,31 @@ "bows", "bullets", "crossbows", + "hobby", "rifles", "traps" ], + "ca": [ + "tenda de caça", + "fletexes", + "arcs", + "bales", + "ballestes", + "rifles", + "escopetes", + "trampres", + "porcsenglars", + "jabalins", + "vedat" + ], + "cs": [ + "šípy", + "luky", + "kulky", + "kuše", + "pušky", + "pasti" + ], "de": [ "geschäft für jagdausrüstung", "jagdgeschäft" @@ -10249,6 +11895,14 @@ "fr": [ "chasse" ], + "he": [ + "חצים", + "קשתות", + "כדורים", + "חץ וקשת", + "אקדחים", + "מלכודות" + ], "it": [ "caccia", "frecce", @@ -10289,6 +11943,7 @@ "vallen" ], "pl": [ + "sklep myśliwski", "myśliwy", "polowanie", "strzały", @@ -10333,7 +11988,8 @@ "if": "shop=interior_decoration", "then": { "en": "Interior Decoration Store", - "ca": "Botiga d'Interiorisme", + "ca": "Botiga de decoració d'interior", + "cs": "Obchod s bytovými doplňky", "da": "Brugskunstbutik", "de": "Innenausstattungsgeschäft", "eo": "Ensembla (meblara) vendejo", @@ -10341,6 +11997,7 @@ "fi": "Sisustusmyymälä", "fr": "Magasin de décoration d'intérieur", "gl": "Tenda de decoración de interiores", + "he": "חנות עיצוב פנים", "hu": "Lakberendezési bolt", "id": "Toko Dekorasi Interior", "it": "Negozio di decorazioni per interni", @@ -10352,6 +12009,21 @@ "sv": "Inredningsaffär" }, "searchTerms": { + "ca": [ + "decoració", + "adornaments", + "interiorisme" + ], + "cs": [ + "bytový doplněk", + "bytové doplňky", + "bytové dekorace", + "bytová dekorace", + "dekorace", + "dekorativní doplněk", + "doplněk do bytu", + "dekorace do bytu" + ], "da": [ "indendørsudsmykningsbutik", "indendørsudsmykning", @@ -10398,6 +12070,9 @@ "fr": [ "magasin de décoration d'intérieur" ], + "he": [ + "חנות עיצוב פנים" + ], "hu": [ "lakástextil", "díszek", @@ -10420,7 +12095,9 @@ "インテリア店", "住宅", "インテリア", - "内装" + "内装", + "お店", + "店舗" ], "nl": [ "versiering", @@ -10430,6 +12107,7 @@ "stijl" ], "pl": [ + "sklep z dekoracją wnętrz", "wyposażenie wnętrz", "dekoracja wnętrz", "dekoracje wnętrz", @@ -10459,6 +12137,7 @@ "then": { "en": "Jewelry Store", "ca": "Joieria", + "cs": "Klenotnictví", "da": "Guldsmed", "de": "Juwelier", "eo": "Juvelista vendejo", @@ -10466,6 +12145,7 @@ "fi": "Jalokiviliike", "fr": "Bijouterie", "gl": "Xoiaría", + "he": "חנות תכשיטים", "hu": "Ékszerüzlet", "id": "Toko Perhiasan", "it": "Gioielleria", @@ -10494,6 +12174,20 @@ "ca": [ "joier" ], + "cs": [ + "náramek", + "diamant", + "náušnice", + "drahokam", + "zlato", + "klenotník", + "šperky", + "klenotnice", + "náhrdelník", + "špendlíky", + "prsten", + "stříbro" + ], "da": [ "smykke", "ædelsten", @@ -10565,6 +12259,33 @@ "aceiro", "ferro" ], + "he": [ + "צורף", + "תכשיט", + "יהלום", + "פנינה", + "טבעת", + "צמיד", + "זהב", + "אבן", + "שרשרת", + "כסף", + "צורפת", + "יהלומן", + "יהלומנית", + "רובי", + "אודם", + "סברובסקי" + ], + "hu": [ + "karkötő", + "gyémánt", + "fülbevaló", + "drágakő", + "arany", + "ékszerész", + "ékszer" + ], "it": [ "gioielli", "braccialetti", @@ -10593,6 +12314,7 @@ "sierraden" ], "pl": [ + "sklep jubilerski", "jubiler", "złotnik", "złoto", @@ -10644,6 +12366,7 @@ "then": { "en": "Kiosk", "ca": "Quiosc", + "cs": "Kiosek", "da": "Kiosk", "de": "Kiosk", "eo": "Gazetbudo", @@ -10651,6 +12374,7 @@ "fi": "Kioski", "fr": "Kiosque", "gl": "Quiosco", + "he": "קיוסק", "hu": "Trafik (önálló épület)", "id": "Warung", "it": "Chiosco", @@ -10663,6 +12387,26 @@ "sv": "Kiosk" }, "searchTerms": { + "en": [ + "beverages", + "cigarettes", + "mall kiosk", + "newsagent", + "newspaper", + "newsstand", + "snacks", + "sweets" + ], + "cs": [ + "nápoje", + "cigarety", + "kiosek v obchodním centru", + "trafika", + "noviny", + "novinový stánek", + "občerstvení", + "sladkosti" + ], "de": [ "kiosk", "zeitungsstand", @@ -10677,7 +12421,9 @@ "es": [ "kiosko", "kiosco", + "kiosquero", "puesto", + "caseta", "negocio", "periódico", "revista", @@ -10688,11 +12434,19 @@ "golosinas", "refrescos", "jugos", - "flores" + "flores", + "glorieta" + ], + "fi": [ + "kioski", + "koju" ], "fr": [ "kiosque" ], + "he": [ + "פיצוציה" + ], "hu": [ "újságos" ], @@ -10765,6 +12519,7 @@ "then": { "en": "Kitchen Design Store", "ca": "Botiga de disseny de cuines", + "cs": "Kuchyňské studio", "da": "Køkkenforhandler", "de": "Küchenfachmarkt", "eo": "Kuirej-mebla vendejo", @@ -10772,6 +12527,7 @@ "fi": "Keittiöliike", "fr": "Cuisiniste", "gl": "Tenda de deseño de cociñas", + "he": "חנות עיצוב המטבח", "hu": "Konyhabútorbolt", "id": "Toko Desain Interior Dapur", "it": "Negozio di cucine", @@ -10788,6 +12544,12 @@ "countertops", "sinks" ], + "cs": [ + "kuchyně", + "kuchyňský", + "kuchyňské linky", + "kuchyně na míru" + ], "da": [ "køkkenbutik" ], @@ -10807,6 +12569,9 @@ "fr": [ "vente de mobilier et accessoires de cuisine" ], + "he": [ + "חנות עיצוב מטבח" + ], "hu": [ "konyhabútor", "konyhatervezés", @@ -10832,6 +12597,7 @@ "keukenzaak" ], "pl": [ + "sklep z wyposażeniem i meblami kuchennymi", "wyposażenie kuchni", "kuchnie", "meble kuchenne" @@ -10868,6 +12634,7 @@ "then": { "en": "Laundry", "ca": "Bugaderia", + "cs": "Prádelna", "da": "Vaskeri", "de": "Wäscherei", "eo": "Vest-lavejo (akvo)", @@ -10875,6 +12642,7 @@ "fi": "Pesula", "fr": "Laverie", "gl": "Lavandaría", + "he": "כביסה", "hu": "Mosoda", "id": "Penatu", "it": "Lavanderia", @@ -10887,6 +12655,11 @@ "sv": "Tvättinrättning" }, "searchTerms": { + "cs": [ + "prádelna", + "čistírna", + "prádlo" + ], "da": [ "vaskeri", "møntvaskeri" @@ -10913,6 +12686,9 @@ "fr": [ "laverie" ], + "he": [ + "כביסה" + ], "hu": [ "ruhatisztító", "vegytisztító", @@ -10973,6 +12749,7 @@ "then": { "en": "Leather Store", "ca": "Botiga de cuirs", + "cs": "Kožené zboží", "da": "Læderbutik", "de": "Lederwarengeschäft", "eo": "Ledaĵa vendejo", @@ -10980,6 +12757,7 @@ "fi": "Nahkaliike", "fr": "Maroquinier", "gl": "Tenda de peles", + "he": "חנות עור", "hu": "Bőrdíszműbolt", "id": "Toko Kulit", "it": "Pelletteria", @@ -10992,6 +12770,23 @@ "sv": "Läderaffär" }, "searchTerms": { + "ca": [ + "tenda de cuirs", + "cuir", + "cuero", + "pell", + "pelleteria" + ], + "cs": [ + "kožený", + "kožená", + "kožené", + "kůže", + "useň", + "usňový", + "usňová", + "usňové" + ], "da": [ "læderbutik", "skinbutik", @@ -11019,6 +12814,9 @@ "fr": [ "boutique de vêtements en cuir" ], + "he": [ + "חנות עור" + ], "hu": [ "bőrdíszműves", "bőrös", @@ -11033,7 +12831,8 @@ "皮革洋品店", "レザーショップ", "皮革", - "レザー" + "レザー", + "革製品店" ], "nl": [ "handtassen", @@ -11076,12 +12875,15 @@ "if": "shop=lighting", "then": { "en": "Lighting Store", + "cs": "Prodejna osvětlení", + "da": "Lampebutik", "de": "Leuchten- und Lampengeschäft", "eo": "Prilumigad‑aparata vendejo", "es": "Tienda de iluminación", "fi": "Valaisinkauppa", "fr": "Magasin de lampes", "gl": "Tenda de iluminación", + "he": "חנות תאורה", "hu": "Világítástechnikai szaküzlet", "it": "Negozio di illuminazione", "ja": "照明器具店", @@ -11099,6 +12901,17 @@ "light fixtures", "lightbulbs" ], + "cs": [ + "zářivkové osvětlení", + "lampy", + "led diody", + "svítidla", + "žárovky" + ], + "da": [ + "lampeforretning", + "lysbutik" + ], "de": [ "leuchten", "lampen", @@ -11135,6 +12948,18 @@ "leds", "luminarias" ], + "he": [ + "מחסני תאורה", + "חנות מנורות", + "תאורה", + "אור", + "מנורות", + "נורות", + "נורה", + "לד", + "ליבון", + "פלורוסנט" + ], "hu": [ "lámpa" ], @@ -11163,6 +12988,7 @@ "lampen" ], "pl": [ + "sklep z oświetleniem", "oświetlenie", "lampy", "lampki", @@ -11205,13 +13031,16 @@ "then": { "en": "Locksmith", "ca": "Copisteria de claus", + "cs": "Zámečník", "da": "Låsesmed", "de": "Schlüsseldienst", "eo": "Laborejo de seruristo", "es": "Cerrajería", + "eu": "Sarrailagilea", "fi": "Lukkoliike", "fr": "Serrurier", "gl": "Cerralleiro", + "he": "מנעולן", "hu": "Lakatos", "id": "Ahli Kunci", "it": "Fabbro", @@ -11228,12 +13057,20 @@ "key", "lockpick" ], + "cs": [ + "zámečnictví", + "zámečník", + "klíč", + "zámek" + ], "da": [ - "låsesmed" + "låsesmed", + "hælebar" ], "de": [ "schlosser", - "schlüsseldienst" + "schlüsseldienst", + "schlüsselmacher" ], "eo": [ "seruristo", @@ -11245,6 +13082,10 @@ "cerradura", "cerrajería" ], + "eu": [ + "sarrailagilea", + "sarrailak" + ], "fi": [ "lukkoseppä", "lukko", @@ -11271,6 +13112,9 @@ "cerralleria", "cerrajeria" ], + "he": [ + "מנעולנית" + ], "hu": [ "kulcsmásoló", "záras", @@ -11340,6 +13184,7 @@ "then": { "en": "Lottery Shop", "ca": "Administració de loteria", + "cs": "Prodejna losů", "da": "Lotteributik", "de": "Lottoannahmestelle", "eo": "Loterbileta vendejo", @@ -11347,6 +13192,7 @@ "fi": "Veikkauspiste", "fr": "Loterie", "gl": "Tenda de lotaría", + "he": "חנות לוטו", "hu": "Lottózó", "id": "Toko Lotre", "it": "Ricevitoria", @@ -11365,6 +13211,14 @@ "gambling", "scratch-offs" ], + "cs": [ + "los", + "losy", + "loterie", + "sázky", + "sázení", + "sportka" + ], "da": [ "lotteributik", "lotteriforretning" @@ -11391,6 +13245,9 @@ "fr": [ "vente de billets de loterie" ], + "he": [ + "עמדת לוטו" + ], "hu": [ "szerencsejáték", "fogadóiroda", @@ -11458,6 +13315,7 @@ "then": { "en": "Mall", "ca": "Centre comercial", + "cs": "Obchodní centrum", "da": "Indkøbscenter", "de": "Einkaufszentrum", "eo": "Vendejaro", @@ -11465,6 +13323,7 @@ "fi": "Kauppakeskus", "fr": "Centre commercial", "gl": "Centro comercial", + "he": "קניון", "hu": "Bevásárlóközpont", "id": "Mal", "it": "Centro commerciale", @@ -11480,6 +13339,12 @@ "en": [ "shopping" ], + "cs": [ + "nákupní středisko", + "obchodní středisko", + "obchody", + "nákupní centrum" + ], "da": [ "indkøbscenter" ], @@ -11508,6 +13373,9 @@ "galerie marchande", "centre d'achat" ], + "he": [ + "קניון" + ], "hu": [ "pláza" ], @@ -11530,6 +13398,7 @@ "centrum handlowe", "galeria handlowa", "pasaż handlowy", + "mall", "zakupy" ], "pt": [ @@ -11567,6 +13436,7 @@ "then": { "en": "Massage Shop", "ca": "Centre de massatges", + "cs": "Masáže", "da": "Massagebutik", "de": "Massagesalon", "eo": "Salono de masaĝo", @@ -11574,6 +13444,7 @@ "fi": "Hierontayritys", "fr": "Salon de massage", "gl": "Tenda de masaxes", + "he": "מכון עיסוי", "hu": "Masszázsszalon", "id": "Panti Pijat", "it": "Centro massaggi", @@ -11585,6 +13456,15 @@ "sv": "Massage" }, "searchTerms": { + "cs": [ + "masáž", + "masáže", + "masér", + "masérka", + "masírování", + "masírovat", + "massage" + ], "da": [ "massagebutik" ], @@ -11609,6 +13489,9 @@ "fr": [ "salon de massage" ], + "he": [ + "מכון מסאז׳" + ], "hu": [ "masszőr", "masszázs", @@ -11626,8 +13509,23 @@ "マッサージ店", "マッサージ", "あんま", + "あん摩", + "按摩", "指圧", - "健康" + "整骨院", + "健康", + "接骨院", + "鍼灸", + "肩こり", + "カイロプラクティック", + "カイロ", + "サービス", + "鍼灸院", + "ほねつぎ", + "施術所", + "治療院", + "治療所", + "整体院" ], "nl": [ "olie" @@ -11662,14 +13560,17 @@ "if": "shop=medical_supply", "then": { "en": "Medical Supply Store", - "ca": "Farmàcia", + "ca": "Botiga d'equipament mèdic", + "cs": "Zdravotnické potřeby", "da": "Håndkøbsmedicinforhandler", "de": "Sanitätshaus", "eo": "Medicin-aparata vendejo", "es": "Tienda de aparatos ortopédicos", + "eu": "Ortopedia eta medikuntzako-hornidura denda", "fi": "Lääketarvikemyymälä", "fr": "Magasin de matériel médical", "gl": "Tenda de subministracións médicas", + "he": "חנות ציוד רפואי", "hu": "Gyógyászati segédeszközök boltja", "id": "Toko Peralatan Medis", "it": "Negozio di forniture mediche", @@ -11682,6 +13583,11 @@ "sv": "Medicinsk utrustning" }, "searchTerms": { + "cs": [ + "zdravotnické potřeby", + "zdravotní potřeby", + "ortopedické pomůcky" + ], "da": [ "håndkøbsmedicinforhandler" ], @@ -11708,6 +13614,9 @@ "fr": [ "magasin de matériel médical" ], + "he": [ + "חנות ציוד רפואי" + ], "hu": [ "gyógybolt", "egészségbolt", @@ -11784,12 +13693,14 @@ "then": { "en": "Military Surplus Store", "ca": "Botiga d'excedents militars", + "cs": "Armádní výprodej", "de": "Militärkleidungsabverkauf", "eo": "Ne-plu-necesa-armea-ekipaĵo vendejo", "es": "Tienda de excedentes militares", "fi": "Armeijan ylijäämämyymälä", "fr": "Surplus militaire", "gl": "Tenda de accesorios militares", + "he": "חנות עודפי צבא", "hu": "Használt katonai felszerelések boltja", "it": "Negozio di eccedenze militari", "ja": "軍払い下げ品店", @@ -11809,6 +13720,15 @@ "war surplus shop", "weapons" ], + "cs": [ + "brnění", + "obchod pro armádu a námořnictvo", + "přebytky armády", + "přebytky v námořnictvu", + "taktické vybavení", + "obchod s válečnými přebytky", + "zbraně" + ], "de": [ "waffen", "armee", @@ -11840,9 +13760,27 @@ "guerre", "équipement de guerre" ], + "he": [ + "ריקושט", + "חנות עודפים צבאיים", + "חנות צבא", + "ציוד צבאי", + "צבא", + "כלי נשק", + "נשקים" + ], "hu": [ "military" ], + "it": [ + "armature", + "negozio dell'esercito-marina", + "eccedenza dell'esercito", + "eccedenza della marina", + "equipaggiamento tattico", + "negozio dell'eccedenza di guerra", + "armi" + ], "ja": [ "軍払い下げ品店", "軍払下げ品店", @@ -11871,6 +13809,7 @@ "sklep z militariami", "militaria", "sprzęt wojskowy", + "demobil", "broń", "zbroje", "hełmy", @@ -11907,6 +13846,7 @@ "then": { "en": "Mobile Phone Store", "ca": "Botiga de telefonia mòbil", + "cs": "Obchod s mobily", "da": "Mobiltelefonforhandler", "de": "Mobiltelefonladen", "eo": "Poŝtelefona vendejo", @@ -11914,6 +13854,7 @@ "fi": "Matkapuhelinmyymälä", "fr": "Magasin de téléphonie mobile", "gl": "Tenda de telefonía móbil", + "he": "חנות טלפונים ניידים", "hu": "Mobiltelefon-szaküzlet", "id": "Toko Handphone", "it": "Negozio di telefonia mobile", @@ -11926,6 +13867,12 @@ "sv": "Mobiltelefoner" }, "searchTerms": { + "cs": [ + "obchod s mobilními telefony", + "přenosné telefony", + "mobil", + "telefon" + ], "da": [ "mobiltelefonforhandler" ], @@ -11957,6 +13904,9 @@ "magasin de téléphones portables", "cellulaires" ], + "he": [ + "חנות טלפונים ניידים" + ], "hu": [ "android", "iphone", @@ -11973,7 +13923,10 @@ ], "ja": [ "携帯電話店", - "ケータイショップ" + "ケータイショップ", + "携帯ショップ", + "携帯", + "電話" ], "nl": [ "gsm-winkel", @@ -11984,6 +13937,8 @@ "mobieltjeszaak" ], "pl": [ + "sklep z telefonami komórkowymi", + "salon telefonii komórkowej", "telefony", "telefony komórkowe", "komórki", @@ -12017,11 +13972,14 @@ "if": "shop=model", "then": { "en": "Model Shop", + "cs": "Modelářský obchod", "de": "Modellbaugeschäft", "eo": "Vendejo de modelfarado", "es": "Tienda de modelismo", + "fi": "Pienoismallikauppa", "fr": "Magasin de modélisme", "gl": "Tenda de modelismo", + "he": "חנות דגמים", "hu": "Modellező bolt", "it": "Negozio di modellistica", "ja": "模型店", @@ -12037,9 +13995,28 @@ "model building", "model figures", "model kits", + "model railroading", "model store", + "rail transport modelling", "scale models" ], + "cs": [ + "modelářství", + "modelářský obchod", + "modelářské potřeby", + "modely", + "stavebnice", + "modely v měřítku", + "miniatury", + "modely letadel", + "modely aut", + "koníček", + "hobby", + "modely budov", + "stavebnice modelů", + "modelová železnice", + "mašinky" + ], "de": [ "spielzeug", "spiele", @@ -12068,6 +14045,13 @@ "maquettes", "modèles réduits" ], + "he": [ + "פנאי", + "בובות", + "דגמים", + "דגמים מוקטנים", + "גיבורי פעולה" + ], "hu": [ "makett" ], @@ -12131,6 +14115,7 @@ "then": { "en": "Money Lender", "ca": "Prestamista", + "cs": "Nebankovní půjčky", "da": "Pengeudlåner", "de": "Geldverleih", "eo": "Mon-pruntejo", @@ -12138,6 +14123,7 @@ "fi": "Rahanlainausliike", "fr": "Prêteur", "gl": "Prestamista de cartos", + "he": "מלווה בריבית", "hu": "Pénzkölcsönző", "id": "Peminjaman Uang", "it": "Agenzia di prestiti", @@ -12150,8 +14136,24 @@ "sv": "Långivare" }, "searchTerms": { + "en": [ + "payday loan" + ], + "cs": [ + "lichvář", + "lichvářství", + "lichva", + "úžera", + "půjčka", + "půjčky", + "úvěr", + "úvěry" + ], "da": [ - "pengeudlåner" + "pengeudlåner", + "långiver", + "kreditor", + "panthaver" ], "de": [ "geldleiher" @@ -12179,6 +14181,9 @@ "cartos", "diñeiro" ], + "he": [ + "מלווה בריבית" + ], "hu": [ "gyorskölcsön pénzkölcsönző", "hitel centrum", @@ -12199,7 +14204,8 @@ "貸金", "お金", "金融", - "借金" + "借金", + "サラリーマン金融" ], "nl": [ "pandhuis", @@ -12211,8 +14217,10 @@ "bank van lening" ], "pl": [ + "firma pożyczkowa", "pożyczki", - "kredyty" + "kredyty", + "lichwiarstwo" ], "pt": [ "money lender", @@ -12245,6 +14253,7 @@ "then": { "en": "Motorcycle Dealership", "ca": "Botiga de motocicletes", + "cs": "Obchod s motocykly", "da": "Motorcykelforhandler", "de": "Motorradhändler", "eo": "Motorcikla vendejo", @@ -12252,6 +14261,7 @@ "fi": "Moottoripyöräliike", "fr": "Vendeur de motos", "gl": "Concesionario de motocicletas", + "he": "חנות אופנועים", "hu": "Motorkerékpár-kereskedés", "id": "Dealer Motor", "it": "Concessionario di motociclette", @@ -12267,6 +14277,12 @@ "en": [ "bike" ], + "cs": [ + "prodejna motocyklů", + "prodejna motorek", + "motocykly", + "motorky" + ], "da": [ "motorcykelforhandler", "mc", @@ -12290,6 +14306,9 @@ "fr": [ "vendeur de motocyclettes" ], + "he": [ + "חנות אופנועים" + ], "hu": [ "motorbicikli", "robogó", @@ -12357,6 +14376,7 @@ "then": { "en": "Motorcycle Repair Shop", "ca": "Taller de reparació de motos", + "cs": "Opravna motocyklů", "da": "Motorcykelværksted", "de": "Motorradwerkstatt", "eo": "Motorcikl-riparejo", @@ -12364,6 +14384,7 @@ "fi": "Moottoripyöräkorjaamo", "fr": "Réparateur de motos", "gl": "Taller de arranxo de motocicletas", + "he": "מוסך אופנועים", "hu": "Motorkerékpáralkatrész-bolt", "it": "Officina riparazione motocicli", "ja": "バイク修理店", @@ -12382,6 +14403,18 @@ "repair", "service" ], + "cs": [ + "opravna motorek", + "motorky", + "motocykl", + "opravna motocyklů", + "servis", + "bike", + "garáž", + "motorkářský", + "motorkářská", + "servis motorek" + ], "da": [ "mekaniker", "mc", @@ -12409,6 +14442,9 @@ "fr": [ "réparateur de motos" ], + "he": [ + "מוסך אופנועים" + ], "hu": [ "motorbicikli", "robogó", @@ -12432,7 +14468,9 @@ "バイク修理店", "オートバイ修理", "バイク", - "オートバイ" + "オートバイ", + "修理", + "サービス" ], "nl": [ "motorfietsreparatie" @@ -12495,6 +14533,7 @@ "then": { "en": "Music Store", "ca": "Botiga de música", + "cs": "Obchod s hudbou", "da": "Musikbutik", "de": "Musikgeschäft", "eo": "Muzika vendejo", @@ -12502,6 +14541,7 @@ "fi": "Musiikkiliike", "fr": "Magasin de musique", "gl": "Tenda de música", + "he": "חנות מוזיקה", "hu": "Hanglemezbolt", "id": "Toko Musik", "it": "Negozio di musica", @@ -12518,11 +14558,18 @@ "tape cassettes", "cds", "compact discs", + "hobby", "vinyl records", "cd store", "casette", "casette store" ], + "cs": [ + "hudební obchod", + "obchod s hudbou", + "cd", + "lp" + ], "da": [ "musikbutik", "musikforretning" @@ -12553,6 +14600,9 @@ "fr": [ "magasin de musique" ], + "he": [ + "חנות מוזיקה" + ], "hu": [ "zenebolt", "cd és dvd bolt", @@ -12633,6 +14683,7 @@ "then": { "en": "Musical Instrument Store", "ca": "Botiga d'instruments musicals", + "cs": "Obchod s hudebními nástroji", "da": "Musikinstrumentbutik", "de": "Musikinstrumentegeschäft", "eo": "Muzikinstrumenta vendejo", @@ -12640,6 +14691,7 @@ "fi": "Instrumenttimyymälä", "fr": "Magasin d'instruments de musique", "gl": "Tenda de instrumentos musicais", + "he": "חנות כלי נגינה", "hu": "Hangszerbolt", "id": "Toko Alat Musik", "it": "Negozio di strumenti musicali", @@ -12653,7 +14705,29 @@ }, "searchTerms": { "en": [ - "guitar" + "accordion", + "brass instruments", + "cello", + "clarinet", + "drum", + "flute", + "guitar", + "hobby", + "keyboard", + "piano", + "saxophone", + "trumpet", + "violin" + ], + "cs": [ + "hudba", + "hudební nástroj", + "hudební nástroje", + "hudebnina", + "hudebniny", + "muzika", + "hudebník", + "muzikant" ], "da": [ "musikinstrumentbutik", @@ -12691,6 +14765,9 @@ "fr": [ "magasin d'instruments de musique" ], + "he": [ + "חנות כלי נגינה" + ], "hu": [ "hangszer", "kotta", @@ -12713,6 +14790,7 @@ "pianokruk" ], "pl": [ + "sklep z instrumentami muzycznymi", "instrumenty muzyczne", "sklep muzyczny" ], @@ -12748,29 +14826,36 @@ { "if": "shop=newsagent", "then": { - "en": "Newspaper/Magazine Shop", - "ca": "Botiga de diaris i revistes", - "da": "Avis/Bladforhandler", + "en": "Newsstand", + "ca": "Quiosc de premsa", + "cs": "Novinový stánek", + "da": "Aviskiosk", "de": "Zeitschriftenhandel", - "eo": "Gazeta vendejo", - "es": "Puesto de periódicos / revistas", - "fi": "Lehtikoju", - "fr": "Magasin de journaux", - "gl": "Tenda de xornais/revistas", - "hu": "Újságárus", - "id": "Toko Majalah/Koran", + "es": "Puesto de periódicos y revistas", + "fi": "Lehtikioski", + "fr": "Kiosque à journaux", + "he": "דוכן עתונים", + "hu": "Újságos", + "id": "Kios Koran", "it": "Edicola", - "ja": "新聞・雑誌店", - "nl": "Kranten-/Tijdschriftwinkel", - "pl": "Sklep z prasą", + "ja": "新聞スタンド", + "nl": "Krantenkiosk", + "pl": "Salonik prasowy", "pt": "Loja de jornais / revistas", - "ru": "Газеты/пресса/журналы", - "sl": "Trgovina s časopisi/revijami", + "ru": "Газетный киоск", "sv": "Tidningsaffär" }, "searchTerms": { - "da": [ - "avis/bladforhandler" + "ca": [ + "quiosc", + "diari", + "periòdic", + "premsa" + ], + "cs": [ + "trafika", + "noviny", + "tabák" ], "de": [ "zeitschiftenhandel", @@ -12782,74 +14867,46 @@ "zeitschriftengeschäft", "magazine" ], - "eo": [ - "gazetvendejo", - "gazetejo", - "magazinoj" - ], "es": [ - "periódico", - "diario", - "semanario", - "revista", - "puesto de diarios", + "quiosco de períodicos", + "kiosco de periódicos", "puesto de periódicos", - "vendedor de diarios", - "vendedor de periódicos", - "tienda", - "negocio" + "periódicos", + "diarios", + "revistas" ], "fr": [ - "vente de journaux", - "de magazines", - "maison de la presse" - ], - "hu": [ - "újságos", - "hírlapárus", - "trafik" + "kiosque", + "magasin", + "échoppe", + "journaux", + "magazines", + "presse" ], "it": [ - "edicola" + "edicola", + "giornalaio", + "quotidiano" ], "ja": [ + "新聞スタンド", "新聞", "雑誌", - "マガジン", - "ニュース", - "スタンド" - ], - "nl": [ - "nieuws", - "kranten", - "tijdschriften", - "magazines" + "新聞販売" ], "pl": [ "salonik prasowy", - "kiosk", "prasa", "gazety", "czasopisma", - "lotto", - "kolporter", - "inmedio", - "ruch" + "lotto" ], "pt": [ "newspaper", "magazine", "jornal", - "revista" - ], - "ru": [ - "газеты", - "журналы", - "пресса", - "сопутствующие товары", - "киоск", - "лоток", - "стенд" + "revista", + "newsagent" ], "sv": [ "tidningsaffär", @@ -12873,13 +14930,15 @@ "then": { "en": "Nutrition Supplements Store", "ca": "Botiga de suplements nutricionals", - "da": "Helsekostbutik", + "cs": "Obchod s potravními doplňky", + "da": "Kosttilskudsbutik", "de": "Nahrungsergänzungsmittelgeschäft", "eo": "Diet-suplementa vendejo", "es": "Tienda de suplementos nutricionales", "fi": "Lisäravinnemyymälä", "fr": "Boutique de compléments alimentaires", "gl": "Tenda de suplementos nutricionais", + "he": "חנות ויטמינים", "hu": "Étrendkiegészítő-bolt", "it": "Negozio di integratori alimentari", "ja": "栄養サプリ販売店", @@ -12893,10 +14952,25 @@ "searchTerms": { "en": [ "health", + "protein", "supplement", "vitamin" ], + "cs": [ + "doplňky stravy", + "potravní doplňky", + "doplňky potravy", + "potravinové doplňky", + "doplňky výživy", + "výživové doplňky", + "nutraceutika", + "supplementy", + "vitamíny", + "minerály", + "léky" + ], "da": [ + "kosttilskudsbutik", "helsekostbutik", "helsekostforretning" ], @@ -12923,6 +14997,9 @@ "fr": [ "compléments alimentaires;compléments nutritionnels" ], + "he": [ + "חנות ויטמינים" + ], "hu": [ "étrend-kiegészítő", "táplálékkiegészítő" @@ -12934,7 +15011,9 @@ "栄養サプリメント販売店", "サプリ専門店", "サプリメント専門店", - "健康" + "健康", + "サプリ", + "サプリメント" ], "nl": [ "supplementen", @@ -12944,6 +15023,7 @@ "eiwitten" ], "pl": [ + "sklep z suplementami diety", "suplementy diety", "odżywki dla sportowców" ], @@ -12972,11 +15052,176 @@ "class": "medium" } }, + { + "if": "shop=nuts", + "then": { + "en": "Nuts Shop", + "cs": "Obchod s oříšky", + "da": "Nøddebutik", + "de": "Nussgeschäft", + "es": "Tienda de frutos secos", + "fi": "Pähkinäkauppa", + "fr": "Magasin de noix", + "he": "חנות פיצוחים", + "ja": "ナッツ店", + "pl": "Sklep z bakaliami", + "pt": "Loja de frutos secos", + "ru": "Магазин орехов", + "sv": "Nötbutik" + }, + "searchTerms": { + "en": [ + "almonds", + "cashews", + "brazil nuts", + "chestnuts", + "coconuts", + "dried fruits", + "hazelnuts", + "macadamia", + "nuts", + "peanuts", + "pecans", + "pistachios", + "seeds", + "walnuts" + ], + "cs": [ + "mandle", + "kešu", + "brazilské ořechy", + "kaštany", + "kokosy", + "sušené ovoce", + "lískové ořechy", + "makadamie", + "ořechy", + "arašídy", + "pekanové ořechy", + "pistácie", + "semena", + "vlašské ořechy" + ], + "de": [ + "mandeln", + "cashews", + "paranüsse", + "kastanien", + "kokosnüsse", + "trockenfrüchte", + "haselnüsse", + "macadamia", + "nüsse", + "erdnüsse", + "pekannüsse", + "pistazien", + "samen", + "walnüsse" + ], + "es": [ + "almendras", + "anacardos", + "castañas de cajú", + "nueces de pecan", + "nueces de brasil", + "castañas", + "cocos", + "frutos secos", + "avellanas", + "macadamia", + "nueces", + "cacahuetes", + "pacanas", + "pistachos", + "semillas" + ], + "fr": [ + "noix", + "fruits secs", + "fruit sec", + "cacahuète", + "pistache", + "graine", + "noix de coco", + "amande" + ], + "ja": [ + "ナッツ店", + "お店", + "店舗", + "ショッピング", + "小売", + "食べ物", + "木の実", + "ナッツ" + ], + "pl": [ + "sklep z bakaliami", + "sklep z orzechami", + "bakalie", + "orzechy" + ], + "pt": [ + "nozes", + "pinhões", + "figos", + "tâmaras", + "pinhão", + "amêndoas", + "amendoins", + "amendoim", + "cajus", + "frutos", + "fruta", + "pecã", + "pistacho", + "pistache", + "pistacio", + "almonds", + "cashews", + "brazil nuts", + "chestnuts", + "coconuts", + "dried fruits", + "hazelnuts", + "macadamia", + "nuts", + "peanuts", + "pecans", + "pistachios", + "seeds", + "walnuts" + ], + "sv": [ + "nötbutik", + "nöt", + "nötter", + "mandlar", + "cashewnötter", + "paranötter", + "kastanjer", + "kokosnötter", + "torkad frukt", + "hasselnötter", + "macadamia", + "jordnötter", + "pekannötter", + "pistagenötter", + "frön", + "valnötter" + ] + }, + "icon": { + "path": "./assets/layers/id_presets/maki-shop.svg", + "class": "medium" + } + }, { "if": "shop=optician", "then": { "en": "Optician", "ca": "Òptica", + "cs": "Optika", "da": "Optiker", "de": "Optiker", "eo": "Optikbutiko", @@ -12984,6 +15229,7 @@ "fi": "Optikko", "fr": "Opticien", "gl": "Óptica", + "he": "אופטיקאי", "hu": "Látszerész", "id": "Optik", "it": "Ottico", @@ -13000,6 +15246,14 @@ "eye", "glasses" ], + "cs": [ + "optik", + "optika", + "brýle", + "zrak", + "kontaktní čočky", + "čočky" + ], "da": [ "optiker", "optikerforretning" @@ -13037,6 +15291,9 @@ "opticien", "marchand de lunettes" ], + "he": [ + "אופטיקאית" + ], "hu": [ "szemüveg", "kontaktlencse", @@ -13115,6 +15372,7 @@ "then": { "en": "Outdoors Store", "ca": "Botiga per a activitats a l'aire lliure", + "cs": "Outdoorové zboží", "da": "Friluftsudstyrsbutik", "de": "Outdoorgeschäft", "eo": "Vojaĝila vendejo", @@ -13122,6 +15380,7 @@ "fi": "Ulkoilmamyymälä", "fr": "Magasin de matériel de sports de plein air", "gl": "Tenda de actividades ó ar libre", + "he": "חנות רהיטי גינה", "hu": "Túrafelszerelés-bolt", "id": "Toko Perlengkapan Outdoor", "it": "Negozio per sport all'aria aperta", @@ -13138,10 +15397,25 @@ "camping", "climbing", "hiking", + "hobby", "outfitter", "outdoor equipment", "outdoor supplies" ], + "cs": [ + "outdoor", + "outdoorový", + "outdoorová", + "outdoorové", + "kempování", + "kempingové", + "horolezecký", + "horolezecké", + "sport", + "sportovní", + "příroda", + "přírody" + ], "da": [ "friluftsudstyrsbutik", "friluftsudstyrsforretning", @@ -13179,6 +15453,9 @@ "excursión", "gps" ], + "he": [ + "חנות ריהוט גינה" + ], "hu": [ "hegymászó felszerelés", "outdoor", @@ -13192,7 +15469,13 @@ "escursionismo" ], "ja": [ - "アウトドアショップ" + "アウトドアショップ", + "アウトドア店", + "屋外", + "店舗", + "お店", + "キャンプ", + "登山" ], "nl": [ "trekking", @@ -13205,6 +15488,7 @@ "pl": [ "sklep turystyczny", "sklep górski", + "sklep outdoorowy", "góry", "wspinaczka", "wspinaczkowy", @@ -13252,12 +15536,14 @@ "if": "shop=outpost", "then": { "en": "Online Retailer Outpost", + "cs": "Výdejna e-shopu", "de": "Abholstelle eines Onlinehändlers", "eo": "Ricevejo de aĉetaĵoj (per interreto)", "es": "Puesto de venta minorista online", "fi": "Verkkokaupan noutopiste", "fr": "Magasin de produits vendus en ligne", "gl": "Posto de venda minorista online", + "he": "נקודת הפצה של שירות מקוון", "hu": "Internetes bolt", "it": "Centro ritiro acquisti online", "ja": "商品受け取り店", @@ -13273,6 +15559,11 @@ "pick up", "pickup" ], + "cs": [ + "online", + "vyzvednutí", + "vyzvednout" + ], "de": [ "online", "abholung", @@ -13297,6 +15588,12 @@ "en ligne", "commande" ], + "he": [ + "נקודת איסוף", + "נקודת הפצה", + "תאי חלוקה", + "תאי הפצה" + ], "hu": [ "internetes bolt", "áruátvétel", @@ -13345,6 +15642,7 @@ "then": { "en": "Paint Store", "ca": "Botiga de pintura", + "cs": "Barvy a laky", "da": "Farvehandel", "de": "Farbengeschäft", "eo": "Farba vendejo", @@ -13352,6 +15650,7 @@ "fi": "Maalikauppa", "fr": "Magasin de peintures", "gl": "Tenda de pinturas", + "he": "חנות צבע", "hu": "Festékbolt", "id": "Toko Cat", "it": "Negozio di vernici", @@ -13364,6 +15663,14 @@ "sv": "Färgbutik" }, "searchTerms": { + "cs": [ + "barva", + "barvy", + "nátěr", + "nátěry", + "lak", + "laky" + ], "da": [ "farvehandel", "malerforretning", @@ -13398,6 +15705,9 @@ "fr": [ "vente de peintures" ], + "he": [ + "חנות צבע" + ], "hu": [ "falfesték", "színkeverés", @@ -13415,6 +15725,7 @@ "verfzaak" ], "pl": [ + "sklep z farbami", "farby", "malowanie" ], @@ -13449,11 +15760,13 @@ "if": "shop=party", "then": { "en": "Party Supply Store", + "cs": "Párty zboží", "de": "Partyzubehör", "eo": "Vendejo de okazaĵaj provizoj", "es": "Tienda de artículos para fiestas", "fr": "Magasin de matériel de fête", "gl": "Tenda de artigos para festas", + "he": "חנות ציוד למסיבות", "hu": "Partykellékbolt", "it": "Negozio di articoli per le feste", "ja": "パーティ用品店", @@ -13470,6 +15783,12 @@ "decorations", "invitations" ], + "cs": [ + "balonky", + "kostýmy", + "dekorace", + "pozvánky" + ], "de": [ "partyzubehör" ], @@ -13518,6 +15837,12 @@ "garulada", "festividade" ], + "he": [ + "בלונים", + "תחפושות", + "קישוטים", + "הזמנות" + ], "ja": [ "パーティ用品店", "パーティグッズ", @@ -13537,6 +15862,7 @@ "kostuums" ], "pl": [ + "sklep z artykułami imprezowymi", "artykuły imprezowe", "balony", "kostiumy", @@ -13580,11 +15906,88 @@ "class": "medium" } }, + { + "if": "shop=pasta", + "then": { + "en": "Pasta Store", + "cs": "Obchod s těstovinami", + "de": "Nudelgeschäft", + "es": "Fábrica de pastas", + "fr": "Magasin de pâtes", + "he": "חנות פסטה", + "ja": "パスタショップ", + "pl": "Sklep z makaronami", + "pt": "Loja de massas" + }, + "searchTerms": { + "en": [ + "fresh pasta", + "ravioli", + "spaghetti" + ], + "cs": [ + "čerstvé těstoviny", + "ravioly", + "špagety" + ], + "de": [ + "nudel", + "nudeln", + "pasta", + "ravioli", + "spaghetti" + ], + "es": [ + "tienda de pasta", + "pastelería", + "pastería", + "fábrica de pastas" + ], + "fr": [ + "magasin de pâtes" + ], + "ja": [ + "生パスタ", + "ラビオリ", + "スパゲティ" + ], + "pl": [ + "sklep z makaronami", + "makarony", + "produkty mączne" + ], + "pt": [ + "pasta", + "estabelecimento", + "ravioli", + "spaghetti", + "esparguete", + "fusili", + "farfalle", + "tubulares", + "rigatoni", + "penne", + "concha", + "conchiglie", + "lumaconi", + "fettucine", + "linguine", + "tagliatelle", + "lasagnette", + "aletria" + ] + }, + "icon": { + "path": "./assets/layers/id_presets/fas-plate-wheat.svg", + "class": "medium" + } + }, { "if": "shop=pastry", "then": { "en": "Pastry Shop", "ca": "Pastisseria", + "cs": "Cukrárna", "da": "Konditori", "de": "Konditorei", "eo": "Kukejo", @@ -13592,6 +15995,7 @@ "fi": "Leipomokonditoria", "fr": "Pâtisserie", "gl": "Confeitaría ou pastelaría", + "he": "בית מאפה", "hu": "Cukrászda", "it": "Pasticceria", "ja": "焼菓子(ペイストリー)店", @@ -13608,6 +16012,10 @@ "cake shop", "cakery" ], + "cs": [ + "cukrářství", + "dorty" + ], "da": [ "konditori" ], @@ -13639,6 +16047,9 @@ "pasteis", "tartas" ], + "he": [ + "חנות מאפים" + ], "hu": [ "sütemény", "süti", @@ -13665,7 +16076,9 @@ "食べ物", "食料品", "店舗", - "お店" + "お店", + "ケーキ", + "スイーツ" ], "nl": [ "patisserie", @@ -13719,74 +16132,55 @@ { "if": "shop=pawnbroker", "then": { - "en": "Pawn Shop", - "ca": "Botiga d'empenyoraments", - "da": "Panteudlåner", + "en": "Pawnshop", + "cs": "Zastavárna", + "da": "Pantelåner", "de": "Pfandleihe", - "eo": "Mon-pruntejo (kontraŭ garantiaĵo)", - "es": "Casa de empeño", - "fi": "Panttilainaamo", + "es": "Casa de empeños", "fr": "Prêteur sur gages", - "gl": "Casa de empeños", + "he": "בית משכון", "hu": "Zálogház", - "id": "Pegadaian", - "it": "Banco dei pegni", - "ja": "質店", + "ja": "質屋", "nl": "Pandjeshuis", "pl": "Lombard", - "pt": "Casa de penhoras", + "pt": "Loja de penhoras", "ru": "Ломбард", - "sl": "Zastavljalnica", "sv": "Pantbank" }, "searchTerms": { - "da": [ - "panteudlåner" - ], "de": [ "leihhaus", "pfandleihhaus", "pfandhaus", - "goldankauf" - ], - "eo": [ - "lombardo", - "monprunto", - "lombardejo", - "pruntejo", - "brokantejo" + "goldankauf", + "pfandleiher" ], "es": [ - "casa de empeño", - "empeño", - "tienda de empeño", - "prenda" + "casa de empeños", + "empeños", + "tienda de empeños" ], "fr": [ + "prêteur", + "dépôt", + "gage", + "gages", + "occasion", "mont-de-piété", "crédit municipal" ], - "hu": [ - "zaci", - "záloghitel" - ], - "it": [ - "banco dei pegni", - "monte dei pegni" + "he": [ + "בית עבוט", + "מציאות" ], "ja": [ "質屋", - "質店", + "質", + "金融", "お金", - "金融" - ], - "nl": [ - "pandhuis", - "lommerd", - "lombard", - "kredietinstelling", - "lenen", - "geld" + "借金", + "サービス", + "質草" ], "pl": [ "lombard" @@ -13797,9 +16191,6 @@ "penhoras", "penhorar" ], - "ru": [ - "ломбард" - ], "sv": [ "pantbank", "pantbanken", @@ -13819,6 +16210,7 @@ "then": { "en": "Perfume Store", "ca": "Botiga de perfums", + "cs": "Parfumerie", "da": "Parfumebutik", "de": "Parfümerie", "eo": "Parfuma vendejo", @@ -13826,6 +16218,7 @@ "fi": "Hajusteliike", "fr": "Parfumerie", "gl": "Perfumaría", + "he": "חנות בשמים", "hu": "Parfüméria", "it": "Profumeria", "ja": "香水店", @@ -13846,6 +16239,10 @@ "perfumeria", "botiga de colònies" ], + "cs": [ + "parfumerie", + "parfémy" + ], "da": [ "parfumebutik", "parfumeforretning", @@ -13878,6 +16275,9 @@ "fr": [ "parfumerie" ], + "he": [ + "חנות בשמים" + ], "hu": [ "parfüm", "illatszer" @@ -13898,6 +16298,7 @@ "eau de parfum" ], "pl": [ + "perfumeria", "sklep z perfumami", "perfumy" ], @@ -13934,13 +16335,15 @@ "then": { "en": "Pet Store", "ca": "Botiga d'animals", - "da": "Kæledyrsbutik", - "de": "Tierhandlung", + "cs": "Chovatelské potřeby", + "da": "Dyrehandler", + "de": "Zoofachgeschäft", "eo": "Hejmbesta vendejo", "es": "Tienda de mascotas", "fi": "Lemmikkiliike", "fr": "Animalerie", "gl": "Tenda de mascotas", + "he": "חנות לחיות מחמד", "hu": "Kisállatkereskedés", "id": "Toko Peliharaan", "it": "Negozio per animali", @@ -13962,15 +16365,24 @@ "puppy", "reptile" ], + "cs": [ + "obchod pro domácí zvířata", + "obchod pro domácí mazlíčky", + "zverimex" + ], "da": [ + "dyrehandler", "kæledyrsbutik", - "dyreforhandler", - "dyrehandler" + "dyreforhandler" ], "de": [ "tierhandlung", "zoohandlung", - "zoofachgeschäft" + "zoofachgeschäft", + "tiernahrung", + "tierzubehör", + "haustier", + "goldfisch" ], "eo": [ "dombesta vendejo", @@ -13986,9 +16398,20 @@ "animal", "tienda de animales" ], + "fi": [ + "lemmikkikauppa", + "lemmikkieläinkauppa", + "kotieläinkauppa", + "lemmikkiliike", + "lemmikkieläinliike", + "kotieläinliike" + ], "fr": [ "animalerie" ], + "he": [ + "חנות לחיות מחמד" + ], "hu": [ "állat", "kisállat", @@ -14062,69 +16485,66 @@ { "if": "shop=pet_grooming", "then": { - "en": "Pet Grooming Store", - "de": "Tierpflegedienst, Tierfriseur (meist Hundesalon)", - "eo": "Hejmbesta beligejo", - "es": "Tienda de aseo de mascotas", - "fi": "Lemmikkihoitola", + "en": "Pet Groomer", + "ca": "Perruqueria d'animals", + "cs": "Zvířecí kadeřník", + "da": "Dyrefrisør", + "de": "Tierfriseur", + "es": "Peluquería de mascotas", "fr": "Salon de toilettage", - "gl": "Tenda de coidado de animais", - "hu": "Állatkozmetika", - "it": "Toelettatura per animali", + "he": "מספרת חיות", + "hu": "Kisállatfodrász", "ja": "ペット美容室", - "nl": "Trimsalon", "pl": "Salon fryzjerski dla zwierząt", - "pt": "Loja de banhos e tosquias", + "pt": "Salão de banhos e tosquias", "ru": "Парикмахерская для животных", "sv": "Pälsvård för husdjur" }, "searchTerms": { "en": [ "cat", - "dog" + "cat grooming", + "dog", + "dog grooming" + ], + "ca": [ + "peluqueria d'animals", + "gos", + "gat", + "perruqueria de gats", + "perruqueria de gosssos", + "peluquria de gats", + "peluqueria de gossos" + ], + "cs": [ + "kočka", + "pes" + ], + "da": [ + "dyrefrisør", + "hundefrisør", + "hundesalon" ], "de": [ "hundefriseur", "hundesalon", "tierfriseur", - "tierpflegedienst" - ], - "eo": [ - "frizejo", - "hartondisto", - "hundoj", - "katoj", - "hejmbestoj", - "dombestoj" + "tierpflegedienst", + "tierpflege" ], "es": [ - "baño", - "aseo", - "peluquería", - "mascotas", - "perro", + "peluquería de mascotas", + "aseo de mascotas", "gato", - "peluquero canino", - "can" + "perro" ], "fr": [ - "salon de toilettage" - ], - "hu": [ - "kutyakozmetika" - ], - "it": [ - "cane", - "gatto", - "cani", - "gatti", - "toilette", - "toletta", - "tolettatura", - "toelettatura", - "parrucchiere", - "unghie", - "shampoo" + "toilettage", + "animal", + "chien", + "chat", + "salon", + "animalerie" ], "ja": [ "ペット美容室", @@ -14137,41 +16557,32 @@ "猫", "動物" ], - "nl": [ - "huisdierenverzorging", - "huisdierentrimsalon", - "hondenverzorging", - "hondentrimsalon", - "kattenverzorging", - "kattentrimsalon" - ], "pl": [ + "salon fryzjerski dla zwierząt", + "salon groomerski", "psi fryzjer" ], "pt": [ - "loja de cuidados com animais de estimação", - "animais", - "animal", - "gato", - "gatos", - "cão", + "grooming", + "groomer", "cães", - "pet", - "tratamento", - "limpeza", + "cão", + "gatos", + "animais", + "tosquiaria", "tosquia", - "cabeleireiro", - "companhia", - "estimação" + "higiénica", + "higiênico", + "higiénico", + "higiênica", + "tosa", + "estética", + "asseio", + "higiene", + "limpeza" ], "ru": [ - "зоосалон", - "салон красоты для животных", - "собак", - "кошек", - "стрижка", - "уход", - "мытьё" + "грумер" ], "sv": [ "pälsvård för husdjur", @@ -14179,7 +16590,10 @@ "husdjur", "hund", "trimning", - "hundvård" + "hundvård", + "katt", + "kattskötsel", + "hundskötsel" ] }, "icon": { @@ -14192,13 +16606,16 @@ "then": { "en": "Photography Store", "ca": "Botiga de fotografia", + "cs": "Fotografický obchod", "da": "Fotoforretning", "de": "Fotofachgeschäft", "eo": "Fotografia vendejo", "es": "Tienda de fotografía", + "eu": "Argazkilaritza denda", "fi": "Valokuvausliike", "fr": "Tirage de photos", "gl": "Tenda de fotografía", + "he": "חנות צילום", "hu": "Fotósbolt", "id": "Toko Fotografi", "it": "Fotografo", @@ -14217,6 +16634,25 @@ "lens", "photo" ], + "cs": [ + "fotografie", + "fotografický obchod", + "foto", + "fotoobchod", + "video", + "vyvolávání", + "tisk", + "film", + "filmy", + "fotostudio", + "studio", + "fotoaparát", + "digitální", + "digitál", + "střih", + "ateliér", + "objektiv" + ], "da": [ "foto", "kamera", @@ -14248,6 +16684,9 @@ "photographe", "tirage de photos" ], + "he": [ + "חנות צילום" + ], "hu": [ "fényképész", "fényképezés", @@ -14276,6 +16715,7 @@ "film" ], "pl": [ + "sklep fotograficzny", "fotografia", "filmy do aparatów", "ramki na zdjęcia", @@ -14333,11 +16773,15 @@ "then": { "en": "Pottery Store", "ca": "Botiga de ceràmica", + "cs": "Keramika", + "da": "Keramikbutik", "de": "Keramikladen", "eo": "Porcelan-vendejo", "es": "Tienda de alfarería", + "fi": "Keramiikkamyymälä", "fr": "Magasin de poterie", "gl": "Tenda de cerámica", + "he": "חנות כדים", "hu": "Fazekas bolt", "it": "Negozio di ceramica", "ja": "陶磁器店", @@ -14353,6 +16797,11 @@ "pot", "vase" ], + "cs": [ + "keramika", + "hrnec", + "váza" + ], "de": [ "töpferwarenladen", "töpferladen", @@ -14383,6 +16832,10 @@ "olaría", "olería" ], + "he": [ + "חנות לכדים", + "קדרות" + ], "ja": [ "陶磁器店", "陶器店", @@ -14423,12 +16876,14 @@ "then": { "en": "Printer Ink Store", "ca": "Botiga de tinta d'impressores", + "cs": "Barvy do tiskáren", "de": "Druckertintengeschäft", "eo": "Presil-inka vendejo", "es": "Tienda de tinta para impresora", "fi": "Tulostinmustemyymälä", "fr": "Vendeur d'encre pour imprimante", "gl": "Tenda de tinta de impresora", + "he": "חנות דיו למדפסות", "hu": "Nyomtatófesték bolt", "it": "Negozio di cartucce per stampanti", "ja": "プリンタ用インク店", @@ -14445,6 +16900,12 @@ "ink cartridges", "toner" ], + "cs": [ + "inkoust do kopírek", + "inkoust pro fax", + "inkoustové kazety", + "toner" + ], "de": [ "kopierertinte", "faxtinte", @@ -14475,6 +16936,13 @@ "cartouche", "impression" ], + "he": [ + "דיו", + "פקס", + "מדפסת", + "הדפסה", + "לייזר" + ], "ja": [ "プリンタ用インク店", "プリンタ", @@ -14524,17 +16992,19 @@ "if": "shop=psychic", "then": { "en": "Psychic", + "cs": "Věštírna", "de": "Astrologiker", "eo": "Laborejo de mediumo", "es": "Vidente", "fi": "Psyykikko", "fr": "Magasin ésotérique psi", "gl": "Vidente", + "he": "מדיום", "hu": "Jóslás", "it": "Sensitivo", "ja": "サイキック店", "nl": "Medium (esoterie)", - "pl": "Medium", + "pl": "Wróżka", "pt": "Vidente", "ru": "Предсказатель", "sv": "Medium / Psykisk" @@ -14548,6 +17018,14 @@ "seer", "spirit" ], + "cs": [ + "astrologie", + "křišťálová koule", + "věštění", + "vypravěč", + "věštec", + "duch" + ], "de": [ "astrologie", "kristallkugel", @@ -14594,6 +17072,13 @@ "extrasensoriel", "psychokinésie" ], + "he": [ + "גילוי עתידות", + "תקשור", + "תיקשור", + "מגלה עתידות", + "מגדת עתידות" + ], "it": [ "astrologia", "cartomante", @@ -14611,9 +17096,11 @@ "helderziende" ], "pl": [ - "medium", "wróżka", "wróżbita", + "tarot", + "przepowiadanie przyszłości", + "medium", "wróżenie" ], "pt": [ @@ -14667,6 +17154,7 @@ "then": { "en": "Fireworks Store", "ca": "Botiga d'articles pirotècnics", + "cs": "Obchod s pyrotechnikou", "da": "Fyrværkeributik", "de": "Feuerwerksgeschäft", "eo": "Art-fajraĵa vendejo", @@ -14674,6 +17162,7 @@ "fi": "Ilotulitemyymälä", "fr": "Magasin de feux d'artifice", "gl": "Tenda de fogos artificiais", + "he": "חנות זיקוקים", "hu": "Tűzijátékbolt", "id": "Toko Kembang Api", "it": "Negozio di fuochi d'artificio", @@ -14688,6 +17177,13 @@ "en": [ "fireworks" ], + "cs": [ + "pyrotechnika", + "zábavní pyrotechnika", + "zábavná pyrotechnika", + "ohňostroj", + "dělbuch" + ], "da": [ "fyrværkeributik", "fyrværkeriforretning", @@ -14732,6 +17228,9 @@ "fogos artificiais", "fogos de artificio" ], + "he": [ + "חנות זיקוקים" + ], "hu": [ "robbanószer", "tűzijáték", @@ -14758,6 +17257,8 @@ "nieuwjaar" ], "pl": [ + "sklep ze sztucznymi ogniami", + "sklep z fajerwerkami", "sztuczne ognie", "fajerwerki", "petardy" @@ -14797,6 +17298,7 @@ "then": { "en": "Radio/Electronic Component Store", "ca": "Botiga d'articles electrònics", + "cs": "Obchod s elektronickými součástkami", "da": "Radio/Elektronikbutik", "de": "Radio/Elektronik-Geschäft", "eo": "Radioteĥnika/elektronik-parta vendejo", @@ -14804,6 +17306,7 @@ "fi": "Elektroniikkakomponenttimyymälä", "fr": "Magasin de composants électroniques et de radio", "gl": "Tenda de compoñentes electrónicos", + "he": "חנות אלקטרוניקה ורדיו", "hu": "Rádiótechnikai bolt", "id": "Toko Komponen Radio/Elektronik", "it": "Negozio di componenti elettronici", @@ -14820,6 +17323,14 @@ "antenna", "transistor" ], + "cs": [ + "elektrotechnika", + "elektronický", + "elektrický", + "elektro", + "radiotechnika", + "radioamatér" + ], "da": [ "radio/elektronikbutik" ], @@ -14856,6 +17367,9 @@ "electrónica", "radio" ], + "he": [ + "חנות אלקטרוניקה ורדיו" + ], "hu": [ "elektronikai alkatrész", "mérőműszer" @@ -14877,6 +17391,7 @@ "satelliet-tv" ], "pl": [ + "sklep z częściami elektronicznymi", "części elektroniczne", "elektronika", "radiotechnika", @@ -14923,6 +17438,7 @@ "then": { "en": "Religious Store", "ca": "Botiga d'articles religiosos", + "cs": "Náboženské předměty", "da": "Religøs forretning", "de": "Devotionalienhandlung", "eo": "Devotaĵa vendejo", @@ -14930,6 +17446,7 @@ "fi": "Uskonnollinen myymälä", "fr": "Magasin d'articles religieux", "gl": "Tenda relixiosa", + "he": "חנות לתשמישי דת", "hu": "Kegytárgybolt", "id": "Toko Agamawi", "it": "Negozio di articoli religiosi", @@ -14941,6 +17458,13 @@ "sv": "Religiös butik" }, "searchTerms": { + "cs": [ + "náboženství", + "náboženský", + "duchovní", + "křesťanský", + "katolický" + ], "da": [ "religøs forretning" ], @@ -14974,6 +17498,11 @@ "boutique d'une église", "d'un monastère" ], + "he": [ + "חנות לפריטי דת", + "חנות יודאיקה", + "חנות לתשמישי קדושה" + ], "hu": [ "vallás", "imakönyv", @@ -14989,7 +17518,11 @@ "仏壇", "仏具", "祭祀用品", - "信仰" + "信仰", + "神具", + "宗教", + "数珠", + "法衣" ], "nl": [ "liturgisch centrum", @@ -14999,6 +17532,7 @@ "souvenirwinkel" ], "pl": [ + "sklep z dewocjonaliami", "dewocjonalia" ], "pt": [ @@ -15031,6 +17565,8 @@ "if": "shop=rental", "then": { "en": "Rental Shop", + "ca": "Botiga de lloguers", + "cs": "půjčovna", "da": "Udlejningsforretning", "de": "Verleih", "eo": "Pruntejo", @@ -15038,6 +17574,7 @@ "fi": "Vuokraamo", "fr": "Magasin de location", "gl": "Tenda de alugueiro", + "he": "חנות השכרה", "hu": "Kölcsönző", "it": "Negozio di noleggio", "ja": "レンタルショップ", @@ -15048,6 +17585,10 @@ "sv": "Hyrbutik" }, "searchTerms": { + "ca": [ + "tenda de lloguers", + "lloguer" + ], "da": [ "udlejning", "udleje", @@ -15090,6 +17631,11 @@ "vehículos", "equipos" ], + "he": [ + "יד שנייה", + "השכרה", + "חכירה" + ], "ja": [ "レンタルショップ", "レンタル店", @@ -15127,15 +17673,19 @@ "if": "shop=repair", "then": { "en": "Repair Shop", + "cs": "Opravna", + "da": "Reparationsværksted", "de": "Reparaturgeschäft", "eo": "Riparejo", "es": "Taller de reparaciones", + "fi": "Korjaamo", "fr": "Atelier de réparation", + "he": "חנות תיקונים", "hu": "Javítóműhely", "it": "Bottega di riparazioni", "ja": "修理店", "nl": "Reparatiewinkel", - "pl": "Naprawy", + "pl": "Naprawy (nieokreślone)", "pt": "Loja de reparações", "sv": "Reparatör" }, @@ -15149,6 +17699,18 @@ "rehabilitate", "tinker" ], + "cs": [ + "opravna", + "servis", + "opravář", + "náhradní díly", + "dílna", + "oprava rozbitého" + ], + "da": [ + "reparationsværksted", + "værksted" + ], "de": [ "kaputt", "reparieren", @@ -15179,18 +17741,33 @@ "rafistolage", "retouche" ], + "he": [ + "רמונט", + "תיקון", + "שיפוץ", + "טלאי", + "פאץ׳", + "ליטוש", + "שיקום" + ], + "hu": [ + "szerelő" + ], "it": [ "riparatutto" ], "ja": [ "修理店", - "修理屋" + "修理屋", + "サービス", + "修理" ], "nl": [ "reparatiewinkel" ], "pl": [ - "naprawy" + "naprawy", + "serwis" ], "pt": [ "consertos", @@ -15206,11 +17783,65 @@ ] } }, + { + "if": "shop=rice", + "then": { + "en": "Rice Store", + "cs": "Obchod s rýží", + "de": "Reisgeschäft", + "es": "Tienda de arroz", + "fr": "Magasin de riz", + "he": "חנות אורז", + "ja": "米穀店", + "pl": "Sklep z ryżem", + "pt": "Loja de arroz", + "sv": "Risaffär" + }, + "searchTerms": { + "de": [ + "reishandel", + "reishändler", + "reisladen" + ], + "es": [ + "tienda de arroz", + "arrocería", + "granería", + "almacén de arroz" + ], + "fr": [ + "magasin de riz" + ], + "ja": [ + "米屋" + ], + "pl": [ + "sklep z ryżem", + "ryż" + ], + "pt": [ + "store", + "rice", + "cereal", + "cereais" + ], + "sv": [ + "risaffär", + "risbutik", + "ris" + ] + }, + "icon": { + "path": "./assets/layers/id_presets/fas-bowl-rice.svg", + "class": "medium" + } + }, { "if": "shop=scuba_diving", "then": { "en": "Scuba Diving Shop", "ca": "Botiga de submarinisme", + "cs": "Potřeby pro potápěče", "da": "Dykkerudstyrsbutik", "de": "Tauchwarengeschäft", "eo": "Subakvad-aparata vendejo", @@ -15218,6 +17849,7 @@ "fi": "Sukellusliike", "fr": "Magasin de matériel de plongée sous-marine", "gl": "Tenda de mergullo", + "he": "חנות לצוללנים", "hu": "Búvárfelszerelés-bolt", "id": "Toko Perlengkapan Menyelam", "it": "Negozio di attrezzatura per subacquei", @@ -15235,6 +17867,21 @@ "scuba", "snorkel" ], + "ca": [ + "tenda de submarinisme", + "mar", + "aigua", + "snorkel", + "buceig", + "submarinisme" + ], + "cs": [ + "potápění", + "potápěč", + "scuba", + "potapěč", + "šnorchl" + ], "da": [ "dykkerudstyrsbutik" ], @@ -15272,6 +17919,9 @@ "buceo", "mergullo submarino" ], + "he": [ + "חנות צלילה" + ], "hu": [ "búvárfelszerelések boltja", "búvárbolt", @@ -15285,7 +17935,10 @@ "スキューバダイビングショップ", "スキューバダイビング", "スポーツ", - "運動" + "運動", + "店舗", + "お店", + "小売" ], "nl": [ "diepzeeduiken", @@ -15294,6 +17947,7 @@ "scuba" ], "pl": [ + "sklep nurkowy", "sprzęt do nurkowania", "nurkowanie" ], @@ -15329,7 +17983,8 @@ "if": "shop=seafood", "then": { "en": "Seafood Shop", - "ca": "Marisqueria", + "ca": "Botiga de Mariscos", + "cs": "Rybárna", "da": "Fiskehandler", "de": "Fischgeschäft", "eo": "Marfrukta vendejo", @@ -15337,6 +17992,7 @@ "fi": "Meriruokakauppa", "fr": "Poissonnerie / Vente de fruits de mer", "gl": "Peixaría", + "he": "חנות למאכלי ים", "hu": "Halbolt", "id": "Toko HIdangan Laut", "it": "Pescheria", @@ -15349,8 +18005,20 @@ "sv": "Fiskaffär" }, "searchTerms": { - "en": [ - "fishmonger" + "ca": [ + "marisqueria", + "pòsit", + "llotja", + "tenda de mariscos" + ], + "cs": [ + "rybárna", + "rybářství", + "ryby", + "ryba", + "plody moře", + "seafood", + "mořské potvory" ], "da": [ "fiskehandler", @@ -15388,6 +18056,9 @@ "peixe", "marisco" ], + "he": [ + "חנות למאכלי ים" + ], "hu": [ "halkereskedés", "halas" @@ -15417,6 +18088,7 @@ ], "pl": [ "sklep rybny", + "sklep z owocami morza", "ryby", "owoce morza" ], @@ -15468,37 +18140,37 @@ { "if": "shop=second_hand", "then": { - "en": "Consignment/Thrift Store", - "ca": "Consigna", + "en": "Thrift Store", + "ca": "Botiga de segona mà", + "cs": "Second hand", "da": "Genbrugsbutik", "de": "Second-Hand-Laden", - "eo": "Brokantejo", "es": "Tienda de segunda mano", - "fi": "Käytetyn tavaran kauppa", - "fr": "Dépôt-vente/produits d'occasion", - "gl": "Tenda de segunda man", - "hu": "Használtáru-bolt", - "id": "Jual Titip/Pasar Loak", - "it": "Negozio di articoli usati", - "ja": "リサイクルショップ", + "fi": "Kirpputori", + "fr": "Magasin de produits d'occasion", + "he": "חנות יד שנייה", + "it": "Mercatino dell'usato", + "ja": "中古品店", "nl": "Tweedehandswinkel", "pl": "Sklep z rzeczami używanymi", "pt": "Loja de produtos em segunda mão", - "ru": "Магазин секонд хенда", + "ru": "Комиссионный магазин", "sv": "Second hand" }, "searchTerms": { "en": [ - "secondhand", - "second hand", + "second-hand", "resale", - "thrift", "used" ], + "cs": [ + "bazarové", + "přeprodej", + "použité" + ], "da": [ - "velgørenhedsbutik", - "velgørenhedsforretning", - "genbrugsbutik" + "genbrugsforretning", + "secondhandbutik" ], "de": [ "second-hand-laden", @@ -15509,67 +18181,40 @@ "brockenstube", "brocki" ], - "eo": [ - "lambardejo", - "eluzitaĵoj", - "uzitaĵoj", - "malnovaĵoj" - ], "es": [ "segunda mano", "usado", "productos usados", "reventa" ], - "fi": [ - "kirpputori", - "myymälä", - "liike", - "kauppa", - "second hand", - "käytetty", - "käytettyä", - "käytetyn", - "tavara", - "jälleenmyynti", - "vertaiskauppa", - "osto- ja myyntiliike" - ], "fr": [ - "produits de seconde main" + "magasin", + "dépot", + "friperie", + "seconde main", + "aubaine", + "solidaire" ], - "hu": [ - "használtruha bolt", - "turkáló", - "turi", - "turkáló butik", - "bálás bolt", - "használtcikk" - ], - "id": [ - "konsinyasi/toko barang bekas" + "he": [ + "יד שנייה", + "מיושן", + "ידשנייה" ], "it": [ - "seconda mano", - "rivendita", - "risparmio", - "usato", - "mercatino" + "negozio dell'usato", + "negozio di seconda mano" ], "ja": [ - "古物商", - "リユースショップ", - "中古", - "リサイクルショップ", + "スリフトショップ", + "リサイクル店", + "中古品店", + "再販店", "中古屋", - "リサイクル", - "リユース" - ], - "nl": [ - "hergebruik", - "doorverkoop" + "中古販売店", + "リサイクルショップ" ], "pl": [ + "sklep z rzeczami używanymi", "second hand", "komis", "używane rzeczy", @@ -15587,12 +18232,6 @@ "roupa usada", "2.ª mão" ], - "ru": [ - "секондхенд", - "секонд хенд", - "секонд", - "комиссионный" - ], "sv": [ "second hand", "loppis", @@ -15610,13 +18249,15 @@ "then": { "en": "Sewing Supply Shop", "ca": "Merceria", + "cs": "Šicí potřeby, galanterie", "da": "Syforretning", - "de": "Kurzwarenladen", + "de": "Geschäft für Nähzubehör", "eo": "Kudrilar-vendejo", "es": "Tienda de suministros de costura", "fi": "Ompelutarvikeliike", "fr": "Magasin de couture", "gl": "Tenda de artigos de costura", + "he": "חנות ציוד תפירה", "hu": "Varrásfelszerelés bolt", "it": "Merceria", "ja": "手芸用品店", @@ -15630,6 +18271,16 @@ "en": [ "haberdashery" ], + "ca": [ + "cinteria", + "llenceria", + "fils", + "cusir", + "cosir" + ], + "cs": [ + "galanterie" + ], "da": [ "sy", "syning", @@ -15640,7 +18291,16 @@ "kreativ" ], "de": [ - "nähzubehörgeschäft" + "nähzubehör", + "kurzwaren", + "garn", + "stricken", + "nähen", + "häckeln", + "sticken", + "nähmaschinen", + "nadeln", + "stricknadeln" ], "eo": [ "pasamento", @@ -15669,6 +18329,12 @@ "confeccion", "corte" ], + "he": [ + "חנות תפירה", + "תופרת", + "בדים", + "בד" + ], "hu": [ "varrógép", "kézimunka" @@ -15688,7 +18354,10 @@ "編物用品", "店", "針", - "糸" + "糸", + "趣味", + "編み物用品店", + "編物" ], "nl": [ "naaimachine", @@ -15748,11 +18417,15 @@ "then": { "en": "Shoe Repair Shop", "ca": "Sabater", + "cs": "Opravna obuvi", + "da": "Skomager", "de": "Schuhreparatur", "eo": "Ŝu-riparejo", "es": "Taller de reparación de calzado", + "eu": "Oinetako-konponketak", "fr": "Cordonnier", "gl": "Tenda de arranxo de zapatos", + "he": "חנות לתיקון נעליים", "hu": "Cipőjavítás", "it": "Calzolaio", "ja": "靴修理店", @@ -15766,6 +18439,26 @@ "en": [ "cobbler" ], + "ca": [ + "reparador de sabates", + "sabates", + "sabateria" + ], + "cs": [ + "švec", + "ševcovství", + "opravna obuvi", + "výrobce bot", + "výroba obuvi", + "boty", + "dílna", + "obuv", + "řemeslo", + "řemeslník" + ], + "da": [ + "hælebar" + ], "de": [ "kopfsteinpflaster" ], @@ -15781,6 +18474,12 @@ "taller de reparación de calzado", "tienda de reparación de calzado" ], + "eu": [ + "oinetako-konponketak", + "zapataria", + "zapatagilea", + "zapateroa" + ], "fr": [ "cordonnerie", "cordonnier réparation de chaussures" @@ -15792,20 +18491,28 @@ "arranxo de calzado", "reparación de calzado" ], + "he": [ + "שומאכר", + "מתקן נעליים", + "תיקון נעליים", + "סנדלר" + ], "hu": [ "cipész" ], "ja": [ "靴修理店", "靴屋", - "靴" + "靴", + "サービス", + "修理" ], "nl": [ "schoenenmaker" ], "pl": [ - "naprawa obuwia", "szewc", + "naprawa obuwia", "obuwie", "buty" ], @@ -15832,13 +18539,16 @@ "then": { "en": "Shoe Store", "ca": "Sabateria", + "cs": "Obuvnictví", "da": "Skobutik", "de": "Schuhgeschäft", "eo": "Ŝua vendejo", "es": "Zapatería", + "eu": "Zapata-denda", "fi": "Kenkäkauppa", "fr": "Magasin de chaussures", "gl": "Zapataría", + "he": "חנות נעליים", "hu": "Cipőbolt", "id": "Toko Sepatu", "it": "Negozio di scarpe", @@ -15858,12 +18568,28 @@ "heels", "loafers", "oxfords", - "sneakers" + "sneakers", + "footwear", + "sandals", + "slippers" ], "ca": [ "sabateria", "botiga de sabates", - "sabater" + "sabater", + "calçat", + "sabata", + "bamba", + "tacons", + "sandàlies", + "botes" + ], + "cs": [ + "dům obuvi", + "boty", + "obuvnictví", + "obuvník", + "švec" ], "da": [ "skobutik", @@ -15890,9 +18616,23 @@ "alpargata", "zapatería" ], + "eu": [ + "zapata-denda", + "zapatadenda", + "oinetakoak", + "oinetako-denda" + ], + "fi": [ + "kenkäkauppa", + "kenkämyymälä", + "kenkäliike" + ], "fr": [ "magasin de chaussures" ], + "he": [ + "חנות נעליים" + ], "hu": [ "cipő", "papucs", @@ -15911,6 +18651,7 @@ "schoenenhandel" ], "pl": [ + "sklep obuwniczy", "obuwie", "buty" ], @@ -15947,6 +18688,7 @@ "then": { "en": "Spice Shop", "ca": "Botiga d'espècies", + "cs": "Koření, bylinky", "da": "Kryddeributik", "de": "Gewürzladen", "eo": "Spica vendejo", @@ -15954,6 +18696,7 @@ "fi": "Maustekauppa", "fr": "Magasin d'épices", "gl": "Tenda de especias", + "he": "חנות תבלינים", "hu": "Fűszerbolt", "it": "Negozio di spezie", "ja": "スパイス店", @@ -15978,6 +18721,36 @@ "turmeric", "wasabi" ], + "ca": [ + "tenda d'espècies", + "curry", + "xili", + "canella", + "herba", + "pebrera", + "pimienta", + "sal", + "especie", + "condiments", + "wasabi", + "condiment", + "pebre", + "safrà" + ], + "cs": [ + "chilli", + "skořice", + "kari", + "zázvor", + "bylinky", + "pepř", + "šafrán", + "sůl", + "obchod s kořením", + "koření", + "kurkuma", + "wasabi" + ], "da": [ "krydderi", "urter", @@ -16039,6 +18812,25 @@ "sel", "wasabi" ], + "he": [ + "צ׳ילי", + "צ'ילי", + "קינמון", + "קארי", + "זנגביל", + "ג׳ינג׳ר", + "ג'ינג'ר", + "תבלינים", + "תבלין", + "זעפרן", + "וסאבי", + "כורכום", + "כמון", + "פלפל", + "חריף", + "לימון פרסי", + "זעתר" + ], "hu": [ "delikátesz" ], @@ -16051,13 +18843,14 @@ "店舗", "食品", "食べ物", - "食料品" + "食料品", + "調味料" ], "nl": [ "kruidenwinkel" ], "pl": [ - "przyprawy", + "sklep z przyprawami przyprawy", "zioła", "suszone owoce", "orzechy" @@ -16105,6 +18898,7 @@ "then": { "en": "Sporting Goods Store", "ca": "Botiga d'esports", + "cs": "Sportovní potřeby", "da": "Sportsudstyrsbutik", "de": "Sportgeschäft", "eo": "Sporta vendejo", @@ -16112,6 +18906,7 @@ "fi": "Urheiluliike", "fr": "Magasin d'équipement sportif", "gl": "Tenda de deportes", + "he": "חנות לאביזרי ספורט", "hu": "Sportbolt", "id": "Toko Olahraga", "it": "Negozio di articoli sportivi", @@ -16125,7 +18920,20 @@ }, "searchTerms": { "en": [ - "athletics" + "athletics", + "hobby" + ], + "ca": [ + "esport", + "deport", + "esports", + "tenda d'esports" + ], + "cs": [ + "sport", + "obchod se sportovními potřebami", + "sportovní potřeby", + "vybavení pro sport" ], "da": [ "sportsudstyrsbutik", @@ -16153,7 +18961,10 @@ "liikunta" ], "fr": [ - "magasin d'équipement sportif" + "magasin de sport" + ], + "he": [ + "חנות לדברי ספורט" ], "hu": [ "sportfelszerelés", @@ -16178,6 +18989,7 @@ "sportgerief" ], "pl": [ + "sklep sportowy", "sprzęt sportowy" ], "pt": [ @@ -16230,13 +19042,16 @@ "then": { "en": "Stationery Store", "ca": "Papereria", + "cs": "Kancelářské potřeby", "da": "Papirforhandler", "de": "Schreibwarengeschäft", "eo": "Papervara vendejo", "es": "Artículos de papelería y oficina", + "eu": "Paperdenda", "fi": "Toimistotarvikekauppa", "fr": "Papeterie", "gl": "Papelaría", + "he": "חנות לדברי כתיבה", "hu": "Papírbolt", "id": "Toko Alat Tulis", "it": "Negozio di cancelleria", @@ -16253,6 +19068,13 @@ "card", "paper" ], + "cs": [ + "papírnictví", + "papír", + "kancelářské potřeby", + "papírnické zboží", + "psací potřeby" + ], "da": [ "papirforhandler", "kontorforsyning" @@ -16284,6 +19106,9 @@ "fr": [ "papeterie" ], + "he": [ + "חנות לדברי כתיבה" + ], "hu": [ "papír", "írószer", @@ -16295,7 +19120,28 @@ ], "ja": [ "文具店", - "文房具屋" + "文房具屋", + "はんこ", + "ハンコ", + "筆記具", + "ノート", + "ペン", + "用紙", + "キングファイル", + "バインダー", + "ペンケース", + "はさみ", + "ホッチキス", + "セロテープ", + "のり", + "文具", + "文房具", + "ステーショナリ", + "お店", + "店舗", + "学習", + "事務用品", + "事務" ], "nl": [ "kaart", @@ -16304,7 +19150,9 @@ "kantoorartikelen" ], "pl": [ - "papierniczy" + "sklep papierniczy", + "artykuły piśmiennicze", + "zeszyty" ], "pt": [ "stationery", @@ -16346,13 +19194,15 @@ "then": { "en": "Storage Rental", "ca": "Lloguer de magatzem", + "cs": "Skladovací prostor", "da": "Lagerhotel", "de": "Lagerraumvermieter", "eo": "Magazena spaco por lui", "es": "Alquiler de espacios para almacenaje", "fi": "Varastonvuokrauspalvelu", - "fr": "Location de stockage - Ne pas utiliser", + "fr": "Location de stockage", "gl": "Alugueiro de almacéns", + "he": "שטח אחסון להשכרה", "hu": "Tárolóhely bérbeadása", "it": "Box a noleggio", "ja": "レンタル倉庫", @@ -16372,6 +19222,15 @@ "storage lockers", "storage units" ], + "cs": [ + "skladiště", + "skladování", + "skladovací prostor", + "uskladnění", + "parkování", + "pronájem", + "nájem" + ], "da": [ "lagerhotel", "opbevaringshotel" @@ -16424,6 +19283,9 @@ "arrendo", "alugamento" ], + "he": [ + "שטח אחסון להשכרה" + ], "hu": [ "tárolás", "raktárbérlés", @@ -16444,7 +19306,10 @@ "レンタル収納スペース", "トランクルーム", "コンテナ収納", - "荷物" + "荷物", + "置き場", + "保管場", + "ストレージ" ], "nl": [ "selfstorage", @@ -16491,6 +19356,7 @@ "then": { "en": "Supermarket", "ca": "Supermercat", + "cs": "Supermarket", "da": "Supermarked", "de": "Supermarkt", "eo": "Superbazaro", @@ -16498,8 +19364,9 @@ "fi": "Supermarketti", "fr": "Supermarché", "gl": "Supermercado", + "he": "סופרמרקט", "hu": "Szupermarket", - "id": "Supermarket", + "id": "Pasar Besar", "it": "Supermercato", "ja": "スーパーマーケット", "nl": "Supermarkt", @@ -16524,6 +19391,27 @@ "hipermercat", "híper" ], + "cs": [ + "obchod", + "market", + "supermarket", + "butik", + "bazar", + "řetězec", + "hypermarket", + "diskont", + "diskontní", + "bleší trh", + "trh", + "tržiště", + "outlet", + "obchodní", + "centrum", + "nákupní", + "obchodní dům", + "večerka", + "prodejní" + ], "da": [ "supermarked", "lavprisbutik", @@ -16546,6 +19434,9 @@ "fr": [ "supermarché" ], + "he": [ + "סופרמרקט" + ], "hu": [ "szupermarket", "élelmiszerbolt", @@ -16636,12 +19527,15 @@ "if": "shop=swimming_pool", "then": { "en": "Pool Supply Store", + "cs": "Bazény", + "da": "Butik med pooludstyr", "de": "Swimmingpoolbedarf", "eo": "Vendejo de naĝej-akcesoriaĵoj", "es": "Tienda de suministros para piscinas", "fi": "Uima-allasliike", "fr": "Magasin de matériel de piscine", "gl": "Tenda de subministracións para piscinas", + "he": "חנות ציוד לבריכות", "hu": "Uszodatechnika-bolt", "it": "Negozio per rifornimenti per piscina", "ja": "プール用品店", @@ -16662,6 +19556,17 @@ "swimming pool maintenance store", "swimming pool supply shop" ], + "cs": [ + "obchod s vybavením pro vířivky", + "obchod s údržbou vířivek", + "obchod s potřebami pro vířivky", + "obchod s bazény", + "bazény", + "obchod s vybavením pro bazény", + "obchod s instalací bazénů", + "obchod s údržbou bazénů", + "obchod s potřebami pro bazény" + ], "de": [ "swimmingpoolbedarf" ], @@ -16689,6 +19594,20 @@ "maintenance", "piscine" ], + "he": [ + "ציוד שחייה", + "ציוד לבריכות", + "תחזוקת ג׳קוזי", + "חנות בריכות", + "בריכת שחייה", + "חנות ציוד", + "ברכת שחייה", + "חנות להתקנת ברכת שחייה", + "חנות להתקנת בריכת שחייה", + "חנות לתחזוקת ברכות", + "חנות לתחזוקת בריכות", + "חנות ציוד לברכות" + ], "hu": [ "medence" ], @@ -16742,6 +19661,7 @@ "then": { "en": "Tailor", "ca": "Sastreria", + "cs": "Krejčovství", "da": "Skrædder", "de": "Schneider", "eo": "Tajlora laborejo/vendejo", @@ -16749,12 +19669,13 @@ "fi": "Räätäliliike", "fr": "Tailleur", "gl": "Xastraría", + "he": "חייט", "hu": "Szabó", "id": "Tukang Jahit", "it": "Sartoria", "ja": "仕立屋", "nl": "Kleermaker", - "pl": "Krawiec / usługi krawieckie", + "pl": "Krawiec (usługi krawieckie)", "pt": "Alfaiate", "ru": "Портной", "sl": "Krojač", @@ -16765,6 +19686,14 @@ "clothes", "suit" ], + "cs": [ + "krejčí", + "krejčířství", + "krejčovství", + "krejčová", + "švadlena", + "švadlenka" + ], "da": [ "skrædder" ], @@ -16772,7 +19701,8 @@ "schneider", "herrenschneider", "änderungsschneiderei", - "änderungsservice" + "änderungsservice", + "anzugsschneider" ], "eo": [ "tajloro" @@ -16804,6 +19734,9 @@ "taller de sastrería", "sastrería" ], + "he": [ + "חייטת" + ], "hu": [ "szabóság", "mértékutáni", @@ -16876,6 +19809,7 @@ "then": { "en": "Tattoo Parlor", "ca": "Centre de tatuatges", + "cs": "Tetovací salón", "da": "Tatovør", "de": "Tätowierer", "eo": "Salono de tatuado", @@ -16883,6 +19817,7 @@ "fi": "Tatuointisalonki", "fr": "Salon de tatouage", "gl": "Salón de tatuaxes", + "he": "מכון קעקועים", "hu": "Tetováló szalon", "id": "Jasa Pembuatan Tato", "it": "Tatuatore", @@ -16898,6 +19833,18 @@ "en": [ "ink" ], + "cs": [ + "tattoo", + "tatér", + "tatérka", + "tatérství", + "tetování", + "kérka", + "kérky", + "kérkař", + "piercing", + "pírsing" + ], "da": [ "tatovør", "tatovørforretning" @@ -16921,6 +19868,9 @@ "fr": [ "salon de tatouage" ], + "he": [ + "מכון קעקועים" + ], "hu": [ "tetoválás", "piercing", @@ -16974,6 +19924,7 @@ "then": { "en": "Tea Store", "ca": "Botiga de te", + "cs": "Obchod s čajem", "da": "Tebutik", "de": "Teegeschäft", "eo": "Tea vendejo", @@ -16981,6 +19932,7 @@ "fi": "Teekauppa", "fr": "Magasin de thés", "gl": "Tenda de té", + "he": "חנות תה", "hu": "Teaüzlet", "id": "Toko Teh", "it": "Negozio di tè", @@ -16993,6 +19945,12 @@ "sv": "Te-butik" }, "searchTerms": { + "cs": [ + "čaj", + "čaje", + "čajovna", + "čajírna" + ], "da": [ "tebutik", "teforhandler", @@ -17015,6 +19973,9 @@ "fr": [ "magasin de thés" ], + "he": [ + "חנות תה" + ], "hu": [ "teabolt", "teázó" @@ -17034,12 +19995,14 @@ "飲み物", "店舗", "小売", - "嗜好品" + "嗜好品", + "茶葉" ], "nl": [ "theehuis" ], "pl": [ + "sklep z herbatą", "sklep z herbatami", "herbaty" ], @@ -17077,17 +20040,19 @@ "if": "shop=telecommunication", "then": { "en": "Telecom Retail Store", + "cs": "Telekomunikační prodejna", "de": "Telekommunikationsfachgeschäft", "eo": "Oficejo de telekomunikada firmao (vendo)", "es": "Tienda minorista de telecomunicaciones", "fi": "Teleoperaattorin myymälä", "fr": "Magasin de compagnie de télécommunication", "gl": "Tenda de subministracións de telecomunicación", + "he": "חנות טלפונים", "hu": "Telekommunikációs üzlet", "it": "Negozio al dettaglio di Telefonia", "ja": "通信サービス店", "nl": "Telecomwinkel", - "pl": "Dostawca Internetu/telefonu/TV", + "pl": "Salon dostawcy usług telekomunikacyjnych", "pt": "Loja de telecomunicações", "sv": "Telekombutik" }, @@ -17100,6 +20065,14 @@ "telephone", "voice" ], + "cs": [ + "komunikace", + "poskytovatel internetové služby", + "isp", + "síť", + "telefon", + "hlas" + ], "de": [ "kommunikation", "internet service provider", @@ -17136,6 +20109,9 @@ "voix sur ip", "portable" ], + "he": [ + "חנות תקשורת" + ], "hu": [ "mobiltelefon" ], @@ -17150,6 +20126,7 @@ "telefoonwinkel" ], "pl": [ + "salon dostawcy usług telekomunikacyjnych", "dostawca internetu", "dostawca usług internetowych", "usługodawca internetowy", @@ -17189,6 +20166,7 @@ "then": { "en": "Ticket Seller", "ca": "Venedor de tiquets", + "cs": "Prodejna vstupenek", "da": "Billetsælger", "de": "Eintrittskartenverkäufer", "eo": "Biletejo", @@ -17196,12 +20174,13 @@ "fi": "Lipunmyyntipiste", "fr": "Boutique de vente de billets", "gl": "Venda de entradas", + "he": "עמדת מכירת כרטיסים", "hu": "Jegypénztár", "id": "Penjual Tiket", "it": "Biglietteria", - "ja": "チケット店", + "ja": "チケット売り場", "nl": "Ticketverkoop", - "pl": "Sprzedaż biletów", + "pl": "Kasa biletowa", "pt": "Bilheteira", "ru": "Билетная касса", "sl": "Prodajalna vstopnic", @@ -17211,6 +20190,16 @@ "en": [ "box office" ], + "cs": [ + "vstupenka", + "vstupenky", + "vstupenek", + "předprodej", + "lístek", + "lístky", + "jízdenka", + "jízdenky" + ], "da": [ "billetsælger", "billetbutik" @@ -17247,6 +20236,9 @@ "boutique de vente de billets", "billetterie" ], + "he": [ + "עמדת מכירת כרטיסים" + ], "hu": [ "koncertjegy", "színházjegy", @@ -17260,7 +20252,12 @@ "ja": [ "チケット店", "金券ショップ", - "チケット" + "チケット", + "金券店", + "切符売り場", + "きっぷ売り場", + "切符", + "チケット売り場" ], "nl": [ "toegangskaartjes", @@ -17308,6 +20305,7 @@ "then": { "en": "Tile Shop", "ca": "Botiga de rajoles", + "cs": "Obchod s obklady", "da": "Fliseforhandler", "de": "Fliesenhändler", "eo": "Kahela vendejo", @@ -17315,6 +20313,7 @@ "fi": "Laattamyymälä", "fr": "Magasin de carrelage", "gl": "Tenda de azulexos", + "he": "חנות מרצפות", "hu": "Csempebolt", "it": "Negozio di piastrelle", "ja": "タイル店", @@ -17325,6 +20324,13 @@ "sv": "Kakelbutik" }, "searchTerms": { + "ca": [ + "tenda de rajoles", + "manises", + "ceràmica", + "paret", + "taulell" + ], "da": [ "flise", "badeværelse", @@ -17359,6 +20365,9 @@ "tellas", "teselas" ], + "he": [ + "חנות מרצפות" + ], "hu": [ "burkolóanyagok" ], @@ -17372,7 +20381,10 @@ ], "ja": [ "タイル店", - "タイルショップ" + "タイルショップ", + "店舗", + "お店", + "建材店" ], "nl": [ "betegeling", @@ -17380,13 +20392,15 @@ "muurtegelwinkel" ], "pl": [ + "sklep z płytkami ceramicznymi", "płytki ceramiczne", "ceramika", "gres", "glazura", "kafelki", "płytki", - "terakota" + "terakota", + "flizy" ], "pt": [ "tijoleira", @@ -17412,6 +20426,7 @@ "then": { "en": "Tobacco Shop", "ca": "Estanc", + "cs": "Kuřácké potřeby", "da": "Tobaksforretning", "de": "Tabakwarengeschäft", "eo": "Tabaka vendejo", @@ -17419,6 +20434,7 @@ "fi": "Tupakkapuoti", "fr": "Bureau de tabac", "gl": "Estanco", + "he": "חנות טבק", "hu": "Dohánybolt", "id": "Toko Tembakau", "it": "Tabaccheria", @@ -17435,6 +20451,30 @@ "cigarettes", "cigars" ], + "ca": [ + "tabacos", + "tabacs", + "estanc", + "expeneduria", + "expendeduria", + "dispensari", + "cigarrets", + "cigars", + "fumar" + ], + "cs": [ + "kuřácké potřeby", + "potřeby pro kuřáky", + "kuřák", + "kuřáci", + "kouření", + "tabák", + "doutník", + "dýmky", + "dýmka", + "cigarety", + "cigareta" + ], "da": [ "tobaksforretning", "cigarforhandler" @@ -17463,6 +20503,9 @@ "fr": [ "buraliste" ], + "he": [ + "חנות טבק" + ], "hu": [ "nemzeti dohánybolt", "dohány", @@ -17484,12 +20527,16 @@ "嗜好品", "タバコ店", "タバコ屋", - "煙草" + "煙草", + "店舗", + "お店", + "小売" ], "nl": [ "sigarettenwinkel" ], "pl": [ + "sklep z tytoniem", "sklep tytoniowy", "tytoń", "papierosy", @@ -17543,6 +20590,7 @@ "then": { "en": "Tool Rental", "ca": "Lloguer d'eines", + "cs": "půjčovna nářadí", "da": "Værktøjsudlejning", "de": "Werkzeugverleih", "eo": "Il-pruntejo", @@ -17550,6 +20598,7 @@ "fi": "Työkaluvuokraamo", "fr": "Location d'outils", "gl": "Alugueiro de ferramentas", + "he": "השכרת כלים", "hu": "Gépkölcsönző", "it": "Noleggio utensili", "ja": "工具レンタル店", @@ -17580,6 +20629,9 @@ "outillage", "location" ], + "he": [ + "חנות להשכרת כלים" + ], "ja": [ "工具レンタル店", "工具", @@ -17589,6 +20641,7 @@ "machineverhuur" ], "pl": [ + "wypożyczalnia narzędzi", "wypożyczanie narzędzi", "wynajem narzędzi", "narzędzia", @@ -17623,6 +20676,7 @@ "then": { "en": "Toy Store", "ca": "Botiga de joguines", + "cs": "Hračkářství", "da": "Legetøjsbutik", "de": "Spielwarengeschäft", "eo": "Ludila vendejo", @@ -17630,6 +20684,7 @@ "fi": "Lelukauppa", "fr": "Magasin de jouets", "gl": "Tenda de xoguetes", + "he": "חנות צעצועים", "hu": "Játékbolt", "id": "Toko Mainan", "it": "Negozio di giocattoli", @@ -17643,13 +20698,19 @@ }, "searchTerms": { "en": [ - "games" + "games", + "hobby", + "teddy" ], "ca": [ "botiga de joguines", "botiga de jocs", "joguineria" ], + "cs": [ + "hračky", + "hry" + ], "da": [ "legetøjsforretning", "legetøjsbutik" @@ -17675,6 +20736,9 @@ "fr": [ "magasin de jouets" ], + "he": [ + "חנות צעצועים" + ], "hu": [ "barbie", "lego", @@ -17699,8 +20763,9 @@ "speelgoedwinkel" ], "pl": [ - "zabawki", - "sklep zabawkarski" + "sklep z zabawkami", + "sklep zabawkarski", + "zabawki" ], "pt": [ "brinquedos", @@ -17729,12 +20794,14 @@ "if": "shop=trade", "then": { "en": "Trade Shop", + "cs": "Stavebniny", "da": "Brancheforhandler", "de": "Baustoffhandel", "eo": "Pogranda vendejo (konstruaĵ‑materialoj)", "es": "Tienda comercial / Corralón", "fr": "Grossiste", "gl": "Distribuidor", + "he": "חנות קמעונאית", "hu": "Szakáruház", "it": "Materiali da edilizia", "ja": "建築資材店", @@ -17802,6 +20869,9 @@ "tenda comercial", "distribuidora" ], + "he": [ + "חנות מוצרים" + ], "it": [ "materiali edilizi", "edilizia", @@ -17815,7 +20885,16 @@ "建築資材店", "工務店", "建材店", - "配管工" + "配管工", + "材木", + "セメント", + "建材", + "レンガ", + "店舗", + "お店", + "住宅", + "住宅設備", + "建築" ], "nl": [ "bouwmaterialenwinkel", @@ -17833,10 +20912,13 @@ "plankenhandel" ], "pl": [ + "skład materiałów budowlanych", + "sklep instalacyjny", + "sklep hydrauliczny", "skład drewna", "skład budowlany", "hurtownia budowlana", - "skład opału" + "materiały instalacyjne" ], "pt": [ "construção", @@ -17881,6 +20963,7 @@ "then": { "en": "Travel Agency", "ca": "Agència de viatges", + "cs": "Cestovní kancelář", "da": "Rejsebureau", "de": "Reisebüro", "eo": "Vojaĝa oficejo", @@ -17888,6 +20971,7 @@ "fi": "Matkatoimisto", "fr": "Agence de voyages", "gl": "Axencia de viaxes", + "he": "סוכנות נסיעות", "hu": "Utazási iroda", "id": "Biro Perjalanan", "it": "Agenzia di viaggi", @@ -17910,6 +20994,12 @@ "ca": [ "agència de viatges" ], + "cs": [ + "cestovní kancelář", + "cestovka", + "cestování", + "dovolená" + ], "da": [ "rejsebureau", "rejseagent" @@ -17931,9 +21021,15 @@ "viajes", "turismo" ], + "fi": [ + "matkatoimisto" + ], "fr": [ "agence de voyage" ], + "he": [ + "סוכנות נסיעות" + ], "hu": [ "ibusz", "vista", @@ -17961,6 +21057,7 @@ "reisbureau" ], "pl": [ + "biuro podróży", "podróże" ], "pt": [ @@ -18003,17 +21100,21 @@ "then": { "en": "Trophy Shop", "ca": "Botiga de trofeus", + "cs": "Prodejna trofejí", + "da": "Trofæbutik", "de": "Trophäengeschäft", "eo": "Vendejo de pokaloj kaj premioj", "es": "Tienda de trofeos", "fr": "Magasin de trophées", "gl": "Tenda de trofeos", + "he": "חנות מדליות", "hu": "Kupák, kitüntetések boltja", "it": "Negozio di coppe", "ja": "徽章店", "nl": "Trofeewinkel", "pl": "Sklep z trofeami", "pt": "Loja de troféus", + "ru": "Магазин наград", "sv": "Affär för troféer" }, "searchTerms": { @@ -18024,6 +21125,35 @@ "plaques", "trophy store" ], + "ca": [ + "tenda de trofeus", + "premi", + "medalla", + "placa", + "trofeu" + ], + "cs": [ + "obchod", + "prodejna", + "trofej", + "rofeje", + "poháry", + "medaile", + "diplomy", + "ocenění", + "ceny", + "rytí", + "rytiny", + "pamětní desky", + "plakety", + "rytí nápisů", + "rytec" + ], + "da": [ + "trofæbutik", + "medaljebutik", + "præmiebutik" + ], "de": [ "pokale", "trophäen", @@ -18056,6 +21186,17 @@ "coupes", "récompenses" ], + "he": [ + "חנות גביעים", + "חנות מזכרות", + "מדליות", + "גביעים", + "חריטה", + "חריטות", + "פרסים", + "מענקים", + "אליפות" + ], "hu": [ "érem" ], @@ -18115,6 +21256,7 @@ "then": { "en": "Tire Store", "ca": "Botiga de pneumàtics", + "cs": "Pneuservis", "da": "Dækforhandler", "de": "Reifenhandel", "eo": "Aerbenda vendejo", @@ -18122,6 +21264,7 @@ "fi": "Rengasliike", "fr": "Magasin de pneus", "gl": "Tenda de pneumáticos", + "he": "חנות צמיגים", "hu": "Autógumibolt", "id": "Toko Ban", "it": "Gommista", @@ -18134,6 +21277,11 @@ "sv": "Däckfirma" }, "searchTerms": { + "cs": [ + "prodejna pneumatik", + "pneumatiky", + "pneuservis" + ], "da": [ "dækforhandler" ], @@ -18155,9 +21303,17 @@ "goma", "gomería" ], + "fi": [ + "rengaskauppa", + "rengasliike", + "rengaskauppias" + ], "fr": [ "magasin de pneus" ], + "he": [ + "חנות צמיגים" + ], "hu": [ "autógumi", "gumiabroncs", @@ -18177,10 +21333,11 @@ "autoband" ], "pl": [ - "opony", + "sklep z oponami", "wulkanizacja", "wulkanizator", "wymiana opon", + "opony", "samochody" ], "pt": [ @@ -18222,6 +21379,7 @@ "then": { "en": "Vacuum Cleaner Store", "ca": "Botiga d'aspiradors", + "cs": "Obchod s vysavači", "da": "Støvsugerforhandler", "de": "Staubsaugergeschäft", "eo": "Polvosuĉila vendejo", @@ -18229,6 +21387,7 @@ "fi": "Pölynimuriliike", "fr": "Magasin d'électroménager de nettoyage", "gl": "Tenda de aspiradoras", + "he": "חנות שואבי אבק", "hu": "Porszívóbolt", "id": "Toko Pengisap Debu", "it": "Negozio di aspirapolveri", @@ -18241,6 +21400,13 @@ "sv": "Dammsugarbutik" }, "searchTerms": { + "cs": [ + "vysavač", + "vysavače", + "vysávat", + "lux", + "luxovat" + ], "da": [ "støvsugerforhandler" ], @@ -18272,6 +21438,9 @@ "aspirateur", "nettoyage" ], + "he": [ + "חנות שואבי אבק" + ], "hu": [ "porszívó", "takarítógép" @@ -18292,6 +21461,7 @@ "elektro" ], "pl": [ + "sklep z odkurzaczami", "odkurzacze" ], "pt": [ @@ -18319,32 +21489,32 @@ { "if": "shop=variety_store", "then": { - "en": "Variety Store", + "en": "Discount Store", "ca": "Botiga de tot a 100", - "da": "Spøg og skæmtbutik", + "cs": "Diskontní prodejna", + "da": "Discountbutik", "de": "Sonderpostenmarkt", - "eo": "Ĉio-po-unu-spesmilo vendejo", - "es": "Tienda de variedades o bazar", - "fi": "Halpahalli", - "fr": "Magasin à prix unique ou à bas prix", - "gl": "Tenda de variedades ou bazar", - "hu": "100 forintos bolt", - "id": "Toserba", - "it": "Negozio a prezzo fisso", - "ja": "雑貨店(低価格)", - "nl": "Euroshop", - "pl": "Sklep z różnościami", + "es": "Tienda de saldos / variedades", + "fi": "Halpatavaramyymälä", + "fr": "Magasin discount", + "he": "חנות מוזלת", + "hu": "Diszkont üzlet", + "id": "Toko Diskon", + "ja": "均一価格店", + "nl": "Discountwinkel", + "pl": "Sklep dyskontowy", "pt": "Loja de variedades", "ru": "Товары по одной цене", - "sl": "Trgovina z mešanim blagom", "sv": "Fyndbutik" }, "searchTerms": { - "ca": [ - "basar" + "en": [ + "five and dime", + "five and ten" ], - "da": [ - "spøg og skæmtbutik" + "cs": [ + "za pár babek", + "za bura" ], "de": [ "ein-euro-geschäft", @@ -18355,79 +21525,57 @@ "restpostenmarkt", "billigladen" ], - "eo": [ - "ĉiopounuspesmilo", - "eŭrovendejo", - "euroshop", - "diversaĵoj", - "ĉio po unu" - ], "es": [ - "variedad", + "de saldos", + "variedades", "bazar", "tienda de todo a", "todo a", "todo por" ], - "fi": [ - "tokmanni", - "hintamyymälä", - "halpa", - "halpatalo", - "halpamyymälä", - "säästömyymälä", - "säästö", - "kauppa", - "myymälä", - "putiikki", - "liike" - ], "fr": [ - "épicerie", - "hard-discount" - ], - "gl": [ - "bazar", - "todo a cen", - "todo a 100", - "variedades" - ], - "hu": [ - "olcsó áruk boltja", - "1 eurós bolt" - ], - "it": [ - "articoli a basso costo", - "tutto a" + "magasin", + "bas prix", + "prix bas", + "discount" ], "ja": [ + "雑貨店(低価格)", + "安物雑貨店", "雑貨店", + "バラエティ雑貨店", + "ディスカウントストア", "100円ショップ", - "バラエティストア", - "百均", + "100円均一ショップ", + "100均", + "雑貨", "日用雑貨", - "買い物", - "ショッピング", - "ディスカウント", - "100均" + "生活雑貨", + "100円" ], "nl": [ - "variety store" + "discounter", + "action" ], "pl": [ + "sklep dyskontowy", "sklep z różnościami", "różności", + "wszystko za złotych", "bibeloty", "pamiątki", "prezenty", - "gadżety" + "gadżety", + "dyskont" ], "pt": [ "loja dos 300", "loja dos trezentos", "bijuterias", "adereços", - "quinquilharia" + "quinquilharia", + "chineses", + "chinês" ], "ru": [ "товары по одной цене", @@ -18437,9 +21585,6 @@ "фикспрайс", "fix price" ], - "sl": [ - "vse za _ _ _ €" - ], "sv": [ "fyndbutik", "billigt", @@ -18460,6 +21605,7 @@ "then": { "en": "Video Store", "ca": "Botiga de vídeos", + "cs": "Video obchod", "da": "Videobutik", "de": "Videothek", "eo": "Filma vendejo/pruntejo", @@ -18467,12 +21613,13 @@ "fi": "Videovuokraamo", "fr": "Vidéo-club", "gl": "Videoclube", + "he": "חנות סרטים", "hu": "Videófilmbolt vagy -kölcsönző", "id": "Toko Video", "it": "Videoteca", - "ja": "ビデオソフト店", + "ja": "ビデオ店", "nl": "Videotheek", - "pl": "Sklep/wypożyczalnia z filmami wideo/dvd", + "pl": "Sklep/wypożyczalnia z filmami", "pt": "Videoclube", "ru": "Видеомагазин", "sl": "Videoteka", @@ -18481,6 +21628,7 @@ "searchTerms": { "en": [ "dvd", + "hobby", "vhs", "video cassette", "video casette" @@ -18488,6 +21636,12 @@ "ca": [ "videoclub" ], + "cs": [ + "videopůjčovna", + "videokazety", + "videokazeta", + "dvd" + ], "da": [ "videobutik", "videoforretning", @@ -18515,6 +21669,9 @@ "fr": [ "club vidéo" ], + "he": [ + "חנות סרטים" + ], "hu": [ "dvd", "videokazetta", @@ -18533,7 +21690,10 @@ "ja": [ "ビデオソフト店", "dvd店", - "娯楽" + "娯楽", + "レンタルビデオ店", + "ビデオ", + "ビデオレンタル" ], "nl": [ "videoverhuur", @@ -18543,10 +21703,10 @@ "pl": [ "sklep z filmami", "wypożyczalnia filmów", - "filmy wideo", - "filmy video", - "filmy dvd", - "filmy blu-ray", + "filmy", + "video", + "dvd", + "blu-ray", "vhs" ], "pt": [ @@ -18584,6 +21744,7 @@ "then": { "en": "Video Game Store", "ca": "Botiga de videojocs", + "cs": "Obchod s videohrami", "da": "Videospilbutik", "de": "Videospielgeschäft", "eo": "Videoluda vendejo", @@ -18591,6 +21752,7 @@ "fi": "Videopeliliike", "fr": "Magasin de location et vente de jeux vidéo", "gl": "Tenda de videoxogos", + "he": "חנות למשחקי מחשב", "hu": "Videojátékbolt", "id": "Toko Permainan Video", "it": "Negozio di videogiochi", @@ -18603,6 +21765,19 @@ "sv": "TV-spel" }, "searchTerms": { + "en": [ + "hobby" + ], + "cs": [ + "videohry", + "video hry", + "video hra", + "videohra", + "herní konzole", + "počítačové hry", + "game", + "games" + ], "da": [ "videospilbutik", "videospilforretning", @@ -18640,6 +21815,9 @@ "fr": [ "magasin de location et vente de jeux vidéo" ], + "he": [ + "חנות למשחקי מחשב" + ], "hu": [ "pc-s játék", "konzolos játék", @@ -18704,7 +21882,8 @@ "if": "shop=watches", "then": { "en": "Watches Shop", - "ca": "Òptica", + "ca": "Botiga de rellotges", + "cs": "Hodinářství", "da": "Urbutik", "de": "Uhrengeschäft", "eo": "Horloĝa vendejo", @@ -18712,6 +21891,7 @@ "fi": "Kellokauppa", "fr": "Magasin de montres", "gl": "Reloxaría", + "he": "שען", "hu": "Órabolt (karóra)", "it": "Negozio di orologi", "ja": "腕時計店", @@ -18724,11 +21904,19 @@ }, "searchTerms": { "ca": [ - "botiga d'ulleres" + "tenda de rellotges", + "botiga de relonges", + "tenda de relonges" + ], + "cs": [ + "hodiny", + "hodinky", + "čas" ], "da": [ "urbutik", - "urmager" + "urmager", + "urhandler" ], "de": [ "uhrengeschäft", @@ -18758,6 +21946,9 @@ "horloger", "vente de montres" ], + "he": [ + "שענית" + ], "hu": [ "órabolt", "órás" @@ -18774,13 +21965,18 @@ ], "ja": [ "腕時計店", - "時計" + "時計", + "店舗", + "お店", + "ショッピング", + "小売" ], "nl": [ "uurwerkwinkel", "klokkenwinkel" ], "pl": [ + "sklep z zegarkami", "zegarek", "zegarki" ], @@ -18829,21 +22025,33 @@ "then": { "en": "Drinking Water Shop", "ca": "Botiga d'aigua potable", + "cs": "Obchod s pitnou vodou", + "da": "Drikkevandsbutik", "de": "Trinkwasserladen", "eo": "Trinkakv-vendejo", "es": "Tienda de agua potable", "fi": "Juomavesikauppa", "fr": "Magasin d'eau potable", "gl": "Tenda de auga potábel", + "he": "חנות מי שתייה", "hu": "Ivóvíz-bolt", "it": "Negozio di acqua da bere", "ja": "飲料水店", "nl": "Drinkwaterwinkel", "pl": "Sklep z wodą pitną", "pt": "Loja de água potável", + "ru": "Магазин питьевой воды", "sv": "Affär för dricksvatten" }, "searchTerms": { + "ca": [ + "tenda d'aigua potable", + "aigua", + "beure", + "sed", + "beguda", + "potable" + ], "de": [ "trinkwasserladen" ], @@ -18868,6 +22076,15 @@ "bebible", "potábel" ], + "he": [ + "מי שתייה", + "מים", + "מינרליים", + "נביעה", + "מי עדן", + "נביעות", + "עין גדי" + ], "it": [ "acqua potabile", "bere", @@ -18895,6 +22112,7 @@ "waterflessenwinkel" ], "pl": [ + "sklep z wodą pitną", "woda", "pitna" ], @@ -18918,6 +22136,7 @@ "then": { "en": "Watersport/Swim Shop", "ca": "Botiga d'esports aquàtics", + "cs": "Plavecké potřeby", "da": "Svømmesport/Svømmeudstyrsbutik", "de": "Wassersportgeschäft", "eo": "Akvosport-aparata vendejo", @@ -18925,6 +22144,7 @@ "fi": "Vesiurheiluliike", "fr": "Vente d'équipements et d'articles pour sports nautiques", "gl": "Tenda de deportes acuáticos / natación", + "he": "חנות שחייה", "hu": "Vízisport-bolt", "id": "Toko Renang/Olahraga Air", "it": "Negozio per sport acquatici", @@ -18936,6 +22156,23 @@ "sv": "Vattensport/simning" }, "searchTerms": { + "ca": [ + "tenda d'esports aquàtics", + "aigua", + "natació", + "nadar", + "piscina", + "mar" + ], + "cs": [ + "plavecké potřeby", + "plavání", + "plavec", + "plavce", + "plavky", + "plavecké", + "plavecký" + ], "da": [ "svømmesport", "svømmeudstyrsbutik" @@ -18982,6 +22219,9 @@ "neopreno", "auga" ], + "he": [ + "חנות שחיה" + ], "hu": [ "kajak", "csónak", @@ -19001,7 +22241,9 @@ "スポーツ", "運動", "競技", - "トレーニング" + "トレーニング", + "店舗", + "お店" ], "nl": [ "watersportwinkel", @@ -19046,6 +22288,7 @@ "then": { "en": "Weapon Shop", "ca": "Armeria", + "cs": "Zbraně a střelivo", "da": "Våbenbutik", "de": "Waffengeschäft", "eo": "Armila vendejo", @@ -19053,6 +22296,7 @@ "fi": "Aseliike", "fr": "Armurerie", "gl": "Armaría", + "he": "חנות נשק קר", "hu": "Fegyverbolt", "id": "Toko Senjata", "it": "Armeria", @@ -19071,6 +22315,25 @@ "knife", "knives" ], + "ca": [ + "botiga d'armes", + "tenda d'armes", + "gavinets", + "ganivets", + "pistola", + "munició", + "armes" + ], + "cs": [ + "zbraně", + "střelivo", + "pistole", + "pušky", + "puška", + "nůž", + "nože", + "army" + ], "da": [ "våbenbutik", "våbenforretning", @@ -19108,6 +22371,9 @@ "fr": [ "armurerie" ], + "he": [ + "חנות כלי נשק קרים" + ], "hu": [ "kés", "lőfegyver", @@ -19126,13 +22392,15 @@ "pistole" ], "ja": [ - "銃砲店" + "銃砲店", + "武器屋" ], "nl": [ "wapens", "munitie" ], "pl": [ + "sklep z bronią", "broń", "militaria", "amunicja", @@ -19175,12 +22443,14 @@ "if": "shop=wholesale", "then": { "en": "Wholesale Store", + "cs": "Velkoobchodní sklad", "de": "Großhandel", "eo": "Pogranda vendejo", "es": "Almacén al por mayor", "fi": "Tukkukauppa", "fr": "Commerce de gros", "gl": "Almacén ó por maior", + "he": "חנות סיטונאות", "hu": "Nagykereskedés", "it": "Grossista", "ja": "卸売店", @@ -19195,6 +22465,10 @@ "warehouse club", "cash and carry" ], + "cs": [ + "skladiště", + "zaplať a odvez" + ], "de": [ "großhandelsgeschäft", "großhändler" @@ -19213,6 +22487,9 @@ "lot", "entrepôt" ], + "he": [ + "חנות סיטונאות" + ], "it": [ "negozio di commercio all'ingrosso" ], @@ -19267,17 +22544,22 @@ "if": "shop=wigs", "then": { "en": "Wig Shop", + "ca": "Botiga de perruqes", + "cs": "Paruky", + "da": "Parykbutik", "de": "Perückenladen", "eo": "Vendejo de perukoj", "es": "Tienda de pelucas", "fr": "Magasin de perruques", "gl": "Tenda de perrucas", + "he": "חנות פיאות", "hu": "Paróka-szaküzlet", "it": "Negozio di parrucche", "ja": "かつら店", "nl": "Pruikenwinkel", "pl": "Sklep z perukami", "pt": "Loja de perucas", + "ru": "Магазин париков", "sv": "Affär för peruker" }, "searchTerms": { @@ -19285,6 +22567,26 @@ "hair extensions", "hair extentions" ], + "ca": [ + "tenda de perruques", + "extensions de monyo", + "extensions de pèl", + "monyo", + "pèl", + "calb", + "calva" + ], + "cs": [ + "obchod s parukami", + "paruky", + "paruka", + "tupé", + "vlásenkář", + "vlásenkáři", + "příčesky", + "příčesek", + "vlasy" + ], "de": [ "haarverlängerung", "perücken", @@ -19307,6 +22609,15 @@ "postiche", "extensions de cheveux" ], + "he": [ + "חרדיות", + "פאה", + "סרטן", + "פיאה", + "שיער מלאכותי", + "שיער", + "תוספות שיער" + ], "it": [ "capelli", "estensioni", @@ -19322,7 +22633,8 @@ "お店", "ショッピング", "小売", - "装飾品" + "装飾品", + "頭髪" ], "nl": [ "toupetwinkel" @@ -19360,6 +22672,7 @@ "then": { "en": "Window Blind Store", "ca": "Botiga de persianes", + "cs": "Obchod s roletami", "da": "Persienneforhandler", "de": "Fensterladengeschäft", "eo": "Fenestr-kovrila vendejo", @@ -19367,6 +22680,7 @@ "fi": "Kaihdinmyymälä", "fr": "Magasin de vente de stores", "gl": "Tenda de persianas", + "he": "חנות וילונות", "hu": "Redőnybolt", "id": "Toko Kerai", "it": "Negozio di tapparelle e serrande", @@ -19379,6 +22693,12 @@ "sv": "Persienner" }, "searchTerms": { + "cs": [ + "roleta", + "rolety", + "žaluzie", + "okenice" + ], "da": [ "persienneforhandler", "persienneforretning" @@ -19416,6 +22736,9 @@ "rideau", "volet" ], + "he": [ + "חנות וילונות" + ], "hu": [ "redőny", "roló", @@ -19434,7 +22757,11 @@ ], "ja": [ "ブラインド販売店", - "家具" + "家具", + "ブラインド", + "インテリア", + "お店", + "店舗" ], "nl": [ "zonwering", @@ -19442,6 +22769,8 @@ "jaloezieën" ], "pl": [ + "sklep z żaluzjami", + "sklep z roletami", "żaluzje", "rolety" ], @@ -19473,6 +22802,7 @@ "then": { "en": "Wine Shop", "ca": "Botiga de vins", + "cs": "Vinotéka", "da": "Vinforretning", "de": "Weinhandel", "eo": "Vina vendejo", @@ -19480,6 +22810,7 @@ "fi": "Viinikauppa", "fr": "Caviste", "gl": "Tenda de viños", + "he": "חנות יינות", "hu": "Borszaküzlet", "id": "Toko Anggur", "it": "Enoteca", @@ -19494,7 +22825,16 @@ "searchTerms": { "ca": [ "celler", - "licoreria" + "licoreria", + "tenda de vins", + "bodega" + ], + "cs": [ + "vinotéka", + "víno", + "vinárna", + "vinařství", + "vino" ], "da": [ "vinforretning", @@ -19526,6 +22866,9 @@ "caviste", "vin" ], + "he": [ + "חנות יינות" + ], "hu": [ "borászat", "italbolt", @@ -19548,7 +22891,10 @@ "嗜好品", "飲み物", "店舗", - "小売" + "小売", + "お店", + "酒", + "お酒" ], "nl": [ "wijnwinkel", @@ -19557,6 +22903,7 @@ "wijnerij" ], "pl": [ + "sklep z winami", "wino", "wina" ], @@ -19606,613 +22953,622 @@ "mappings": [ { "if": "shop=boutique", - "then": "circle:white;./assets/layers/id_presets/maki-shop.svg" + "then": "./assets/layers/id_presets/maki-shop.svg" }, { "if": "shop=fashion", - "then": "circle:white;./assets/layers/id_presets/maki-shop.svg" - }, - { - "if": "shop=vacant", - "then": "circle:white;./assets/layers/id_presets/maki-shop.svg" - }, - { - "if": "shop=yes", - "then": "circle:white;./assets/layers/id_presets/maki-shop.svg" - }, - { - "if": "shop=agrarian", - "then": "circle:white;./assets/layers/id_presets/fas-tractor.svg" - }, - { - "if": "shop=alcohol", - "then": "circle:white;./assets/layers/id_presets/fas-wine-bottle.svg" - }, - { - "if": "shop=anime", - "then": "circle:white;./assets/layers/id_presets/fas-dragon.svg" - }, - { - "if": "shop=antiques", - "then": "circle:white;./assets/layers/id_presets/temaki-furniture.svg" - }, - { - "if": "shop=appliance", - "then": "circle:white;./assets/layers/id_presets/temaki-laundry.svg" - }, - { - "if": "shop=art", - "then": "circle:white;./assets/layers/id_presets/maki-shop.svg" - }, - { - "if": "shop=baby_goods", - "then": "circle:white;./assets/layers/id_presets/fas-baby-carriage.svg" - }, - { - "if": "shop=bag", - "then": "circle:white;./assets/layers/id_presets/fas-suitcase-rolling.svg" - }, - { - "if": "shop=bakery", - "then": "circle:white;./assets/layers/id_presets/maki-bakery.svg" - }, - { - "if": "shop=bathroom_furnishing", - "then": "circle:white;./assets/layers/id_presets/fas-bath.svg" - }, - { - "if": "shop=beauty", - "then": "circle:white;./assets/layers/id_presets/temaki-lipstick.svg" - }, - { - "if": "shop=bed", - "then": "circle:white;./assets/layers/id_presets/maki-lodging.svg" - }, - { - "if": "shop=beverages", - "then": "circle:white;./assets/layers/id_presets/temaki-bottles.svg" - }, - { - "if": "shop=bicycle", - "then": "circle:white;./assets/layers/id_presets/maki-bicycle.svg" - }, - { - "if": "shop=boat", - "then": "circle:white;./assets/layers/id_presets/temaki-boat.svg" - }, - { - "if": "shop=bookmaker", - "then": "circle:white;./assets/layers/id_presets/temaki-money_hand.svg" - }, - { - "if": "shop=books", - "then": "circle:white;./assets/layers/id_presets/fas-book.svg" - }, - { - "if": "shop=brewing_supplies", - "then": "circle:white;./assets/layers/id_presets/temaki-storage_fermenter.svg" - }, - { - "if": "shop=butcher", - "then": "circle:white;./assets/layers/id_presets/temaki-cleaver.svg" - }, - { - "if": "shop=camera", - "then": "circle:white;./assets/layers/id_presets/fas-camera-retro.svg" - }, - { - "if": "shop=cannabis", - "then": "circle:white;./assets/layers/id_presets/fas-cannabis.svg" - }, - { - "if": "shop=car", - "then": "circle:white;./assets/layers/id_presets/maki-car.svg" - }, - { - "if": "shop=car_parts", - "then": "circle:white;./assets/layers/id_presets/fas-car-battery.svg" - }, - { - "if": "shop=car_repair", - "then": "circle:white;./assets/layers/id_presets/maki-car-repair.svg" - }, - { - "if": "shop=caravan", - "then": "circle:white;./assets/layers/id_presets/temaki-camper_trailer.svg" - }, - { - "if": "shop=carpet", - "then": "circle:white;./assets/layers/id_presets/fas-tape.svg" - }, - { - "if": "shop=catalogue", - "then": "circle:white;./assets/layers/id_presets/maki-shop.svg" - }, - { - "if": "shop=charity", - "then": "circle:white;./assets/layers/id_presets/maki-shop.svg" - }, - { - "if": "shop=cheese", - "then": "circle:white;./assets/layers/id_presets/fas-cheese.svg" - }, - { - "if": "shop=chocolate", - "then": "circle:white;./assets/layers/id_presets/maki-confectionery.svg" - }, - { - "if": "shop=clothes", - "then": "circle:white;./assets/layers/id_presets/maki-clothing-store.svg" - }, - { - "if": "shop=coffee", - "then": "circle:white;./assets/layers/id_presets/temaki-coffee.svg" - }, - { - "if": "shop=computer", - "then": "circle:white;./assets/layers/id_presets/fas-laptop.svg" - }, - { - "if": "shop=confectionery", - "then": "circle:white;./assets/layers/id_presets/maki-confectionery.svg" - }, - { - "if": "shop=copyshop", - "then": "circle:white;./assets/layers/id_presets/fas-print.svg" - }, - { - "if": "shop=cosmetics", - "then": "circle:white;./assets/layers/id_presets/temaki-lipstick.svg" - }, - { - "if": "shop=country_store", - "then": "circle:white;./assets/layers/id_presets/fas-hat-cowboy-side.svg" - }, - { - "if": "shop=curtain", - "then": "circle:white;./assets/layers/id_presets/temaki-curtains.svg" - }, - { - "if": "shop=dairy", - "then": "circle:white;./assets/layers/id_presets/fas-cheese.svg" - }, - { - "if": "shop=deli", - "then": "circle:white;./assets/layers/id_presets/temaki-meat.svg" - }, - { - "if": "shop=department_store", - "then": "circle:white;./assets/layers/id_presets/maki-shop.svg" - }, - { - "if": "shop=doityourself", - "then": "circle:white;./assets/layers/id_presets/temaki-tools.svg" - }, - { - "if": "shop=doors", - "then": "circle:white;./assets/layers/id_presets/fas-door-open.svg" - }, - { - "if": "shop=dry_cleaning", - "then": "circle:white;./assets/layers/id_presets/temaki-clothes_hanger.svg" - }, - { - "if": "shop=e-cigarette", - "then": "circle:white;./assets/layers/id_presets/maki-shop.svg" - }, - { - "if": "shop=electrical", - "then": "circle:white;./assets/layers/id_presets/temaki-power.svg" - }, - { - "if": "shop=electronics", - "then": "circle:white;./assets/layers/id_presets/fas-plug.svg" - }, - { - "if": "shop=erotic", - "then": "circle:white;./assets/layers/id_presets/maki-shop.svg" - }, - { - "if": "shop=fabric", - "then": "circle:white;./assets/layers/id_presets/fas-tape.svg" - }, - { - "if": "shop=fashion_accessories", - "then": "circle:white;./assets/layers/id_presets/temaki-fashion_accessories.svg" - }, - { - "if": "shop=fireplace", - "then": "circle:white;./assets/layers/id_presets/temaki-fireplace.svg" - }, - { - "if": "shop=fishing", - "then": "circle:white;./assets/layers/id_presets/temaki-ice_fishing.svg" - }, - { - "if": "shop=flooring", - "then": "circle:white;./assets/layers/id_presets/temaki-tools.svg" - }, - { - "if": "shop=florist", - "then": "circle:white;./assets/layers/id_presets/maki-florist.svg" - }, - { - "if": "shop=frame", - "then": "circle:white;./assets/layers/id_presets/fas-vector-square.svg" - }, - { - "if": "shop=frozen_food", - "then": "circle:white;./assets/layers/id_presets/maki-shop.svg" - }, - { - "if": "shop=fuel", - "then": "circle:white;./assets/layers/id_presets/temaki-propane_tank.svg" - }, - { - "if": "shop=funeral_directors", - "then": "circle:white;./assets/layers/id_presets/maki-cemetery.svg" - }, - { - "if": "shop=furniture", - "then": "circle:white;./assets/layers/id_presets/fas-couch.svg" - }, - { - "if": "shop=games", - "then": "circle:white;./assets/layers/id_presets/fas-dice.svg" - }, - { - "if": "shop=garden_centre", - "then": "circle:white;./assets/layers/id_presets/maki-garden-centre.svg" - }, - { - "if": "shop=gas", - "then": "circle:white;./assets/layers/id_presets/temaki-propane_tank.svg" - }, - { - "if": "shop=general", - "then": "circle:white;./assets/layers/id_presets/maki-shop.svg" - }, - { - "if": "shop=gift", - "then": "circle:white;./assets/layers/id_presets/maki-gift.svg" - }, - { - "if": "shop=greengrocer", - "then": "circle:white;./assets/layers/id_presets/fas-carrot.svg" - }, - { - "if": "shop=hairdresser", - "then": "circle:white;./assets/layers/id_presets/temaki-beauty_salon.svg" - }, - { - "if": "shop=hairdresser_supply", - "then": "circle:white;./assets/layers/id_presets/temaki-hair_care.svg" - }, - { - "if": "shop=hardware", - "then": "circle:white;./assets/layers/id_presets/temaki-tools.svg" - }, - { - "if": "shop=health_food", - "then": "circle:white;./assets/layers/id_presets/maki-shop.svg" - }, - { - "if": "shop=hearing_aids", - "then": "circle:white;./assets/layers/id_presets/temaki-hearing_aid.svg" - }, - { - "if": "shop=herbalist", - "then": "circle:white;./assets/layers/id_presets/fas-leaf.svg" - }, - { - "if": "shop=hifi", - "then": "circle:white;./assets/layers/id_presets/temaki-speaker.svg" + "then": "./assets/layers/id_presets/maki-shop.svg" }, { "if": "shop=hobby", - "then": "circle:white;./assets/layers/id_presets/fas-dragon.svg" + "then": "./assets/layers/id_presets/fas-dragon.svg" + }, + { + "if": "shop=vacant", + "then": "./assets/layers/id_presets/maki-shop.svg" + }, + { + "if": "shop=yes", + "then": "./assets/layers/id_presets/maki-shop.svg" + }, + { + "if": "shop=agrarian", + "then": "./assets/layers/id_presets/fas-tractor.svg" + }, + { + "if": "shop=alcohol", + "then": "./assets/layers/id_presets/fas-wine-bottle.svg" + }, + { + "if": "shop=anime", + "then": "./assets/layers/id_presets/fas-dragon.svg" + }, + { + "if": "shop=antiques", + "then": "./assets/layers/id_presets/temaki-furniture.svg" + }, + { + "if": "shop=appliance", + "then": "./assets/layers/id_presets/temaki-laundry.svg" + }, + { + "if": "shop=art", + "then": "./assets/layers/id_presets/maki-shop.svg" + }, + { + "if": "shop=baby_goods", + "then": "./assets/layers/id_presets/fas-baby-carriage.svg" + }, + { + "if": "shop=bag", + "then": "./assets/layers/id_presets/fas-suitcase-rolling.svg" + }, + { + "if": "shop=bakery", + "then": "./assets/layers/id_presets/maki-bakery.svg" + }, + { + "if": "shop=bathroom_furnishing", + "then": "./assets/layers/id_presets/fas-bath.svg" + }, + { + "if": "shop=beauty", + "then": "./assets/layers/id_presets/temaki-lipstick.svg" + }, + { + "if": "shop=bed", + "then": "./assets/layers/id_presets/maki-lodging.svg" + }, + { + "if": "shop=beverages", + "then": "./assets/layers/id_presets/temaki-bottles.svg" + }, + { + "if": "shop=bicycle", + "then": "./assets/layers/id_presets/maki-bicycle.svg" + }, + { + "if": "shop=boat", + "then": "./assets/layers/id_presets/temaki-boat.svg" + }, + { + "if": "shop=bookmaker", + "then": "./assets/layers/id_presets/temaki-money_hand.svg" + }, + { + "if": "shop=books", + "then": "./assets/layers/id_presets/fas-book.svg" + }, + { + "if": "shop=brewing_supplies", + "then": "./assets/layers/id_presets/temaki-storage_fermenter.svg" + }, + { + "if": "shop=butcher", + "then": "./assets/layers/id_presets/temaki-cleaver.svg" + }, + { + "if": "shop=camera", + "then": "./assets/layers/id_presets/fas-camera-retro.svg" + }, + { + "if": "shop=cannabis", + "then": "./assets/layers/id_presets/fas-cannabis.svg" + }, + { + "if": "shop=car_parts", + "then": "./assets/layers/id_presets/fas-car-battery.svg" + }, + { + "if": "shop=car_repair", + "then": "./assets/layers/id_presets/maki-car-repair.svg" + }, + { + "if": "shop=caravan", + "then": "./assets/layers/id_presets/temaki-camper_trailer.svg" + }, + { + "if": "shop=carpet", + "then": "./assets/layers/id_presets/fas-tape.svg" + }, + { + "if": "shop=catalogue", + "then": "./assets/layers/id_presets/maki-shop.svg" + }, + { + "if": "shop=charity", + "then": "./assets/layers/id_presets/maki-shop.svg" + }, + { + "if": "shop=cheese", + "then": "./assets/layers/id_presets/fas-cheese.svg" + }, + { + "if": "shop=chocolate", + "then": "./assets/layers/id_presets/maki-confectionery.svg" + }, + { + "if": "shop=clothes", + "then": "./assets/layers/id_presets/maki-clothing-store.svg" + }, + { + "if": "shop=coffee", + "then": "./assets/layers/id_presets/temaki-coffee.svg" + }, + { + "if": "shop=computer", + "then": "./assets/layers/id_presets/fas-laptop.svg" + }, + { + "if": "shop=confectionery", + "then": "./assets/layers/id_presets/maki-confectionery.svg" + }, + { + "if": "shop=copyshop", + "then": "./assets/layers/id_presets/fas-print.svg" + }, + { + "if": "shop=cosmetics", + "then": "./assets/layers/id_presets/temaki-lipstick.svg" + }, + { + "if": "shop=country_store", + "then": "./assets/layers/id_presets/fas-hat-cowboy-side.svg" + }, + { + "if": "shop=curtain", + "then": "./assets/layers/id_presets/temaki-curtains.svg" + }, + { + "if": "shop=dairy", + "then": "./assets/layers/id_presets/fas-cheese.svg" + }, + { + "if": "shop=deli", + "then": "./assets/layers/id_presets/fas-jar.svg" + }, + { + "if": "shop=department_store", + "then": "./assets/layers/id_presets/maki-shop.svg" + }, + { + "if": "shop=doityourself", + "then": "./assets/layers/id_presets/temaki-tools.svg" + }, + { + "if": "shop=doors", + "then": "./assets/layers/id_presets/fas-door-open.svg" + }, + { + "if": "shop=dry_cleaning", + "then": "./assets/layers/id_presets/temaki-clothes_hanger.svg" + }, + { + "if": "shop=e-cigarette", + "then": "./assets/layers/id_presets/maki-shop.svg" + }, + { + "if": "shop=electrical", + "then": "./assets/layers/id_presets/temaki-power.svg" + }, + { + "if": "shop=electronics", + "then": "./assets/layers/id_presets/fas-plug.svg" + }, + { + "if": "shop=erotic", + "then": "./assets/layers/id_presets/maki-shop.svg" + }, + { + "if": "shop=fabric", + "then": "./assets/layers/id_presets/fas-tape.svg" + }, + { + "if": "shop=fashion_accessories", + "then": "./assets/layers/id_presets/temaki-fashion_accessories.svg" + }, + { + "if": "shop=fireplace", + "then": "./assets/layers/id_presets/temaki-fireplace.svg" + }, + { + "if": "shop=fishing", + "then": "./assets/layers/id_presets/temaki-ice_fishing.svg" + }, + { + "if": "shop=flooring", + "then": "./assets/layers/id_presets/temaki-tools.svg" + }, + { + "if": "shop=florist", + "then": "./assets/layers/id_presets/maki-florist.svg" + }, + { + "if": "shop=frame", + "then": "./assets/layers/id_presets/fas-vector-square.svg" + }, + { + "if": "shop=fuel", + "then": "./assets/layers/id_presets/temaki-propane_tank.svg" + }, + { + "if": "shop=funeral_directors", + "then": "./assets/layers/id_presets/maki-cemetery.svg" + }, + { + "if": "shop=furniture", + "then": "./assets/layers/id_presets/fas-couch.svg" + }, + { + "if": "shop=games", + "then": "./assets/layers/id_presets/fas-dice.svg" + }, + { + "if": "shop=garden_centre", + "then": "./assets/layers/id_presets/maki-garden-centre.svg" + }, + { + "if": "shop=gas", + "then": "./assets/layers/id_presets/temaki-propane_tank.svg" + }, + { + "if": "shop=general", + "then": "./assets/layers/id_presets/maki-shop.svg" + }, + { + "if": "shop=gift", + "then": "./assets/layers/id_presets/maki-gift.svg" + }, + { + "if": "shop=greengrocer", + "then": "./assets/layers/id_presets/fas-carrot.svg" + }, + { + "if": "shop=hairdresser", + "then": "./assets/layers/id_presets/temaki-beauty_salon.svg" + }, + { + "if": "shop=hairdresser_supply", + "then": "./assets/layers/id_presets/temaki-hair_care.svg" + }, + { + "if": "shop=hardware", + "then": "./assets/layers/id_presets/temaki-tools.svg" + }, + { + "if": "shop=health_food", + "then": "./assets/layers/id_presets/maki-shop.svg" + }, + { + "if": "shop=hearing_aids", + "then": "./assets/layers/id_presets/temaki-hearing_aid.svg" + }, + { + "if": "shop=herbalist", + "then": "./assets/layers/id_presets/fas-leaf.svg" + }, + { + "if": "shop=hifi", + "then": "./assets/layers/id_presets/temaki-speaker.svg" + }, + { + "if": "shop=honey", + "then": "./assets/layers/id_presets/maki-shop.svg" }, { "if": "shop=household_linen", - "then": "circle:white;./assets/layers/id_presets/temaki-cloth.svg" + "then": "./assets/layers/id_presets/temaki-cloth.svg" }, { "if": "shop=houseware", - "then": "circle:white;./assets/layers/id_presets/fas-blender.svg" + "then": "./assets/layers/id_presets/fas-blender.svg" }, { "if": "shop=hunting", - "then": "circle:white;./assets/layers/id_presets/temaki-bow_and_arrow.svg" + "then": "./assets/layers/id_presets/temaki-bow_and_arrow.svg" }, { "if": "shop=interior_decoration", - "then": "circle:white;./assets/layers/id_presets/maki-shop.svg" + "then": "./assets/layers/id_presets/maki-shop.svg" }, { "if": "shop=jewelry", - "then": "circle:white;./assets/layers/id_presets/maki-jewelry-store.svg" + "then": "./assets/layers/id_presets/maki-jewelry-store.svg" }, { "if": "shop=kiosk", - "then": "circle:white;./assets/layers/id_presets/fas-store.svg" + "then": "./assets/layers/id_presets/fas-store.svg" }, { "if": "shop=kitchen", - "then": "circle:white;./assets/layers/id_presets/temaki-kitchen_sink.svg" + "then": "./assets/layers/id_presets/temaki-kitchen_sink.svg" }, { "if": "shop=laundry", - "then": "circle:white;./assets/layers/id_presets/temaki-laundry.svg" + "then": "./assets/layers/id_presets/temaki-laundry.svg" }, { "if": "shop=leather", - "then": "circle:white;./assets/layers/id_presets/temaki-handbag.svg" + "then": "./assets/layers/id_presets/temaki-handbag.svg" }, { "if": "shop=lighting", - "then": "circle:white;./assets/layers/id_presets/temaki-desk_lamp.svg" + "then": "./assets/layers/id_presets/temaki-desk_lamp.svg" }, { "if": "shop=locksmith", - "then": "circle:white;./assets/layers/id_presets/fas-key.svg" + "then": "./assets/layers/id_presets/fas-key.svg" }, { "if": "shop=mall", - "then": "circle:white;./assets/layers/id_presets/maki-shop.svg" + "then": "./assets/layers/id_presets/maki-shop.svg" }, { "if": "shop=massage", - "then": "circle:white;./assets/layers/id_presets/temaki-spa.svg" + "then": "./assets/layers/id_presets/temaki-spa.svg" }, { "if": "shop=medical_supply", - "then": "circle:white;./assets/layers/id_presets/fas-crutch.svg" + "then": "./assets/layers/id_presets/fas-crutch.svg" }, { "if": "shop=military_surplus", - "then": "circle:white;./assets/layers/id_presets/temaki-military.svg" + "then": "./assets/layers/id_presets/temaki-military.svg" }, { "if": "shop=model", - "then": "circle:white;./assets/layers/id_presets/maki-shop.svg" + "then": "./assets/layers/id_presets/maki-shop.svg" }, { "if": "shop=money_lender", - "then": "circle:white;./assets/layers/id_presets/temaki-money_hand.svg" + "then": "./assets/layers/id_presets/temaki-money_hand.svg" }, { "if": "shop=motorcycle", - "then": "circle:white;./assets/layers/id_presets/fas-motorcycle.svg" + "then": "./assets/layers/id_presets/fas-motorcycle.svg" }, { "if": "shop=motorcycle_repair", - "then": "circle:white;./assets/layers/id_presets/temaki-motorcycle_repair.svg" + "then": "./assets/layers/id_presets/temaki-motorcycle_repair.svg" }, { "if": "shop=music", - "then": "circle:white;./assets/layers/id_presets/fas-compact-disc.svg" + "then": "./assets/layers/id_presets/fas-compact-disc.svg" }, { "if": "shop=musical_instrument", - "then": "circle:white;./assets/layers/id_presets/fas-guitar.svg" + "then": "./assets/layers/id_presets/fas-guitar.svg" }, { "if": "shop=newsagent", - "then": "circle:white;./assets/layers/id_presets/fas-newspaper.svg" + "then": "./assets/layers/id_presets/fas-newspaper.svg" }, { "if": "shop=nutrition_supplements", - "then": "circle:white;./assets/layers/id_presets/fas-pills.svg" + "then": "./assets/layers/id_presets/fas-pills.svg" + }, + { + "if": "shop=nuts", + "then": "./assets/layers/id_presets/maki-shop.svg" }, { "if": "shop=optician", - "then": "circle:white;./assets/layers/id_presets/maki-optician.svg" + "then": "./assets/layers/id_presets/maki-optician.svg" }, { "if": "shop=outdoor", - "then": "circle:white;./assets/layers/id_presets/temaki-compass.svg" + "then": "./assets/layers/id_presets/temaki-compass.svg" }, { "if": "shop=outpost", - "then": "circle:white;./assets/layers/id_presets/maki-shop.svg" + "then": "./assets/layers/id_presets/maki-shop.svg" }, { "if": "shop=paint", - "then": "circle:white;./assets/layers/id_presets/fas-paint-roller.svg" + "then": "./assets/layers/id_presets/fas-paint-roller.svg" }, { "if": "shop=party", - "then": "circle:white;./assets/layers/id_presets/temaki-balloon.svg" + "then": "./assets/layers/id_presets/temaki-balloon.svg" + }, + { + "if": "shop=pasta", + "then": "./assets/layers/id_presets/fas-plate-wheat.svg" }, { "if": "shop=pastry", - "then": "circle:white;./assets/layers/id_presets/maki-bakery.svg" + "then": "./assets/layers/id_presets/maki-bakery.svg" }, { "if": "shop=pawnbroker", - "then": "circle:white;./assets/layers/id_presets/temaki-money_hand.svg" + "then": "./assets/layers/id_presets/temaki-money_hand.svg" }, { "if": "shop=perfumery", - "then": "circle:white;./assets/layers/id_presets/temaki-perfume.svg" + "then": "./assets/layers/id_presets/temaki-perfume.svg" }, { "if": "shop=pet", - "then": "circle:white;./assets/layers/id_presets/fas-cat.svg" + "then": "./assets/layers/id_presets/fas-cat.svg" }, { "if": "shop=pet_grooming", - "then": "circle:white;./assets/layers/id_presets/temaki-pet_grooming.svg" + "then": "./assets/layers/id_presets/temaki-pet_grooming.svg" }, { "if": "shop=photo", - "then": "circle:white;./assets/layers/id_presets/fas-camera-retro.svg" + "then": "./assets/layers/id_presets/fas-camera-retro.svg" }, { "if": "shop=pottery", - "then": "circle:white;./assets/layers/id_presets/temaki-vase.svg" + "then": "./assets/layers/id_presets/temaki-vase.svg" }, { "if": "shop=printer_ink", - "then": "circle:white;./assets/layers/id_presets/fas-print.svg" + "then": "./assets/layers/id_presets/fas-print.svg" }, { "if": "shop=psychic", - "then": "circle:white;./assets/layers/id_presets/temaki-psychic.svg" + "then": "./assets/layers/id_presets/temaki-psychic.svg" }, { "if": "shop=pyrotechnics", - "then": "circle:white;./assets/layers/id_presets/temaki-rocket_firework.svg" + "then": "./assets/layers/id_presets/temaki-rocket_firework.svg" }, { "if": "shop=radiotechnics", - "then": "circle:white;./assets/layers/id_presets/fas-microchip.svg" + "then": "./assets/layers/id_presets/fas-microchip.svg" }, { "if": "shop=religion", - "then": "circle:white;./assets/layers/id_presets/maki-shop.svg" + "then": "./assets/layers/id_presets/maki-shop.svg" }, { "if": "shop=rental", - "then": "circle:white;./assets/layers/id_presets/fas-dolly.svg" + "then": "./assets/layers/id_presets/fas-dolly.svg" + }, + { + "if": "shop=rice", + "then": "./assets/layers/id_presets/fas-bowl-rice.svg" }, { "if": "shop=scuba_diving", - "then": "circle:white;./assets/layers/id_presets/temaki-scuba_diving.svg" + "then": "./assets/layers/id_presets/temaki-scuba_diving.svg" }, { "if": "shop=seafood", - "then": "circle:white;./assets/layers/id_presets/temaki-fish_cleaning.svg" + "then": "./assets/layers/id_presets/temaki-fish_cleaning.svg" }, { "if": "shop=second_hand", - "then": "circle:white;./assets/layers/id_presets/maki-shop.svg" + "then": "./assets/layers/id_presets/maki-shop.svg" }, { "if": "shop=sewing", - "then": "circle:white;./assets/layers/id_presets/temaki-needle_and_spool.svg" + "then": "./assets/layers/id_presets/temaki-needle_and_spool.svg" }, { "if": "shop=shoe_repair", - "then": "circle:white;./assets/layers/id_presets/temaki-hammer_shoe.svg" + "then": "./assets/layers/id_presets/temaki-hammer_shoe.svg" }, { "if": "shop=shoes", - "then": "circle:white;./assets/layers/id_presets/maki-shoe.svg" + "then": "./assets/layers/id_presets/maki-shoe.svg" }, { "if": "shop=spices", - "then": "circle:white;./assets/layers/id_presets/temaki-spice_bottle.svg" + "then": "./assets/layers/id_presets/temaki-spice_bottle.svg" }, { "if": "shop=sports", - "then": "circle:white;./assets/layers/id_presets/fas-futbol.svg" + "then": "./assets/layers/id_presets/fas-futbol.svg" }, { "if": "shop=stationery", - "then": "circle:white;./assets/layers/id_presets/fas-paperclip.svg" + "then": "./assets/layers/id_presets/fas-paperclip.svg" }, { "if": "shop=storage_rental", - "then": "circle:white;./assets/layers/id_presets/temaki-storage_rental.svg" + "then": "./assets/layers/id_presets/temaki-storage_rental.svg" }, { "if": "shop=supermarket", - "then": "circle:white;./assets/layers/id_presets/maki-grocery.svg" + "then": "./assets/layers/id_presets/maki-grocery.svg" }, { "if": "shop=tailor", - "then": "circle:white;./assets/layers/id_presets/temaki-needle_and_spool.svg" + "then": "./assets/layers/id_presets/temaki-needle_and_spool.svg" }, { "if": "shop=tattoo", - "then": "circle:white;./assets/layers/id_presets/temaki-tattoo_machine.svg" + "then": "./assets/layers/id_presets/temaki-tattoo_machine.svg" }, { "if": "shop=tea", - "then": "circle:white;./assets/layers/id_presets/maki-teahouse.svg" + "then": "./assets/layers/id_presets/maki-teahouse.svg" }, { "if": "shop=telecommunication", - "then": "circle:white;./assets/layers/id_presets/maki-telephone.svg" + "then": "./assets/layers/id_presets/maki-telephone.svg" }, { "if": "shop=tiles", - "then": "circle:white;./assets/layers/id_presets/temaki-tiling.svg" + "then": "./assets/layers/id_presets/temaki-tiling.svg" }, { "if": "shop=tobacco", - "then": "circle:white;./assets/layers/id_presets/temaki-pipe.svg" + "then": "./assets/layers/id_presets/temaki-pipe.svg" }, { "if": "shop=tool_hire", - "then": "circle:white;./assets/layers/id_presets/temaki-tools.svg" + "then": "./assets/layers/id_presets/temaki-tools.svg" }, { "if": "shop=toys", - "then": "circle:white;./assets/layers/id_presets/fas-rocket.svg" + "then": "./assets/layers/id_presets/fas-rocket.svg" }, { "if": "shop=trade", - "then": "circle:white;./assets/layers/id_presets/temaki-tools.svg" + "then": "./assets/layers/id_presets/temaki-tools.svg" }, { "if": "shop=travel_agency", - "then": "circle:white;./assets/layers/id_presets/fas-suitcase.svg" + "then": "./assets/layers/id_presets/fas-suitcase.svg" }, { "if": "shop=trophy", - "then": "circle:white;./assets/layers/id_presets/fas-trophy.svg" + "then": "./assets/layers/id_presets/fas-trophy.svg" }, { "if": "shop=tyres", - "then": "circle:white;./assets/layers/id_presets/temaki-tire.svg" + "then": "./assets/layers/id_presets/temaki-tire.svg" }, { "if": "shop=vacuum_cleaner", - "then": "circle:white;./assets/layers/id_presets/temaki-vacuum.svg" + "then": "./assets/layers/id_presets/temaki-vacuum.svg" }, { "if": "shop=variety_store", - "then": "circle:white;./assets/layers/id_presets/maki-shop.svg" + "then": "./assets/layers/id_presets/maki-shop.svg" }, { "if": "shop=video", - "then": "circle:white;./assets/layers/id_presets/temaki-movie_rental.svg" + "then": "./assets/layers/id_presets/temaki-movie_rental.svg" }, { "if": "shop=video_games", - "then": "circle:white;./assets/layers/id_presets/maki-gaming.svg" + "then": "./assets/layers/id_presets/maki-gaming.svg" }, { "if": "shop=watches", - "then": "circle:white;./assets/layers/id_presets/maki-watch.svg" + "then": "./assets/layers/id_presets/maki-watch.svg" }, { "if": "shop=water", - "then": "circle:white;./assets/layers/id_presets/temaki-water_bottle.svg" + "then": "./assets/layers/id_presets/temaki-water_bottle.svg" }, { "if": "shop=weapons", - "then": "circle:white;./assets/layers/id_presets/temaki-dagger.svg" + "then": "./assets/layers/id_presets/temaki-dagger.svg" }, { "if": "shop=wholesale", - "then": "circle:white;./assets/layers/id_presets/maki-warehouse.svg" + "then": "./assets/layers/id_presets/maki-warehouse.svg" }, { "if": "shop=wigs", - "then": "circle:white;./assets/layers/id_presets/maki-shop.svg" + "then": "./assets/layers/id_presets/maki-shop.svg" }, { "if": "shop=window_blind", - "then": "circle:white;./assets/layers/id_presets/temaki-window.svg" + "then": "./assets/layers/id_presets/temaki-window.svg" }, { "if": "shop=wine", - "then": "circle:white;./assets/layers/id_presets/maki-alcohol-shop.svg" + "then": "./assets/layers/id_presets/maki-alcohol-shop.svg" } ] } - ] + ], + "#dont-translate": "*" } diff --git a/assets/layers/id_presets/license_info.json b/assets/layers/id_presets/license_info.json index 7d4e44e56..efd56dbcf 100644 --- a/assets/layers/id_presets/license_info.json +++ b/assets/layers/id_presets/license_info.json @@ -49,6 +49,16 @@ "https://github.com/FortAwesome/Font-Awesome" ] }, + { + "path": "fas-bowl-rice.svg", + "license": "CC-BY 4.0", + "authors": [ + "Font-Awesome icon set" + ], + "sources": [ + "https://github.com/FortAwesome/Font-Awesome" + ] + }, { "path": "fas-camera-retro.svg", "license": "CC-BY-4.0", @@ -209,6 +219,16 @@ "https://github.com/FortAwesome/Font-Awesome" ] }, + { + "path": "fas-jar.svg", + "license": "CC-BY 4.0", + "authors": [ + "Font-Awesome icon set" + ], + "sources": [ + "https://github.com/FortAwesome/Font-Awesome" + ] + }, { "path": "fas-key.svg", "license": "CC-BY-4.0", @@ -299,6 +319,16 @@ "https://github.com/FortAwesome/Font-Awesome" ] }, + { + "path": "fas-plate-wheat.svg", + "license": "CC-BY 4.0", + "authors": [ + "Font-Awesome icon set" + ], + "sources": [ + "https://github.com/FortAwesome/Font-Awesome" + ] + }, { "path": "fas-plug.svg", "license": "CC-BY-4.0", diff --git a/assets/layers/import_candidate/import_candidate.json b/assets/layers/import_candidate/import_candidate.json index 99fb3f0b7..b315f20f1 100644 --- a/assets/layers/import_candidate/import_candidate.json +++ b/assets/layers/import_candidate/import_candidate.json @@ -2,18 +2,24 @@ "id": "import_candidate", "description": "Layer used as template in the importHelper", "source": "special", - "mapRendering": [ + "title": "Import candidate", + "pointRendering": [ { "location": [ "point", "centroid" ], - "icon": "square:red;", "iconSize": "15,15", - "anchor": "center" + "anchor": "center", + "marker": [ + { + "icon": "square", + "color": "red" + } + ] } ], - "title": "Import candidate", + "lineRendering": [], "tagRenderings": [ { "id": "all_tags", diff --git a/assets/layers/indoors/indoors.json b/assets/layers/indoors/indoors.json index f47492063..61b168bfe 100644 --- a/assets/layers/indoors/indoors.json +++ b/assets/layers/indoors/indoors.json @@ -27,6 +27,7 @@ ] } }, + "minzoom": 13, "title": { "render": { "en": "Indoor area {name}", @@ -116,7 +117,106 @@ ] } ], - "minzoom": 13, + "pointRendering": [ + { + "label": { + "render": "
    {name}
    ", + "condition": "name~*", + "mappings": [ + { + "if": { + "or": [ + "room=administration", + "room=auditorium", + "room=bedroom", + "room=chapel", + "room=class", + "room=computer", + "room=conference", + "room=crypt", + "room=kitchen", + "room=laboratory", + "room=library", + "room=locker", + "room=nursery", + "room=office", + "room=prison_cell", + "room=restaurant", + "room=security_check", + "room=sport", + "room=storage", + "room=technical", + "room=toilet", + "room=toilets", + "room=waiting" + ] + }, + "then": "
    {name}
    " + } + ] + }, + "location": [ + "point", + "centroid" + ], + "marker": [ + { + "icon": { + "mappings": [ + { + "if": { + "or": [ + "room=administration", + "room=auditorium", + "room=bedroom", + "room=chapel", + "room=class", + "room=computer", + "room=conference", + "room=crypt", + "room=kitchen", + "room=laboratory", + "room=library", + "room=locker", + "room=nursery", + "room=office", + "room=prison_cell", + "room=restaurant", + "room=security_check", + "room=sport", + "room=storage", + "room=technical", + "room=toilets", + "room=waiting" + ] + }, + "then": "./assets/layers/indoors/room_{room}.svg" + }, + { + "if": "room=toilet", + "then": "./assets/layers/indoors/room_toilets.svg" + } + ] + } + } + ], + "iconSize": "15,15", + "anchor": "bottom" + } + ], + "lineRendering": [ + { + "color": "#d3d7d588", + "width": "8", + "offset": "-4", + "fill": "no" + }, + { + "color": "#4f5551", + "fill": "no", + "width": "2" + } + ], "tagRenderings": [ "images", "level", @@ -473,99 +573,5 @@ } } } - ], - "mapRendering": [ - { - "color": "#d3d7d588", - "width": "8", - "offset": "-4", - "fill": "no" - }, - { - "color": "#4f5551", - "fill": "no", - "width": "2" - }, - { - "label": { - "render": "
    {name}
    ", - "condition": "name~*", - "mappings": [ - { - "if": { - "or": [ - "room=administration", - "room=auditorium", - "room=bedroom", - "room=chapel", - "room=class", - "room=computer", - "room=conference", - "room=crypt", - "room=kitchen", - "room=laboratory", - "room=library", - "room=locker", - "room=nursery", - "room=office", - "room=prison_cell", - "room=restaurant", - "room=security_check", - "room=sport", - "room=storage", - "room=technical", - "room=toilet", - "room=toilets", - "room=waiting" - ] - }, - "then": "
    {name}
    " - } - ] - }, - "location": [ - "point", - "centroid" - ], - "icon": { - "mappings": [ - { - "if": { - "or": [ - "room=administration", - "room=auditorium", - "room=bedroom", - "room=chapel", - "room=class", - "room=computer", - "room=conference", - "room=crypt", - "room=kitchen", - "room=laboratory", - "room=library", - "room=locker", - "room=nursery", - "room=office", - "room=prison_cell", - "room=restaurant", - "room=security_check", - "room=sport", - "room=storage", - "room=technical", - "room=toilets", - "room=waiting" - ] - }, - "then": "./assets/layers/indoors/room_{room}.svg" - }, - { - "if": "room=toilet", - "then": "./assets/layers/indoors/room_toilets.svg" - } - ] - }, - "iconSize": "15,15", - "anchor": "bottom" - } ] } diff --git a/assets/layers/information_board/information_board.json b/assets/layers/information_board/information_board.json index 4fe3d27b1..90ce2612b 100644 --- a/assets/layers/information_board/information_board.json +++ b/assets/layers/information_board/information_board.json @@ -12,7 +12,15 @@ "pl": "Tablice informacyjne", "cs": "Informační tabule" }, - "minzoom": 12, + "description": { + "en": "A layer showing touristical, road side information boards (e.g. giving information about the landscape, a building, a feature, a map, …)", + "nl": "Deze laag toont informatieborden in de publieke ruimte die uitleg geven over een bezienswaardigheid (bv. uitleg over het landschap, een ruine, een kaart van de omgeving, ...)", + "de": "Eine Ebene mit touristischen, straßenseitigen Informationstafeln (z. B. mit Informationen über die Landschaft, ein Gebäude, ein Merkmal, eine Karte, …)", + "es": "Una capa que muestra paneles informativos turísticos (ej. informan sobre el paisaje, una construcción, una característica, un mapa, ...)", + "ca": "Una capa que mostra panells informatius turístics (p.e. informen sobre el paissatge, una construcció, una característica, un mapa, …)", + "pl": "Warstwa pokazujące przydrożne tablice informacyjne dla turystów (np. informujące o krajobrazie, budynku, obiekcie, mapa, ...)", + "cs": "Vrstva zobrazující turistické informační tabule u silnice (např. informace o krajině, budově, objektu, mapě, ...)" + }, "source": { "osmTags": { "and": [ @@ -20,6 +28,7 @@ ] } }, + "minzoom": 12, "title": { "render": { "nl": "Informatiebord", @@ -34,8 +43,24 @@ "cs": "Informační tabule" } }, - "tagRenderings": [ - "images" + "pointRendering": [ + { + "iconSize": "40,40", + "location": [ + "point" + ], + "anchor": "center", + "marker": [ + { + "icon": "./assets/layers/information_board/board.svg" + } + ] + } + ], + "lineRendering": [ + { + "color": "#00f" + } ], "presets": [ { @@ -57,6 +82,9 @@ } } ], + "tagRenderings": [ + "images" + ], "deletion": { "softDeletionTags": { "and": [ @@ -71,27 +99,5 @@ "allowMove": { "enableRelocation": false, "enableImproveAccuraccy": true - }, - "mapRendering": [ - { - "icon": "./assets/layers/information_board/board.svg", - "iconSize": "40,40", - "location": [ - "point" - ], - "anchor": "center" - }, - { - "color": "#00f" - } - ], - "description": { - "en": "A layer showing touristical, road side information boards (e.g. giving information about the landscape, a building, a feature, a map, …)", - "nl": "Deze laag toont informatieborden in de publieke ruimte die uitleg geven over een bezienswaardigheid (bv. uitleg over het landschap, een ruine, een kaart van de omgeving, ...)", - "de": "Eine Ebene mit touristischen, straßenseitigen Informationstafeln (z. B. mit Informationen über die Landschaft, ein Gebäude, ein Merkmal, eine Karte, …)", - "es": "Una capa que muestra paneles informativos turísticos (ej. informan sobre el paisaje, una construcción, una característica, un mapa, ...)", - "ca": "Una capa que mostra panells informatius turístics (p.e. informen sobre el paissatge, una construcció, una característica, un mapa, …)", - "pl": "Warstwa pokazujące przydrożne tablice informacyjne dla turystów (np. informujące o krajobrazie, budynku, obiekcie, mapa, ...)", - "cs": "Vrstva zobrazující turistické informační tabule u silnice (např. informace o krajině, budově, objektu, mapě, ...)" } } diff --git a/assets/layers/kerbs/kerbs.json b/assets/layers/kerbs/kerbs.json index 52a2ab10f..a2200d543 100644 --- a/assets/layers/kerbs/kerbs.json +++ b/assets/layers/kerbs/kerbs.json @@ -38,39 +38,74 @@ "cs": "Obrubník" } }, - "mapRendering": [ + "pointRendering": [ { "location": [ "point" ], - "icon": { - "render": "./assets/layers/kerbs/KerbIcon.svg", - "mappings": [ - { - "if": "kerb=raised", - "then": "./assets/layers/kerbs/raised.svg" - }, - { - "if": "kerb=lowered", - "then": "./assets/layers/kerbs/lowered.svg" - }, - { - "if": "kerb=flush", - "then": "./assets/layers/kerbs/flush.svg" - }, - { - "if": "kerb=no", - "then": "./assets/layers/kerbs/no.svg" + "marker": [ + { + "icon": { + "render": "./assets/layers/kerbs/KerbIcon.svg", + "mappings": [ + { + "if": "kerb=raised", + "then": "./assets/layers/kerbs/raised.svg" + }, + { + "if": "kerb=lowered", + "then": "./assets/layers/kerbs/lowered.svg" + }, + { + "if": "kerb=flush", + "then": "./assets/layers/kerbs/flush.svg" + }, + { + "if": "kerb=no", + "then": "./assets/layers/kerbs/no.svg" + } + ] } - ] - } - }, + } + ] + } + ], + "lineRendering": [ { "color": "#f44e42", "fill": "no", "width": "8" } ], + "presets": [ + { + "title": { + "en": "a kerb", + "nl": "een stoeprand", + "de": "einen Bordstein", + "fr": "une bordure", + "ru": "бордюр", + "pl": "krawężnik", + "ca": "una vorada", + "cs": "obrubník" + }, + "tags": [ + "barrier=kerb" + ], + "description": { + "en": "Kerb in a footway", + "nl": "Stoeprand in een voetpad", + "de": "Bordstein in einem Fußweg", + "fr": "Bordure dans un trottoir", + "cs": "Obrubník na chodníku" + }, + "snapToLayer": [ + "cycleways_and_roads", + "kerbs" + ], + "maxSnapDistance": 10 + } + ], "tagRenderings": [ "images", { @@ -275,35 +310,6 @@ ] } ], - "presets": [ - { - "title": { - "en": "a kerb", - "nl": "een stoeprand", - "de": "einen Bordstein", - "fr": "une bordure", - "ru": "бордюр", - "pl": "krawężnik", - "ca": "una vorada", - "cs": "obrubník" - }, - "tags": [ - "barrier=kerb" - ], - "description": { - "en": "Kerb in a footway", - "nl": "Stoeprand in een voetpad", - "de": "Bordstein in einem Fußweg", - "fr": "Bordure dans un trottoir", - "cs": "Obrubník na chodníku" - }, - "snapToLayer": [ - "cycleways_and_roads", - "kerbs" - ], - "maxSnapDistance": 10 - } - ], "filter": [ { "id": "kerb-type", diff --git a/assets/layers/kindergarten_childcare/kindergarten_childcare.json b/assets/layers/kindergarten_childcare/kindergarten_childcare.json index fc4b1e74a..da586630c 100644 --- a/assets/layers/kindergarten_childcare/kindergarten_childcare.json +++ b/assets/layers/kindergarten_childcare/kindergarten_childcare.json @@ -9,7 +9,6 @@ "cs": "Mateřské školky a péče o děti" }, "description": "Shows kindergartens and preschools. Both are grouped in one layer, as they are regularly confused with each other", - "minzoom": 12, "source": { "osmTags": { "or": [ @@ -19,6 +18,7 @@ ] } }, + "minzoom": 12, "title": { "mappings": [ { @@ -43,6 +43,81 @@ } ] }, + "pointRendering": [ + { + "location": [ + "point", + "centroid" + ], + "label": { + "mappings": [ + { + "if": "name~*", + "then": "
    {name}
    " + } + ] + }, + "marker": [ + { + "icon": "circle", + "color": "white" + }, + { + "icon": { + "mappings": [ + { + "if": "amenity=kindergarten", + "then": "./assets/layers/kindergarten_childcare/kindergarten.svg" + }, + { + "if": "amenity=childcare", + "then": "./assets/layers/kindergarten_childcare/childcare.svg" + } + ] + } + } + ] + } + ], + "lineRendering": [ + { + "color": "#62fc6c", + "width": 1 + } + ], + "presets": [ + { + "title": { + "en": "a kindergarten", + "nl": "een kleuterschool", + "de": "einen Kindergarten", + "ru": "детский сад", + "ca": "una llar d'infants", + "pl": "przedszkole", + "cs": "mateřská školka" + }, + "description": "A kindergarten (also known as preschool) is a school where small kids receive early education.", + "tags": [ + "amenity=kindergarten", + "isced:level=0", + "isced:2011:level=early_childhood" + ] + }, + { + "title": { + "en": "a childcare", + "nl": "een kinderopvang", + "de": "eine Kinderkrippe", + "ca": "una guarderia", + "pl": "żłobek", + "cs": "péče o děti" + }, + "description": "A childcare (also known as a nursery or daycare) is a facility which looks after small kids, but does not offer them an education program.", + "tags": [ + "amenity=kindergarten" + ] + } + ], "tagRenderings": [ { "id": "childcare-type", @@ -147,74 +222,9 @@ } } ], - "presets": [ - { - "title": { - "en": "a kindergarten", - "nl": "een kleuterschool", - "de": "einen Kindergarten", - "ru": "детский сад", - "ca": "una llar d'infants", - "pl": "przedszkole", - "cs": "mateřská školka" - }, - "description": "A kindergarten (also known as preschool) is a school where small kids receive early education.", - "tags": [ - "amenity=kindergarten", - "isced:level=0", - "isced:2011:level=early_childhood" - ] - }, - { - "title": { - "en": "a childcare", - "nl": "een kinderopvang", - "de": "eine Kinderkrippe", - "ca": "una guarderia", - "pl": "żłobek", - "cs": "péče o děti" - }, - "description": "A childcare (also known as a nursery or daycare) is a facility which looks after small kids, but does not offer them an education program.", - "tags": [ - "amenity=kindergarten" - ] - } - ], - "mapRendering": [ - { - "location": [ - "point", - "centroid" - ], - "label": { - "mappings": [ - { - "if": "name~*", - "then": "
    {name}
    " - } - ] - }, - "icon": { - "mappings": [ - { - "if": "amenity=kindergarten", - "then": "circle:white;./assets/layers/kindergarten_childcare/kindergarten.svg" - }, - { - "if": "amenity=childcare", - "then": "circle:white;./assets/layers/kindergarten_childcare/childcare.svg" - } - ] - } - }, - { - "color": "#62fc6c", - "width": 1 - } - ], + "deletion": true, "allowMove": { "enableRelocation": true, "enableImproveAccuracy": true - }, - "deletion": true + } } diff --git a/assets/layers/last_click/last_click.json b/assets/layers/last_click/last_click.json index 99dd89310..c99a4ce5b 100644 --- a/assets/layers/last_click/last_click.json +++ b/assets/layers/last_click/last_click.json @@ -1,5 +1,6 @@ { "id": "last_click", + "name": null, "description": "This layer defines how to render the 'last click'-location. By default, it will show a marker with the possibility to add a new point (if there are some presets) and/or to add a new note (if the 'note' layer attribute is set). If none are possible, this layer won't show up", "source": "special", "isShown": { @@ -8,9 +9,6 @@ "has_note_layer=yes" ] }, - "name": null, - "titleIcons": [], - "popupInFloatover": true, "title": { "mappings": [ { @@ -56,42 +54,32 @@ } ] }, - "tagRenderings": [ + "popupInFloatover": true, + "titleIcons": [], + "pointRendering": [ { - "id": "add_new", - "condition": "has_presets=yes", - "render": { - "*": "{add_new_point()}" - } - }, - { - "id": "add_note", - "condition": "has_note_layer=yes", - "render": { - "*": "{open_note()}" - } - } - ], - "mapRendering": [ - { - "icon": { - "mappings": [ - { - "if": { - "and": [ - "has_note_layer=yes", - "has_presets=no" - ] - }, - "then": "./assets/svg/note.svg" - }, - { - "if": "number_of_presets=1", - "then": "{first_preset}" + "marker": [ + { + "icon": { + "mappings": [ + { + "if": { + "and": [ + "has_note_layer=yes", + "has_presets=no" + ] + }, + "then": "./assets/svg/note.svg" + }, + { + "if": "number_of_presets=1", + "then": "{first_preset}" + } + ], + "render": "
    {renderings}{first_preset}
    " } - ], - "render": "
    {renderings}{first_preset}
    " - }, + } + ], "labelCssClasses": "text-sm min-w-min px-2 rounded-full text-white opacity-65 whitespace-nowrap block-ruby", "labelCss": "background: #00000088", "label": { @@ -164,6 +152,24 @@ } } ], + "lineRendering": [], + "tagRenderings": [ + { + "id": "add_new", + "classes": "h-full flex", + "condition": "has_presets=yes", + "render": { + "*": "{add_new_point()}" + } + }, + { + "id": "add_note", + "condition": "has_note_layer=yes", + "render": { + "*": "{open_note()}" + } + } + ], "filter": [ { "id": "action", diff --git a/assets/layers/map/map.json b/assets/layers/map/map.json index 0a736af16..1c68c68bc 100644 --- a/assets/layers/map/map.json +++ b/assets/layers/map/map.json @@ -13,7 +13,17 @@ "pl": "Mapy", "cs": "Mapy" }, - "minzoom": 12, + "description": { + "en": "A map, meant for tourists which is permanently installed in the public space", + "nl": "Een permantent geinstalleerde kaart", + "it": "Una mappa, destinata ai turisti e che è sistemata in maniera permanente in uno spazio pubblico", + "fr": "Une carte, destinée aux touristes, installée en permanence dans l'espace public", + "de": "Eine Karte, die für Touristen gedacht ist und dauerhaft im öffentlichen Raum aufgestellt ist", + "es": "Un mapa, pensado para turistas y que está instalado de manera permanente en un espacio público", + "pl": "Mapa, przeznaczona dla turystów, która jest zainstalowana w przestrzeni publicznej na stałe", + "ca": "Un mapa", + "cs": "Mapa určená pro turisty, která je trvale instalována na veřejném prostranství" + }, "source": { "osmTags": { "or": [ @@ -22,6 +32,7 @@ ] } }, + "minzoom": 12, "title": { "render": { "en": "Map", @@ -37,17 +48,89 @@ "cs": "Mapa" } }, - "description": { - "en": "A map, meant for tourists which is permanently installed in the public space", - "nl": "Een permantent geinstalleerde kaart", - "it": "Una mappa, destinata ai turisti e che è sistemata in maniera permanente in uno spazio pubblico", - "fr": "Une carte, destinée aux touristes, installée en permanence dans l'espace public", - "de": "Eine Karte, die für Touristen gedacht ist und dauerhaft im öffentlichen Raum aufgestellt ist", - "es": "Un mapa, pensado para turistas y que está instalado de manera permanente en un espacio público", - "pl": "Mapa, przeznaczona dla turystów, która jest zainstalowana w przestrzeni publicznej na stałe", - "ca": "Un mapa", - "cs": "Mapa určená pro turisty, která je trvale instalována na veřejném prostranství" - }, + "pointRendering": [ + { + "marker": [ + { + "icon": { + "render": "./assets/layers/map/map.svg", + "mappings": [ + { + "if": { + "and": [ + "map_source=OpenStreetMap", + "map_source:attribution=sticker" + ] + }, + "then": "./assets/layers/map/map-stickered.svg" + }, + { + "if": { + "and": [ + "map_source=OpenStreetMap", + "map_source:attribution=yes" + ] + }, + "then": "./assets/layers/map/osm-logo-white-bg.svg" + }, + { + "if": { + "and": [ + "map_source=OpenStreetMap" + ] + }, + "then": "./assets/layers/map/osm-logo-buggy-attr.svg" + } + ] + } + } + ], + "iconSize": "50,50", + "location": [ + "point", + "centroid" + ], + "anchor": "center" + } + ], + "lineRendering": [ + { + "color": "#00f", + "width": "8" + } + ], + "presets": [ + { + "tags": [ + "tourism=information", + "information=map" + ], + "title": { + "en": "a map", + "nl": "een kaart", + "it": "una mappa", + "ru": "Карта", + "fr": "une carte", + "de": "eine Karte", + "ca": "un mapa", + "es": "un mapa", + "pl": "mapa", + "cs": "mapa" + }, + "description": { + "en": "Add a missing map", + "nl": "Voeg een ontbrekende kaart toe", + "it": "Aggiungi una mappa mancante", + "fr": "Ajouter une carte manquante", + "de": "Fehlende Karte hinzufügen", + "ru": "Добавить отсутствующую карту", + "es": "Añadir un mapa que falta", + "ca": "Afegeix un mapa que falta", + "pl": "Dodaj brakującą mapę", + "cs": "Přidat chybějící mapu" + } + } + ], "tagRenderings": [ "images", { @@ -328,38 +411,6 @@ } } ], - "presets": [ - { - "tags": [ - "tourism=information", - "information=map" - ], - "title": { - "en": "a map", - "nl": "een kaart", - "it": "una mappa", - "ru": "Карта", - "fr": "une carte", - "de": "eine Karte", - "ca": "un mapa", - "es": "un mapa", - "pl": "mapa", - "cs": "mapa" - }, - "description": { - "en": "Add a missing map", - "nl": "Voeg een ontbrekende kaart toe", - "it": "Aggiungi una mappa mancante", - "fr": "Ajouter une carte manquante", - "de": "Fehlende Karte hinzufügen", - "ru": "Добавить отсутствующую карту", - "es": "Añadir un mapa que falta", - "ca": "Afegeix un mapa que falta", - "pl": "Dodaj brakującą mapę", - "cs": "Přidat chybějící mapu" - } - } - ], "deletion": { "softDeletionTags": { "and": [ @@ -372,50 +423,5 @@ "allowMove": { "enableRelocation": false, "enableImproveAccuraccy": true - }, - "mapRendering": [ - { - "icon": { - "render": "./assets/layers/map/map.svg", - "mappings": [ - { - "if": { - "and": [ - "map_source=OpenStreetMap", - "map_source:attribution=sticker" - ] - }, - "then": "./assets/layers/map/map-stickered.svg" - }, - { - "if": { - "and": [ - "map_source=OpenStreetMap", - "map_source:attribution=yes" - ] - }, - "then": "./assets/layers/map/osm-logo-white-bg.svg" - }, - { - "if": { - "and": [ - "map_source=OpenStreetMap" - ] - }, - "then": "./assets/layers/map/osm-logo-buggy-attr.svg" - } - ] - }, - "iconSize": "50,50", - "location": [ - "point", - "centroid" - ], - "anchor": "center" - }, - { - "color": "#00f", - "width": "8" - } - ] + } } diff --git a/assets/layers/maproulette/maproulette.json b/assets/layers/maproulette/maproulette.json index 0430c12ac..9c5a24c71 100644 --- a/assets/layers/maproulette/maproulette.json +++ b/assets/layers/maproulette/maproulette.json @@ -1,9 +1,12 @@ { "id": "maproulette", - "source": { - "geoJson": "https://maproulette.org/api/v2/tasks/box/{x_min}/{y_min}/{x_max}/{y_max}", - "geoJsonZoomLevel": 16, - "osmTags": "title~*" + "name": { + "en": "MapRoulette Tasks", + "de": "MapRoulette-Aufgaben", + "nl": "MapRoulette Taken", + "pl": "Zadania MapRoulette", + "ca": "Tasques de MapRoulette", + "cs": "Úkoly MapRoulette" }, "description": { "en": "Layer showing all tasks in MapRoulette", @@ -13,53 +16,80 @@ "pl": "Warstwa pokazująca wszystkie zadania w MapRoulette", "cs": "Vrstva zobrazující všechny úlohy v MapRoulette" }, - "mapRendering": [ + "source": { + "geoJson": "https://maproulette.org/api/v2/tasks/box/{x_min}/{y_min}/{x_max}/{y_max}", + "geoJsonZoomLevel": 16, + "osmTags": "title~*" + }, + "minzoom": 15, + "title": { + "render": { + "en": "MapRoulette Item: {parentName}", + "de": "MapRoulette-Element: {parentName}", + "nl": "MapRoulette Item: {parentName}", + "pl": "Obiekt MapRoulette: {parentName}", + "cs": "Položka MapRoulette: {parentName}" + } + }, + "titleIcons": [ + { + "id": "maproulette", + "render": "" + } + ], + "pointRendering": [ { "location": [ "point", "centroid" ], - "icon": { - "render": "./assets/layers/maproulette/logomark.svg", - "mappings": [ - { - "if": "status=0", - "then": "pin:#959DFF" - }, - { - "if": "status=1", - "then": "pin:#65D2DA" - }, - { - "if": "status=2", - "then": "pin:#F7BB59" - }, - { - "if": "status=3", - "then": "pin:#F7BB59" - }, - { - "if": "status=4", - "then": "pin:#737373" - }, - { - "if": "status=5", - "then": "pin:#CCB186" - }, - { - "if": "status=6", - "then": "pin:#FF5E63" - }, - { - "if": "status=9", - "then": "pin:#FF349C" + "marker": [ + { + "icon": "pin", + "color": { + "render": "#00", + "mappings": [ + { + "if": "status=0", + "then": "#959DFF" + }, + { + "if": "status=1", + "then": "#65D2DA" + }, + { + "if": "status=2", + "then": "#F7BB59" + }, + { + "if": "status=3", + "then": "#F7BB59" + }, + { + "if": "status=4", + "then": "#737373" + }, + { + "if": "status=5", + "then": "#CCB186" + }, + { + "if": "status=6", + "then": "#FF5E63" + }, + { + "if": "status=9", + "then": "#FF349C" + } + ] } - ] - }, + } + ], "iconSize": "40,40", "anchor": "bottom" } ], + "lineRendering": [], "tagRenderings": [ { "id": "status", @@ -213,30 +243,6 @@ } } ], - "minzoom": 15, - "name": { - "en": "MapRoulette Tasks", - "de": "MapRoulette-Aufgaben", - "nl": "MapRoulette Taken", - "pl": "Zadania MapRoulette", - "ca": "Tasques de MapRoulette", - "cs": "Úkoly MapRoulette" - }, - "title": { - "render": { - "en": "MapRoulette Item: {parentName}", - "de": "MapRoulette-Element: {parentName}", - "nl": "MapRoulette Item: {parentName}", - "pl": "Obiekt MapRoulette: {parentName}", - "cs": "Položka MapRoulette: {parentName}" - } - }, - "titleIcons": [ - { - "id": "maproulette", - "render": "" - } - ], "filter": [ { "id": "status", diff --git a/assets/layers/maproulette_challenge/maproulette_challenge.json b/assets/layers/maproulette_challenge/maproulette_challenge.json index 10b37e97f..2f192ebd8 100644 --- a/assets/layers/maproulette_challenge/maproulette_challenge.json +++ b/assets/layers/maproulette_challenge/maproulette_challenge.json @@ -28,53 +28,78 @@ "render": "" } ], - "mapRendering": [ + "pointRendering": [ { "location": [ "point", "centroid" ], - "icon": { - "render": "./assets/layers/maproulette/logomark.svg", - "mappings": [ - { - "if": "mr_taskStatus=Created", - "then": "pin:#959DFF" + "marker": [ + { + "color": { + "mappings": [ + { + "if": "mr_taskStatus=Created", + "then": "#959DFF" + }, + { + "if": "mr_taskStatus=Fixed", + "then": "#65D2DA" + }, + { + "if": "mr_taskStatus=False positive", + "then": "#F7BB59" + }, + { + "if": "mr_taskStatus=Skipped", + "then": "#F7BB59" + }, + { + "if": "mr_taskStatus=Deleted", + "then": "#737373" + }, + { + "if": "mr_taskStatus=Already fixed", + "then": "#CCB186" + }, + { + "if": "mr_taskStatus=Too hard", + "then": "#FF5E63" + }, + { + "if": "mr_taskStatus=Disabled", + "then": "#FF349C" + } + ] }, - { - "if": "mr_taskStatus=Fixed", - "then": "pin:#65D2DA" - }, - { - "if": "mr_taskStatus=False positive", - "then": "pin:#F7BB59" - }, - { - "if": "mr_taskStatus=Skipped", - "then": "pin:#F7BB59" - }, - { - "if": "mr_taskStatus=Deleted", - "then": "pin:#737373" - }, - { - "if": "mr_taskStatus=Already fixed", - "then": "pin:#CCB186" - }, - { - "if": "mr_taskStatus=Too hard", - "then": "pin:#FF5E63" - }, - { - "if": "mr_taskStatus=Disabled", - "then": "pin:#FF349C" + "icon": { + "render": "./assets/layers/maproulette/logomark.svg", + "mappings": [ + { + "if": { + "or": [ + "mr_taskStatus=Created", + "mr_taskStatus=Fixed", + "mr_taskStatus=False positive", + "mr_taskStatus=Skipped", + "mr_taskStatus=Deleted", + "mr_taskStatus=Already fixed", + "mr_taskStatus=Already fixed", + "mr_taskStatus=Disabled", + "mr_taskStatus=Too hard" + ] + }, + "then": "pin" + } + ] } - ] - }, + } + ], "iconSize": "40,40", "anchor": "bottom" } ], + "lineRendering": [], "tagRenderings": [ { "id": "details", diff --git a/assets/layers/maxspeed/maxspeed.json b/assets/layers/maxspeed/maxspeed.json index cba7e65a0..6ce88e50b 100644 --- a/assets/layers/maxspeed/maxspeed.json +++ b/assets/layers/maxspeed/maxspeed.json @@ -10,6 +10,15 @@ "fr": "Vitesse maximale", "cs": "Maximální rychlost" }, + "description": { + "en": "Shows the allowed speed for every road", + "de": "Zeigt die zulässige Geschwindigkeit für jede Straße an", + "nl": "Toont de toegestane snelheid voor elke weg", + "cs": "Zobrazuje povolenou rychlost pro každou silnici", + "ca": "Mostra la velocitat permesa per a cada carretera", + "fr": "Affiche les vitesses autorisées sur toutes les routes", + "pl": "Pokazuje dozwoloną prędkość na każdej drodze" + }, "source": { "osmTags": { "and": [ @@ -55,15 +64,47 @@ } ] }, - "description": { - "en": "Shows the allowed speed for every road", - "de": "Zeigt die zulässige Geschwindigkeit für jede Straße an", - "nl": "Toont de toegestane snelheid voor elke weg", - "cs": "Zobrazuje povolenou rychlost pro každou silnici", - "ca": "Mostra la velocitat permesa per a cada carretera", - "fr": "Affiche les vitesses autorisées sur toutes les routes", - "pl": "Pokazuje dozwoloną prędkość na każdej drodze" - }, + "pointRendering": [ + { + "marker": [ + { + "icon": { + "render": null, + "mappings": [ + { + "if": "maxspeed~[1-9]0|1[0-4]0", + "then": "./assets/themes/maxspeed/maxspeed_{maxspeed} mph.svg" + }, + { + "if": "maxspeed~[1-9]0|1[0-4]0 mph", + "then": "./assets/themes/maxspeed/maxspeed_{maxspeed}.svg" + } + ] + } + } + ], + "iconSize": "32,32", + "location": [ + "point", + "projected_centerpoint" + ], + "anchor": "center" + } + ], + "lineRendering": [ + { + "color": { + "render": "#000000", + "mappings": [ + { + "if": "maxspeed=", + "then": "#ff0000" + } + ] + }, + "width": "3" + } + ], "tagRenderings": [ { "render": { @@ -112,41 +153,6 @@ } ], "allowSplit": true, - "mapRendering": [ - { - "icon": { - "render": null, - "mappings": [ - { - "if": "maxspeed~[1-9]0|1[0-4]0", - "then": "./assets/themes/maxspeed/maxspeed_{maxspeed} mph.svg" - }, - { - "if": "maxspeed~[1-9]0|1[0-4]0 mph", - "then": "./assets/themes/maxspeed/maxspeed_{maxspeed}.svg" - } - ] - }, - "iconSize": "32,32", - "location": [ - "point", - "projected_centerpoint" - ], - "anchor": "center" - }, - { - "color": { - "render": "#000000", - "mappings": [ - { - "if": "maxspeed=", - "then": "#ff0000" - } - ] - }, - "width": "3" - } - ], "units": [ { "applicableUnits": [ diff --git a/assets/layers/memorial/memorial.json b/assets/layers/memorial/memorial.json index 7bc85edda..c49171f44 100644 --- a/assets/layers/memorial/memorial.json +++ b/assets/layers/memorial/memorial.json @@ -12,6 +12,24 @@ "cs": "Pamětní deska" } }, + "pointRendering": [ + { + "location": [ + "centroid", + "point" + ], + "marker": [ + { + "icon": "circle", + "color": "white" + }, + { + "icon": "./assets/layers/memorial/plaque.svg" + } + ] + } + ], + "lineRendering": [], "tagRenderings": [ { "id": "inscription", @@ -33,15 +51,6 @@ } } ], - "mapRendering": [ - { - "location": [ - "centroid", - "point" - ], - "icon": "circle:white;./assets/layers/memorial/plaque.svg" - } - ], "deletion": true, "allowMove": { "enableImproveAccuracy": true, diff --git a/assets/layers/named_streets/named_streets.json b/assets/layers/named_streets/named_streets.json index 539acd577..9c2a3c1ba 100644 --- a/assets/layers/named_streets/named_streets.json +++ b/assets/layers/named_streets/named_streets.json @@ -1,7 +1,6 @@ { "id": "named_streets", "description": "Hidden layer with all streets which have a name. Useful to detect addresses", - "minzoom": 18, "source": { "osmTags": { "and": [ @@ -10,11 +9,13 @@ ] } }, - "mapRendering": [ + "minzoom": 18, + "shownByDefault": false, + "pointRendering": [], + "lineRendering": [ { "color": "#ccc", "width": "3" } - ], - "shownByDefault": false + ] } diff --git a/assets/layers/nature_reserve/nature_reserve.json b/assets/layers/nature_reserve/nature_reserve.json index dc2ba2672..76196cf8b 100644 --- a/assets/layers/nature_reserve/nature_reserve.json +++ b/assets/layers/nature_reserve/nature_reserve.json @@ -8,7 +8,13 @@ "ca": "Reserva Natural", "cs": "Přírodní rezervace" }, - "minzoom": 12, + "description": { + "en": "A nature reserve is an area where nature can take its course", + "nl": "Een natuurgebied is een gebied waar actief ruimte gemaakt word voor de natuur. Typisch zijn deze in beheer van Natuurpunt of het Agentschap Natuur en Bos of zijn deze erkend door de overheid.", + "de": "Ein Naturschutzgebiet ist ein Gebiet, das der Natur überlassen wurde", + "ca": "Una reserva natural és una zona on la natura pot seguir el seu curs", + "cs": "Přírodní rezervace je území, kde se příroda může rozvíjet" + }, "source": { "osmTags": { "and": [ @@ -26,6 +32,7 @@ ] } }, + "minzoom": 12, "title": { "render": { "nl": "Natuurgebied", @@ -48,13 +55,49 @@ } ] }, - "description": { - "en": "A nature reserve is an area where nature can take its course", - "nl": "Een natuurgebied is een gebied waar actief ruimte gemaakt word voor de natuur. Typisch zijn deze in beheer van Natuurpunt of het Agentschap Natuur en Bos of zijn deze erkend door de overheid.", - "de": "Ein Naturschutzgebiet ist ein Gebiet, das der Natur überlassen wurde", - "ca": "Una reserva natural és una zona on la natura pot seguir el seu curs", - "cs": "Přírodní rezervace je území, kde se příroda může rozvíjet" - }, + "pointRendering": [ + { + "iconSize": "50,50", + "location": [ + "point", + "centroid" + ], + "anchor": "center", + "marker": [ + { + "icon": "./assets/layers/nature_reserve/nature_reserve.svg" + } + ] + } + ], + "lineRendering": [ + { + "color": "#3c3", + "width": "1" + } + ], + "presets": [ + { + "tags": [ + "leisure=nature_reserve", + "fixme=Toegevoegd met MapComplete, geometry nog uit te tekenen" + ], + "title": { + "en": "a nature reserve", + "nl": "een natuurreservaat", + "de": "ein Schutzgebiet", + "ca": "una reserva natural", + "cs": "přírodní rezervace" + }, + "description": { + "en": "Add a missing nature reserve", + "nl": "Voeg een ontbrekend, erkend natuurreservaat toe, bv. een gebied dat beheerd wordt door het ANB of natuurpunt", + "de": "Ein fehlendes Naturschutzgebiet hinzufügen", + "ca": "Afegeix una reserva natural que falta", + "cs": "Přidat chybějící přírodní rezervaci" + } + } + ], "tagRenderings": [ "images", { @@ -497,28 +540,6 @@ }, "wikipedia" ], - "presets": [ - { - "tags": [ - "leisure=nature_reserve", - "fixme=Toegevoegd met MapComplete, geometry nog uit te tekenen" - ], - "title": { - "en": "a nature reserve", - "nl": "een natuurreservaat", - "de": "ein Schutzgebiet", - "ca": "una reserva natural", - "cs": "přírodní rezervace" - }, - "description": { - "en": "Add a missing nature reserve", - "nl": "Voeg een ontbrekend, erkend natuurreservaat toe, bv. een gebied dat beheerd wordt door het ANB of natuurpunt", - "de": "Ein fehlendes Naturschutzgebiet hinzufügen", - "ca": "Afegeix una reserva natural que falta", - "cs": "Přidat chybějící přírodní rezervaci" - } - } - ], "filter": [ { "id": "access", @@ -574,20 +595,5 @@ } ] } - ], - "mapRendering": [ - { - "icon": "./assets/layers/nature_reserve/nature_reserve.svg", - "iconSize": "50,50", - "location": [ - "point", - "centroid" - ], - "anchor": "center" - }, - { - "color": "#3c3", - "width": "1" - } ] } diff --git a/assets/layers/note/note.json b/assets/layers/note/note.json index 089f23d83..cbf752842 100644 --- a/assets/layers/note/note.json +++ b/assets/layers/note/note.json @@ -16,6 +16,15 @@ "maxCacheAge": 0, "isOsmCache": false }, + "calculatedTags": [ + "_total_comments:=get(feat)('comments').length", + "_first_comment:=get(feat)('comments')[0].text", + "_opened_by_anonymous_user:=get(feat)('comments')[0].user === undefined", + "_first_user:=get(feat)('comments')[0].user", + "_last_user:=(() => {const comms = get(feat)('comments'); return comms[comms.length - 1].user})()", + "_first_user_id:=get(feat)('comments')[0].uid", + "_is_import_note:=(() => {const lines = feat.properties['_first_comment'].split('\\n'); const matchesMapCompleteURL = lines.map(l => l.match(\".*https://mapcomplete.\\(osm.be|org\\)/\\([a-zA-Z_-]+\\)\\(.html\\).*#import\")); const matchedIndexes = matchesMapCompleteURL.map((doesMatch, i) => [doesMatch !== null, i]).filter(v => v[0]).map(v => v[1]); return matchedIndexes[0] })()" + ], "minzoom": 10, "title": { "render": { @@ -43,20 +52,45 @@ } ] }, - "calculatedTags": [ - "_total_comments:=get(feat)('comments').length", - "_first_comment:=get(feat)('comments')[0].text", - "_opened_by_anonymous_user:=get(feat)('comments')[0].user === undefined", - "_first_user:=get(feat)('comments')[0].user", - "_last_user:=(() => {const comms = get(feat)('comments'); return comms[comms.length - 1].user})()", - "_first_user_id:=get(feat)('comments')[0].uid", - "_is_import_note:=(() => {const lines = feat.properties['_first_comment'].split('\\n'); const matchesMapCompleteURL = lines.map(l => l.match(\".*https://mapcomplete.\\(osm.be|org\\)/\\([a-zA-Z_-]+\\)\\(.html\\).*#import\")); const matchedIndexes = matchesMapCompleteURL.map((doesMatch, i) => [doesMatch !== null, i]).filter(v => v[0]).map(v => v[1]); return matchedIndexes[0] })()" - ], "titleIcons": [ { "render": "" } ], + "pointRendering": [ + { + "location": [ + "point", + "centroid" + ], + "marker": [ + { + "icon": { + "render": "note", + "mappings": [ + { + "if": "closed_at~*", + "then": "resolved" + } + ] + } + } + ], + "iconSize": "40,40", + "iconBadges": [ + { + "if": "_total_comments>1", + "then": "circle:white;speech_bubble" + }, + { + "if": "_is_import_note~*", + "then": "addSmall" + } + ], + "anchor": "bottom" + } + ], + "lineRendering": [], "tagRenderings": [ { "id": "conversation", @@ -111,35 +145,6 @@ } } ], - "mapRendering": [ - { - "location": [ - "point", - "centroid" - ], - "icon": { - "render": "note", - "mappings": [ - { - "if": "closed_at~*", - "then": "resolved" - } - ] - }, - "iconSize": "40,40", - "iconBadges": [ - { - "if": "_total_comments>1", - "then": "circle:white;speech_bubble" - }, - { - "if": "_is_import_note~*", - "then": "addSmall" - } - ], - "anchor": "bottom" - } - ], "filter": [ { "id": "search", diff --git a/assets/layers/observation_tower/observation_tower.json b/assets/layers/observation_tower/observation_tower.json index 7abefb7a7..0a71f60e8 100644 --- a/assets/layers/observation_tower/observation_tower.json +++ b/assets/layers/observation_tower/observation_tower.json @@ -10,6 +10,22 @@ "pl": "Wieże obserwacyjne", "cs": "Rozhledny" }, + "description": { + "en": "Towers with a panoramic view", + "nl": "Torens om van het uitzicht te genieten", + "de": "Türme zur Aussicht auf die umgebende Landschaft", + "es": "Torres con vista panorámica", + "pl": "Wieże z panoramicznym widokiem", + "ca": "Torres amb vista panoràmica", + "cs": "Věže s panoramatickým výhledem" + }, + "source": { + "osmTags": { + "and": [ + "tower:type=observation" + ] + } + }, "minzoom": 8, "title": { "render": { @@ -38,15 +54,26 @@ } ] }, - "description": { - "en": "Towers with a panoramic view", - "nl": "Torens om van het uitzicht te genieten", - "de": "Türme zur Aussicht auf die umgebende Landschaft", - "es": "Torres con vista panorámica", - "pl": "Wieże z panoramicznym widokiem", - "ca": "Torres amb vista panoràmica", - "cs": "Věže s panoramatickým výhledem" - }, + "pointRendering": [ + { + "iconSize": "40,40", + "location": [ + "point", + "centroid" + ], + "anchor": "center", + "marker": [ + { + "icon": "circle", + "color": "white" + }, + { + "icon": "./assets/layers/observation_tower/Tower_observation.svg" + } + ] + } + ], + "lineRendering": [], "tagRenderings": [ "images", { @@ -329,12 +356,9 @@ }, "wikipedia" ], - "source": { - "osmTags": { - "and": [ - "tower:type=observation" - ] - } + "allowMove": { + "enableRelocation": false, + "enableImproveAccuraccy": true }, "units": [ { @@ -362,20 +386,5 @@ ], "eraseInvalidValues": true } - ], - "allowMove": { - "enableRelocation": false, - "enableImproveAccuraccy": true - }, - "mapRendering": [ - { - "icon": "circle:white;./assets/layers/observation_tower/Tower_observation.svg", - "iconSize": "40,40", - "location": [ - "point", - "centroid" - ], - "anchor": "center" - } ] } diff --git a/assets/layers/osm_community_index/osm_community_index.json b/assets/layers/osm_community_index/osm_community_index.json index ce02d8a06..cde21addc 100644 --- a/assets/layers/osm_community_index/osm_community_index.json +++ b/assets/layers/osm_community_index/osm_community_index.json @@ -8,6 +8,23 @@ "pl": "Indeks społeczności OSM", "cs": "OSM Community Index" }, + "description": { + "en": "A layer showing the OpenStreetMap Communities", + "de": "Eine Ebene aller OpenStreetMap-Communities", + "ca": "Una capa que mostra les comunitats d'OpenStreetMap", + "fr": "Une couche affichant les communautés OpenStreetMap", + "pl": "Warstwa pokazująca społeczności OpenStreetMap", + "cs": "Vrstva zobrazující komunity OpenStreetMap" + }, + "source": { + "geoJson": "https://raw.githubusercontent.com/pietervdvn/MapComplete-data/main/community_index/tile_{z}_{x}_{y}.geojson", + "geoJsonZoomLevel": 6, + "osmTags": "resources~*", + "isOsmCache": false + }, + "calculatedTags": [ + "_community_links=Object.values(JSON.parse(feat.properties.resources || '{}')).map(value =>{return value.resolved.nameHTML + '
     ' + value.resolved.descriptionHTML}).join('
    ')" + ], "title": { "render": { "en": "OSM Community Index", @@ -18,14 +35,29 @@ "cs": "OSM Community Index" } }, - "source": { - "geoJson": "https://raw.githubusercontent.com/pietervdvn/MapComplete-data/main/community_index/tile_{z}_{x}_{y}.geojson", - "geoJsonZoomLevel": 6, - "osmTags": "resources~*", - "isOsmCache": false - }, - "calculatedTags": [ - "_community_links=Object.values(JSON.parse(feat.properties.resources || '{}')).map(value =>{return value.resolved.nameHTML + '
     ' + value.resolved.descriptionHTML}).join('
    ')" + "pointRendering": [ + { + "iconSize": "40,40", + "location": [ + "point" + ], + "anchor": "bottom", + "marker": [ + { + "icon": "pin", + "color": "#6BC4F7" + }, + { + "icon": "./assets/layers/osm_community_index/osm.svg" + } + ] + } + ], + "lineRendering": [ + { + "color": "#444444", + "width": "1" + } ], "tagRenderings": [ { @@ -41,20 +73,6 @@ "description": "Community Links (Discord, meetups, Slack groups, IRC channels, mailing lists etc...)" } ], - "mapRendering": [ - { - "icon": "pin:#6BC4F7;./assets/layers/osm_community_index/osm.svg", - "iconSize": "40,40", - "location": [ - "point" - ], - "anchor": "bottom" - }, - { - "color": "#444444", - "width": "1" - } - ], "filter": [ { "id": "country", @@ -167,13 +185,5 @@ } ] } - ], - "description": { - "en": "A layer showing the OpenStreetMap Communities", - "de": "Eine Ebene aller OpenStreetMap-Communities", - "ca": "Una capa que mostra les comunitats d'OpenStreetMap", - "fr": "Une couche affichant les communautés OpenStreetMap", - "pl": "Warstwa pokazująca społeczności OpenStreetMap", - "cs": "Vrstva zobrazující komunity OpenStreetMap" - } + ] } diff --git a/assets/layers/parcel_lockers/parcel_lockers.json b/assets/layers/parcel_lockers/parcel_lockers.json index 1b0cab7da..812d2b501 100644 --- a/assets/layers/parcel_lockers/parcel_lockers.json +++ b/assets/layers/parcel_lockers/parcel_lockers.json @@ -18,7 +18,6 @@ "pl": "Warstwa pokazująca paczkomaty umożliwiające odbieranie i wysyłanie przesyłek.", "cs": "Vrstva se schránkami na balíky pro vyzvedávání a odesílání balíků." }, - "minzoom": 12, "source": { "osmTags": { "or": [ @@ -32,22 +31,7 @@ ] } }, - "presets": [ - { - "title": { - "en": "a parcel locker", - "nl": "een pakketautomaat", - "de": "ein Paketschließfach", - "ca": "una bústia intel·ligent", - "fr": "un casier à colis", - "pl": "paczkomat", - "cs": "schránky na balíky" - }, - "tags": [ - "amenity=parcel_locker" - ] - } - ], + "minzoom": 12, "title": { "render": { "en": "Parcel Locker", @@ -73,6 +57,48 @@ } ] }, + "pointRendering": [ + { + "iconBadges": [ + { + "if": "opening_hours~*", + "then": "icons.isOpen" + } + ], + "iconSize": "40,40", + "location": [ + "point", + "centroid" + ], + "anchor": "center", + "marker": [ + { + "icon": "square", + "color": "white" + }, + { + "icon": "./assets/layers/parcel_lockers/parcel_lockers.svg" + } + ] + } + ], + "lineRendering": [], + "presets": [ + { + "title": { + "en": "a parcel locker", + "nl": "een pakketautomaat", + "de": "ein Paketschließfach", + "ca": "una bústia intel·ligent", + "fr": "un casier à colis", + "pl": "paczkomat", + "cs": "schránky na balíky" + }, + "tags": [ + "amenity=parcel_locker" + ] + } + ], "tagRenderings": [ "images", { @@ -322,25 +348,8 @@ "filter": [ "open_now" ], + "deletion": true, "allowMove": { "enableImproveAccuracy": true - }, - "deletion": true, - "mapRendering": [ - { - "icon": "square:white;./assets/layers/parcel_lockers/parcel_lockers.svg", - "iconBadges": [ - { - "if": "opening_hours~*", - "then": "icons.isOpen" - } - ], - "iconSize": "40,40", - "location": [ - "point", - "centroid" - ], - "anchor": "center" - } - ] + } } diff --git a/assets/layers/parking/parking.json b/assets/layers/parking/parking.json index 480680d14..fc5958597 100644 --- a/assets/layers/parking/parking.json +++ b/assets/layers/parking/parking.json @@ -11,10 +11,20 @@ "pl": "Parking", "cs": "Parkoviště" }, - "minzoom": 12, + "description": { + "en": "A layer showing car parkings", + "nl": "Deze laag toont autoparkings", + "de": "Eine Ebene mit Parkplätzen", + "es": "Una capa que muestra aparcamientos para coches", + "fr": "Un calque montrant les parkings", + "ca": "Una capa que mostra aparcaments per a cotxes", + "pl": "Warstwa pokazująca parkingi samochodowe", + "cs": "Vrstva zobrazující parkoviště" + }, "source": { "osmTags": "amenity=parking" }, + "minzoom": 12, "title": { "render": { "nl": "Parking voor auto's", @@ -27,16 +37,55 @@ "cs": "Parkování" } }, - "description": { - "en": "A layer showing car parkings", - "nl": "Deze laag toont autoparkings", - "de": "Eine Ebene mit Parkplätzen", - "es": "Una capa que muestra aparcamientos para coches", - "fr": "Un calque montrant les parkings", - "ca": "Una capa que mostra aparcaments per a cotxes", - "pl": "Warstwa pokazująca parkingi samochodowe", - "cs": "Vrstva zobrazující parkoviště" - }, + "pointRendering": [ + { + "iconSize": "36,36", + "location": [ + "point", + "centroid" + ], + "iconBadges": [ + { + "if": { + "or": [ + "capacity:disabled>0", + "capacity:disabled=yes" + ] + }, + "then": "circle:white;./assets/layers/toilet/wheelchair.svg" + } + ], + "anchor": "center", + "marker": [ + { + "icon": "./assets/layers/parking/parking.svg" + } + ] + } + ], + "lineRendering": [ + { + "width": 2, + "color": "#ddcc00" + } + ], + "presets": [ + { + "tags": [ + "amenity=parking" + ], + "title": { + "nl": "een parking voor auto's", + "en": "a car parking", + "de": "einen Parkplatz", + "es": "un aparcamiento de coches", + "fr": "un lieu de stationnement pour voitures", + "ca": "un aparcament per a cotxes", + "pl": "parking samochodowy", + "cs": "parkoviště" + } + } + ], "tagRenderings": [ "images", "level", @@ -272,23 +321,6 @@ } } ], - "presets": [ - { - "tags": [ - "amenity=parking" - ], - "title": { - "nl": "een parking voor auto's", - "en": "a car parking", - "de": "einen Parkplatz", - "es": "un aparcamiento de coches", - "fr": "un lieu de stationnement pour voitures", - "ca": "un aparcament per a cotxes", - "pl": "parking samochodowy", - "cs": "parkoviště" - } - } - ], "deletion": { "softDeletionTags": { "and": [ @@ -301,31 +333,5 @@ "allowMove": { "enableRelocation": false, "enableImproveAccuracy": true - }, - "mapRendering": [ - { - "icon": "./assets/layers/parking/parking.svg", - "iconSize": "36,36", - "location": [ - "point", - "centroid" - ], - "iconBadges": [ - { - "if": { - "or": [ - "capacity:disabled>0", - "capacity:disabled=yes" - ] - }, - "then": "circle:white;./assets/layers/toilet/wheelchair.svg" - } - ], - "anchor": "center" - }, - { - "width": 2, - "color": "#ddcc00" - } - ] + } } diff --git a/assets/layers/parking_spaces/parking_spaces.json b/assets/layers/parking_spaces/parking_spaces.json index 6f14ddbd8..ab10f4bf4 100644 --- a/assets/layers/parking_spaces/parking_spaces.json +++ b/assets/layers/parking_spaces/parking_spaces.json @@ -16,10 +16,59 @@ "ca": "Capa que mostra aparcaments de cotxes individuals.", "cs": "Vrstva zobrazující jednotlivá parkovací místa." }, - "minzoom": 19, "source": { "osmTags": "amenity=parking_space" }, + "minzoom": 18, + "title": { + "render": { + "en": "Parking Space", + "de": "Stellplatz", + "nl": "Parkeerplek", + "ca": "Espai d'aparcament", + "cs": "Parkovací místo" + }, + "mappings": [ + { + "if": "parking_space=disabled", + "then": { + "en": "Disabled Parking Space", + "nl": "Parkeerplek voor gehandicapten", + "de": "Behindertenparkplatz", + "cs": "Parkovací místo pro osoby se zdravotním postižením" + } + } + ] + }, + "pointRendering": [ + { + "marker": [ + { + "icon": { + "render": "./assets/layers/parking_spaces/parking_space.svg", + "mappings": [ + { + "if": "parking_space=disabled", + "then": "./assets/layers/toilet/wheelchair.svg" + } + ] + } + } + ], + "iconSize": "20,20", + "location": [ + "point", + "centroid" + ], + "anchor": "center" + } + ], + "lineRendering": [ + { + "color": "#696969", + "width": "1" + } + ], "tagRenderings": [ "images", { @@ -214,48 +263,5 @@ } ] } - ], - "title": { - "render": { - "en": "Parking Space", - "de": "Stellplatz", - "nl": "Parkeerplek", - "ca": "Espai d'aparcament", - "cs": "Parkovací místo" - }, - "mappings": [ - { - "if": "parking_space=disabled", - "then": { - "en": "Disabled Parking Space", - "nl": "Parkeerplek voor gehandicapten", - "de": "Behindertenparkplatz", - "cs": "Parkovací místo pro osoby se zdravotním postižením" - } - } - ] - }, - "mapRendering": [ - { - "icon": { - "render": "./assets/layers/parking_spaces/parking_space.svg", - "mappings": [ - { - "if": "parking_space=disabled", - "then": "./assets/layers/toilet/wheelchair.svg" - } - ] - }, - "iconSize": "20,20", - "location": [ - "point", - "centroid" - ], - "anchor": "center" - }, - { - "color": "#696969", - "width": "1" - } ] } diff --git a/assets/layers/parking_ticket_machine/parking_ticket_machine.json b/assets/layers/parking_ticket_machine/parking_ticket_machine.json index c11047a3e..bc28714ab 100644 --- a/assets/layers/parking_ticket_machine/parking_ticket_machine.json +++ b/assets/layers/parking_ticket_machine/parking_ticket_machine.json @@ -14,15 +14,6 @@ "ca": "Capa amb màquines de bitllets d'aparcament per pagar l'aparcament.", "cs": "Vrstva s parkovacími automaty pro placení parkovného." }, - "title": { - "render": { - "en": "Parking Ticket Machine", - "nl": "Parkeerkaartautomaat", - "de": "Parkscheinautomat", - "ca": "Màquina de bitllets d'aparcament", - "cs": "Parkovací automat" - } - }, "source": { "osmTags": { "and": [ @@ -32,6 +23,35 @@ } }, "minzoom": 16, + "title": { + "render": { + "en": "Parking Ticket Machine", + "nl": "Parkeerkaartautomaat", + "de": "Parkscheinautomat", + "ca": "Màquina de bitllets d'aparcament", + "cs": "Parkovací automat" + } + }, + "pointRendering": [ + { + "location": [ + "point", + "centroid" + ], + "iconSize": "20,20", + "anchor": "center", + "marker": [ + { + "icon": "square", + "color": "white" + }, + { + "icon": "./assets/layers/parking_ticket_machine/parking_tickets.svg" + } + ] + } + ], + "lineRendering": [], "presets": [ { "tags": [ @@ -93,16 +113,5 @@ } ] } - ], - "mapRendering": [ - { - "location": [ - "point", - "centroid" - ], - "icon": "square:white;./assets/layers/parking_ticket_machine/parking_tickets.svg", - "iconSize": "20,20", - "anchor": "center" - } ] } diff --git a/assets/layers/pedestrian_path/pedestrian_path.json b/assets/layers/pedestrian_path/pedestrian_path.json index b6a33a2bf..87c84cf43 100644 --- a/assets/layers/pedestrian_path/pedestrian_path.json +++ b/assets/layers/pedestrian_path/pedestrian_path.json @@ -8,7 +8,14 @@ "ca": "Camins per a vianants", "cs": "Cesty pro chodce" }, - "minzoom": 18, + "description": { + "en": "Pedestrian footpaths, especially used for indoor navigation and snapping entrances to this layer", + "nl": "Pad voor voetgangers, in het bijzonder gebruikt voor navigatie binnen gebouwen en om aan toegangen vast te klikken in deze laag", + "de": "Fußgängerwege, insbesondere für die Navigation in Gebäuden und die Aufnahme von Eingängen in diese Ebene", + "fr": "Sentiers piétonniers, particulièrement utilisés pour la navigation intérieure et les entrées d'accrochage à cette couche", + "ca": "Senderes per a vianants, especialment utilitzades per a la navegació interior i les entrades ràpides a aquesta capa", + "cs": "Chodníky pro pěší, používané zejména pro navigaci v interiéru a zachycení vstupů do této vrstvy" + }, "source": { "osmTags": { "or": [ @@ -19,21 +26,20 @@ ] } }, - "description": { - "en": "Pedestrian footpaths, especially used for indoor navigation and snapping entrances to this layer", - "nl": "Pad voor voetgangers, in het bijzonder gebruikt voor navigatie binnen gebouwen en om aan toegangen vast te klikken in deze laag", - "de": "Fußgängerwege, insbesondere für die Navigation in Gebäuden und die Aufnahme von Eingängen in diese Ebene", - "fr": "Sentiers piétonniers, particulièrement utilisés pour la navigation intérieure et les entrées d'accrochage à cette couche", - "ca": "Senderes per a vianants, especialment utilitzades per a la navegació interior i les entrades ràpides a aquesta capa", - "cs": "Chodníky pro pěší, používané zejména pro navigaci v interiéru a zachycení vstupů do této vrstvy" - }, - "mapRendering": [ + "minzoom": 18, + "pointRendering": [ { - "icon": "./assets/svg/bug.svg", "location": [ "point" + ], + "marker": [ + { + "icon": "./assets/svg/bug.svg" + } ] - }, + } + ], + "lineRendering": [ { "color": "#b33", "width": 4, diff --git a/assets/layers/pharmacy/pharmacy.json b/assets/layers/pharmacy/pharmacy.json index fdf01d281..5357ba9a4 100644 --- a/assets/layers/pharmacy/pharmacy.json +++ b/assets/layers/pharmacy/pharmacy.json @@ -17,6 +17,14 @@ "ca": "Una capa que mostra les farmàcies, que (probablement) distribueixen medicaments amb recepta", "cs": "Vrstva zobrazující lékárny, které (pravděpodobně) vydávají léky na předpis" }, + "source": { + "osmTags": { + "and": [ + "amenity=pharmacy" + ] + } + }, + "minzoom": 13, "title": { "render": { "en": "{name}", @@ -41,14 +49,51 @@ } ] }, - "source": { - "osmTags": { - "and": [ - "amenity=pharmacy" + "pointRendering": [ + { + "iconSize": "40,40", + "location": [ + "point", + "centroid" + ], + "iconBadges": [ + { + "if": "opening_hours~*", + "then": "icons.isOpen" + } + ], + "label": { + "mappings": [ + { + "if": "name~*", + "then": "
    {name}
    " + } + ] + }, + "anchor": "bottom", + "marker": [ + { + "icon": "./assets/layers/pharmacy/pharmacy.svg" + } ] } - }, - "minzoom": 13, + ], + "lineRendering": [], + "presets": [ + { + "tags": [ + "amenity=pharmacy" + ], + "title": { + "en": "a pharmacy", + "nl": "een apotheek", + "de": "eine Apotheke", + "fr": "une pharmacie", + "ca": "una farmàcia", + "cs": "lékárna" + } + } + ], "tagRenderings": [ "images", "reviews", @@ -134,31 +179,6 @@ ] } ], - "mapRendering": [ - { - "icon": "./assets/layers/pharmacy/pharmacy.svg", - "iconSize": "40,40", - "location": [ - "point", - "centroid" - ], - "iconBadges": [ - { - "if": "opening_hours~*", - "then": "icons.isOpen" - } - ], - "label": { - "mappings": [ - { - "if": "name~*", - "then": "
    {name}
    " - } - ] - }, - "anchor": "bottom" - } - ], "filter": [ { "id": "drive-through", @@ -194,21 +214,6 @@ }, "open_now" ], - "presets": [ - { - "tags": [ - "amenity=pharmacy" - ], - "title": { - "en": "a pharmacy", - "nl": "een apotheek", - "de": "eine Apotheke", - "fr": "une pharmacie", - "ca": "una farmàcia", - "cs": "lékárna" - } - } - ], "deletion": true, "allowMove": true } diff --git a/assets/layers/physiotherapist/physiotherapist.json b/assets/layers/physiotherapist/physiotherapist.json index 31cf78f21..9d95f68b8 100644 --- a/assets/layers/physiotherapist/physiotherapist.json +++ b/assets/layers/physiotherapist/physiotherapist.json @@ -17,6 +17,7 @@ "source": { "osmTags": "healthcare=physiotherapist" }, + "minzoom": 13, "title": { "render": { "en": "Physiotherapist {name}", @@ -26,7 +27,41 @@ "cs": "Fyzioterapeut {name}" } }, - "minzoom": 13, + "pointRendering": [ + { + "iconSize": "40,40", + "location": [ + "point", + "centroid" + ], + "anchor": "center", + "marker": [ + { + "icon": "circle", + "color": "white" + }, + { + "icon": "./assets/layers/physiotherapist/doctors.svg" + } + ] + } + ], + "lineRendering": [], + "presets": [ + { + "title": { + "en": "a physiotherapists office", + "de": "Praxis eines Physiotherapeuten", + "nl": "een fysiotherapeutenpraktijk", + "fr": "un cabinet de kinésithérapeutes", + "ca": "una consulta fisioterapèutica", + "cs": "ordinace fyzioterapeuta" + }, + "tags": [ + "healthcare=physiotherapist" + ] + } + ], "tagRenderings": [ "images", { @@ -54,35 +89,9 @@ "email", "website" ], - "presets": [ - { - "title": { - "en": "a physiotherapists office", - "de": "Praxis eines Physiotherapeuten", - "nl": "een fysiotherapeutenpraktijk", - "fr": "un cabinet de kinésithérapeutes", - "ca": "una consulta fisioterapèutica", - "cs": "ordinace fyzioterapeuta" - }, - "tags": [ - "healthcare=physiotherapist" - ] - } - ], "filter": [ "open_now" ], - "mapRendering": [ - { - "icon": "circle:white;./assets/layers/physiotherapist/doctors.svg", - "iconSize": "40,40", - "location": [ - "point", - "centroid" - ], - "anchor": "center" - } - ], "deletion": true, "allowMove": true } diff --git a/assets/layers/picnic_table/picnic_table.json b/assets/layers/picnic_table/picnic_table.json index bc832c25e..170f2caf3 100644 --- a/assets/layers/picnic_table/picnic_table.json +++ b/assets/layers/picnic_table/picnic_table.json @@ -11,10 +11,21 @@ "es": "Mesas de pícnic", "cs": "Piknikové stoly" }, - "minzoom": 12, + "description": { + "en": "The layer showing picnic tables", + "nl": "Deze laag toont picknicktafels", + "it": "Il livello che mostra i tavoli da picnic", + "fr": "La couche montrant les tables de pique-nique", + "ru": "Слой, отображающий столы для пикника", + "de": "Die Ebene zeigt Picknicktische an", + "es": "Una capa que muestra mesas de pícnic", + "ca": "La capa mostra taules de pícnic", + "cs": "Vrstva zobrazující piknikové stoly" + }, "source": { "osmTags": "leisure=picnic_table" }, + "minzoom": 12, "title": { "render": { "en": "Picnic table", @@ -28,17 +39,44 @@ "cs": "Piknikový stůl" } }, - "description": { - "en": "The layer showing picnic tables", - "nl": "Deze laag toont picknicktafels", - "it": "Il livello che mostra i tavoli da picnic", - "fr": "La couche montrant les tables de pique-nique", - "ru": "Слой, отображающий столы для пикника", - "de": "Die Ebene zeigt Picknicktische an", - "es": "Una capa que muestra mesas de pícnic", - "ca": "La capa mostra taules de pícnic", - "cs": "Vrstva zobrazující piknikové stoly" - }, + "pointRendering": [ + { + "iconSize": "35,35", + "location": [ + "point", + "centroid" + ], + "anchor": "center", + "marker": [ + { + "icon": "circle", + "color": "#e6cf39" + }, + { + "icon": "./assets/layers/picnic_table/picnic_table.svg" + } + ] + } + ], + "lineRendering": [], + "presets": [ + { + "tags": [ + "leisure=picnic_table" + ], + "title": { + "en": "a picnic table", + "nl": "een picknicktafel", + "it": "una tavolo da picnic", + "ru": "стол для пикника", + "de": "einen Picknick-Tisch", + "fr": "une table de pique-nique", + "es": "una mesa de pícnic", + "ca": "una taula de pícnic", + "cs": "piknikový stůl" + } + } + ], "tagRenderings": [ "images", "level", @@ -113,24 +151,6 @@ "id": "picnic_table-material" } ], - "presets": [ - { - "tags": [ - "leisure=picnic_table" - ], - "title": { - "en": "a picnic table", - "nl": "een picknicktafel", - "it": "una tavolo da picnic", - "ru": "стол для пикника", - "de": "einen Picknick-Tisch", - "fr": "une table de pique-nique", - "es": "una mesa de pícnic", - "ca": "una taula de pícnic", - "cs": "piknikový stůl" - } - } - ], "deletion": { "softDeletionTags": { "and": [ @@ -143,16 +163,5 @@ "allowMove": { "enableRelocation": false, "enableImproveAccuraccy": true - }, - "mapRendering": [ - { - "icon": "circle:#e6cf39;./assets/layers/picnic_table/picnic_table.svg", - "iconSize": "35,35", - "location": [ - "point", - "centroid" - ], - "anchor": "center" - } - ] + } } diff --git a/assets/layers/play_forest/play_forest.json b/assets/layers/play_forest/play_forest.json index 7ceaf32c7..5a81c3feb 100644 --- a/assets/layers/play_forest/play_forest.json +++ b/assets/layers/play_forest/play_forest.json @@ -3,7 +3,9 @@ "name": { "nl": "Speelbossen" }, - "minzoom": 13, + "description": { + "nl": "Een speelbos is een vrij toegankelijke zone in een bos" + }, "source": { "osmTags": { "and": [ @@ -11,6 +13,7 @@ ] } }, + "minzoom": 13, "title": { "render": { "nl": "Speelbos" @@ -30,9 +33,40 @@ } ] }, - "description": { - "nl": "Een speelbos is een vrij toegankelijke zone in een bos" - }, + "pointRendering": [ + { + "iconSize": "40,40", + "location": [ + "point", + "centroid" + ], + "anchor": "center", + "marker": [ + { + "icon": "./assets/layers/play_forest/icon.svg" + } + ] + } + ], + "lineRendering": [ + { + "color": "#007055", + "width": "2" + } + ], + "presets": [ + { + "title": { + "*": "Speelbos" + }, + "tags": [ + "leisure=playground", + "playground=forest", + "fixme=Toegevoegd met MapComplete, geometry nog uit te tekenen" + ], + "description": "Een zone in het bos, duidelijk gemarkeerd als speelzone met de overeenkomstige borden.
    " + } + ], "tagRenderings": [ "images", { @@ -92,33 +126,5 @@ "render": "{reviews(name, play_forest)}" } ], - "hideFromOverview": false, - "presets": [ - { - "title": { - "*": "Speelbos" - }, - "tags": [ - "leisure=playground", - "playground=forest", - "fixme=Toegevoegd met MapComplete, geometry nog uit te tekenen" - ], - "description": "Een zone in het bos, duidelijk gemarkeerd als speelzone met de overeenkomstige borden.
    " - } - ], - "mapRendering": [ - { - "icon": "./assets/layers/play_forest/icon.svg", - "iconSize": "40,40", - "location": [ - "point", - "centroid" - ], - "anchor": "center" - }, - { - "color": "#007055", - "width": "2" - } - ] + "hideFromOverview": false } diff --git a/assets/layers/playground/playground.json b/assets/layers/playground/playground.json index d05b0b503..c29fcdee5 100644 --- a/assets/layers/playground/playground.json +++ b/assets/layers/playground/playground.json @@ -11,18 +11,6 @@ "pa_PK": "کھید دے میدان", "cs": "Dětská hřiště" }, - "minzoom": 13, - "source": { - "osmTags": { - "and": [ - "leisure=playground", - "playground!=forest" - ] - } - }, - "calculatedTags": [ - "_size_classification=Number(feat.properties._surface) < 10 ? 'small' : (Number(feat.properties._surface) < 100 ? 'medium' : 'large') " - ], "description": { "nl": "Speeltuinen", "en": "Playgrounds", @@ -34,6 +22,18 @@ "pa_PK": "کھید دے میدان", "cs": "Dětská hřiště" }, + "source": { + "osmTags": { + "and": [ + "leisure=playground", + "playground!=forest" + ] + } + }, + "calculatedTags": [ + "_size_classification=Number(feat.properties._surface) < 10 ? 'small' : (Number(feat.properties._surface) < 100 ? 'medium' : 'large') " + ], + "minzoom": 13, "title": { "render": { "nl": "Speeltuin", @@ -62,6 +62,74 @@ } ] }, + "pointRendering": [ + { + "iconBadges": [ + { + "if": { + "and": [ + "opening_hours!=24/7", + "opening_hours~*" + ] + }, + "then": "icons.isOpen" + } + ], + "iconSize": { + "render": "40,40,center", + "mappings": [ + { + "if": "id~node/.*", + "then": "40,40,center" + }, + { + "if": "_size_classification=small", + "then": "25,25,center" + }, + { + "if": "_size_classification=medium", + "then": "40,40,center" + }, + { + "if": "_size_classification=large", + "then": "60,60,center" + } + ] + }, + "location": [ + "point", + "centroid" + ], + "marker": [ + { + "icon": "./assets/themes/playgrounds/playground.svg" + } + ] + } + ], + "lineRendering": [ + { + "color": "#5dbaa9", + "width": "1" + } + ], + "presets": [ + { + "tags": [ + "leisure=playground" + ], + "title": { + "nl": "een speeltuin", + "en": "a playground", + "ru": "Детская площадка", + "fr": "une terrain de jeux", + "it": "una campetto", + "de": "einen Spielplatz", + "ca": "un parc infantil", + "cs": "hřiště" + } + } + ], "tagRenderings": [ "images", { @@ -607,23 +675,6 @@ "render": "{reviews(name, playground)}" } ], - "presets": [ - { - "tags": [ - "leisure=playground" - ], - "title": { - "nl": "een speeltuin", - "en": "a playground", - "ru": "Детская площадка", - "fr": "une terrain de jeux", - "it": "una campetto", - "de": "einen Spielplatz", - "ca": "un parc infantil", - "cs": "hřiště" - } - } - ], "deletion": { "nonDeleteMappings": [ { @@ -643,50 +694,5 @@ "leisure=" ] } - }, - "mapRendering": [ - { - "icon": "./assets/themes/playgrounds/playground.svg", - "iconBadges": [ - { - "if": { - "and": [ - "opening_hours!=24/7", - "opening_hours~*" - ] - }, - "then": "icons.isOpen" - } - ], - "iconSize": { - "render": "40,40,center", - "mappings": [ - { - "if": "id~node/.*", - "then": "40,40,center" - }, - { - "if": "_size_classification=small", - "then": "25,25,center" - }, - { - "if": "_size_classification=medium", - "then": "40,40,center" - }, - { - "if": "_size_classification=large", - "then": "60,60,center" - } - ] - }, - "location": [ - "point", - "centroid" - ] - }, - { - "color": "#5dbaa9", - "width": "1" - } - ] + } } diff --git a/assets/layers/postboxes/postboxes.json b/assets/layers/postboxes/postboxes.json index d76381881..ea67f8518 100644 --- a/assets/layers/postboxes/postboxes.json +++ b/assets/layers/postboxes/postboxes.json @@ -14,10 +14,23 @@ "fr": "Boîtes à lettres", "cs": "Poštovní schránky" }, - "minzoom": 12, + "description": { + "en": "The layer showing postboxes.", + "de": "Die Ebene zeigt Briefkästen.", + "zh_Hant": "這圖層顯示郵筒。", + "id": "Layer yang memperlihatkan kotak pos.", + "hu": "Postaládákat megjelenítő réteg.", + "nl": "Deze laag toont brievenbussen.", + "es": "La capa que mostrando buzones de correo.", + "fr": "Le calque montrant les boîtes à lettres.", + "ca": "La capa que mostra bústies de correus.", + "cs": "Vrstva zobrazující poštovní schránky.", + "pl": "Warstwa pokazująca skrzynki pocztowe." + }, "source": { "osmTags": "amenity=post_box" }, + "minzoom": 12, "title": { "render": { "en": "Postbox", @@ -34,24 +47,25 @@ "cs": "Poštovní schránka" } }, - "description": { - "en": "The layer showing postboxes.", - "de": "Die Ebene zeigt Briefkästen.", - "zh_Hant": "這圖層顯示郵筒。", - "id": "Layer yang memperlihatkan kotak pos.", - "hu": "Postaládákat megjelenítő réteg.", - "nl": "Deze laag toont brievenbussen.", - "es": "La capa que mostrando buzones de correo.", - "fr": "Le calque montrant les boîtes à lettres.", - "ca": "La capa que mostra bústies de correus.", - "cs": "Vrstva zobrazující poštovní schránky.", - "pl": "Warstwa pokazująca skrzynki pocztowe." - }, - "tagRenderings": [ - "images", + "pointRendering": [ { - "id": "minimap", - "render": "{minimap(18): height: 5rem; overflow: hidden; border-radius:3rem; }" + "iconSize": "40,40", + "location": [ + "point", + "centroid" + ], + "anchor": "bottom", + "marker": [ + { + "icon": "./assets/layers/postboxes/postbox.svg" + } + ] + } + ], + "lineRendering": [ + { + "color": "#DADADA", + "width": "1" } ], "presets": [ @@ -74,6 +88,13 @@ } } ], + "tagRenderings": [ + "images", + { + "id": "minimap", + "render": "{minimap(18): height: 5rem; overflow: hidden; border-radius:3rem; }" + } + ], "deletion": { "softDeletionTags": { "and": [ @@ -81,20 +102,5 @@ "razed:amenity=post_box" ] } - }, - "mapRendering": [ - { - "icon": "./assets/layers/postboxes/postbox.svg", - "iconSize": "40,40", - "location": [ - "point", - "centroid" - ], - "anchor": "bottom" - }, - { - "color": "#DADADA", - "width": "1" - } - ] + } } diff --git a/assets/layers/postoffices/postoffices.json b/assets/layers/postoffices/postoffices.json index e0d7191be..826b68ca2 100644 --- a/assets/layers/postoffices/postoffices.json +++ b/assets/layers/postoffices/postoffices.json @@ -14,7 +14,19 @@ "nb_NO": "Postkontor", "cs": "Pošty" }, - "minzoom": 12, + "description": { + "en": "A layer showing post offices.", + "de": "Eine Ebene mit Postämtern.", + "zh_Hant": "圖層顯示郵局。", + "id": "Layer yang menunjukkan kantor pos.", + "hu": "Postákat megjelenítő réteg.", + "nl": "Een laag die postkantoren toont.", + "es": "Una capa que muestra oficinas postales.", + "fr": "Un claque montrant les bureaux de poste.", + "nb_NO": "Et lag som viser postkontor.", + "ca": "Una capa que mostra oficines postals.", + "cs": "Vrstva zobrazující pošty." + }, "source": { "osmTags": { "or": [ @@ -23,6 +35,7 @@ ] } }, + "minzoom": 12, "title": { "render": { "en": "Post Office", @@ -69,19 +82,62 @@ } ] }, - "description": { - "en": "A layer showing post offices.", - "de": "Eine Ebene mit Postämtern.", - "zh_Hant": "圖層顯示郵局。", - "id": "Layer yang menunjukkan kantor pos.", - "hu": "Postákat megjelenítő réteg.", - "nl": "Een laag die postkantoren toont.", - "es": "Una capa que muestra oficinas postales.", - "fr": "Un claque montrant les bureaux de poste.", - "nb_NO": "Et lag som viser postkontor.", - "ca": "Una capa que mostra oficines postals.", - "cs": "Vrstva zobrazující pošty." - }, + "pointRendering": [ + { + "iconBadges": [ + { + "if": "opening_hours~*", + "then": "icons.isOpen" + }, + { + "if": "shop~*", + "then": "./assets/themes/shops/shop.svg" + } + ], + "iconSize": "40,40", + "location": [ + "point", + "centroid" + ], + "anchor": "center", + "marker": [ + { + "icon": "square", + "color": "white" + }, + { + "icon": "./assets/layers/postoffices/post_office.svg" + } + ] + } + ], + "lineRendering": [ + { + "color": "#DADADA", + "width": "1" + } + ], + "presets": [ + { + "tags": [ + "amenity=post_office" + ], + "title": { + "en": "a post office", + "de": "eine Poststelle", + "ru": "Почтовое отделение", + "zh_Hant": "郵局", + "id": "Kantor Pos", + "hu": "Posta", + "nl": "een postkantoor", + "ca": "una oficina de correus", + "es": "una oficina de correo", + "nb_NO": "et postkontor", + "fr": "un bureau de poste", + "cs": "pošta" + } + } + ], "tagRenderings": [ "images", { @@ -495,53 +551,7 @@ ] } ], - "presets": [ - { - "tags": [ - "amenity=post_office" - ], - "title": { - "en": "a post office", - "de": "eine Poststelle", - "ru": "Почтовое отделение", - "zh_Hant": "郵局", - "id": "Kantor Pos", - "hu": "Posta", - "nl": "een postkantoor", - "ca": "una oficina de correus", - "es": "una oficina de correo", - "nb_NO": "et postkontor", - "fr": "un bureau de poste", - "cs": "pošta" - } - } - ], "filter": [ "open_now" - ], - "mapRendering": [ - { - "icon": "square:white;./assets/layers/postoffices/post_office.svg", - "iconBadges": [ - { - "if": "opening_hours~*", - "then": "icons.isOpen" - }, - { - "if": "shop~*", - "then": "./assets/themes/shops/shop.svg" - } - ], - "iconSize": "40,40", - "location": [ - "point", - "centroid" - ], - "anchor": "center" - }, - { - "color": "#DADADA", - "width": "1" - } ] } diff --git a/assets/layers/public_bookcase/public_bookcase.json b/assets/layers/public_bookcase/public_bookcase.json index 581b30673..72025489a 100644 --- a/assets/layers/public_bookcase/public_bookcase.json +++ b/assets/layers/public_bookcase/public_bookcase.json @@ -55,6 +55,37 @@ } ] }, + "pointRendering": [ + { + "label": { + "mappings": [ + { + "if": "name~*", + "then": "
    {name}
    " + } + ] + }, + "location": [ + "point", + "centroid" + ], + "marker": [ + { + "icon": "circle", + "color": "#ffffff" + }, + { + "icon": "./assets/themes/bookcases/bookcase.svg" + } + ] + } + ], + "lineRendering": [ + { + "color": "#0000ff", + "width": "8" + } + ], "presets": [ { "title": { @@ -524,16 +555,6 @@ "id": "public_bookcase-website" } ], - "allowMove": true, - "deletion": { - "softDeletionTags": { - "and": [ - "disused:amenity=public_bookcase", - "amenity=" - ] - }, - "neededChangesets": 5 - }, "filter": [ { "id": "kid-books", @@ -608,25 +629,14 @@ }, "has_image" ], - "mapRendering": [ - { - "icon": "circle:#ffffff;./assets/themes/bookcases/bookcase.svg", - "label": { - "mappings": [ - { - "if": "name~*", - "then": "
    {name}
    " - } - ] - }, - "location": [ - "point", - "centroid" + "deletion": { + "softDeletionTags": { + "and": [ + "disused:amenity=public_bookcase", + "amenity=" ] }, - { - "color": "#0000ff", - "width": "8" - } - ] + "neededChangesets": 5 + }, + "allowMove": true } diff --git a/assets/layers/questions/questions.json b/assets/layers/questions/questions.json index 5e61b7575..3274721b9 100644 --- a/assets/layers/questions/questions.json +++ b/assets/layers/questions/questions.json @@ -2,7 +2,8 @@ "id": "questions", "description": "Special library layer which does not need a '.questions'-prefix before being imported", "source": "special:library", - "mapRendering": null, + "pointRendering": null, + "lineRendering": null, "tagRenderings": [ { "id": "questions", @@ -2030,6 +2031,7 @@ }, { "id": "internet", + "labels": ["internet-all"], "question": { "en": "Does this place offer internet access?", "nl": "Biedt deze plaats internettoegang aan?", @@ -2135,6 +2137,7 @@ }, { "id": "internet-fee", + "labels": ["internet-all"], "condition": { "and": [ "internet_access!=no", @@ -2211,6 +2214,7 @@ }, { "id": "internet-ssid", + "labels": ["internet-all"], "condition": "internet_access=wlan", "question": { "en": "What is the network name for the wireless internet access?", @@ -2410,6 +2414,9 @@ }, { "id": "sugar_free", + "labels": [ + "diets" + ], "question": { "en": "Does this shop have a sugar free offering?", "de": "Verkauft das Geschäft zuckerfreie Produkte?", @@ -2457,6 +2464,9 @@ }, { "id": "lactose_free", + "labels": [ + "diets" + ], "question": { "en": "Does {title()} have a lactose-free offering?", "de": "Verkauft {title()} laktosefreie Produkte?", @@ -2490,7 +2500,7 @@ { "if": "diet:lactose_free=no", "then": { - "en": "No lactose free offering", + "en": "This shop has no lactose free offering", "de": "Keine laktosefreie Produkte", "cs": "Žádná nabídka bez laktózy" } @@ -2499,6 +2509,9 @@ }, { "id": "gluten_free", + "labels": [ + "diets" + ], "question": { "en": "Does this shop have a gluten free offering?", "de": "Verkauft das Geschäft glutenfreie Produkte?", @@ -2538,6 +2551,41 @@ } } ] + }, + { + "id": "vegan", + "labels": [ + "diets" + ], + "question": { + "en": "Does this place offer a vegan option?" + }, + "mappings": [ + { + "if": "diet:vegan=only", + "then": { + "en": "This place only sells vegan products" + } + }, + { + "if": "diet:vegan=yes", + "then": { + "en": "This shop has a big vegan offering" + } + }, + { + "if": "diet:vegan=limited", + "then": { + "en": "This shop has a limited vegan offering" + } + }, + { + "if": "diet:vegan=no", + "then": { + "en": "This shop has no vegan offering" + } + } + ] } ] } diff --git a/assets/layers/railway_platforms/railway_platforms.json b/assets/layers/railway_platforms/railway_platforms.json index e083ea526..2be319b5c 100644 --- a/assets/layers/railway_platforms/railway_platforms.json +++ b/assets/layers/railway_platforms/railway_platforms.json @@ -16,6 +16,14 @@ "ca": "Trobeu totes les andanes de l'estació i les rutes de tren que les fan servir.", "cs": "Najděte všechna nástupiště ve stanici a vlakové trasy, které je používají." }, + "source": { + "osmTags": { + "or": [ + "railway=platform" + ] + } + }, + "minzoom": 18, "title": { "render": { "en": "Platform", @@ -39,14 +47,32 @@ } ] }, - "source": { - "osmTags": { - "or": [ - "railway=platform" + "pointRendering": [ + { + "location": [ + "point", + "centroid" + ], + "label": { + "mappings": [ + { + "if": "ref~*", + "then": "
    {ref}
    " + } + ] + }, + "marker": [ + { + "icon": "./assets/themes/stations/rail-light.svg" + } ] } - }, - "minzoom": 18, + ], + "lineRendering": [ + { + "color": "gray" + } + ], "tagRenderings": [ { "id": "ref", @@ -80,25 +106,5 @@ } }, "level" - ], - "mapRendering": [ - { - "color": "gray" - }, - { - "icon": "./assets/themes/stations/rail-light.svg", - "location": [ - "point", - "centroid" - ], - "label": { - "mappings": [ - { - "if": "ref~*", - "then": "
    {ref}
    " - } - ] - } - } ] } diff --git a/assets/layers/rainbow_crossings/rainbow_crossings.json b/assets/layers/rainbow_crossings/rainbow_crossings.json index ace04c620..ba7d92e27 100644 --- a/assets/layers/rainbow_crossings/rainbow_crossings.json +++ b/assets/layers/rainbow_crossings/rainbow_crossings.json @@ -41,6 +41,37 @@ "cs": "Přechod" } }, + "pointRendering": [ + { + "marker": [ + { + "icon": { + "render": "./assets/themes/rainbow_crossings/crossing.svg", + "mappings": [ + { + "if": "surface:colour=rainbow", + "then": "./assets/themes/rainbow_crossings/logo.svg" + } + ] + } + } + ], + "iconSize": "40,40", + "location": [ + "point", + "centroid" + ], + "anchor": "center" + } + ], + "lineRendering": [ + { + "color": "red", + "width": "5", + "dashArray": "10 2", + "lineCap": "square" + } + ], "presets": [ { "title": { @@ -63,7 +94,9 @@ "ca": "Pas de vianants", "cs": "Přechod pro chodce" }, - "snapToLayer": "cycleways_and_roads", + "snapToLayer": [ + "cycleways_and_roads" + ], "maxSnapDistance": 25 } ], @@ -118,30 +151,5 @@ } ] } - ], - "mapRendering": [ - { - "icon": { - "render": "./assets/themes/rainbow_crossings/crossing.svg", - "mappings": [ - { - "if": "surface:colour=rainbow", - "then": "./assets/themes/rainbow_crossings/logo.svg" - } - ] - }, - "iconSize": "40,40", - "location": [ - "point", - "centroid" - ], - "anchor": "center" - }, - { - "color": "red", - "width": "5", - "dashArray": "10 2", - "lineCap": "square" - } ] } diff --git a/assets/layers/range/range.json b/assets/layers/range/range.json index a19ab32a4..ae92cb021 100644 --- a/assets/layers/range/range.json +++ b/assets/layers/range/range.json @@ -1,11 +1,12 @@ { "id": "range", - "description": "Meta-layer, simply showing a bbox in red", - "title": null, - "source": "special", "name": null, + "description": "Meta-layer, simply showing a bbox in red", + "source": "special", "shownByDefault": false, - "mapRendering": [ + "title": null, + "pointRendering": [], + "lineRendering": [ { "width": 3, "fill": "no", diff --git a/assets/layers/reception_desk/reception_desk.json b/assets/layers/reception_desk/reception_desk.json index 9c1f2d14d..b8e017a87 100644 --- a/assets/layers/reception_desk/reception_desk.json +++ b/assets/layers/reception_desk/reception_desk.json @@ -14,6 +14,9 @@ "ca": "Una capa que mostra on es troben els mostradors de recepció i que demana informació d'accessibilitat", "cs": "Vrstva, která ukazuje, kde se nacházejí recepce, a která se ptá na některé informace o přístupnosti" }, + "source": { + "osmTags": "amenity=reception_desk" + }, "title": { "render": { "en": "Reception desk", @@ -23,18 +26,38 @@ "cs": "Recepční pult" } }, - "source": { - "osmTags": "amenity=reception_desk" - }, - "mapRendering": [ + "pointRendering": [ { "location": [ "point", "centroid" ], - "icon": "circle:white;./assets/layers/reception_desk/reception_desk.svg", "iconSize": "40,40", - "anchor": "center" + "anchor": "center", + "marker": [ + { + "icon": "circle", + "color": "white" + }, + { + "icon": "./assets/layers/reception_desk/reception_desk.svg" + } + ] + } + ], + "lineRendering": [], + "presets": [ + { + "tags": [ + "amenity=reception_desk" + ], + "title": { + "en": "a reception desk", + "fr": "un bureau d'accueil", + "de": "einen Empfangstresen", + "ca": "una recepció", + "cs": "recepční pult" + } } ], "tagRenderings": [ @@ -73,20 +96,6 @@ }, "induction-loop" ], - "presets": [ - { - "tags": [ - "amenity=reception_desk" - ], - "title": { - "en": "a reception desk", - "fr": "un bureau d'accueil", - "de": "einen Empfangstresen", - "ca": "una recepció", - "cs": "recepční pult" - } - } - ], "units": [ { "appliesToKey": [ diff --git a/assets/layers/recycling/recycling.json b/assets/layers/recycling/recycling.json index 8e200279c..823f95d66 100644 --- a/assets/layers/recycling/recycling.json +++ b/assets/layers/recycling/recycling.json @@ -82,225 +82,12 @@ } ] }, - "mapRendering": [ + "pointRendering": [ { "location": [ "point", "centroid" ], - "icon": { - "render": "circle:white;./assets/layers/recycling/recycling-14.svg", - "mappings": [ - { - "if": { - "and": [ - "_waste_amount=1", - "recycling:batteries=yes" - ] - }, - "then": "circle:white;./assets/layers/recycling/batteries.svg" - }, - { - "if": { - "and": [ - "_waste_amount=1", - "recycling:beverage_cartons=yes" - ] - }, - "then": "circle:white;./assets/layers/recycling/beverage_cartons.svg" - }, - { - "if": { - "and": [ - "_waste_amount=1", - "recycling:cans=yes" - ] - }, - "then": "circle:white;./assets/layers/recycling/cans.svg" - }, - { - "if": { - "and": [ - "_waste_amount=1", - "recycling:clothes=yes" - ] - }, - "then": "circle:white;./assets/layers/recycling/clothes.svg" - }, - { - "if": { - "and": [ - "_waste_amount=1", - "recycling:cooking_oil=yes" - ] - }, - "then": "circle:white;./assets/layers/recycling/cooking_oil.svg" - }, - { - "if": { - "and": [ - "_waste_amount=1", - "recycling:engine_oil=yes" - ] - }, - "then": "circle:white;./assets/layers/recycling/engine_oil.svg" - }, - { - "if": { - "and": [ - "_waste_amount=1", - "recycling:fluorescent_tubes=yes" - ] - }, - "then": "circle:white;./assets/layers/recycling/fluorescent_tubes.svg" - }, - { - "if": { - "and": [ - "_waste_amount=1", - "recycling:glass=yes" - ] - }, - "then": "circle:white;./assets/layers/recycling/glass.svg" - }, - { - "if": { - "and": [ - "_waste_amount=1", - "recycling:glass_bottles=yes" - ] - }, - "then": "circle:white;./assets/layers/recycling/glass_bottles.svg" - }, - { - "if": { - "and": [ - "_waste_amount=1", - { - "or": [ - "recycling:green_waste=yes", - "recycling:organic=yes" - ] - } - ] - }, - "then": "circle:white;./assets/layers/recycling/garden_waste.svg" - }, - { - "if": { - "and": [ - "_waste_amount=1", - "recycling:light_bulbs=yes" - ] - }, - "then": "circle:white;./assets/layers/recycling/light_bulbs.svg" - }, - { - "if": { - "and": [ - "_waste_amount=1", - "recycling:newspaper=yes" - ] - }, - "then": "circle:white;./assets/layers/recycling/newspaper.svg" - }, - { - "if": { - "and": [ - "_waste_amount=1", - "recycling:paper=yes" - ] - }, - "then": "circle:white;./assets/layers/recycling/paper.svg" - }, - { - "if": { - "and": [ - "_waste_amount=1", - "recycling:plastic_bottles=yes" - ] - }, - "then": "circle:white;./assets/layers/recycling/plastic_bottles.svg" - }, - { - "if": { - "and": [ - "_waste_amount=1", - "recycling:plastic_packaging=yes" - ] - }, - "then": "circle:white;./assets/layers/recycling/plastic_packaging.svg" - }, - { - "if": { - "and": [ - "_waste_amount=1", - "recycling:plastic=yes" - ] - }, - "then": "circle:white;./assets/layers/recycling/plastic.svg" - }, - { - "if": { - "and": [ - "_waste_amount=1", - "recycling:printer_cartridges=yes" - ] - }, - "then": "circle:white;./assets/layers/recycling/printer_cartridges.svg" - }, - { - "if": { - "and": [ - "_waste_amount=1", - "recycling:scrap_metal=yes" - ] - }, - "then": "circle:white;./assets/layers/recycling/scrap_metal.svg" - }, - { - "if": { - "and": [ - "_waste_amount=1", - "recycling:shoes=yes" - ] - }, - "then": "circle:white;./assets/layers/recycling/shoes.svg" - }, - { - "if": { - "and": [ - "_waste_amount=1", - { - "or": [ - "recycling:small_appliances=yes", - "recycling:small_electric_appliances=yes" - ] - } - ] - }, - "then": "circle:white;./assets/layers/recycling/small_electrical_appliances.svg" - }, - { - "if": { - "and": [ - "_waste_amount=1", - "recycling:waste=yes" - ] - }, - "then": "circle:white;./assets/layers/waste_disposal/waste_disposal.svg" - }, - { - "if": { - "and": [ - "_waste_amount=1", - "recycling:needles=yes" - ] - }, - "then": "circle:white;./assets/layers/recycling/needles.svg" - } - ] - }, "iconBadges": [ { "if": { @@ -309,7 +96,7 @@ "recycling:batteries=yes" ] }, - "then": "circle:white;./assets/layers/recycling/batteries.svg" + "then": "./assets/layers/recycling/batteries.svg" }, { "if": { @@ -318,7 +105,7 @@ "recycling:beverage_cartons=yes" ] }, - "then": "circle:white;./assets/layers/recycling/beverage_cartons.svg" + "then": "./assets/layers/recycling/beverage_cartons.svg" }, { "if": { @@ -327,7 +114,7 @@ "recycling:cans=yes" ] }, - "then": "circle:white;./assets/layers/recycling/cans.svg" + "then": "./assets/layers/recycling/cans.svg" }, { "if": { @@ -336,7 +123,7 @@ "recycling:clothes=yes" ] }, - "then": "circle:white;./assets/layers/recycling/clothes.svg" + "then": "./assets/layers/recycling/clothes.svg" }, { "if": { @@ -345,7 +132,7 @@ "recycling:cooking_oil=yes" ] }, - "then": "circle:white;./assets/layers/recycling/cooking_oil.svg" + "then": "./assets/layers/recycling/cooking_oil.svg" }, { "if": { @@ -354,7 +141,7 @@ "recycling:engine_oil=yes" ] }, - "then": "circle:white;./assets/layers/recycling/engine_oil.svg" + "then": "./assets/layers/recycling/engine_oil.svg" }, { "if": { @@ -363,7 +150,7 @@ "recycling:fluorescent_tubes=yes" ] }, - "then": "circle:white;./assets/layers/recycling/fluorescent_tubes.svg" + "then": "./assets/layers/recycling/fluorescent_tubes.svg" }, { "if": { @@ -372,7 +159,7 @@ "recycling:glass=yes" ] }, - "then": "circle:white;./assets/layers/recycling/glass.svg" + "then": "./assets/layers/recycling/glass.svg" }, { "if": { @@ -381,7 +168,7 @@ "recycling:glass_bottles=yes" ] }, - "then": "circle:white;./assets/layers/recycling/glass_bottles.svg" + "then": "./assets/layers/recycling/glass_bottles.svg" }, { "if": { @@ -395,7 +182,7 @@ } ] }, - "then": "circle:white;./assets/layers/recycling/garden_waste.svg" + "then": "./assets/layers/recycling/garden_waste.svg" }, { "if": { @@ -404,7 +191,7 @@ "recycling:light_bulbs=yes" ] }, - "then": "circle:white;./assets/layers/recycling/light_bulbs.svg" + "then": "./assets/layers/recycling/light_bulbs.svg" }, { "if": { @@ -413,7 +200,7 @@ "recycling:newspaper=yes" ] }, - "then": "circle:white;./assets/layers/recycling/newspaper.svg" + "then": "./assets/layers/recycling/newspaper.svg" }, { "if": { @@ -422,7 +209,7 @@ "recycling:paper=yes" ] }, - "then": "circle:white;./assets/layers/recycling/paper.svg" + "then": "./assets/layers/recycling/paper.svg" }, { "if": { @@ -431,7 +218,7 @@ "recycling:plastic_bottles=yes" ] }, - "then": "circle:white;./assets/layers/recycling/plastic_bottles.svg" + "then": "./assets/layers/recycling/plastic_bottles.svg" }, { "if": { @@ -440,7 +227,7 @@ "recycling:plastic_packaging=yes" ] }, - "then": "circle:white;./assets/layers/recycling/plastic_packaging.svg" + "then": "./assets/layers/recycling/plastic_packaging.svg" }, { "if": { @@ -449,7 +236,7 @@ "recycling:plastic=yes" ] }, - "then": "circle:white;./assets/layers/recycling/plastic.svg" + "then": "./assets/layers/recycling/plastic.svg" }, { "if": { @@ -458,7 +245,7 @@ "recycling:printer_cartridges=yes" ] }, - "then": "circle:white;./assets/layers/recycling/printer_cartridges.svg" + "then": "./assets/layers/recycling/printer_cartridges.svg" }, { "if": { @@ -467,7 +254,7 @@ "recycling:scrap_metal=yes" ] }, - "then": "circle:white;./assets/layers/recycling/scrap_metal.svg" + "then": "./assets/layers/recycling/scrap_metal.svg" }, { "if": { @@ -476,7 +263,7 @@ "recycling:shoes=yes" ] }, - "then": "circle:white;./assets/layers/recycling/shoes.svg" + "then": "./assets/layers/recycling/shoes.svg" }, { "if": { @@ -490,7 +277,7 @@ } ] }, - "then": "circle:white;./assets/layers/recycling/small_electrical_appliances.svg" + "then": "./assets/layers/recycling/small_electrical_appliances.svg" }, { "if": { @@ -499,7 +286,7 @@ "recycling:waste=yes" ] }, - "then": "circle:white;./assets/layers/waste_disposal/waste_disposal.svg" + "then": "./assets/layers/waste_disposal/waste_disposal.svg" }, { "if": { @@ -508,7 +295,7 @@ "recycling:needles=yes" ] }, - "then": "circle:white;./assets/layers/recycling/needles.svg" + "then": "./assets/layers/recycling/needles.svg" }, { "if": { @@ -517,11 +304,233 @@ "recycling:bicycles=yes" ] }, - "then": "circle:white;./assets/layers/recycling/bicycles.svg" + "then": "./assets/layers/recycling/bicycles.svg" + } + ], + "marker": [ + { + "icon": "circle", + "color": "white" + }, + { + "icon": { + "render": "./assets/layers/recycling/recycling-14.svg", + "mappings": [ + { + "if": { + "and": [ + "_waste_amount=1", + "recycling:batteries=yes" + ] + }, + "then": "./assets/layers/recycling/batteries.svg" + }, + { + "if": { + "and": [ + "_waste_amount=1", + "recycling:beverage_cartons=yes" + ] + }, + "then": "./assets/layers/recycling/beverage_cartons.svg" + }, + { + "if": { + "and": [ + "_waste_amount=1", + "recycling:cans=yes" + ] + }, + "then": "./assets/layers/recycling/cans.svg" + }, + { + "if": { + "and": [ + "_waste_amount=1", + "recycling:clothes=yes" + ] + }, + "then": "./assets/layers/recycling/clothes.svg" + }, + { + "if": { + "and": [ + "_waste_amount=1", + "recycling:cooking_oil=yes" + ] + }, + "then": "./assets/layers/recycling/cooking_oil.svg" + }, + { + "if": { + "and": [ + "_waste_amount=1", + "recycling:engine_oil=yes" + ] + }, + "then": "./assets/layers/recycling/engine_oil.svg" + }, + { + "if": { + "and": [ + "_waste_amount=1", + "recycling:fluorescent_tubes=yes" + ] + }, + "then": "./assets/layers/recycling/fluorescent_tubes.svg" + }, + { + "if": { + "and": [ + "_waste_amount=1", + "recycling:glass=yes" + ] + }, + "then": "./assets/layers/recycling/glass.svg" + }, + { + "if": { + "and": [ + "_waste_amount=1", + "recycling:glass_bottles=yes" + ] + }, + "then": "./assets/layers/recycling/glass_bottles.svg" + }, + { + "if": { + "and": [ + "_waste_amount=1", + { + "or": [ + "recycling:green_waste=yes", + "recycling:organic=yes" + ] + } + ] + }, + "then": "./assets/layers/recycling/garden_waste.svg" + }, + { + "if": { + "and": [ + "_waste_amount=1", + "recycling:light_bulbs=yes" + ] + }, + "then": "./assets/layers/recycling/light_bulbs.svg" + }, + { + "if": { + "and": [ + "_waste_amount=1", + "recycling:newspaper=yes" + ] + }, + "then": "./assets/layers/recycling/newspaper.svg" + }, + { + "if": { + "and": [ + "_waste_amount=1", + "recycling:paper=yes" + ] + }, + "then": "./assets/layers/recycling/paper.svg" + }, + { + "if": { + "and": [ + "_waste_amount=1", + "recycling:plastic_bottles=yes" + ] + }, + "then": "./assets/layers/recycling/plastic_bottles.svg" + }, + { + "if": { + "and": [ + "_waste_amount=1", + "recycling:plastic_packaging=yes" + ] + }, + "then": "./assets/layers/recycling/plastic_packaging.svg" + }, + { + "if": { + "and": [ + "_waste_amount=1", + "recycling:plastic=yes" + ] + }, + "then": "./assets/layers/recycling/plastic.svg" + }, + { + "if": { + "and": [ + "_waste_amount=1", + "recycling:printer_cartridges=yes" + ] + }, + "then": "./assets/layers/recycling/printer_cartridges.svg" + }, + { + "if": { + "and": [ + "_waste_amount=1", + "recycling:scrap_metal=yes" + ] + }, + "then": "./assets/layers/recycling/scrap_metal.svg" + }, + { + "if": { + "and": [ + "_waste_amount=1", + "recycling:shoes=yes" + ] + }, + "then": "./assets/layers/recycling/shoes.svg" + }, + { + "if": { + "and": [ + "_waste_amount=1", + { + "or": [ + "recycling:small_appliances=yes", + "recycling:small_electric_appliances=yes" + ] + } + ] + }, + "then": "./assets/layers/recycling/small_electrical_appliances.svg" + }, + { + "if": { + "and": [ + "_waste_amount=1", + "recycling:waste=yes" + ] + }, + "then": "./assets/layers/waste_disposal/waste_disposal.svg" + }, + { + "if": { + "and": [ + "_waste_amount=1", + "recycling:needles=yes" + ] + }, + "then": "./assets/layers/recycling/needles.svg" + } + ] + } } ] } ], + "lineRendering": [], "presets": [ { "title": { @@ -572,6 +581,7 @@ "mappings": [ { "if": "recycling_type=container", + "addExtraTags": ["amenity=recycling"], "then": { "en": "This is a recycling container", "nl": "Dit is een recyclingcontainer", @@ -585,6 +595,7 @@ }, { "if": "recycling_type=centre", + "addExtraTags": ["amenity=recycling"], "then": { "en": "This is a recycling centre", "nl": "Dit is een recyclingcentrum", @@ -635,6 +646,7 @@ }, { "if": "recycling_type=pickup_point", + "addExtraTags": ["amenity=recycling"], "then": { "en": "This is a pickup point. The waste material is placed here without placing it in a dedicated container.", "nl": "Dit is een verzamelplaats zonder container waar het afval later opgepikt wordt.", @@ -646,6 +658,7 @@ }, { "if": "recycling_type=dump", + "addExtraTags": ["amenity=recycling"], "then": { "en": "This is a dump where the waste material is stacked.", "nl": "Dit is een afvalhoop waar het afvalmateriaal bovenop elkaar gestapeld wordt.", diff --git a/assets/layers/route_marker/bicycle_route_marker.jpg b/assets/layers/route_marker/bicycle_route_marker.jpg new file mode 100644 index 000000000..6a576df9f Binary files /dev/null and b/assets/layers/route_marker/bicycle_route_marker.jpg differ diff --git a/assets/layers/route_marker/bicycle_route_marker.jpg.license b/assets/layers/route_marker/bicycle_route_marker.jpg.license new file mode 100644 index 000000000..28cb665ca --- /dev/null +++ b/assets/layers/route_marker/bicycle_route_marker.jpg.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: Segubi +SPDX-License-Identifier: CC0-1.0 \ No newline at end of file diff --git a/assets/layers/route_marker/license_info.json b/assets/layers/route_marker/license_info.json new file mode 100644 index 000000000..0786ccda3 --- /dev/null +++ b/assets/layers/route_marker/license_info.json @@ -0,0 +1,28 @@ +[ + { + "path": "bicycle_route_marker.jpg", + "license": "CC0-1.0", + "authors": [ + "Segubi" + ], + "sources": [ + "https://wiki.openstreetmap.org/wiki/File:Route_marker_Germany_Zwischenwegweiser_Radverkehrsnetz_NRW.jpg" + ] + }, + { + "path": "route_marker.svg", + "license": "CC0-1.0", + "authors": [ + "Robin van der Linde" + ], + "sources": [] + }, + { + "path": "walking_route_marker.jpg", + "license": "CC0-1.0", + "authors": [ + "Robin van der Linde" + ], + "sources": [] + } +] \ No newline at end of file diff --git a/assets/layers/route_marker/route_marker.json b/assets/layers/route_marker/route_marker.json new file mode 100644 index 000000000..379c9b310 --- /dev/null +++ b/assets/layers/route_marker/route_marker.json @@ -0,0 +1,101 @@ +{ + "id": "route_marker", + "name": { + "en": "Route markers" + }, + "description": { + "en": "Route markers are small markers often found along official hiking/cycling/riding/skiing routes to indicate the direction of the route." + }, + "source": { + "osmTags": "information=route_marker" + }, + "minzoom": 14, + "title": { + "render": { + "en": "Route marker" + } + }, + "pointRendering": [ + { + "location": [ + "centroid", + "point" + ], + "marker": [ + { + "icon": "./assets/layers/route_marker/route_marker.svg" + } + ] + } + ], + "presets": [ + { + "title": { + "en": "a route marker" + }, + "tags": [ + "tourism=information", + "information=route_marker" + ], + "description": { + "en": "A route marker is a small marker often found along official hiking/cycling/riding/skiing routes to indicate the direction of the route." + }, + "exampleImages": [ + "./assets/layers/route_marker/bicycle_route_marker.jpg", + "./assets/layers/route_marker/walking_route_marker.jpg" + ] + } + ], + "tagRenderings": [ + "images", + { + "id": "type", + "question": { + "en": "For what kind of route is this marker?" + }, + "multiAnswer": true, + "mappings": [ + { + "if": "bicycle=yes", + "ifnot": "biycle=", + "then": { + "en": "This is a route marker for a bicycle route." + } + }, + { + "if": "hiking=yes", + "ifnot": "hiking=", + "then": { + "en": "This is a route marker for a hiking route." + } + }, + { + "if": "mtb=yes", + "ifnot": "mtb=", + "then": { + "en": "This is a route marker for a mountain bike route." + } + }, + { + "if": "horse=yes", + "ifnot": "horse=", + "then": { + "en": "This is a route marker for a horse riding route." + } + }, + { + "if": "ski=yes", + "ifnot": "ski=", + "then": { + "en": "This is a route marker for a ski route." + } + } + ] + } + ], + "deletion": true, + "allowMove": { + "enableImproveAccuracy": true, + "enableRelocation": false + } +} diff --git a/assets/layers/route_marker/route_marker.svg b/assets/layers/route_marker/route_marker.svg new file mode 100644 index 000000000..7dd5e4a1b --- /dev/null +++ b/assets/layers/route_marker/route_marker.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/layers/route_marker/route_marker.svg.license b/assets/layers/route_marker/route_marker.svg.license new file mode 100644 index 000000000..75299f884 --- /dev/null +++ b/assets/layers/route_marker/route_marker.svg.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: Robin van der Linde +SPDX-License-Identifier: CC0-1.0 \ No newline at end of file diff --git a/assets/layers/route_marker/walking_route_marker.jpg b/assets/layers/route_marker/walking_route_marker.jpg new file mode 100644 index 000000000..65e20cb83 Binary files /dev/null and b/assets/layers/route_marker/walking_route_marker.jpg differ diff --git a/assets/layers/route_marker/walking_route_marker.jpg.license b/assets/layers/route_marker/walking_route_marker.jpg.license new file mode 100644 index 000000000..75299f884 --- /dev/null +++ b/assets/layers/route_marker/walking_route_marker.jpg.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: Robin van der Linde +SPDX-License-Identifier: CC0-1.0 \ No newline at end of file diff --git a/assets/layers/school/school.json b/assets/layers/school/school.json index fcbafa629..f7d15b347 100644 --- a/assets/layers/school/school.json +++ b/assets/layers/school/school.json @@ -9,6 +9,19 @@ "cs": "Základní a střední školy" }, "description": "Schools giving primary and secondary education and post-secondary, non-tertiary education. Note that this level of education does not imply an age of the pupiles", + "source": { + "osmTags": "amenity=school" + }, + "calculatedTags": [ + "_enclosing=enclosingFeatures(feat)('school').map(f => f.feat.properties.id)", + "_is_enclosed=feat.properties._enclosing != '[]'" + ], + "isShown": { + "or": [ + "building=", + "_is_enclosed!=true" + ] + }, "minzoom": 12, "title": { "render": { @@ -21,16 +34,55 @@ "cs": "Škola {name}" } }, - "calculatedTags": [ - "_enclosing=enclosingFeatures(feat)('school').map(f => f.feat.properties.id)", - "_is_enclosed=feat.properties._enclosing != '[]'" + "pointRendering": [ + { + "label": { + "mappings": [ + { + "if": "name~*", + "then": "
    {name}
    " + } + ] + }, + "iconSize": "40,40", + "location": [ + "point", + "centroid" + ], + "anchor": "center", + "marker": [ + { + "icon": "circle", + "color": "white" + }, + { + "icon": "./assets/layers/school/school.svg" + } + ] + } + ], + "lineRendering": [ + { + "color": "#fcd862", + "width": 1 + } + ], + "presets": [ + { + "tags": [ + "amenity=school", + "fixme=Added with MapComplete, the precise geometry should still be drawn" + ], + "title": { + "en": "a primary or secondary school", + "nl": "een lagere of middelbare school", + "de": "eine Grundschule oder weiterführende Schule", + "fr": "une école primaire ou secondaire", + "ca": "una escola de primària o secundària", + "cs": "základní nebo střední škola" + } + } ], - "isShown": { - "or": [ - "building=", - "_is_enclosed!=true" - ] - }, "tagRenderings": [ { "render": { @@ -409,47 +461,5 @@ } } } - ], - "presets": [ - { - "tags": [ - "amenity=school", - "fixme=Added with MapComplete, the precise geometry should still be drawn" - ], - "title": { - "en": "a primary or secondary school", - "nl": "een lagere of middelbare school", - "de": "eine Grundschule oder weiterführende Schule", - "fr": "une école primaire ou secondaire", - "ca": "una escola de primària o secundària", - "cs": "základní nebo střední škola" - } - } - ], - "source": { - "osmTags": "amenity=school" - }, - "mapRendering": [ - { - "icon": "circle:white;./assets/layers/school/school.svg", - "label": { - "mappings": [ - { - "if": "name~*", - "then": "
    {name}
    " - } - ] - }, - "iconSize": "40,40", - "location": [ - "point", - "centroid" - ], - "anchor": "center" - }, - { - "color": "#fcd862", - "width": 1 - } ] } diff --git a/assets/layers/selected_element/selected_element.json b/assets/layers/selected_element/selected_element.json index 5cf401638..4b58dea06 100644 --- a/assets/layers/selected_element/selected_element.json +++ b/assets/layers/selected_element/selected_element.json @@ -9,9 +9,8 @@ "cs": "Zvýrazní aktuálně vybraný prvek. Přepište tuto vrstvu, aby měla různé barvy" }, "source": "special", - "mapRendering": [ + "pointRendering": [ { - "icon": "circle:red", "iconSize": "1,1", "location": [ "point", @@ -19,7 +18,14 @@ ], "css": "box-shadow: red 0 0 20px 20px; z-index: -1; height: 1px; width: 1px;", "cssClasses": "block relative rounded-full", - "anchor": "center" + "anchor": "center", + "marker": [ + { + "icon": "circle", + "color": "red" + } + ] } - ] + ], + "lineRendering": [] } diff --git a/assets/layers/shelter/shelter.json b/assets/layers/shelter/shelter.json index 3aa82308d..5b2f7a77a 100644 --- a/assets/layers/shelter/shelter.json +++ b/assets/layers/shelter/shelter.json @@ -30,15 +30,20 @@ "cs": "Přístřešek" } }, - "mapRendering": [ + "pointRendering": [ { "location": [ "point", "centroid" ], - "icon": "./assets/layers/shelter/shelter.svg" + "marker": [ + { + "icon": "./assets/layers/shelter/shelter.svg" + } + ] } ], + "lineRendering": [], "tagRenderings": [ { "id": "shelter-type", diff --git a/assets/layers/shops/shops.json b/assets/layers/shops/shops.json index b4aab0894..8cc53cc9a 100644 --- a/assets/layers/shops/shops.json +++ b/assets/layers/shops/shops.json @@ -13,7 +13,19 @@ "pa_PK": "دکان", "cs": "Obchod" }, - "minzoom": 12, + "description": { + "en": "A shop", + "fr": "Un magasin", + "ja": "ショップ", + "nl": "Een winkel", + "ru": "Магазин", + "de": "Ein Geschäft", + "eo": "Butiko", + "hu": "Egy bolt", + "es": "Una tienda", + "ca": "Una botiga", + "cs": "Obchod" + }, "source": { "osmTags": { "and": [ @@ -28,6 +40,7 @@ ] } }, + "minzoom": 12, "title": { "render": { "en": "Shop", @@ -83,19 +96,126 @@ } ] }, - "description": { - "en": "A shop", - "fr": "Un magasin", - "ja": "ショップ", - "nl": "Een winkel", - "ru": "Магазин", - "de": "Ein Geschäft", - "eo": "Butiko", - "hu": "Egy bolt", - "es": "Una tienda", - "ca": "Una botiga", - "cs": "Obchod" - }, + "pointRendering": [ + { + "marker": [ + { + "icon": "circle", + "color": "white" + }, + { + "icon": { + "builtin": "id_presets.shop_rendering", + "override": { + "render": "./assets/layers/id_presets/maki-shop.svg", + "+mappings": [ + { + "#": "Layer icon rendering", + "if": "id=", + "then": "./assets/layers/id_presets/maki-shop.svg" + }, + { + "if": { + "or": [ + "shop=vacant", + "shop=disused", + "disused:shop=yes" + ] + }, + "then": "./assets/layers/shops/shop-disused.svg" + }, + { + "if": "craft=shoemaker", + "then": "./assets/layers/id_presets/temaki-hammer_shoe.svg" + } + ], + "mappings+": [ + { + "if": "craft=key_cutter", + "then": "./assets/layers/id_presets/fas-key.svg" + } + ] + } + } + } + ], + "iconBadges": [ + { + "if": "opening_hours~*", + "then": "icons.isOpen" + }, + { + "if": { + "or": [ + "organic=yes", + "organic=only" + ] + }, + "then": "./assets/layers/food/organic.svg" + }, + { + "if": { + "or": [ + "service:key_cutting=yes", + "craft=key_cutter" + ] + }, + "then": "./assets/layers/id_presets/fas-key.svg" + } + ], + "label": { + "mappings": [ + { + "if": "name~*", + "then": "
    {name}
    " + } + ] + }, + "iconSize": "40,40", + "location": [ + "point", + "centroid" + ], + "anchor": "center" + } + ], + "lineRendering": [ + { + "color": "#00f", + "width": "8" + } + ], + "presets": [ + { + "tags": [ + "shop=yes" + ], + "title": { + "en": "a shop", + "fr": "une magasin", + "ru": "Магазин", + "ja": "店", + "nl": "een winkel", + "de": "ein Geschäft", + "eo": "Butiko", + "es": "una tienda", + "ca": "una botiga", + "cs": "obchod" + }, + "description": { + "en": "Add a new shop", + "fr": "Ajouter un nouveau magasin", + "ru": "Добавить новый магазин", + "ja": "新しい店を追加する", + "nl": "Voeg een nieuwe winkel toe", + "de": "Ein neues Geschäft hinzufügen", + "eo": "Enmeti novan butikon", + "es": "Añadir una nueva tienda", + "ca": "Afegir una botiga nova", + "cs": "Přidat nový obchod" + } + } + ], "tagRenderings": [ "images", { @@ -148,7 +268,8 @@ "fixme=freeform shop key used, to be reviewed" ] }, - "condition": "craft=" + "condition": "craft=", + "invalidValues": "shop=yes" } }, { @@ -275,6 +396,57 @@ } ] }, + { + "id": "key_cutter", + "question": { + "en": "Does this shop offer key cutting?" + }, + "mappings": [ + { + "if": "craft=key_cutter", + "#": "Many shoe repair shops are also specialized in key cutting and deserve the 'craft'-tag. Some other shops (often DIY- and home-improvement stores) offer it as a service, but rather limited/on the side", + "hideInAnswer": "shop!=shoe_repair", + "icon": "./assets/layers/id_presets/fas-key.svg", + "then": { + "en": "This shop is also specialized in key cutting" + }, + "addExtraTags": [ + "service:key_cutting=yes" + ] + }, + { + "if": "service:key_cutting=yes", + "icon": "./assets/layers/id_presets/fas-key.svg", + "then": { + "en": "This shop offers key cutting as a service" + } + }, + { + "if": { + "and": [ + "craft=", + "service:key_cutting=no" + ] + }, + "then": { + "en": "This shops does not offer key cutting as a service" + } + } + ], + "condition": { + "or": [ + "shop=shoe_repair", + "service:key_cutting~*", + "craft=key_cutting", + "shop=diy", + "shop=doityourself", + "shop=home_improvement", + "shop=hardware", + "shop=locksmith", + "shop=repair" + ] + } + }, "internet", "internet-fee", "internet-ssid", @@ -373,128 +545,6 @@ "questions", "reviews" ], - "presets": [ - { - "tags": [ - "shop=yes" - ], - "title": { - "en": "a shop", - "fr": "une magasin", - "ru": "Магазин", - "ja": "店", - "nl": "een winkel", - "de": "ein Geschäft", - "eo": "Butiko", - "es": "una tienda", - "ca": "una botiga", - "cs": "obchod" - }, - "description": { - "en": "Add a new shop", - "fr": "Ajouter un nouveau magasin", - "ru": "Добавить новый магазин", - "ja": "新しい店を追加する", - "nl": "Voeg een nieuwe winkel toe", - "de": "Ein neues Geschäft hinzufügen", - "eo": "Enmeti novan butikon", - "es": "Añadir una nueva tienda", - "ca": "Afegir una botiga nova", - "cs": "Přidat nový obchod" - } - } - ], - "deletion": { - "softDeletionTags": { - "and": [ - "shop=", - "disused:shop:={shop}" - ] - }, - "extraDeleteReasons": [ - { - "explanation": { - "nl": "{title()} is permanent gestopt", - "en": "{title()} has closed down permanently", - "de": "{title()} wurde dauerhaft geschlossen", - "es": "{title()} ha cerrado permanentemente", - "fr": "{title()} a fermé définitivement", - "ca": "{title()} ha tancat permanentment", - "cs": "{title()} je trvale uzavřen" - }, - "changesetMessage": "shop_closed" - } - ] - }, - "allowMove": true, - "mapRendering": [ - { - "icon": { - "builtin": "id_presets.shop_rendering", - "override": { - "render": "./assets/layers/id_presets/maki-shop.svg", - "+mappings": [ - { - "#": "Layer icon rendering", - "if": "id=", - "then": "circle:white;./assets/layers/id_presets/maki-shop.svg" - }, - { - "if": { - "or": [ - "shop=vacant", - "shop=disused", - "disused:shop=yes" - ] - }, - "then": "circle:white;./assets/layers/shops/shop-disused.svg" - }, - { - "if": "craft=shoemaker", - "then": "circle:white;./assets/layers/id_presets/temaki-hammer_shoe.svg" - }, - { - "if": "craft=key_cutter", - "then": "circle:white;./assets/layers/id_presets/fas-key.svg" - } - ] - } - }, - "iconBadges": [ - { - "if": "opening_hours~*", - "then": "icons.isOpen" - }, - { - "if": { - "or": [ - "organic=yes", - "organic=only" - ] - }, - "then": "./assets/layers/food/organic.svg" - } - ], - "label": { - "mappings": [ - { - "if": "name~*", - "then": "
    {name}
    " - } - ] - }, - "iconSize": "40,40", - "location": [ - "point", - "centroid" - ], - "anchor": "center" - }, - { - "color": "#00f", - "width": "8" - } - ], "filter": [ "open_now", { @@ -563,15 +613,33 @@ ] } } - ], - "condition": { - "and": [ - "shop!=second_hand" - ] - } + ] }, "sugar_free", "gluten_free", "lactose_free" - ] + ], + "deletion": { + "softDeletionTags": { + "and": [ + "shop=", + "disused:shop:={shop}" + ] + }, + "extraDeleteReasons": [ + { + "explanation": { + "nl": "{title()} is permanent gestopt", + "en": "{title()} has closed down permanently", + "de": "{title()} wurde dauerhaft geschlossen", + "es": "{title()} ha cerrado permanentemente", + "fr": "{title()} a fermé définitivement", + "ca": "{title()} ha tancat permanentment", + "cs": "{title()} je trvale uzavřen" + }, + "changesetMessage": "shop_closed" + } + ] + }, + "allowMove": true } diff --git a/assets/layers/shower/shower.json b/assets/layers/shower/shower.json index c39ec566c..759004606 100644 --- a/assets/layers/shower/shower.json +++ b/assets/layers/shower/shower.json @@ -7,10 +7,17 @@ "ca": "Dutxa", "cs": "Sprcha" }, - "minzoom": 12, + "description": { + "en": "A layer showing (public) showers", + "de": "Eine Ebene mit (öffentlichen) Duschen", + "fr": "Une couche affichant les douches (publiques)", + "ca": "Una capa que mostra dutxes (públiques)", + "cs": "Vrstva zobrazující (veřejné) sprchy" + }, "source": { "osmTags": "amenity=shower" }, + "minzoom": 12, "title": { "render": { "en": "Shower", @@ -20,6 +27,30 @@ "cs": "Sprcha" } }, + "pointRendering": [ + { + "location": [ + "point", + "centroid" + ], + "iconBadges": [ + { + "if": "opening_hours~*", + "then": "icons.isOpen" + } + ], + "marker": [ + { + "icon": "circle", + "color": "white" + }, + { + "icon": "./assets/layers/shower/shower.svg" + } + ] + } + ], + "lineRendering": [], "presets": [ { "title": { @@ -241,27 +272,5 @@ "allowMove": { "enableImproveAccuracy": true, "enableRelocation": false - }, - "mapRendering": [ - { - "icon": "circle:white;./assets/layers/shower/shower.svg", - "location": [ - "point", - "centroid" - ], - "iconBadges": [ - { - "if": "opening_hours~*", - "then": "icons.isOpen" - } - ] - } - ], - "description": { - "en": "A layer showing (public) showers", - "de": "Eine Ebene mit (öffentlichen) Duschen", - "fr": "Une couche affichant les douches (publiques)", - "ca": "Una capa que mostra dutxes (públiques)", - "cs": "Vrstva zobrazující (veřejné) sprchy" } } diff --git a/assets/layers/slow_roads/slow_roads.json b/assets/layers/slow_roads/slow_roads.json index e7268d286..ccb9e7e03 100644 --- a/assets/layers/slow_roads/slow_roads.json +++ b/assets/layers/slow_roads/slow_roads.json @@ -1,9 +1,15 @@ { "id": "slow_roads", "name": { + "en": "Paths, carfree and slow roads", "nl": "Paadjes, trage wegen en autoluwe straten" }, - "minzoom": 16, + "description": { + "en": "All carfree roads", + "nl": "Alle verkeersvrije wegen", + "de": "Alle autofreien Straßen", + "ca": "Totes les carreteres sense cotxe" + }, "source": { "osmTags": { "and": [ @@ -22,47 +28,102 @@ ] } }, + "minzoom": 16, "title": { "render": { + "en": "Slow road", "nl": "Trage weg" }, "mappings": [ { "if": "name~*", "then": { + "*": "{name}", "nl": "{name}" } }, { "if": "highway=footway", "then": { + "en": "Footway", "nl": "Voetpad" } }, { "if": "highway=cycleway", "then": { + "en": "Cycleway", "nl": "Fietspad" } }, { "if": "highway=pedestrian", "then": { + "en": "Pedestrian street", "nl": "Voetgangersstraat" } }, { "if": "highway=living_street", "then": { + "en": "Living street", "nl": "Woonerf" } }, { "if": "highway=path", - "then": "Klein pad" + "then": { + "en": "Small path", + "nl": "Klein pad" + } } ] }, + "pointRendering": [ + { + "location": [ + "point" + ], + "marker": [ + { + "icon": "./assets/layers/slow_roads/slow_road.svg" + } + ] + } + ], + "lineRendering": [ + { + "color": "#eaba2a", + "width": "7", + "dashArray": { + "render": "", + "mappings": [ + { + "if": "highway=cycleway", + "then": "" + }, + { + "if": "highway=path", + "then": "0 12" + }, + { + "if": { + "or": [ + "highway=footway", + "highway=pedestrian" + ] + }, + "then": "12 18" + }, + { + "if": "highway=living_street", + "then": "12 12 0 12" + } + ] + } + } + ], + "presets": [], "tagRenderings": [ "images", { @@ -71,7 +132,8 @@ { "if": "highway=living_street", "then": { - "nl:": "
    Dit is een woonerf:
    • Voetgangers mogen hier de volledige breedte van de straat gebruiken
    • Gemotoriseerd verkeer mag maximaal 20km/h rijden
    " + "en": "This is a living street", + "nl": "
    Dit is een woonerf:
    • Voetgangers mogen hier de volledige breedte van de straat gebruiken
    • Gemotoriseerd verkeer mag maximaal 20km/h rijden
    " }, "icon": { "path": "./assets/layers/slow_roads/woonerf.svg", @@ -81,30 +143,35 @@ { "if": "highway=pedestrian", "then": { + "en": "This is a wide, carfree street", "nl": "Dit is een brede, autovrije straat" } }, { "if": "highway=footway", "then": { + "en": "This is a footway", "nl": "Dit is een voetpaadje" } }, { "if": "highway=path", "then": { + "en": "This is a small path", "nl": "Dit is een wegeltje of bospad" } }, { "if": "highway=bridleway", "then": { + "en": "This is a bridleway", "nl": "Dit is een ruiterswegel" } }, { "if": "highway=track", "then": { + "en": "This is a land access road", "nl": "Dit is een tractorspoor of weg om landbouwgrond te bereikken" } } @@ -112,6 +179,7 @@ }, { "question": { + "en": "What surface does this road have?", "nl": "Wat is de wegverharding van dit pad?" }, "render": { @@ -248,7 +316,10 @@ }, { "id": "slow_road_is_lit", - "question": "Is deze weg 's nachts verlicht?", + "question": { + "en": "Is this road lit at night?", + "nl": "Is deze weg 's nachts verlicht?" + }, "mappings": [ { "if": "lit=yes", @@ -256,54 +327,12 @@ }, { "if": "lit=no", - "then": "Niet verlicht" + "then": { + "en": "Not lit", + "nl": "Niet verlicht" + } } ] } - ], - "presets": [], - "mapRendering": [ - { - "icon": "./assets/layers/slow_roads/slow_road.svg", - "location": [ - "point" - ] - }, - { - "color": "#eaba2a", - "width": "7", - "dashArray": { - "render": "", - "mappings": [ - { - "if": "highway=cycleway", - "then": "" - }, - { - "if": "highway=path", - "then": "0 12" - }, - { - "if": { - "or": [ - "highway=footway", - "highway=pedestrian" - ] - }, - "then": "12 18" - }, - { - "if": "highway=living_street", - "then": "12 12 0 12" - } - ] - } - } - ], - "description": { - "en": "All carfree roads", - "nl": "Alle verkeersvrije wegen", - "de": "Alle autofreien Straßen", - "ca": "Totes les carreteres sense cotxe" - } + ] } diff --git a/assets/layers/speed_camera/speed_camera.json b/assets/layers/speed_camera/speed_camera.json index b46e881b0..046cc7d16 100644 --- a/assets/layers/speed_camera/speed_camera.json +++ b/assets/layers/speed_camera/speed_camera.json @@ -16,6 +16,10 @@ "ca": "Capa que mostra càmeres de velocitat", "cs": "Vrstva zobrazující rychlostní radary" }, + "source": { + "osmTags": "highway=speed_camera" + }, + "minzoom": 12, "title": { "render": { "en": "Speed Camera", @@ -26,10 +30,43 @@ "cs": "Rychlostní radar" } }, - "minzoom": 12, - "source": { - "osmTags": "highway=speed_camera" - }, + "pointRendering": [ + { + "location": [ + "point", + "centroid" + ], + "marker": [ + { + "icon": "square", + "color": "white" + }, + { + "icon": "./assets/layers/speed_camera/speed_camera.svg" + } + ] + } + ], + "lineRendering": [], + "presets": [ + { + "tags": [ + "highway=speed_camera" + ], + "title": { + "en": "a speed camera", + "de": "einen Blitzer", + "nl": "een flitspaal", + "es": "una cámara de velocidad", + "ca": "una càmera de velocitat", + "cs": "rychlostní radar" + }, + "snapToLayer": [ + "maxspeed" + ], + "maxSnapDistance": 10 + } + ], "tagRenderings": [ { "id": "maxspeed", @@ -77,34 +114,6 @@ "condition": "ref~*" } ], - "presets": [ - { - "tags": [ - "highway=speed_camera" - ], - "title": { - "en": "a speed camera", - "de": "einen Blitzer", - "nl": "een flitspaal", - "es": "una cámara de velocidad", - "ca": "una càmera de velocitat", - "cs": "rychlostní radar" - }, - "snapToLayer": [ - "maxspeed" - ], - "maxSnapDistance": 10 - } - ], - "mapRendering": [ - { - "icon": "square:white;./assets/layers/speed_camera/speed_camera.svg", - "location": [ - "point", - "centroid" - ] - } - ], "units": [ { "appliesToKey": [ diff --git a/assets/layers/speed_display/speed_display.json b/assets/layers/speed_display/speed_display.json index a41835c17..a29fed538 100644 --- a/assets/layers/speed_display/speed_display.json +++ b/assets/layers/speed_display/speed_display.json @@ -14,6 +14,10 @@ "ca": "Capa que mostra radars pedagògics que alerten als conductors de la seva velocitat.", "cs": "Vrstva zobrazující ukazatele rychlosti, které řidiče upozorňují na jejich rychlost." }, + "source": { + "osmTags": "highway=speed_display" + }, + "minzoom": 12, "title": { "render": { "en": "Speed Display", @@ -22,10 +26,34 @@ "cs": "Ukazatel rychlosti" } }, - "minzoom": 12, - "source": { - "osmTags": "highway=speed_display" - }, + "pointRendering": [ + { + "location": [ + "point", + "centroid" + ], + "marker": [ + { + "icon": "./assets/layers/speed_display/speed_display.svg" + } + ] + } + ], + "lineRendering": [], + "presets": [ + { + "title": { + "en": "a speed display", + "de": "eine Geschwindigkeitsanzeige", + "nl": "een snelheidsdisplay", + "ca": "un radar pedagògic", + "cs": "ukazatel rychlosti" + }, + "tags": [ + "highway=speed_display" + ] + } + ], "tagRenderings": [ { "id": "maxspeed", @@ -85,29 +113,6 @@ } } ], - "presets": [ - { - "title": { - "en": "a speed display", - "de": "eine Geschwindigkeitsanzeige", - "nl": "een snelheidsdisplay", - "ca": "un radar pedagògic", - "cs": "ukazatel rychlosti" - }, - "tags": [ - "highway=speed_display" - ] - } - ], - "mapRendering": [ - { - "location": [ - "point", - "centroid" - ], - "icon": "./assets/layers/speed_display/speed_display.svg" - } - ], "units": [ { "appliesToKey": [ diff --git a/assets/layers/split_point/split_point.json b/assets/layers/split_point/split_point.json index e35006cb2..c43c0921d 100644 --- a/assets/layers/split_point/split_point.json +++ b/assets/layers/split_point/split_point.json @@ -1,19 +1,28 @@ { "id": "split_point", - "description": "Layer rendering the little scissors for the minimap in the 'splitRoadWizard'", - "minzoom": 1, - "source": "special", "name": "Split point", + "description": "Layer rendering the little scissors for the minimap in the 'splitRoadWizard'", + "source": "special", + "minzoom": 1, "title": "Split point", - "mapRendering": [ + "pointRendering": [ { "location": [ "point", "centroid" ], - "icon": "circle:white;./assets/svg/scissors.svg", "iconSize": "30,30", - "anchor": "center" + "anchor": "center", + "marker": [ + { + "icon": "circle", + "color": "white" + }, + { + "icon": "./assets/svg/scissors.svg" + } + ] } - ] + ], + "lineRendering": [] } diff --git a/assets/layers/split_road/split_road.json b/assets/layers/split_road/split_road.json index 3fad3696c..13a6d3cfc 100644 --- a/assets/layers/split_road/split_road.json +++ b/assets/layers/split_road/split_road.json @@ -1,19 +1,25 @@ { "id": "split_road", - "description": "Layer rendering the way to split in the 'splitRoadWizard'. This one is used instead of the variable rendering by the themes themselves, as they might not always be very visible", - "minzoom": 1, - "source": "special", "name": null, + "description": "Layer rendering the way to split in the 'splitRoadWizard'. This one is used instead of the variable rendering by the themes themselves, as they might not always be very visible", + "source": "special", + "minzoom": 1, "title": null, - "mapRendering": [ + "pointRendering": [ { "location": [ "point" ], - "icon": "bug", "iconSize": "30,30", - "anchor": "center" - }, + "anchor": "center", + "marker": [ + { + "icon": "bug" + } + ] + } + ], + "lineRendering": [ { "width": "8", "color": "black" diff --git a/assets/layers/sport_pitch/sport_pitch.json b/assets/layers/sport_pitch/sport_pitch.json index 13fbba20c..3ac8d36a4 100644 --- a/assets/layers/sport_pitch/sport_pitch.json +++ b/assets/layers/sport_pitch/sport_pitch.json @@ -11,7 +11,16 @@ "es": "Pistas de deportes", "cs": "Sportovní hřiště" }, - "minzoom": 12, + "description": { + "nl": "Een sportterrein", + "fr": "Un terrain de sport", + "en": "A sport pitch", + "it": "Un campo sportivo", + "ru": "Спортивная площадка", + "de": "Ein Sportplatz", + "es": "Una pista de deportes", + "cs": "Sportovní hřiště" + }, "source": { "osmTags": { "and": [ @@ -22,6 +31,7 @@ "calculatedTags": [ "_size_classification=Number(feat.properties._surface) < 200 ? 'small' : (Number(feat.properties._surface) < 750 ? 'medium' : 'large') " ], + "minzoom": 12, "title": { "render": { "nl": "Sportterrein", @@ -35,16 +45,128 @@ "cs": "Sportovní hřiště" } }, - "description": { - "nl": "Een sportterrein", - "fr": "Un terrain de sport", - "en": "A sport pitch", - "it": "Un campo sportivo", - "ru": "Спортивная площадка", - "de": "Ein Sportplatz", - "es": "Una pista de deportes", - "cs": "Sportovní hřiště" - }, + "pointRendering": [ + { + "marker": [ + { + "icon": "circle", + "color": "white" + }, + { + "icon": { + "render": "./assets/layers/sport_pitch/sport_pitch.svg", + "mappings": [ + { + "if": { + "or": [ + "sport=baseball", + "sport=basketball", + "sport=beachvolleyball", + "sport=boules", + "sport=skateboard", + "sport=soccer", + "sport=table_tennis", + "sport=tennis", + "sport=volleyball", + "sport=equestrian" + ] + }, + "then": "./assets/layers/sport_pitch/{sport}.svg" + } + ] + } + } + ], + "iconBadges": [ + { + "if": { + "and": [ + "opening_hours!=24/7", + "opening_hours~*" + ] + }, + "then": "icons.isOpen" + }, + { + "if": { + "or": [ + "access=customers", + "access=private", + "access=no" + ] + }, + "then": "circle:white;./assets/layers/sport_pitch/lock.svg" + } + ], + "iconSize": { + "render": "25,25,center", + "mappings": [ + { + "if": { + "or": [ + "_size_classification=medium", + "id~node/.*" + ] + }, + "then": "32,32,center" + }, + { + "if": "_size_classification=small", + "then": "25,25,center" + }, + { + "if": "_size_classification=large", + "then": "40,40,center" + } + ] + }, + "location": [ + "point", + "centroid" + ] + } + ], + "lineRendering": [ + { + "color": "#00cc00", + "width": "1", + "fill": "false" + } + ], + "presets": [ + { + "title": { + "nl": "een ping-pong tafel", + "fr": "une table de ping-pong", + "en": "a tabletennis table", + "it": "una tavolo da tennistavolo", + "ru": "Стол для настольного тенниса", + "de": "eine Tischtennisplatte", + "cs": "stůl na stolní tenis" + }, + "tags": [ + "leisure=pitch", + "sport=table_tennis" + ] + }, + { + "title": { + "nl": "een sportterrein", + "fr": "une terrain de sport", + "en": "a sport pitch", + "ru": "Спортивная площадка", + "it": "una campo sportivo", + "de": "einen Sportplatz", + "es": "una pista de deportes", + "ca": "una pista d'esports", + "cs": "sportovní hřiště" + }, + "tags": [ + "leisure=pitch", + "fixme=Toegevoegd met MapComplete, geometry nog uit te tekenen" + ] + } + ], "tagRenderings": [ "images", { @@ -587,118 +709,6 @@ "render": "{reviews(name, sportpitch)}" } ], - "presets": [ - { - "title": { - "nl": "een ping-pong tafel", - "fr": "une table de ping-pong", - "en": "a tabletennis table", - "it": "una tavolo da tennistavolo", - "ru": "Стол для настольного тенниса", - "de": "eine Tischtennisplatte", - "cs": "stůl na stolní tenis" - }, - "tags": [ - "leisure=pitch", - "sport=table_tennis" - ] - }, - { - "title": { - "nl": "een sportterrein", - "fr": "une terrain de sport", - "en": "a sport pitch", - "ru": "Спортивная площадка", - "it": "una campo sportivo", - "de": "einen Sportplatz", - "es": "una pista de deportes", - "ca": "una pista d'esports", - "cs": "sportovní hřiště" - }, - "tags": [ - "leisure=pitch", - "fixme=Toegevoegd met MapComplete, geometry nog uit te tekenen" - ] - } - ], - "mapRendering": [ - { - "icon": { - "render": "circle:white;./assets/layers/sport_pitch/sport_pitch.svg", - "mappings": [ - { - "if": { - "or": [ - "sport=baseball", - "sport=basketball", - "sport=beachvolleyball", - "sport=boules", - "sport=skateboard", - "sport=soccer", - "sport=table_tennis", - "sport=tennis", - "sport=volleyball", - "sport=equestrian" - ] - }, - "then": "circle:white;./assets/layers/sport_pitch/{sport}.svg" - } - ] - }, - "iconBadges": [ - { - "if": { - "and": [ - "opening_hours!=24/7", - "opening_hours~*" - ] - }, - "then": "icons.isOpen" - }, - { - "if": { - "or": [ - "access=customers", - "access=private", - "access=no" - ] - }, - "then": "circle:white;./assets/layers/sport_pitch/lock.svg" - } - ], - "iconSize": { - "render": "25,25,center", - "mappings": [ - { - "if": { - "or": [ - "_size_classification=medium", - "id~node/.*" - ] - }, - "then": "32,32,center" - }, - { - "if": "_size_classification=small", - "then": "25,25,center" - }, - { - "if": "_size_classification=large", - "then": "40,40,center" - } - ] - }, - "location": [ - "point", - "centroid" - ] - }, - { - "color": "#00cc00", - "width": "1", - "fill": "false" - } - ], "filter": [ { "id": "accessibility", diff --git a/assets/layers/sports_centre/sports_centre.json b/assets/layers/sports_centre/sports_centre.json index 11776dfac..ff1cbb60c 100644 --- a/assets/layers/sports_centre/sports_centre.json +++ b/assets/layers/sports_centre/sports_centre.json @@ -12,10 +12,10 @@ "ca": "En aquesta capa es poden trobar centres esportius interiors i exteriors", "cs": "Na této vrstvě najdete krytá a venkovní sportovní centra" }, - "minzoom": 12, "source": { "osmTags": "leisure=sports_centre" }, + "minzoom": 12, "title": { "render": { "en": "Sports centre", @@ -30,13 +30,34 @@ } ] }, - "tagRenderings": [ - "images", - "opening_hours", - "phone", - "website", - "email", - "wheelchair-access" + "pointRendering": [ + { + "iconBadges": [ + { + "if": "opening_hours~*", + "then": "icons.isOpen" + } + ], + "location": [ + "point", + "centroid" + ], + "marker": [ + { + "icon": "circle", + "color": "white" + }, + { + "icon": "./assets/layers/sports_centre/sports_centre.svg" + } + ] + } + ], + "lineRendering": [ + { + "color": "darkgreen", + "fill": "no" + } ], "presets": [ { @@ -51,29 +72,18 @@ ] } ], - "mapRendering": [ - { - "icon": "circle:white;./assets/layers/sports_centre/sports_centre.svg", - "iconBadges": [ - { - "if": "opening_hours~*", - "then": "icons.isOpen" - } - ], - "location": [ - "point", - "centroid" - ] - }, - { - "color": "darkgreen", - "fill": "no" - } + "tagRenderings": [ + "images", + "opening_hours", + "phone", + "website", + "email", + "wheelchair-access" + ], + "filter": [ + "open_now" ], "allowMove": { "enableImproveAccuracy": true - }, - "filter": [ - "open_now" - ] + } } diff --git a/assets/layers/stairs/stairs.json b/assets/layers/stairs/stairs.json index a538a1b53..cb7561a70 100644 --- a/assets/layers/stairs/stairs.json +++ b/assets/layers/stairs/stairs.json @@ -14,6 +14,10 @@ "ca": "Capa que mostra escales i escales mecàniques", "cs": "Vrstva zobrazující schody a eskalátory" }, + "source": { + "osmTags": "highway=steps" + }, + "minzoom": 17, "title": { "render": { "en": "Stairs", @@ -35,10 +39,14 @@ } ] }, - "minzoom": 17, - "source": { - "osmTags": "highway=steps" - }, + "pointRendering": [], + "lineRendering": [ + { + "color": "gray", + "width": 10, + "dashArray": "6 12" + } + ], "tagRenderings": [ "images", { @@ -260,12 +268,5 @@ } ] } - ], - "mapRendering": [ - { - "color": "gray", - "width": 10, - "dashArray": "6 12" - } ] } diff --git a/assets/layers/street_lamps/street_lamps.json b/assets/layers/street_lamps/street_lamps.json index 1ba56080a..0f11997ad 100644 --- a/assets/layers/street_lamps/street_lamps.json +++ b/assets/layers/street_lamps/street_lamps.json @@ -8,6 +8,14 @@ "ca": "Fanals", "cs": "Pouliční Lampy" }, + "description": { + "en": "A layer showing street lights", + "nl": "Een laag die alle straatlantaarns toont", + "de": "Eine Ebene mit Straßenbeleuchtung", + "es": "Una capa que muestra luces callejeras", + "ca": "Una capa que mostra els llums del carrer", + "cs": "Vrstva zobrazující pouliční osvětlení" + }, "source": { "osmTags": "highway=street_lamp" }, @@ -35,13 +43,12 @@ } ] }, - "mapRendering": [ + "pointRendering": [ { "location": [ "point", "centroid" ], - "icon": "./assets/layers/street_lamps/street_lamp.svg", "iconBadges": [ { "if": "light:colour~*", @@ -49,9 +56,15 @@ } ], "iconSize": "40,40", - "anchor": "bottom" + "anchor": "bottom", + "marker": [ + { + "icon": "./assets/layers/street_lamps/street_lamp.svg" + } + ] } ], + "lineRendering": [], "presets": [ { "title": { @@ -448,7 +461,6 @@ "en": "This lamp has 1 fixture", "nl": "Deze lantaarn heeft 1 lamp", "de": "Diese Straßenlaterne hat 1 Leuchte", - "es": "", "ca": "Aquest fanal té 1 aparell", "cs": "Tato lampa má 1 světlo" } @@ -551,13 +563,5 @@ "allowMove": { "enableImproveAccuracy": true, "enableRelocation": false - }, - "description": { - "en": "A layer showing street lights", - "nl": "Een laag die alle straatlantaarns toont", - "de": "Eine Ebene mit Straßenbeleuchtung", - "es": "Una capa que muestra luces callejeras", - "ca": "Una capa que mostra els llums del carrer", - "cs": "Vrstva zobrazující pouliční osvětlení" } } diff --git a/assets/layers/surveillance_camera/surveillance_camera.json b/assets/layers/surveillance_camera/surveillance_camera.json index 7a429a51f..049962d33 100644 --- a/assets/layers/surveillance_camera/surveillance_camera.json +++ b/assets/layers/surveillance_camera/surveillance_camera.json @@ -11,7 +11,15 @@ "es": "Cámaras de vigilancia", "cs": "Bezpečnostní kamery" }, - "minzoom": 12, + "description": { + "en": "This layer shows surveillance cameras and allows a contributor to update information and add new cameras", + "nl": "Deze laag toont bewakingscamera's en laat toe om de informatie te verrijken en om nieuwe camera\"s toe te voegen", + "de": "Diese Ebene zeigt die Überwachungskameras an und ermöglicht es, Informationen zu aktualisieren und neue Kameras hinzuzufügen", + "es": "Esta capa muestra las cámaras de vigilancia y permite a quien colabora, actualizar la información y agregar nuevas cámaras", + "fr": "Cette couche affiche les caméras de surveillance et permet au contributeur de mettre à jour les informations et ajouter de nouvelles caméras", + "ca": "Aquesta capa mostra les càmeres de vigilància i permet a qui col·labora, actualitzar la informació i afegir noves càmeres", + "cs": "Tato vrstva zobrazuje sledovací kamery a umožňuje přispěvateli aktualizovat informace a přidávat nové kamery" + }, "source": { "osmTags": { "and": [ @@ -26,6 +34,7 @@ ] } }, + "minzoom": 12, "title": { "render": { "en": "Surveillance Camera", @@ -40,6 +49,163 @@ "cs": "Bezpečnostní kamera" } }, + "pointRendering": [ + { + "marker": [ + { + "icon": { + "render": "./assets/themes/surveillance/logo.svg", + "mappings": [ + { + "if": "surveillance:type=ALPR", + "then": "./assets/layers/surveillance_camera/ALPR.svg" + }, + { + "if": "camera:type=dome", + "then": "./assets/themes/surveillance/dome.svg" + }, + { + "if": "_direction:leftright=right", + "then": "./assets/themes/surveillance/cam_right.svg" + }, + { + "if": "_direction:leftright=left", + "then": "./assets/themes/surveillance/cam_left.svg" + } + ] + } + } + ], + "iconSize": { + "mappings": [ + { + "if": { + "and": [ + "camera:type=fixed", + "surveillance:type=camera", + "_direction:leftright~*" + ] + }, + "then": "100,35,center" + } + ], + "render": "35,35,center" + }, + "location": [ + "point", + "centroid" + ], + "rotation": { + "#": "Note: {camera:direction} is substituted by a number, giving the string 'calc(123deg + 90deg)' ; it is this string that is used as css property, which interprets the calc", + "render": "calc({_direction:numerical}deg + 90deg)", + "mappings": [ + { + "if": { + "or": [ + "camera:type=dome", + "surveillance:type=ALPR" + ] + }, + "then": "0" + }, + { + "if": "_direction:leftright=right", + "then": "calc({_direction:numerical}deg - 90deg)" + } + ] + } + } + ], + "lineRendering": [ + { + "color": "#f00", + "width": "8" + } + ], + "presets": [ + { + "tags": [ + "man_made=surveillance", + "surveillance:type=camera" + ], + "title": { + "en": "a surveillance camera", + "nl": "een bewakingscamera", + "de": "eine Überwachungskamera", + "es": "una cámara de vigilancia", + "fr": "une caméra de surveillance", + "ca": "una càmera de vigilància", + "cs": "bezpečnostní kamera" + } + }, + { + "tags": [ + "man_made=surveillance", + "surveillance:type=camera", + "camera:mount=wall" + ], + "title": { + "en": "a surveillance camera mounted on a wall", + "nl": "een bewakingscamera gemonteerd op een muur", + "de": "eine an einer Wand montierte Überwachungskamera", + "es": "una cámara de vigilancia montada en una pared", + "fr": "une caméra de surveillance fixée au mur", + "ca": "una càmera de vigilància muntada en una paret", + "cs": "sledovací kamera namontovaná na zdi" + }, + "snapToLayer": [ + "walls_and_buildings" + ] + }, + { + "tags": [ + "man_made=surveillance", + "surveillance:type=ALPR" + ], + "title": { + "en": "an ALPR camera (Automatic Number Plate Reader)", + "ca": "una càmera ALPR (lector automàtic de matrícules, per les seves sigles en anglès)", + "de": "Eine Kamera zur automatischen Nummernschilderkennung", + "cs": "kamera ALPR (automatická čtečka registračních značek)" + }, + "description": { + "en": "An ALPR typically has two lenses and an array of infrared lights.", + "ca": "Un ALPR normalment té dues lents i una sèrie de llums infrarojes.", + "de": "Eine automatische Nummernschilderkennung hat üblicherweise zwei Linsen und ein Reihe aus Infrarotlichtern.", + "cs": "ALPR má obvykle dvě čočky a pole infračervených světel." + }, + "exampleImages": [ + "./assets/layers/surveillance_camera/ALPR_Example.jpg", + "./assets/layers/surveillance_camera/ALPR_Example2.jpg" + ] + }, + { + "tags": [ + "man_made=surveillance", + "surveillance:type=ALPR", + "camera:mount=wall" + ], + "title": { + "en": "an ALPR camera (Automatic Number Plate Reader) mounted on a wall", + "ca": "una càmera ALPR (lector automàtic de matrícules) muntada a la paret", + "de": "eine Kamera zur Nummernschilderkennung, die an einer Wand befestigt ist", + "cs": "kamera ALPR (Automatická čtečka registračních značek) namontovaná na zdi" + }, + "description": { + "en": "An ALPR typically has two lenses and an array of infrared lights.", + "ca": "Un ALPR normalment té dues lents i una sèrie de llums infrarojes.", + "de": "Eine automatische Nummernschilderkennung hat üblicherweise zwei Linsen und ein Reihe aus Infrarotlichtern.", + "cs": "ALPR má obvykle dvě čočky a pole infračervených světel." + }, + "exampleImages": [ + "./assets/layers/surveillance_camera/ALPR_Example.jpg", + "./assets/layers/surveillance_camera/ALPR_Example2.jpg" + ], + "snapToLayer": [ + "walls_and_buildings" + ] + } + ], "tagRenderings": [ "images", { @@ -642,161 +808,5 @@ "id": "camera:mount" } ], - "presets": [ - { - "tags": [ - "man_made=surveillance", - "surveillance:type=camera" - ], - "title": { - "en": "a surveillance camera", - "nl": "een bewakingscamera", - "de": "eine Überwachungskamera", - "es": "una cámara de vigilancia", - "fr": "une caméra de surveillance", - "ca": "una càmera de vigilància", - "cs": "bezpečnostní kamera" - } - }, - { - "tags": [ - "man_made=surveillance", - "surveillance:type=camera", - "camera:mount=wall" - ], - "title": { - "en": "a surveillance camera mounted on a wall", - "nl": "een bewakingscamera gemonteerd op een muur", - "de": "eine an einer Wand montierte Überwachungskamera", - "es": "una cámara de vigilancia montada en una pared", - "fr": "une caméra de surveillance fixée au mur", - "ca": "una càmera de vigilància muntada en una paret", - "cs": "sledovací kamera namontovaná na zdi" - }, - "snapToLayer": "walls_and_buildings" - }, - { - "tags": [ - "man_made=surveillance", - "surveillance:type=ALPR" - ], - "title": { - "en": "an ALPR camera (Automatic Number Plate Reader)", - "ca": "una càmera ALPR (lector automàtic de matrícules, per les seves sigles en anglès)", - "de": "Eine Kamera zur automatischen Nummernschilderkennung", - "cs": "kamera ALPR (automatická čtečka registračních značek)" - }, - "description": { - "en": "An ALPR typically has two lenses and an array of infrared lights.", - "ca": "Un ALPR normalment té dues lents i una sèrie de llums infrarojes.", - "de": "Eine automatische Nummernschilderkennung hat üblicherweise zwei Linsen und ein Reihe aus Infrarotlichtern.", - "cs": "ALPR má obvykle dvě čočky a pole infračervených světel." - }, - "exampleImages": [ - "./assets/layers/surveillance_camera/ALPR_Example.jpg", - "./assets/layers/surveillance_camera/ALPR_Example2.jpg" - ] - }, - { - "tags": [ - "man_made=surveillance", - "surveillance:type=ALPR", - "camera:mount=wall" - ], - "title": { - "en": "an ALPR camera (Automatic Number Plate Reader) mounted on a wall", - "ca": "una càmera ALPR (lector automàtic de matrícules) muntada a la paret", - "de": "eine Kamera zur Nummernschilderkennung, die an einer Wand befestigt ist", - "cs": "kamera ALPR (Automatická čtečka registračních značek) namontovaná na zdi" - }, - "description": { - "en": "An ALPR typically has two lenses and an array of infrared lights.", - "ca": "Un ALPR normalment té dues lents i una sèrie de llums infrarojes.", - "de": "Eine automatische Nummernschilderkennung hat üblicherweise zwei Linsen und ein Reihe aus Infrarotlichtern.", - "cs": "ALPR má obvykle dvě čočky a pole infračervených světel." - }, - "exampleImages": [ - "./assets/layers/surveillance_camera/ALPR_Example.jpg", - "./assets/layers/surveillance_camera/ALPR_Example2.jpg" - ], - "snapToLayer": "walls_and_buildings" - } - ], - "mapRendering": [ - { - "icon": { - "render": "./assets/themes/surveillance/logo.svg", - "mappings": [ - { - "if": "surveillance:type=ALPR", - "then": "./assets/layers/surveillance_camera/ALPR.svg" - }, - { - "if": "camera:type=dome", - "then": "./assets/themes/surveillance/dome.svg" - }, - { - "if": "_direction:leftright=right", - "then": "./assets/themes/surveillance/cam_right.svg" - }, - { - "if": "_direction:leftright=left", - "then": "./assets/themes/surveillance/cam_left.svg" - } - ] - }, - "iconSize": { - "mappings": [ - { - "if": { - "and": [ - "camera:type=fixed", - "surveillance:type=camera", - "_direction:leftright~*" - ] - }, - "then": "100,35,center" - } - ], - "render": "35,35,center" - }, - "location": [ - "point", - "centroid" - ], - "rotation": { - "#": "Note: {camera:direction} is substituted by a number, giving the string 'calc(123deg + 90deg)' ; it is this string that is used as css property, which interprets the calc", - "render": "calc({_direction:numerical}deg + 90deg)", - "mappings": [ - { - "if": { - "or": [ - "camera:type=dome", - "surveillance:type=ALPR" - ] - }, - "then": "0" - }, - { - "if": "_direction:leftright=right", - "then": "calc({_direction:numerical}deg - 90deg)" - } - ] - } - }, - { - "color": "#f00", - "width": "8" - } - ], - "deletion": true, - "description": { - "en": "This layer shows surveillance cameras and allows a contributor to update information and add new cameras", - "nl": "Deze laag toont bewakingscamera's en laat toe om de informatie te verrijken en om nieuwe camera\"s toe te voegen", - "de": "Diese Ebene zeigt die Überwachungskameras an und ermöglicht es, Informationen zu aktualisieren und neue Kameras hinzuzufügen", - "es": "Esta capa muestra las cámaras de vigilancia y permite a quien colabora, actualizar la información y agregar nuevas cámaras", - "fr": "Cette couche affiche les caméras de surveillance et permet au contributeur de mettre à jour les informations et ajouter de nouvelles caméras", - "ca": "Aquesta capa mostra les càmeres de vigilància i permet a qui col·labora, actualitzar la informació i afegir noves càmeres", - "cs": "Tato vrstva zobrazuje sledovací kamery a umožňuje přispěvateli aktualizovat informace a přidávat nové kamery" - } + "deletion": true } diff --git a/assets/layers/tertiary_education/tertiary_education.json b/assets/layers/tertiary_education/tertiary_education.json index c57432846..69aae353d 100644 --- a/assets/layers/tertiary_education/tertiary_education.json +++ b/assets/layers/tertiary_education/tertiary_education.json @@ -76,6 +76,64 @@ } ] }, + "pointRendering": [ + { + "location": [ + "point", + "centroid" + ], + "iconSize": "40,40", + "label": { + "mappings": [ + { + "if": "name~*", + "then": "
    {name}
    " + } + ] + }, + "anchor": "center", + "marker": [ + { + "icon": "circle", + "color": "white" + }, + { + "icon": "./assets/layers/school/college.svg" + } + ] + } + ], + "lineRendering": [ + { + "color": "#22f1f4", + "width": 1 + } + ], + "presets": [ + { + "title": { + "en": "a university", + "nl": "een universiteit", + "de": "eine Universität", + "fr": "une université", + "da": "et universitet", + "ca": "una universitat", + "cs": "univerzita" + }, + "description": { + "en": "An institute where tertiary education is given (at the level equivalent of a bachelors degree or higher). A single point per campus is enough - buildings and faculties should not be mapped with different university points.", + "nl": "Een onderwijsinstelling waar tertiair onderwijs wordt gegeven - dit is onderwijs waarvan het niveau overeenkomt met een bachelor of hoger is. Eén enkel punt per campus is genoeg - gebouwen en faculteiten worden hier niet op aangeduid.", + "de": "Eine Einrichtung, an der tertiäre Bildung vermittelt wird (auf dem Niveau eines Bachelor-Abschlusses oder höher). Ein einziger Punkt pro Campus ist ausreichend - Gebäude und Fakultäten sollten nicht mit Universitätspunkten gekennzeichnet werden.", + "fr": "Un institut où l'on dispense un enseignement supérieur (au niveau équivalent à un bachelor ou plus). Un simple point par campus est suffisant - les bâtiments et les facultés ne doivent pas être cartographiés avec différents points d'université.", + "ca": "Un institut on s'imparteix ensenyament terciari (al nivell equivalent de batxillerat o superior). N'hi ha prou amb un únic punt per campus: els edificis i les facultats no s'han de cartografiar amb diferents punts universitaris.", + "cs": "Institut, kde se poskytuje terciární vzdělání (na úrovni odpovídající bakalářskému titulu nebo vyšší). Stačí jeden bod na kampus - budovy a fakulty by neměly být mapovány s různými univerzitními body." + }, + "tags": [ + "amenity=university", + "fixme=Added with MapComplete, geometry to be drawn" + ] + } + ], "tagRenderings": [ { "id": "institution-kind", @@ -179,53 +237,5 @@ "website", "email", "phone" - ], - "mapRendering": [ - { - "location": [ - "point", - "centroid" - ], - "iconSize": "40,40", - "label": { - "mappings": [ - { - "if": "name~*", - "then": "
    {name}
    " - } - ] - }, - "icon": "circle:white;./assets/layers/school/college.svg", - "anchor": "center" - }, - { - "color": "#22f1f4", - "width": 1 - } - ], - "presets": [ - { - "title": { - "en": "a university", - "nl": "een universiteit", - "de": "eine Universität", - "fr": "une université", - "da": "et universitet", - "ca": "una universitat", - "cs": "univerzita" - }, - "description": { - "en": "An institute where tertiary education is given (at the level equivalent of a bachelors degree or higher). A single point per campus is enough - buildings and faculties should not be mapped with different university points.", - "nl": "Een onderwijsinstelling waar tertiair onderwijs wordt gegeven - dit is onderwijs waarvan het niveau overeenkomt met een bachelor of hoger is. Eén enkel punt per campus is genoeg - gebouwen en faculteiten worden hier niet op aangeduid.", - "de": "Eine Einrichtung, an der tertiäre Bildung vermittelt wird (auf dem Niveau eines Bachelor-Abschlusses oder höher). Ein einziger Punkt pro Campus ist ausreichend - Gebäude und Fakultäten sollten nicht mit Universitätspunkten gekennzeichnet werden.", - "fr": "Un institut où l'on dispense un enseignement supérieur (au niveau équivalent à un bachelor ou plus). Un simple point par campus est suffisant - les bâtiments et les facultés ne doivent pas être cartographiés avec différents points d'université.", - "ca": "Un institut on s'imparteix ensenyament terciari (al nivell equivalent de batxillerat o superior). N'hi ha prou amb un únic punt per campus: els edificis i les facultats no s'han de cartografiar amb diferents punts universitaris.", - "cs": "Institut, kde se poskytuje terciární vzdělání (na úrovni odpovídající bakalářskému titulu nebo vyšší). Stačí jeden bod na kampus - budovy a fakulty by neměly být mapovány s různými univerzitními body." - }, - "tags": [ - "amenity=university", - "fixme=Added with MapComplete, geometry to be drawn" - ] - } ] } diff --git a/assets/layers/ticket_machine/ticket_machine.json b/assets/layers/ticket_machine/ticket_machine.json index fd849a8f5..aa9318126 100644 --- a/assets/layers/ticket_machine/ticket_machine.json +++ b/assets/layers/ticket_machine/ticket_machine.json @@ -32,6 +32,41 @@ "cs": "Automat na jízdenky" } }, + "pointRendering": [ + { + "iconSize": "20,20", + "location": [ + "point", + "centroid" + ], + "anchor": "center", + "marker": [ + { + "icon": "square", + "color": "lightblue" + }, + { + "icon": "./assets/themes/stations/public_transport_tickets.svg" + } + ] + } + ], + "lineRendering": [], + "presets": [ + { + "tags": [ + "amenity=vending_machine", + "vending=public_transport_tickets" + ], + "title": { + "en": "a ticket machine", + "de": "einen Fahrkartenautomat", + "nl": "een kaartautomaat", + "ca": "una màquina de bitllets", + "cs": "automat na jízdenky" + } + } + ], "tagRenderings": [ "images", "level", @@ -83,32 +118,6 @@ "denominations-coins", "denominations-notes" ], - "presets": [ - { - "tags": [ - "amenity=vending_machine", - "vending=public_transport_tickets" - ], - "title": { - "en": "a ticket machine", - "de": "einen Fahrkartenautomat", - "nl": "een kaartautomaat", - "ca": "una màquina de bitllets", - "cs": "automat na jízdenky" - } - } - ], - "mapRendering": [ - { - "icon": "square:lightblue;./assets/themes/stations/public_transport_tickets.svg", - "iconSize": "20,20", - "location": [ - "point", - "centroid" - ], - "anchor": "center" - } - ], - "allowMove": true, - "deletion": true + "deletion": true, + "allowMove": true } diff --git a/assets/layers/ticket_validator/ticket_validator.json b/assets/layers/ticket_validator/ticket_validator.json index 9ae4b7931..c8dd109a6 100644 --- a/assets/layers/ticket_validator/ticket_validator.json +++ b/assets/layers/ticket_validator/ticket_validator.json @@ -24,6 +24,45 @@ "cs": "Validátor jízdenek" } }, + "pointRendering": [ + { + "iconSize": "20,20", + "location": [ + "point", + "centroid" + ], + "anchor": "center", + "marker": [ + { + "icon": "square", + "color": "green" + }, + { + "icon": "./assets/themes/stations/public_transport_tickets.svg" + } + ] + } + ], + "lineRendering": [], + "presets": [ + { + "tags": [ + "amenity=ticket_validator" + ], + "title": { + "en": "a ticket validator", + "de": "einen Fahrkartenentwerter", + "ca": "un validador de bitllets", + "cs": "validátor jízdenek" + }, + "description": { + "en": "A ticket validator to validate a public transport ticket. This can be either a digital reader, reading a card or ticket, or a machine stamping or punching a ticket.", + "de": "Ein Fahrkartenentwerter zur Entwertung einer Fahrkarte für öffentliche Verkehrsmittel. Dabei kann es sich entweder um ein digitales Lesegerät handeln, das eine Karte oder einen Fahrschein liest, oder um eine Maschine, die einen Fahrschein stempelt oder locht.", + "ca": "Un validador de bitllets per validar un bitllet de transport públic. Pot ser un lector digital, llegir una targeta o un bitllet, o una màquina que estampa o perfora un bitllet.", + "cs": "Ověřovač jízdenek k ověření platnosti jízdenky na veřejnou dopravu. Může to být buď digitální čtečka, která čte kartu nebo jízdenku, nebo stroj, který jízdenku orazítkuje nebo vyrazí." + } + } + ], "tagRenderings": [ "images", "level", @@ -120,36 +159,6 @@ } } ], - "presets": [ - { - "tags": [ - "amenity=ticket_validator" - ], - "title": { - "en": "a ticket validator", - "de": "einen Fahrkartenentwerter", - "ca": "un validador de bitllets", - "cs": "validátor jízdenek" - }, - "description": { - "en": "A ticket validator to validate a public transport ticket. This can be either a digital reader, reading a card or ticket, or a machine stamping or punching a ticket.", - "de": "Ein Fahrkartenentwerter zur Entwertung einer Fahrkarte für öffentliche Verkehrsmittel. Dabei kann es sich entweder um ein digitales Lesegerät handeln, das eine Karte oder einen Fahrschein liest, oder um eine Maschine, die einen Fahrschein stempelt oder locht.", - "ca": "Un validador de bitllets per validar un bitllet de transport públic. Pot ser un lector digital, llegir una targeta o un bitllet, o una màquina que estampa o perfora un bitllet.", - "cs": "Ověřovač jízdenek k ověření platnosti jízdenky na veřejnou dopravu. Může to být buď digitální čtečka, která čte kartu nebo jízdenku, nebo stroj, který jízdenku orazítkuje nebo vyrazí." - } - } - ], - "mapRendering": [ - { - "icon": "square:green;./assets/themes/stations/public_transport_tickets.svg", - "iconSize": "20,20", - "location": [ - "point", - "centroid" - ], - "anchor": "center" - } - ], - "allowMove": true, - "deletion": true + "deletion": true, + "allowMove": true } diff --git a/assets/layers/toilet/toilet.json b/assets/layers/toilet/toilet.json index 110709755..22bb4f1fb 100644 --- a/assets/layers/toilet/toilet.json +++ b/assets/layers/toilet/toilet.json @@ -13,10 +13,20 @@ "pa_PK": "ٹوئیلٹاں", "cs": "Toalety" }, - "minzoom": 12, + "description": { + "en": "A layer showing (public) toilets", + "nl": "Een laag die publieke toiletten toont", + "de": "Eine Ebene mit (öffentlichen) Toiletten", + "es": "Una capa que muestra baños (públicos)", + "fr": "Un calque montrant les toilettes (publiques)", + "da": "Et lag, der viser (offentlige) toiletter", + "ca": "Una capa que mostra banys (publics)", + "cs": "Vrstva zobrazující (veřejné) toalety" + }, "source": { "osmTags": "amenity=toilets" }, + "minzoom": 12, "title": { "render": { "en": "Toilet", @@ -32,6 +42,52 @@ "cs": "Toaleta" } }, + "pointRendering": [ + { + "iconBadges": [ + { + "if": "opening_hours~*", + "then": "icons.isOpen" + } + ], + "location": [ + "point", + "centroid" + ], + "marker": [ + { + "icon": "circle", + "color": "white" + }, + { + "icon": { + "render": "./assets/layers/toilet/toilets.svg", + "mappings": [ + { + "if": { + "or": [ + "wheelchair=yes", + "wheelchair=designated" + ] + }, + "then": "./assets/layers/toilet/wheelchair.svg" + }, + { + "if": { + "or": [ + "toilets:position=urinals", + "toilets:position=urinal" + ] + }, + "then": "./assets/layers/toilet/urinal.svg" + } + ] + } + } + ] + } + ], + "lineRendering": [], "presets": [ { "title": { @@ -783,53 +839,6 @@ "enableRelocation": false, "enableImproveAccuracy": true }, - "mapRendering": [ - { - "icon": { - "render": "circle:#ffffff;./assets/layers/toilet/toilets.svg", - "mappings": [ - { - "if": { - "or": [ - "wheelchair=yes", - "wheelchair=designated" - ] - }, - "then": "circle:white;./assets/layers/toilet/wheelchair.svg" - }, - { - "if": { - "or": [ - "toilets:position=urinals", - "toilets:position=urinal" - ] - }, - "then": "./assets/layers/toilet/urinal.svg" - } - ] - }, - "iconBadges": [ - { - "if": "opening_hours~*", - "then": "icons.isOpen" - } - ], - "location": [ - "point", - "centroid" - ] - } - ], - "description": { - "en": "A layer showing (public) toilets", - "nl": "Een laag die publieke toiletten toont", - "de": "Eine Ebene mit (öffentlichen) Toiletten", - "es": "Una capa que muestra baños (públicos)", - "fr": "Un calque montrant les toilettes (publiques)", - "da": "Et lag, der viser (offentlige) toiletter", - "ca": "Una capa que mostra banys (publics)", - "cs": "Vrstva zobrazující (veřejné) toalety" - }, "units": [ { "appliesToKey": [ diff --git a/assets/layers/toilet_at_amenity/toilet_at_amenity.json b/assets/layers/toilet_at_amenity/toilet_at_amenity.json index fde386373..011c92881 100644 --- a/assets/layers/toilet_at_amenity/toilet_at_amenity.json +++ b/assets/layers/toilet_at_amenity/toilet_at_amenity.json @@ -7,10 +7,17 @@ "ca": "Lavabos a altres instal·lacions", "cs": "Toalety u ostatního vybavení" }, - "minzoom": 12, + "description": { + "en": "A layer showing (public) toilets located at different places.", + "de": "Eine Ebene mit (öffentlichen) Toiletten an verschiedenen Orten.", + "nl": "Een laag die (publiek toegankelijke) toiletten toont in verschillende andere voorzieningen.", + "ca": "Una capa que mostra banys (públics) ubicats en diferents llocs.", + "cs": "Vrstva zobrazující (veřejné) toalety umístěné na různých místech." + }, "source": { "osmTags": "toilets=yes" }, + "minzoom": 12, "title": { "render": { "en": "Toilet at amenity", @@ -32,6 +39,96 @@ } ] }, + "pointRendering": [ + { + "marker": [ + { + "icon": "circle", + "color": "white" + }, + { + "icon": { + "render": "./assets/layers/toilet/toilets.svg", + "mappings": [ + { + "if": { + "or": [ + "toilets:wheelchair=yes", + "toilets:wheelchair=designated" + ] + }, + "then": "./assets/layers/toilet/wheelchair.svg" + }, + { + "if": { + "or": [ + "toilets:position=urinals", + "toilets:position=urinal" + ] + }, + "then": "./assets/layers/toilet/urinal.svg" + } + ] + } + } + ], + "iconBadges": [ + { + "if": "opening_hours~*", + "then": "icons.isOpen" + }, + { + "if": "shop~*", + "then": "./assets/themes/shops/shop.svg" + }, + { + "if": "amenity=restaurant", + "then": "circle:white;./assets/layers/food/restaurant.svg" + }, + { + "if": { + "and": [ + "amenity=fast_food", + "cuisine=friture" + ] + }, + "then": "circle:white;./assets/layers/food/fries.svg" + }, + { + "if": { + "and": [ + "amenity=fast_food", + "cuisine!=friture" + ] + }, + "then": "circle:white;./assets/layers/food/fastfood.svg" + }, + { + "if": { + "or": [ + "amenity=bar", + "amenity=pub", + "amenity=biergarten" + ] + }, + "then": "circle:white;./assets/layers/cafe_pub/pub.svg" + }, + { + "if": "amenity=cafe", + "then": "circle:white;./assets/layers/cafe_pub/cafe.svg" + }, + { + "if": "amenity=nightclub", + "then": "circle:white;./assets/layers/cafe_pub/nightclub.svg" + } + ], + "location": [ + "point", + "centroid" + ] + } + ], + "lineRendering": [], "tagRenderings": [ "images", "level", @@ -381,94 +478,6 @@ }, "neededChangesets": 1 }, - "mapRendering": [ - { - "icon": { - "render": "circle:white;./assets/layers/toilet/toilets.svg", - "mappings": [ - { - "if": { - "or": [ - "toilets:wheelchair=yes", - "toilets:wheelchair=designated" - ] - }, - "then": "circle:white;./assets/layers/toilet/wheelchair.svg" - }, - { - "if": { - "or": [ - "toilets:position=urinals", - "toilets:position=urinal" - ] - }, - "then": "./assets/layers/toilet/urinal.svg" - } - ] - }, - "iconBadges": [ - { - "if": "opening_hours~*", - "then": "icons.isOpen" - }, - { - "if": "shop~*", - "then": "./assets/themes/shops/shop.svg" - }, - { - "if": "amenity=restaurant", - "then": "circle:white;./assets/layers/food/restaurant.svg" - }, - { - "if": { - "and": [ - "amenity=fast_food", - "cuisine=friture" - ] - }, - "then": "circle:white;./assets/layers/food/fries.svg" - }, - { - "if": { - "and": [ - "amenity=fast_food", - "cuisine!=friture" - ] - }, - "then": "circle:white;./assets/layers/food/fastfood.svg" - }, - { - "if": { - "or": [ - "amenity=bar", - "amenity=pub", - "amenity=biergarten" - ] - }, - "then": "circle:white;./assets/layers/cafe_pub/pub.svg" - }, - { - "if": "amenity=cafe", - "then": "circle:white;./assets/layers/cafe_pub/cafe.svg" - }, - { - "if": "amenity=nightclub", - "then": "circle:white;./assets/layers/cafe_pub/nightclub.svg" - } - ], - "location": [ - "point", - "centroid" - ] - } - ], - "description": { - "en": "A layer showing (public) toilets located at different places.", - "de": "Eine Ebene mit (öffentlichen) Toiletten an verschiedenen Orten.", - "nl": "Een laag die (publiek toegankelijke) toiletten toont in verschillende andere voorzieningen.", - "ca": "Una capa que mostra banys (públics) ubicats en diferents llocs.", - "cs": "Vrstva zobrazující (veřejné) toalety umístěné na různých místech." - }, "units": [ { "appliesToKey": [ diff --git a/assets/layers/trail/trail.json b/assets/layers/trail/trail.json index a55487b92..e6bacfdf3 100644 --- a/assets/layers/trail/trail.json +++ b/assets/layers/trail/trail.json @@ -10,7 +10,10 @@ "da": "Stier", "cs": "Stezky" }, - "minzoom": 12, + "description": { + "en": "Waymarked trails", + "nl": "Aangeduide wandeltochten" + }, "source": { "osmTags": { "and": [ @@ -25,6 +28,7 @@ ] } }, + "minzoom": 12, "title": { "render": { "en": "Trail", @@ -43,6 +47,47 @@ } ] }, + "pointRendering": [ + { + "marker": [ + { + "icon": { + "render": "./assets/layers/trail/trail.svg", + "mappings": [ + { + "if": "wheelchair=yes", + "then": "./assets/layers/trail/wheelchair.svg" + }, + { + "if": "pushchair=yes", + "then": "./assets/layers/trail/pushchair.svg" + } + ] + } + } + ], + "iconSize": "35,35", + "location": [ + "point" + ], + "anchor": "center" + } + ], + "lineRendering": [ + { + "color": { + "render": "#335D9F", + "mappings": [ + { + "if": "colour~*", + "then": "{colour}" + } + ] + }, + "width": "3", + "dashArray": "5 5" + } + ], "tagRenderings": [ "images", { @@ -59,9 +104,11 @@ }, { "question": { + "en": "What is the name of this trail?", "nl": "Wat is de naam van deze wandeling?" }, "render": { + "en": "This trail is called {name}", "nl": "Deze wandeling heet {name}" }, "freeform": { @@ -71,9 +118,11 @@ }, { "render": { + "en": "This trail is maintained by {operator}", "nl": "Beheer door {operator}" }, "question": { + "en": "Who maintains this trail?", "nl": "Wie beheert deze wandeltocht?" }, "freeform": { @@ -87,6 +136,7 @@ ] }, "then": { + "en": "This trail is maintained by Natuurpunt", "nl": "Dit gebied wordt beheerd door Natuurpunt" }, "icon": { @@ -101,6 +151,7 @@ ] }, "then": { + "en": "This trail is maintained by {operator}", "nl": "Dit gebied wordt beheerd door {operator}" }, "hideInAnswer": true, @@ -114,9 +165,11 @@ }, { "question": { + "en": "What is the reference colour of this trail?", "nl": "Welke kleur heeft deze wandeling?" }, "render": { + "en": "The reference colour is {colour}", "nl": "Deze wandeling heeft kleur {colour}" }, "freeform": { @@ -177,17 +230,20 @@ }, { "question": { + "en": "Is this trail wheelchair accessible?", "nl": "Is deze wandeling toegankelijk met de rolstoel?" }, "mappings": [ { "then": { + "en": "This trail is wheelchair-accessible", "nl": "deze wandeltocht is toegankelijk met de rolstoel" }, "if": "wheelchair=yes" }, { "then": { + "en": "This trail is not wheelchair accessible", "nl": "deze wandeltocht is niet toegankelijk met de rolstoel" }, "if": "wheelchair=no" @@ -197,17 +253,20 @@ }, { "question": { + "en": "Is this trail accessible with a pushchair?", "nl": "Is deze wandeltocht toegankelijk met de buggy?" }, "mappings": [ { "then": { + "en": "This trail is accessible with a pushchair", "nl": "deze wandeltocht is toegankelijk met de buggy" }, "if": "pushchair=yes" }, { "then": { + "en": "This trail is not accessible with a pushchair", "nl": "deze wandeltocht is niet toegankelijk met de buggy" }, "if": "pushchair=no" @@ -215,43 +274,5 @@ ], "id": "pushchair access" } - ], - "description": { - "nl": "Aangeduide wandeltochten" - }, - "mapRendering": [ - { - "icon": { - "render": "./assets/layers/trail/trail.svg", - "mappings": [ - { - "if": "wheelchair=yes", - "then": "./assets/layers/trail/wheelchair.svg" - }, - { - "if": "pushchair=yes", - "then": "./assets/layers/trail/pushchair.svg" - } - ] - }, - "iconSize": "35,35", - "location": [ - "point" - ], - "anchor": "center" - }, - { - "color": { - "render": "#335D9F", - "mappings": [ - { - "if": "colour~*", - "then": "{colour}" - } - ] - }, - "width": "3", - "dashArray": "5 5" - } ] } diff --git a/assets/layers/transit_routes/transit_routes.json b/assets/layers/transit_routes/transit_routes.json index 02d4daec5..45163fdb4 100644 --- a/assets/layers/transit_routes/transit_routes.json +++ b/assets/layers/transit_routes/transit_routes.json @@ -24,6 +24,9 @@ ] } }, + "calculatedTags": [ + "_numeric_id=feat.properties.id.split('/')[1]" + ], "minzoom": 15, "title": { "render": { @@ -48,25 +51,30 @@ } ] }, - "mapRendering": [ + "titleIcons": [ + { + "condition": { + "and": [ + "id~relation/[0-9]+", + "_numeric_id~*" + ] + }, + "render": "on relatify" + }, + "icons.defaults" + ], + "pointRendering": [], + "lineRendering": [ { "color": { - "render": { - "en": "#ff0000", - "de": "#ff0000", - "da": "#ff0000", - "nl": "#ff0000", - "ca": "#ff0000", - "cs": "#ff0000" - }, + "render": "#ff0000", "mappings": [ { "if": "colour~*", "then": "{colour}" } ] - }, - "width": 5 + } } ], "tagRenderings": [ @@ -229,19 +237,11 @@ } } ], - "titleIcons": [ - { - "condition": { - "and": [ - "id~relation/[0-9]+", - "_numeric_id~*" - ] - }, - "render": "on relatify" - }, - "icons.defaults" - ], - "calculatedTags": [ - "_numeric_id=feat.properties.id.split('/')[1]" - ] -} \ No newline at end of file + "cs": { + "0": { + "color": { + "render": "#ff0000" + } + } + } +} diff --git a/assets/layers/transit_stops/transit_stops.json b/assets/layers/transit_stops/transit_stops.json index 16977e20f..3ab512ab9 100644 --- a/assets/layers/transit_stops/transit_stops.json +++ b/assets/layers/transit_stops/transit_stops.json @@ -46,19 +46,24 @@ } ] }, - "mapRendering": [ + "pointRendering": [ { "location": [ "point", "centroid" ], - "icon": { - "render": "./assets/layers/transit_stops/bus_stop.svg", - "mappings": [] - }, - "label": "
    {name}
    " + "label": "
    {name}
    ", + "marker": [ + { + "icon": { + "render": "./assets/layers/transit_stops/bus_stop.svg", + "mappings": [] + } + } + ] } ], + "lineRendering": [], "tagRenderings": [ { "id": "stop_name", diff --git a/assets/layers/tree_node/tree_node.json b/assets/layers/tree_node/tree_node.json index 4a57626ed..85e6bbabd 100644 --- a/assets/layers/tree_node/tree_node.json +++ b/assets/layers/tree_node/tree_node.json @@ -13,7 +13,16 @@ "pt_BR": "Árvore", "cs": "Strom" }, - "minzoom": 16, + "description": { + "en": "A layer showing trees", + "nl": "Een laag die bomen toont", + "es": "Una capa que muestra árboles", + "de": "Eine Ebene, die Bäume zeigt", + "fr": "Une couche montrant les arbres", + "da": "Et lag, der viser træer", + "ca": "Una capa que mostra arbres", + "cs": "Vrstva zobrazující stromy" + }, "source": { "osmTags": { "and": [ @@ -21,6 +30,7 @@ ] } }, + "minzoom": 16, "title": { "render": { "nl": "Boom", @@ -72,6 +82,141 @@ } ] }, + "pointRendering": [ + { + "marker": [ + { + "icon": "circle", + "color": "#ffffff" + }, + { + "icon": { + "render": "./assets/layers/tree_node/unknown.svg", + "mappings": [ + { + "if": { + "and": [ + "leaf_type=broadleaved" + ] + }, + "then": "./assets/layers/tree_node/broadleaved.svg" + }, + { + "if": { + "and": [ + "leaf_type=needleleaved" + ] + }, + "then": "./assets/layers/tree_node/needleleaved.svg" + } + ] + } + } + ], + "iconSize": "40,40", + "location": [ + "point", + "centroid" + ], + "anchor": "bottom" + } + ], + "lineRendering": [], + "presets": [ + { + "tags": [ + "natural=tree", + "leaf_type=broadleaved" + ], + "title": { + "nl": "een loofboom", + "en": "a broadleaved tree", + "it": "una albero latifoglia", + "fr": "une arbre feuillu", + "ru": "Лиственное дерево", + "de": "ein Laubbaum", + "es": "árbol de hoja ancha", + "da": "et løvtræ", + "pt": "uma árvore de folhas largas", + "ca": "un arbre de fulla ampla", + "cs": "listnatý strom" + }, + "description": { + "nl": "Een boom van een soort die blaadjes heeft, bijvoorbeeld eik of populier.", + "en": "A tree of a species with leaves, such as oak or populus.", + "it": "Un albero di una specie con foglie larghe come la quercia o il pioppo.", + "fr": "Un arbre d'une espèce avec de larges feuilles, comme le chêne ou le peuplier.", + "de": "Ein Baum mit Blättern, z. B. Eiche oder Buche.", + "es": "Un árbol de hojas como el Roble o el Álamo.", + "pt": "Uma árvore de uma espécie com folhas, como carvalho ou populus.", + "ca": "Arbre d'una espècie amb fulles, com el roure o el pollancre.", + "cs": "Strom s listy, například dub nebo topol." + } + }, + { + "tags": [ + "natural=tree", + "leaf_type=needleleaved" + ], + "title": { + "nl": "een naaldboom", + "en": "a needleleaved tree", + "it": "una albero aghifoglia", + "ru": "Хвойное дерево", + "fr": "une arbre résineux", + "de": "ein Nadelbaum", + "es": "Árbol tipo Conífera", + "da": "et nåletræ", + "pt": "uma árvore com folhas de agulha", + "ca": "un arbre amb fulles d'agulla", + "cs": "jehličnatý strom" + }, + "description": { + "nl": "Een boom van een soort met naalden, bijvoorbeeld den of spar.", + "en": "A tree of a species with needles, such as pine or spruce.", + "it": "Un albero di una specie con aghi come il pino o l’abete.", + "ru": "Дерево с хвоей (иглами), например, сосна или ель.", + "fr": "Une espèce d’arbre avec des épines comme le pin ou l’épicéa.", + "de": "Ein Baum mit Nadeln, z. B. Kiefer oder Fichte.", + "es": "Un árbol de hojas agujas, como el Pino o el Abeto.", + "da": "Et træ af en art med nåle, såsom fyr eller gran.", + "ca": "Arbre d'una espècie amb agulles, com el pi o l'avet.", + "cs": "Strom s jehlicemi, například borovice nebo smrk." + } + }, + { + "tags": [ + "natural=tree" + ], + "title": { + "nl": "een boom", + "en": "a tree", + "it": "una albero", + "ru": "Дерево", + "fr": "une arbre", + "id": "Pohon", + "de": "ein Baum", + "ca": "un arbre", + "es": "un árbol", + "da": "et træ", + "pt": "uma árvore", + "pt_BR": "uma árvore", + "cs": "strom" + }, + "description": { + "nl": "Wanneer je niet zeker bent of het nu een loof- of naaldboom is.", + "en": "If you're not sure whether it's a broadleaved or needleleaved tree.", + "it": "Qualora non si sia sicuri se si tratta di un albero latifoglia o aghifoglia.", + "fr": "Si vous n'êtes pas sûr(e) de savoir s'il s'agit d'un arbre à feuilles larges ou à aiguilles.", + "ru": "Если вы не уверены в том, лиственное это дерево или хвойное.", + "de": "Wenn Sie nicht sicher sind, ob es sich um einen Laubbaum oder einen Nadelbaum handelt.", + "es": "Si no estás seguro de si es un árbol de hoja ancha o de hoja de aguja.", + "da": "Hvis du ikke er sikker på, om det er et løv- eller nåletræ.", + "ca": "Si no esteu segur de si es tracta d'un arbre amb fulles amples o amb fulles d'agulles.", + "cs": "Pokud si nejste jisti, zda se jedná o listnatý nebo jehličnatý strom." + } + } + ], "tagRenderings": [ "images", { @@ -798,147 +943,11 @@ "id": "tree_node-wikidata" } ], - "presets": [ - { - "tags": [ - "natural=tree", - "leaf_type=broadleaved" - ], - "title": { - "nl": "een loofboom", - "en": "a broadleaved tree", - "it": "una albero latifoglia", - "fr": "une arbre feuillu", - "ru": "Лиственное дерево", - "de": "ein Laubbaum", - "es": "árbol de hoja ancha", - "da": "et løvtræ", - "pt": "uma árvore de folhas largas", - "ca": "un arbre de fulla ampla", - "cs": "listnatý strom" - }, - "description": { - "nl": "Een boom van een soort die blaadjes heeft, bijvoorbeeld eik of populier.", - "en": "A tree of a species with leaves, such as oak or populus.", - "it": "Un albero di una specie con foglie larghe come la quercia o il pioppo.", - "fr": "Un arbre d'une espèce avec de larges feuilles, comme le chêne ou le peuplier.", - "de": "Ein Baum mit Blättern, z. B. Eiche oder Buche.", - "es": "Un árbol de hojas como el Roble o el Álamo.", - "pt": "Uma árvore de uma espécie com folhas, como carvalho ou populus.", - "ca": "Arbre d'una espècie amb fulles, com el roure o el pollancre.", - "cs": "Strom s listy, například dub nebo topol." - } - }, - { - "tags": [ - "natural=tree", - "leaf_type=needleleaved" - ], - "title": { - "nl": "een naaldboom", - "en": "a needleleaved tree", - "it": "una albero aghifoglia", - "ru": "Хвойное дерево", - "fr": "une arbre résineux", - "de": "ein Nadelbaum", - "es": "Árbol tipo Conífera", - "da": "et nåletræ", - "pt": "uma árvore com folhas de agulha", - "ca": "un arbre amb fulles d'agulla", - "cs": "jehličnatý strom" - }, - "description": { - "nl": "Een boom van een soort met naalden, bijvoorbeeld den of spar.", - "en": "A tree of a species with needles, such as pine or spruce.", - "it": "Un albero di una specie con aghi come il pino o l’abete.", - "ru": "Дерево с хвоей (иглами), например, сосна или ель.", - "fr": "Une espèce d’arbre avec des épines comme le pin ou l’épicéa.", - "de": "Ein Baum mit Nadeln, z. B. Kiefer oder Fichte.", - "es": "Un árbol de hojas agujas, como el Pino o el Abeto.", - "da": "Et træ af en art med nåle, såsom fyr eller gran.", - "ca": "Arbre d'una espècie amb agulles, com el pi o l'avet.", - "cs": "Strom s jehlicemi, například borovice nebo smrk." - } - }, - { - "tags": [ - "natural=tree" - ], - "title": { - "nl": "een boom", - "en": "a tree", - "it": "una albero", - "ru": "Дерево", - "fr": "une arbre", - "id": "Pohon", - "de": "ein Baum", - "ca": "un arbre", - "es": "un árbol", - "da": "et træ", - "pt": "uma árvore", - "pt_BR": "uma árvore", - "cs": "strom" - }, - "description": { - "nl": "Wanneer je niet zeker bent of het nu een loof- of naaldboom is.", - "en": "If you're not sure whether it's a broadleaved or needleleaved tree.", - "it": "Qualora non si sia sicuri se si tratta di un albero latifoglia o aghifoglia.", - "fr": "Si vous n'êtes pas sûr(e) de savoir s'il s'agit d'un arbre à feuilles larges ou à aiguilles.", - "ru": "Если вы не уверены в том, лиственное это дерево или хвойное.", - "de": "Wenn Sie nicht sicher sind, ob es sich um einen Laubbaum oder einen Nadelbaum handelt.", - "es": "Si no estás seguro de si es un árbol de hoja ancha o de hoja de aguja.", - "da": "Hvis du ikke er sikker på, om det er et løv- eller nåletræ.", - "ca": "Si no esteu segur de si es tracta d'un arbre amb fulles amples o amb fulles d'agulles.", - "cs": "Pokud si nejste jisti, zda se jedná o listnatý nebo jehličnatý strom." - } - } - ], - "allowMove": { - "enableRelocation": false, - "enableImproveAccuraccy": true - }, "deletion": { "minNeededChangesets": 5 }, - "mapRendering": [ - { - "icon": { - "render": "circle:#ffffff;./assets/layers/tree_node/unknown.svg", - "mappings": [ - { - "if": { - "and": [ - "leaf_type=broadleaved" - ] - }, - "then": "circle:#ffffff;./assets/layers/tree_node/broadleaved.svg" - }, - { - "if": { - "and": [ - "leaf_type=needleleaved" - ] - }, - "then": "circle:#ffffff;./assets/layers/tree_node/needleleaved.svg" - } - ] - }, - "iconSize": "40,40", - "location": [ - "point", - "centroid" - ], - "anchor": "bottom" - } - ], - "description": { - "en": "A layer showing trees", - "nl": "Een laag die bomen toont", - "es": "Una capa que muestra árboles", - "de": "Eine Ebene, die Bäume zeigt", - "fr": "Une couche montrant les arbres", - "da": "Et lag, der viser træer", - "ca": "Una capa que mostra arbres", - "cs": "Vrstva zobrazující stromy" + "allowMove": { + "enableRelocation": false, + "enableImproveAccuraccy": true } } diff --git a/assets/layers/usersettings/usersettings.json b/assets/layers/usersettings/usersettings.json index fe1723ef1..082cc5ab0 100644 --- a/assets/layers/usersettings/usersettings.json +++ b/assets/layers/usersettings/usersettings.json @@ -8,6 +8,15 @@ "ca": "Una capa especial que no està pensada per mostrar-se en un mapa, però que s'utilitza per configurar la configuració de l'usuari", "cs": "Speciální vrstva, která není určena k zobrazení na mapě, ale slouží k nastavení uživatelských nastavení" }, + "source": "special", + "calculatedTags": [ + "_mastodon_candidate_md=feat.properties._description.match(/\\[[^\\]]*\\]\\((.*(mastodon|en.osm.town).*)\\).*/)?.at(1)", + "_d=feat.properties._description?.replace(/</g,'<')?.replace(/>/g,'>') ?? ''", + "_mastodon_candidate_a=(feat => {const e = document.createElement('div');e.innerHTML = feat.properties._d;return Array.from(e.getElementsByTagName(\"a\")).filter(a => a.href.match(/mastodon|en.osm.town/) !== null)[0]?.href }) (feat) ", + "_mastodon_link=(feat => {const e = document.createElement('div');e.innerHTML = feat.properties._d;return Array.from(e.getElementsByTagName(\"a\")).filter(a => a.getAttribute(\"rel\")?.indexOf('me') >= 0)[0]?.href})(feat) ", + "_mastodon_candidate=feat.properties._mastodon_candidate_md ?? feat.properties._mastodon_candidate_a", + "__current_background:='initial_value'" + ], "title": { "render": { "en": "Settings", @@ -19,15 +28,8 @@ "cs": "Nastavení" } }, - "source": "special", - "calculatedTags": [ - "_mastodon_candidate_md=feat.properties._description.match(/\\[[^\\]]*\\]\\((.*(mastodon|en.osm.town).*)\\).*/)?.at(1)", - "_d=feat.properties._description?.replace(/</g,'<')?.replace(/>/g,'>') ?? ''", - "_mastodon_candidate_a=(feat => {const e = document.createElement('div');e.innerHTML = feat.properties._d;return Array.from(e.getElementsByTagName(\"a\")).filter(a => a.href.match(/mastodon|en.osm.town/) !== null)[0]?.href }) (feat) ", - "_mastodon_link=(feat => {const e = document.createElement('div');e.innerHTML = feat.properties._d;return Array.from(e.getElementsByTagName(\"a\")).filter(a => a.getAttribute(\"rel\")?.indexOf('me') >= 0)[0]?.href})(feat) ", - "_mastodon_candidate=feat.properties._mastodon_candidate_md ?? feat.properties._mastodon_candidate_a", - "__current_background:='initial_value'" - ], + "pointRendering": null, + "lineRendering": null, "tagRenderings": [ { "id": "profile", @@ -723,6 +725,5 @@ "condition": "mapcomplete-show_debug=yes", "render": "{all_tags()}" } - ], - "mapRendering": null + ] } diff --git a/assets/layers/vending_machine/vending_machine.json b/assets/layers/vending_machine/vending_machine.json index f26619edb..456a16943 100644 --- a/assets/layers/vending_machine/vending_machine.json +++ b/assets/layers/vending_machine/vending_machine.json @@ -24,6 +24,9 @@ ] } }, + "calculatedTags": [ + "_vending_count=feat.properties.vending.split(';').length" + ], "title": { "render": { "en": "Vending machine", @@ -58,6 +61,301 @@ } ] }, + "pointRendering": [ + { + "marker": [ + { + "icon": "circle", + "color": "white" + }, + { + "icon": { + "render": "./assets/layers/vending_machine/vending_machine.svg", + "mappings": [ + { + "if": "vending=drinks", + "then": "./assets/layers/id_presets/temaki-bottles.svg" + }, + { + "if": "vending=sweets", + "then": "./assets/layers/id_presets/maki-confectionery.svg" + }, + { + "if": "vending=food", + "then": "./assets/layers/vending_machine/utensils.svg" + }, + { + "if": "vending=cigarettes", + "then": "./assets/layers/vending_machine/smoking.svg" + }, + { + "if": "vending=coffee", + "then": "./assets/layers/vending_machine/mug-saucer.svg" + }, + { + "if": "vending=water", + "then": "./assets/layers/id_presets/temaki-water_bottle.svg" + }, + { + "if": "vending=newspapers", + "then": "./assets/layers/id_presets/fas-newspaper.svg" + }, + { + "if": "vending=milk", + "then": "./assets/layers/vending_machine/cow.svg" + }, + { + "if": "vending=bread", + "then": "./assets/layers/id_presets/maki-bakery.svg" + }, + { + "if": "vending=eggs", + "then": "./assets/layers/vending_machine/egg.svg" + }, + { + "if": "vending=cheese", + "then": "./assets/layers/id_presets/fas-cheese.svg" + }, + { + "if": "vending=honey", + "then": "./assets/layers/vending_machine/honey.svg" + }, + { + "if": "vending=potatoes", + "then": "./assets/layers/vending_machine/potato.svg" + }, + { + "if": "vending=meat", + "then": "./assets/layers/id_presets/temaki-meat.svg" + }, + { + "if": "vending=fruit", + "then": "./assets/layers/vending_machine/fruits.svg" + }, + { + "if": "vending=strawberries", + "then": "./assets/layers/vending_machine/strawberry.svg" + }, + { + "if": "vending=flowers", + "then": "./assets/layers/id_presets/maki-florist.svg" + }, + { + "if": "vending=condoms", + "then": "./assets/layers/vending_machine/condom.svg" + } + ] + } + } + ], + "location": [ + "point", + "centroid" + ], + "iconBadges": [ + { + "if": "opening_hours~*", + "then": "icons.isOpen" + }, + { + "if": { + "and": [ + "_vending_count>1", + "vending~.*drinks.*" + ] + }, + "then": "circle:white;./assets/layers/id_presets/temaki-bottles.svg" + }, + { + "if": { + "and": [ + "_vending_count>1", + "vending~.*sweets.*" + ] + }, + "then": "circle:white;./assets/layers/id_presets/maki-confectionery.svg" + }, + { + "if": { + "and": [ + "_vending_count>1", + "vending~.*food.*" + ] + }, + "then": "circle:white;./assets/layers/vending_machine/utensils.svg" + }, + { + "if": { + "and": [ + "_vending_count>1", + "vending~.*cigarettes.*" + ] + }, + "then": "circle:white;./assets/layers/vending_machine/smoking.svg" + }, + { + "if": { + "and": [ + "_vending_count>1", + "vending~.*coffee.*" + ] + }, + "then": "circle:white;./assets/layers/vending_machine/mug-saucer.svg" + }, + { + "if": { + "and": [ + "_vending_count>1", + "vending~.*water.*" + ] + }, + "then": "circle:white;./assets/layers/id_presets/temaki-water_bottle.svg" + }, + { + "if": { + "and": [ + "_vending_count>1", + "vending~.*newspapers.*" + ] + }, + "then": "circle:white;./assets/layers/id_presets/fas-newspaper.svg" + }, + { + "if": { + "and": [ + "_vending_count>1", + "vending~.*milk.*" + ] + }, + "then": "circle:white;./assets/layers/vending_machine/cow.svg" + }, + { + "if": { + "and": [ + "_vending_count>1", + "vending~.*bread.*" + ] + }, + "then": "circle:white;./assets/layers/id_presets/maki-bakery.svg" + }, + { + "if": { + "and": [ + "_vending_count>1", + "vending~.*eggs.*" + ] + }, + "then": "circle:white;./assets/layers/vending_machine/egg.svg" + }, + { + "if": { + "and": [ + "_vending_count>1", + "vending~.*cheese.*" + ] + }, + "then": "circle:white;./assets/layers/id_presets/fas-cheese.svg" + }, + { + "if": { + "and": [ + "_vending_count>1", + "vending~.*honey.*" + ] + }, + "then": "circle:white;./assets/layers/vending_machine/honey.svg" + }, + { + "if": { + "and": [ + "_vending_count>1", + "vending~.*potatoes.*" + ] + }, + "then": "circle:white;./assets/layers/vending_machine/potato.svg" + }, + { + "if": { + "and": [ + "_vending_count>1", + "vending~.*meat.*" + ] + }, + "then": "circle:white;./assets/layers/id_presets/temaki-meat.svg" + }, + { + "if": { + "and": [ + "_vending_count>1", + "vending~.*fruit.*" + ] + }, + "then": "circle:white;./assets/layers/vending_machine/fruits.svg" + }, + { + "if": { + "and": [ + "_vending_count>1", + "vending~.*strawberries.*" + ] + }, + "then": "circle:white;./assets/layers/vending_machine/strawberry.svg" + }, + { + "if": { + "and": [ + "_vending_count>1", + "vending~.*flowers.*" + ] + }, + "then": "circle:white;./assets/layers/id_presets/maki-florist.svg" + }, + { + "if": { + "and": [ + "_vending_count>1", + "vending~.*parking_tickets.*" + ] + }, + "then": "circle:white;./assets/layers/parking_ticket_machine/parking_tickets.svg" + }, + { + "if": { + "and": [ + "_vending_count>1", + "vending~.*elongated_coin.*" + ] + }, + "then": "circle:white;./assets/themes/elongated_coin/penny.svg" + }, + { + "if": { + "and": [ + "_vending_count>1", + "vending~.*public_transport_tickets.*" + ] + }, + "then": "circle:white;./assets/themes/stations/public_transport_tickets.svg" + } + ] + } + ], + "lineRendering": [], + "presets": [ + { + "title": { + "en": "a vending machine", + "nl": "een verkoopautomaat", + "de": "ein Verkaufsautomat", + "fr": "un distributeur", + "ca": "una màquina expenedora", + "cs": "prodejní automat" + }, + "tags": [ + "amenity=vending_machine" + ] + } + ], "tagRenderings": [ "images", { @@ -488,295 +786,6 @@ }, "website" ], - "calculatedTags": [ - "_vending_count=feat.properties.vending.split(';').length" - ], - "presets": [ - { - "title": { - "en": "a vending machine", - "nl": "een verkoopautomaat", - "de": "ein Verkaufsautomat", - "fr": "un distributeur", - "ca": "una màquina expenedora", - "cs": "prodejní automat" - }, - "tags": [ - "amenity=vending_machine" - ] - } - ], - "mapRendering": [ - { - "icon": { - "render": "./assets/layers/vending_machine/vending_machine.svg", - "mappings": [ - { - "if": "vending=drinks", - "then": "circle:white;./assets/layers/id_presets/temaki-bottles.svg" - }, - { - "if": "vending=sweets", - "then": "circle:white;./assets/layers/id_presets/maki-confectionery.svg" - }, - { - "if": "vending=food", - "then": "circle:white;./assets/layers/vending_machine/utensils.svg" - }, - { - "if": "vending=cigarettes", - "then": "circle:white;./assets/layers/vending_machine/smoking.svg" - }, - { - "if": "vending=coffee", - "then": "circle:white;./assets/layers/vending_machine/mug-saucer.svg" - }, - { - "if": "vending=water", - "then": "circle:white;./assets/layers/id_presets/temaki-water_bottle.svg" - }, - { - "if": "vending=newspapers", - "then": "circle:white;./assets/layers/id_presets/fas-newspaper.svg" - }, - { - "if": "vending=milk", - "then": "circle:white;./assets/layers/vending_machine/cow.svg" - }, - { - "if": "vending=bread", - "then": "circle:white;./assets/layers/id_presets/maki-bakery.svg" - }, - { - "if": "vending=eggs", - "then": "circle:white;./assets/layers/vending_machine/egg.svg" - }, - { - "if": "vending=cheese", - "then": "circle:white;./assets/layers/id_presets/fas-cheese.svg" - }, - { - "if": "vending=honey", - "then": "circle:white;./assets/layers/vending_machine/honey.svg" - }, - { - "if": "vending=potatoes", - "then": "circle:white;./assets/layers/vending_machine/potato.svg" - }, - { - "if": "vending=meat", - "then": "./assets/layers/id_presets/temaki-meat.svg" - }, - { - "if": "vending=fruit", - "then": "./assets/layers/vending_machine/fruits.svg" - }, - { - "if": "vending=strawberries", - "then": "./assets/layers/vending_machine/strawberry.svg" - }, - { - "if": "vending=flowers", - "then": "circle:white;./assets/layers/id_presets/maki-florist.svg" - }, - { - "if": "vending=condoms", - "then": "circle:white;./assets/layers/vending_machine/condom.svg" - } - ] - }, - "location": [ - "point", - "centroid" - ], - "iconBadges": [ - { - "if": "opening_hours~*", - "then": "icons.isOpen" - }, - { - "if": { - "and": [ - "_vending_count>1", - "vending~.*drinks.*" - ] - }, - "then": "circle:white;./assets/layers/id_presets/temaki-bottles.svg" - }, - { - "if": { - "and": [ - "_vending_count>1", - "vending~.*sweets.*" - ] - }, - "then": "circle:white;./assets/layers/id_presets/maki-confectionery.svg" - }, - { - "if": { - "and": [ - "_vending_count>1", - "vending~.*food.*" - ] - }, - "then": "circle:white;./assets/layers/vending_machine/utensils.svg" - }, - { - "if": { - "and": [ - "_vending_count>1", - "vending~.*cigarettes.*" - ] - }, - "then": "circle:white;./assets/layers/vending_machine/smoking.svg" - }, - { - "if": { - "and": [ - "_vending_count>1", - "vending~.*coffee.*" - ] - }, - "then": "circle:white;./assets/layers/vending_machine/mug-saucer.svg" - }, - { - "if": { - "and": [ - "_vending_count>1", - "vending~.*water.*" - ] - }, - "then": "circle:white;./assets/layers/id_presets/temaki-water_bottle.svg" - }, - { - "if": { - "and": [ - "_vending_count>1", - "vending~.*newspapers.*" - ] - }, - "then": "circle:white;./assets/layers/id_presets/fas-newspaper.svg" - }, - { - "if": { - "and": [ - "_vending_count>1", - "vending~.*milk.*" - ] - }, - "then": "circle:white;./assets/layers/vending_machine/cow.svg" - }, - { - "if": { - "and": [ - "_vending_count>1", - "vending~.*bread.*" - ] - }, - "then": "circle:white;./assets/layers/id_presets/maki-bakery.svg" - }, - { - "if": { - "and": [ - "_vending_count>1", - "vending~.*eggs.*" - ] - }, - "then": "circle:white;./assets/layers/vending_machine/egg.svg" - }, - { - "if": { - "and": [ - "_vending_count>1", - "vending~.*cheese.*" - ] - }, - "then": "circle:white;./assets/layers/id_presets/fas-cheese.svg" - }, - { - "if": { - "and": [ - "_vending_count>1", - "vending~.*honey.*" - ] - }, - "then": "circle:white;./assets/layers/vending_machine/honey.svg" - }, - { - "if": { - "and": [ - "_vending_count>1", - "vending~.*potatoes.*" - ] - }, - "then": "circle:white;./assets/layers/vending_machine/potato.svg" - }, - { - "if": { - "and": [ - "_vending_count>1", - "vending~.*meat.*" - ] - }, - "then": "./assets/layers/id_presets/temaki-meat.svg" - }, - { - "if": { - "and": [ - "_vending_count>1", - "vending~.*fruit.*" - ] - }, - "then": "./assets/layers/vending_machine/fruits.svg" - }, - { - "if": { - "and": [ - "_vending_count>1", - "vending~.*strawberries.*" - ] - }, - "then": "./assets/layers/vending_machine/strawberry.svg" - }, - { - "if": { - "and": [ - "_vending_count>1", - "vending~.*flowers.*" - ] - }, - "then": "circle:white;./assets/layers/id_presets/maki-florist.svg" - }, - { - "if": { - "and": [ - "_vending_count>1", - "vending~.*parking_tickets.*" - ] - }, - "then": "circle:white;./assets/layers/parking_ticket_machine/parking_tickets.svg" - }, - { - "if": { - "and": [ - "_vending_count>1", - "vending~.*elongated_coin.*" - ] - }, - "then": "circle:white;./assets/themes/elongated_coin/penny.svg" - }, - { - "if": { - "and": [ - "_vending_count>1", - "vending~.*public_transport_tickets.*" - ] - }, - "then": "circle:white;./assets/themes/stations/public_transport_tickets.svg" - } - ] - } - ], "filter": [ "open_now", { @@ -1073,9 +1082,9 @@ ] } ], + "deletion": true, "allowMove": { "enableImproveAccuracy": true, "enableRelocation": true - }, - "deletion": true -} \ No newline at end of file + } +} diff --git a/assets/layers/veterinary/veterinary.json b/assets/layers/veterinary/veterinary.json index 0612d5d7f..fb6c6a2c5 100644 --- a/assets/layers/veterinary/veterinary.json +++ b/assets/layers/veterinary/veterinary.json @@ -1,5 +1,15 @@ { "id": "veterinary", + "name": { + "en": "veterinary", + "da": "dyrlæge", + "de": "Tierärzte", + "es": "veterinario", + "nl": "Dierenarts", + "fr": "vétérinaire", + "ca": "Veterinari", + "cs": "veterinář" + }, "description": "A layer showing veterinarians", "source": { "osmTags": { @@ -9,6 +19,61 @@ } }, "minzoom": 10, + "title": { + "render": { + "en": "Veterinary", + "da": "Dyrlæge", + "de": "Tierarzt", + "id": "Dokter hewan", + "es": "Veterinario", + "nl": "Dierenarts", + "ca": "Veterinari", + "cs": "Veterinární ordinace" + }, + "mappings": [ + { + "if": "name~*", + "then": { + "*": "{name}" + } + } + ] + }, + "pointRendering": [ + { + "location": [ + "point", + "centroid" + ], + "iconSize": "30,40", + "label": { + "mappings": [ + { + "if": "name~*", + "then": "
    {name}
    " + } + ] + }, + "iconBadges": [ + { + "if": "opening_hours~*", + "then": "icons.isOpen" + } + ], + "anchor": "center", + "marker": [ + { + "icon": "./assets/layers/veterinary/vet.svg" + } + ] + } + ], + "lineRendering": [ + { + "color": "#ff0", + "width": 5 + } + ], "presets": [ { "title": { @@ -37,65 +102,6 @@ } } ], - "name": { - "en": "veterinary", - "da": "dyrlæge", - "de": "Tierärzte", - "es": "veterinario", - "nl": "Dierenarts", - "fr": "vétérinaire", - "ca": "Veterinari", - "cs": "veterinář" - }, - "title": { - "render": { - "en": "Veterinary", - "da": "Dyrlæge", - "de": "Tierarzt", - "id": "Dokter hewan", - "es": "Veterinario", - "nl": "Dierenarts", - "ca": "Veterinari", - "cs": "Veterinární ordinace" - }, - "mappings": [ - { - "if": "name~*", - "then": { - "*": "{name}" - } - } - ] - }, - "mapRendering": [ - { - "location": [ - "point", - "centroid" - ], - "icon": "./assets/layers/veterinary/vet.svg", - "iconSize": "30,40", - "label": { - "mappings": [ - { - "if": "name~*", - "then": "
    {name}
    " - } - ] - }, - "iconBadges": [ - { - "if": "opening_hours~*", - "then": "icons.isOpen" - } - ], - "anchor": "center" - }, - { - "color": "#ff0", - "width": 5 - } - ], "tagRenderings": [ "website", "reviews", diff --git a/assets/layers/viewpoint/viewpoint.json b/assets/layers/viewpoint/viewpoint.json index 0012ac6a9..40e2dce63 100644 --- a/assets/layers/viewpoint/viewpoint.json +++ b/assets/layers/viewpoint/viewpoint.json @@ -28,7 +28,41 @@ "osmTags": "tourism=viewpoint" }, "minzoom": 14, - "wayhandling": 2, + "title": { + "render": { + "en": "Viewpoint", + "nl": "Uitzicht", + "de": "Aussichtspunkt", + "fr": "Point de vue", + "ru": "Смотровая площадка", + "it": "Punto panoramico", + "id": "Sudut pandang", + "eo": "Vidpunkto", + "ca": "Mirador", + "da": "Udsigtspunkt", + "cs": "Vyhlídka" + } + }, + "pointRendering": [ + { + "iconSize": "20,20", + "location": [ + "point" + ], + "anchor": "center", + "marker": [ + { + "icon": "./assets/layers/viewpoint/viewpoint.svg" + } + ] + } + ], + "lineRendering": [ + { + "color": "#ffffff", + "width": "5" + } + ], "presets": [ { "title": { @@ -47,21 +81,6 @@ ] } ], - "title": { - "render": { - "en": "Viewpoint", - "nl": "Uitzicht", - "de": "Aussichtspunkt", - "fr": "Point de vue", - "ru": "Смотровая площадка", - "it": "Punto panoramico", - "id": "Sudut pandang", - "eo": "Vidpunkto", - "ca": "Mirador", - "da": "Udsigtspunkt", - "cs": "Vyhlídka" - } - }, "tagRenderings": [ "images", { @@ -85,18 +104,5 @@ "id": "viewpoint-description" } ], - "mapRendering": [ - { - "icon": "./assets/layers/viewpoint/viewpoint.svg", - "iconSize": "20,20", - "location": [ - "point" - ], - "anchor": "center" - }, - { - "color": "#ffffff", - "width": "5" - } - ] + "wayhandling": 2 } diff --git a/assets/layers/village_green/village_green.json b/assets/layers/village_green/village_green.json index dea3d1c0f..4b79bd6a0 100644 --- a/assets/layers/village_green/village_green.json +++ b/assets/layers/village_green/village_green.json @@ -3,6 +3,13 @@ "name": { "nl": "Speelweide" }, + "description": { + "en": "A layer showing village-green (which are communal green areas, but not quite parks)", + "nl": "Een laag die dorpsgroen toont (gemeenschapsgroen, maar niet echt een park)", + "de": "Eine Ebene mit Dorfangern (kommunale Grünflächen, aber nicht wirklich Parks)", + "ca": "Una capa que mostra “village-green” (que són zones verdes comunals, però no parcs del tot)", + "cs": "Vrstva zobrazující městskou zeleň (což jsou společné zelené plochy, ale ne tak docela parky)" + }, "source": { "osmTags": "landuse=village_green" }, @@ -20,6 +27,27 @@ } ] }, + "pointRendering": [ + { + "iconSize": "40,40", + "location": [ + "point", + "centroid" + ], + "anchor": "center", + "marker": [ + { + "icon": "./assets/themes/playgrounds/playground.svg" + } + ] + } + ], + "lineRendering": [ + { + "color": "#937f20", + "width": "1" + } + ], "tagRenderings": [ "images", { @@ -30,27 +58,5 @@ "id": "village_green-reviews", "render": "{reviews(name, landuse=village_green )}" } - ], - "mapRendering": [ - { - "icon": "./assets/themes/playgrounds/playground.svg", - "iconSize": "40,40", - "location": [ - "point", - "centroid" - ], - "anchor": "center" - }, - { - "color": "#937f20", - "width": "1" - } - ], - "description": { - "en": "A layer showing village-green (which are communal green areas, but not quite parks)", - "nl": "Een laag die dorpsgroen toont (gemeenschapsgroen, maar niet echt een park)", - "de": "Eine Ebene mit Dorfangern (kommunale Grünflächen, aber nicht wirklich Parks)", - "ca": "Una capa que mostra “village-green” (que són zones verdes comunals, però no parcs del tot)", - "cs": "Vrstva zobrazující městskou zeleň (což jsou společné zelené plochy, ale ne tak docela parky)" - } + ] } diff --git a/assets/layers/visitor_information_centre/visitor_information_centre.json b/assets/layers/visitor_information_centre/visitor_information_centre.json index efad573e2..a68f472c7 100644 --- a/assets/layers/visitor_information_centre/visitor_information_centre.json +++ b/assets/layers/visitor_information_centre/visitor_information_centre.json @@ -10,7 +10,14 @@ "ca": "Centre d'Informació al Visitant", "cs": "Turistické informační centrum" }, - "minzoom": 12, + "description": { + "en": "A visitor center offers information about a specific attraction or place of interest where it is located.", + "nl": "Een bezoekerscentrum biedt informatie over een specifieke attractie of bezienswaardigheid waar het is gevestigd.", + "de": "Ein Besucherzentrum bietet Informationen über eine bestimmte Attraktion oder Sehenswürdigkeit, an der es sich befindet.", + "es": "Un centro de visitantes ofrece información sobre una atracción específica o lugar de interese donde se sitúa.", + "ca": "Un centre de visitants ofereix informació sobre una atracció o lloc d'interès específic on es troba.", + "cs": "Turistické centrum nabízí informace o konkrétní atrakci nebo zajímavém místě, kde se nachází." + }, "source": { "osmTags": { "and": [ @@ -23,6 +30,7 @@ ] } }, + "minzoom": 12, "title": { "render": { "nl": "{name}", @@ -70,25 +78,22 @@ } ] }, - "description": { - "en": "A visitor center offers information about a specific attraction or place of interest where it is located.", - "nl": "Een bezoekerscentrum biedt informatie over een specifieke attractie of bezienswaardigheid waar het is gevestigd.", - "de": "Ein Besucherzentrum bietet Informationen über eine bestimmte Attraktion oder Sehenswürdigkeit, an der es sich befindet.", - "es": "Un centro de visitantes ofrece información sobre una atracción específica o lugar de interese donde se sitúa.", - "ca": "Un centre de visitants ofereix informació sobre una atracció o lloc d'interès específic on es troba.", - "cs": "Turistické centrum nabízí informace o konkrétní atrakci nebo zajímavém místě, kde se nachází." - }, - "tagRenderings": [], - "presets": [], - "mapRendering": [ + "pointRendering": [ { - "icon": "./assets/layers/visitor_information_centre/information.svg", "iconSize": "40,40", "location": [ "point", "centroid" ], - "anchor": "center" + "anchor": "center", + "marker": [ + { + "icon": "./assets/layers/visitor_information_centre/information.svg" + } + ] } - ] + ], + "lineRendering": [], + "presets": [], + "tagRenderings": [] } diff --git a/assets/layers/walls_and_buildings/walls_and_buildings.json b/assets/layers/walls_and_buildings/walls_and_buildings.json index ef855c70b..9745070f3 100644 --- a/assets/layers/walls_and_buildings/walls_and_buildings.json +++ b/assets/layers/walls_and_buildings/walls_and_buildings.json @@ -1,18 +1,5 @@ { "id": "walls_and_buildings", - "minzoom": 18, - "title": { - "render": { - "en": "Wall or building", - "nl": "Muur of gebouw", - "de": "Wand oder Gebäude", - "es": "Pared o edificio", - "fr": "Mur ou bâtiment", - "da": "Mur eller bygning", - "ca": "Paret o edifici", - "cs": "Zeď nebo budova" - } - }, "description": { "en": "Special builtin layer providing all walls and buildings. This layer is useful in presets for objects which can be placed against walls (e.g. AEDs, postboxes, entrances, addresses, surveillance cameras, …). This layer is invisible by default and not toggleable by the user.", "nl": "Speciale ingebouwde laag voor alle muren en gebouwen. Deze laag is nuttig in voorkeuzen voor objecten die tegen muren geplaatst kunnen worden (bv. AEDs, brievenbussen, ingangen, adressen, beveiligingscamera's,…). Deze laag is standaard onzichtbaar en niet in te schakelen door de gebruiker.", @@ -33,9 +20,31 @@ ] } }, - "passAllFeatures": true, + "calculatedTags": [ + "_entrance_properties=overlapWith(feat)('entrance')?.map(e => e.feat.properties)?.filter(p => p !== undefined && p.indoor !== 'door')", + "_entrance_properties_with_width=get(feat)('_entrance_properties')?.filter(p => p['width'] !== undefined)", + "_entrances_count=get(feat)('_entrance_properties').length", + "_entrances_count_without_width_count= get(feat)('_entrances_count') - get(feat)('_entrance_properties_with_width').length", + "_biggest_width= Math.max( get(feat)('_entrance_properties').map(p => p.width))", + "_biggest_width_properties= /* Can be a list! */ get(feat)('_entrance_properties').filter(p => p.width === get(feat)('_biggest_width'))", + "_biggest_width_id=get(feat)('_biggest_width_properties').id" + ], + "minzoom": 18, "shownByDefault": false, - "mapRendering": [ + "title": { + "render": { + "en": "Wall or building", + "nl": "Muur of gebouw", + "de": "Wand oder Gebäude", + "es": "Pared o edificio", + "fr": "Mur ou bâtiment", + "da": "Mur eller bygning", + "ca": "Paret o edifici", + "cs": "Zeď nebo budova" + } + }, + "pointRendering": [], + "lineRendering": [ { "color": "#fff", "fill": "no", @@ -47,58 +56,7 @@ "width": "2" } ], - "calculatedTags": [ - "_entrance_properties=overlapWith(feat)('entrance')?.map(e => e.feat.properties)?.filter(p => p !== undefined && p.indoor !== 'door')", - "_entrance_properties_with_width=get(feat)('_entrance_properties')?.filter(p => p['width'] !== undefined)", - "_entrances_count=get(feat)('_entrance_properties').length", - "_entrances_count_without_width_count= get(feat)('_entrances_count') - get(feat)('_entrance_properties_with_width').length", - "_biggest_width= Math.max( get(feat)('_entrance_properties').map(p => p.width))", - "_biggest_width_properties= /* Can be a list! */ get(feat)('_entrance_properties').filter(p => p.width === get(feat)('_biggest_width'))", - "_biggest_width_id=get(feat)('_biggest_width_properties').id" - ], - "units": [ - { - "appliesToKey": [ - "width", - "_biggest_width" - ], - "defaultUnit": "cm", - "applicableUnits": [ - { - "useIfNoUnitGiven": true, - "canonicalDenomination": "m", - "alternativeDenomination": [ - "meter" - ], - "human": { - "en": "meter", - "fr": "mètre", - "de": "Meter", - "da": "meter", - "nl": "meter", - "ca": "metre", - "cs": "metr" - } - }, - { - "canonicalDenomination": "cm", - "alternativeDenomination": [ - "centimeter", - "cms" - ], - "human": { - "en": "centimeter", - "fr": "centimètre", - "de": "Zentimeter", - "da": "centimeter", - "nl": "centimeter", - "ca": "centimetre", - "cs": "centimetr" - } - } - ] - } - ], + "passAllFeatures": true, "tagRenderings": [ { "id": "entrance_info", @@ -162,5 +120,48 @@ "render": "The entrance with the biggest width is {canonical(_biggest_width)} wide", "condition": "_biggest_width_id~*" } + ], + "units": [ + { + "appliesToKey": [ + "width", + "_biggest_width" + ], + "defaultUnit": "cm", + "applicableUnits": [ + { + "useIfNoUnitGiven": true, + "canonicalDenomination": "m", + "alternativeDenomination": [ + "meter" + ], + "human": { + "en": "meter", + "fr": "mètre", + "de": "Meter", + "da": "meter", + "nl": "meter", + "ca": "metre", + "cs": "metr" + } + }, + { + "canonicalDenomination": "cm", + "alternativeDenomination": [ + "centimeter", + "cms" + ], + "human": { + "en": "centimeter", + "fr": "centimètre", + "de": "Zentimeter", + "da": "centimeter", + "nl": "centimeter", + "ca": "centimetre", + "cs": "centimetr" + } + } + ] + } ] } diff --git a/assets/layers/waste_basket/waste_basket.json b/assets/layers/waste_basket/waste_basket.json index 7db351a01..2c572b62e 100644 --- a/assets/layers/waste_basket/waste_basket.json +++ b/assets/layers/waste_basket/waste_basket.json @@ -13,7 +13,18 @@ "fr": "Poubelle", "cs": "Odpadkový koš" }, - "minzoom": 17, + "description": { + "en": "This is a public waste basket, thrash can, where you can throw away your thrash.", + "nl": "Dit is een publieke vuilnisbak waar je je afval kan weggooien.", + "de": "Dies ist ein öffentlicher Abfalleimer, in den Sie Ihren Müll entsorgen können.", + "hu": "Ez egy nyilvános szemétkosár vagy kuka, ahová kidobhatod a szemetedet.", + "it": "Questo è un cestino dei rifiuti pubblico, un bidone della spazzatura, dove puoi buttare via la tua spazzatura", + "es": "Esta es una papelera pública, donde puedes tirar tu basura.", + "da": "Dette er en offentlig affaldskurv, en skraldespand, hvor du kan smide dit affald.", + "fr": "C'est une poubelle dans laquelle vous pouvez jeter vos mégots.", + "ca": "Es tracta d'una paperera pública, una paperera, on pots llençar la teva paperera.", + "cs": "Jedná se o veřejný odpadkový koš, odpadkový koš, kam můžete vyhodit odpadky." + }, "source": { "osmTags": { "and": [ @@ -21,6 +32,7 @@ ] } }, + "minzoom": 17, "title": { "render": { "en": "Waste Basket", @@ -35,18 +47,49 @@ "cs": "Odpadkový koš" } }, - "description": { - "en": "This is a public waste basket, thrash can, where you can throw away your thrash.", - "nl": "Dit is een publieke vuilnisbak waar je je afval kan weggooien.", - "de": "Dies ist ein öffentlicher Abfalleimer, in den Sie Ihren Müll entsorgen können.", - "hu": "Ez egy nyilvános szemétkosár vagy kuka, ahová kidobhatod a szemetedet.", - "it": "Questo è un cestino dei rifiuti pubblico, un bidone della spazzatura, dove puoi buttare via la tua spazzatura", - "es": "Esta es una papelera pública, donde puedes tirar tu basura.", - "da": "Dette er en offentlig affaldskurv, en skraldespand, hvor du kan smide dit affald.", - "fr": "C'est une poubelle dans laquelle vous pouvez jeter vos mégots.", - "ca": "Es tracta d'una paperera pública, una paperera, on pots llençar la teva paperera.", - "cs": "Jedná se o veřejný odpadkový koš, odpadkový koš, kam můžete vyhodit odpadky." - }, + "pointRendering": [ + { + "iconSize": "40,40", + "anchor": "center", + "location": [ + "point" + ], + "marker": [ + { + "icon": "./assets/themes/waste_basket/waste_basket.svg" + } + ] + } + ], + "lineRendering": [ + { + "color": "#00f", + "width": "8" + } + ], + "presets": [ + { + "tags": [ + "amenity=waste_basket" + ], + "title": { + "en": "a waste basket", + "nl": "een vuilnisbak", + "ru": "Контейнер для мусора", + "de": "einen Abfalleimer", + "eo": "Rubujo", + "it": "un cestino dei rifiuti", + "id": "sebuah keranjang sampah", + "da": "en affaldskurv", + "ca": "una paperera", + "fr": "une poubelle", + "cs": "odpadkový koš" + }, + "presiceInput": { + "preferredBackground": "photo" + } + } + ], "tagRenderings": [ "images", { @@ -256,29 +299,6 @@ ] } ], - "presets": [ - { - "tags": [ - "amenity=waste_basket" - ], - "title": { - "en": "a waste basket", - "nl": "een vuilnisbak", - "ru": "Контейнер для мусора", - "de": "einen Abfalleimer", - "eo": "Rubujo", - "it": "un cestino dei rifiuti", - "id": "sebuah keranjang sampah", - "da": "en affaldskurv", - "ca": "una paperera", - "fr": "une poubelle", - "cs": "odpadkový koš" - }, - "presiceInput": { - "preferredBackground": "photo" - } - } - ], "filter": [ { "id": "waste-type", @@ -413,41 +433,15 @@ "enableRelocation": false, "enableImproveAccuracy": true }, - "mapRendering": [ - { - "icon": "./assets/themes/waste_basket/waste_basket.svg", + "cs": { + "0": { "iconSize": { - "render": "40,40,center", - "mappings": [ - { - "if": { - "and": [ - "amenity=waste_basket" - ] - }, - "then": { - "en": "Waste Basket", - "nl": "Vuilnisbak", - "ru": "Контейнер для мусора", - "de": "Abfalleimer", - "id": "Keranjang Sampah", - "es": "Papelera", - "it": "Cestino dei rifiuti", - "da": "Affaldskurv", - "ca": "Paperera", - "fr": "Poubelle", - "cs": "Odpadkový koš" - } + "mappings": { + "0": { + "then": "Odpadkový koš" } - ] - }, - "location": [ - "point" - ] - }, - { - "color": "#00f", - "width": "8" + } + } } - ] + } } diff --git a/assets/layers/waste_disposal/waste_disposal.json b/assets/layers/waste_disposal/waste_disposal.json index 52e7b6579..a088f949a 100644 --- a/assets/layers/waste_disposal/waste_disposal.json +++ b/assets/layers/waste_disposal/waste_disposal.json @@ -38,16 +38,25 @@ "cs": "Nakládání s odpady" } }, - "mapRendering": [ + "pointRendering": [ { "location": [ "point", "centroid" ], - "icon": "circle:white;./assets/layers/waste_disposal/waste_disposal.svg", - "iconSize": "20,20" + "iconSize": "20,20", + "marker": [ + { + "icon": "circle", + "color": "white" + }, + { + "icon": "./assets/layers/waste_disposal/waste_disposal.svg" + } + ] } ], + "lineRendering": [], "presets": [ { "title": { @@ -244,11 +253,6 @@ ] } ], - "allowMove": { - "enableImproveAccuracy": true, - "enableRelocation": true - }, - "deletion": true, "filter": [ { "#": "ignore-possible-duplicate", @@ -269,5 +273,10 @@ } ] } - ] + ], + "deletion": true, + "allowMove": { + "enableImproveAccuracy": true, + "enableRelocation": true + } } diff --git a/assets/layers/windturbine/windturbine.json b/assets/layers/windturbine/windturbine.json index d65591df4..82e2787cc 100644 --- a/assets/layers/windturbine/windturbine.json +++ b/assets/layers/windturbine/windturbine.json @@ -61,6 +61,50 @@ } ] }, + "pointRendering": [ + { + "label": { + "mappings": [ + { + "if": "generator:output:electricity~^[0-9]+.*[W]$", + "then": "
    {generator:output:electricity}
    " + } + ] + }, + "iconSize": "40, 40", + "anchor": "bottom", + "location": [ + "point", + "centroid" + ], + "marker": [ + { + "icon": "./assets/themes/openwindpowermap/wind_turbine.svg" + } + ] + } + ], + "lineRendering": [], + "presets": [ + { + "tags": [ + "power=generator", + "generator:source=wind" + ], + "title": { + "en": "a wind turbine", + "nl": "een windturbine", + "fr": "une éolienne", + "de": "ein Windrad", + "it": "una pala eolica", + "zh_Hant": "風機", + "hu": "Szélerőmű", + "da": "en vindmølle", + "ca": "una turbina eòlica", + "cs": "větrná turbína" + } + } + ], "tagRenderings": [ { "id": "turbine-output", @@ -254,26 +298,6 @@ }, "images" ], - "presets": [ - { - "tags": [ - "power=generator", - "generator:source=wind" - ], - "title": { - "en": "a wind turbine", - "nl": "een windturbine", - "fr": "une éolienne", - "de": "ein Windrad", - "it": "una pala eolica", - "zh_Hant": "風機", - "hu": "Szélerőmű", - "da": "en vindmølle", - "ca": "una turbina eòlica", - "cs": "větrná turbína" - } - } - ], "units": [ { "appliesToKey": [ @@ -401,24 +425,5 @@ } ] } - ], - "mapRendering": [ - { - "icon": "./assets/themes/openwindpowermap/wind_turbine.svg", - "label": { - "mappings": [ - { - "if": "generator:output:electricity~^[0-9]+.*[W]$", - "then": "
    {generator:output:electricity}
    " - } - ] - }, - "iconSize": "40, 40", - "anchor": "bottom", - "location": [ - "point", - "centroid" - ] - } ] } diff --git a/assets/svg/add.svg b/assets/svg/add.svg index e0ec8b41a..6bde6716f 100644 --- a/assets/svg/add.svg +++ b/assets/svg/add.svg @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/assets/svg/license_info.json b/assets/svg/license_info.json index d8c29df6e..8a9e84cc7 100644 --- a/assets/svg/license_info.json +++ b/assets/svg/license_info.json @@ -659,14 +659,6 @@ "authors": [], "sources": [] }, - { - "path": "location-empty.svg", - "license": "CC0-1.0", - "authors": [ - "Pol Labaut" - ], - "sources": [] - }, { "path": "location-refused.svg", "license": "CC0-1.0", @@ -683,6 +675,14 @@ ], "sources": [] }, + { + "path": "location_empty.svg", + "license": "CC0-1.0", + "authors": [ + "Pol Labaut" + ], + "sources": [] + }, { "path": "location_locked.svg", "license": "CC0-1.0", @@ -1209,18 +1209,6 @@ "authors": [], "sources": [] }, - { - "path": "star_outline_half.svg", - "license": "TRIVIAL", - "authors": [], - "sources": [] - }, - { - "path": "star_outline_half.svg", - "license": "TRIVIAL", - "authors": [], - "sources": [] - }, { "path": "statistics.svg", "license": "CC-BY-3.0", diff --git a/assets/svg/location-empty.svg b/assets/svg/location_empty.svg similarity index 100% rename from assets/svg/location-empty.svg rename to assets/svg/location_empty.svg diff --git a/assets/svg/location_empty.svg.license b/assets/svg/location_empty.svg.license new file mode 100644 index 000000000..c2bdd116b --- /dev/null +++ b/assets/svg/location_empty.svg.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: Pol Labaut +SPDX-License-Identifier: CC0-1.0 \ No newline at end of file diff --git a/assets/svg/osm-logo.svg b/assets/svg/osm-logo.svg index eab6bc5b9..feb458d19 100644 --- a/assets/svg/osm-logo.svg +++ b/assets/svg/osm-logo.svg @@ -1,1368 +1,2515 @@ - - OpenStreetMap logo 2011 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - OpenStreetMap logo 2011 - - - Ken Vermette - - - - April 2011 - - - OpenStreetMap.org - - - Replacement logo for OpenStreetMap Foundation - - - OSM openstreetmap logo - - - http://wiki.openstreetmap.org/wiki/File:Public-images-osm_logo.svg - - - - - - - - - - - - - - - - + + + OpenStreetMap logo 2011 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + OpenStreetMap logo 2011 + + + Ken Vermette + + + + April 2011 + + + OpenStreetMap.org + + + Replacement logo for OpenStreetMap Foundation + + + OSM openstreetmap logo + + + http://wiki.openstreetmap.org/wiki/File:Public-images-osm_logo.svg + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - 01011001 - 00110101 - 10010011 - - 01011001 - 00110101 - 10010011 - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - \ No newline at end of file + + + + + + + + + + + + + + + + + 01011001 00110101 10010011   + 01011001 00110101 10010011   + + + diff --git a/assets/svg/star_outline_half.svg b/assets/svg/star_outline_half.svg deleted file mode 100644 index 8c08c6cda..000000000 --- a/assets/svg/star_outline_half.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/assets/themes/advertising/advertising.json b/assets/themes/advertising/advertising.json index 1aa5355ca..f0b67bac2 100644 --- a/assets/themes/advertising/advertising.json +++ b/assets/themes/advertising/advertising.json @@ -1,6 +1,5 @@ { "id": "advertising", - "credits": "Offsel", "title": { "en": "Advertising", "ca": "Publicitat", @@ -13,18 +12,6 @@ "eu": "Publizitatea", "pl": "Reklamy" }, - "shortDescription": { - "ca": "On puc trobar elements publicitaris?", - "es": "Dónde puedo encontrar elementos publicitarios?", - "en": "Where I can find advertising features?", - "de": "Wo finde ich Werbeträger?", - "cs": "Kde najdu reklamní objekty?", - "fr": "Où puis-je trouver des dispositifs publicitaires ?", - "nl": "Waar zijn er reclameborden?", - "zh_Hant": "我能夠在那裡找到廣告物件?", - "eu": "Non aurki ditzaket publizitate ezaugarriak?", - "pl": "Gdzie mogę znaleźć obiekty reklamowe?" - }, "description": { "ca": "Alguna vegada t'has preguntat quanta publictat hi ha als nostres carrers i carreteres? Amb aquest mapa podràs trobar i afegir informació de tots els elements publictaris que t'hi trobes pel carrer", "es": "¿Alguna vez te has preguntado cuanta publicidad hay en nuestras calles y carreteras? Con este mapa podrás encontrar y añadir información de todos los elementos publicitarios que te encuentres por la calle", @@ -38,13 +25,25 @@ "eu": "Inoiz pentsatu duzu zenbat iragarki dauden gure kale eta errepideetan? Mapa honekin, kalean aurki ditzakezun publizitate-ezaugarri guztiei buruzko informazioa aurkitu eta erants dezakezu", "pl": "Czy zastanawiałeś się kiedyś, ile reklam jest na naszych ulicach i drogach? Dzięki tej mapie możesz znaleźć i dodać informacje o wszystkich funkcjach reklamowych, które możesz znaleźć na ulicy" }, - "maintainer": "Offsel", + "shortDescription": { + "ca": "On puc trobar elements publicitaris?", + "es": "Dónde puedo encontrar elementos publicitarios?", + "en": "Where I can find advertising features?", + "de": "Wo finde ich Werbeträger?", + "cs": "Kde najdu reklamní objekty?", + "fr": "Où puis-je trouver des dispositifs publicitaires ?", + "nl": "Waar zijn er reclameborden?", + "zh_Hant": "我能夠在那裡找到廣告物件?", + "eu": "Non aurki ditzaket publizitate ezaugarriak?", + "pl": "Gdzie mogę znaleźć obiekty reklamowe?" + }, "icon": "./assets/themes/advertising/icon.svg", - "startLat": 0, - "startLon": 0, - "startZoom": 1, - "widenFactor": 0.01, + "credits": [ + "Offsel" + ], "layers": [ "advertising" - ] + ], + "widenFactor": 0.01, + "maintainer": "Offsel" } \ No newline at end of file diff --git a/assets/themes/aed/aed.json b/assets/themes/aed/aed.json index a2aaed745..acb09ab23 100644 --- a/assets/themes/aed/aed.json +++ b/assets/themes/aed/aed.json @@ -25,7 +25,6 @@ "zgh": "ⴽⵛⵎ ⵖⵔ ⵜⴽⴰⵕⴹⴰ ⵏ AED", "eu": "Desfibriladoreak" }, - "icon": "./assets/themes/aed/aed.svg", "description": { "en": "On this map, one can find and mark nearby defibrillators", "ca": "En aquest mapa , qualsevol pot trobar i marcar els desfibril·ladors externs automàtics més propers", @@ -51,8 +50,7 @@ "zgh": "ⴳ ⵜⴽⴰⵕⴹⴰ ⴰⴷ, ⵉⵣⵎⵔⵏ ⵓⴼⴳⴰⵏ ⴰⴷ ⵢⴰⴼ ⵓⵎⵍⴰⵏ ⵅⴼ ⵡⴰⵍⵍⴰⵍⵏ ⵏ ⵜⵓⴽⴽⵙⴰ ⵏ ⵜⵔⴳⴰⴳⴰⵢⵜ", "eu": "Mapa honetan, hurbileko desfibriladoreak aurkitu eta marka daitezke" }, - "startLat": 0, - "startLon": 0, + "icon": "./assets/themes/aed/aed.svg", "startZoom": 12, "layers": [ "defibrillator" diff --git a/assets/themes/artwork/artwork.json b/assets/themes/artwork/artwork.json index c0fcfa17f..7c7015cbb 100644 --- a/assets/themes/artwork/artwork.json +++ b/assets/themes/artwork/artwork.json @@ -49,8 +49,6 @@ }, "icon": "./assets/themes/artwork/artwork.svg", "startZoom": 12, - "startLat": 0, - "startLon": 0, "layers": [ "artwork" ] diff --git a/assets/themes/atm/atm.json b/assets/themes/atm/atm.json index 9d3a3ce93..d8148c7f1 100644 --- a/assets/themes/atm/atm.json +++ b/assets/themes/atm/atm.json @@ -32,9 +32,6 @@ "pl": "Ta mapa pokazuje bankomaty, w których można wypłacać lub wpłacać pieniądze" }, "icon": "./assets/themes/atm/logo.svg", - "startLat": 0, - "startLon": 0, - "startZoom": 0, "layers": [ "atm", { diff --git a/assets/themes/bag/bag.json b/assets/themes/bag/bag.json index 351b55763..158f122e0 100644 --- a/assets/themes/bag/bag.json +++ b/assets/themes/bag/bag.json @@ -12,17 +12,6 @@ "zh_Hant": "BAG 匯入助手", "pl": "Pomocnik importowy BAG" }, - "shortDescription": { - "nl": "BAG import helper tool", - "en": "BAG import helper tool", - "de": "BAG-Import-Hilfswerkzeug", - "fr": "Outil de facilitation d'import BAG", - "ca": "Ferramenta d'ajuda per a importar el BAG", - "es": "Herramienta de ayuda a la importación BAG", - "cs": "Pomocný nástroj pro import BAG", - "eu": "BAGak inportatzen laguntzeko tresna", - "pl": "Narzędzie wspomagające import BAG" - }, "description": { "nl": "Dit thema helpt het importeren van BAG data", "en": "This theme helps with importing data from BAG", @@ -35,11 +24,25 @@ "eu": "Gai honek BAGeko datuak inportatzen laguntzen du", "pl": "Motyw ten pomaga w importowaniu danych z BAG" }, - "credits": "Wouter van der Wal", + "shortDescription": { + "nl": "BAG import helper tool", + "en": "BAG import helper tool", + "de": "BAG-Import-Hilfswerkzeug", + "fr": "Outil de facilitation d'import BAG", + "ca": "Ferramenta d'ajuda per a importar el BAG", + "es": "Herramienta de ayuda a la importación BAG", + "cs": "Pomocný nástroj pro import BAG", + "eu": "BAGak inportatzen laguntzeko tresna", + "pl": "Narzędzie wspomagające import BAG" + }, "icon": "./assets/themes/bag/logo.svg", + "startZoom": 9, "startLat": 53.1726, "startLon": 7.04545, - "startZoom": 9, + "credits": [ + "Wouter van der Wal" + ], + "hideFromOverview": true, "layers": [ { "id": "osm:buildings", @@ -54,49 +57,6 @@ "calculatedTags": [ "_surface:strict:=feat(get)('_surface')" ], - "mapRendering": [ - { - "width": { - "render": "2", - "mappings": [ - { - "if": "fixme~*", - "then": "5" - } - ] - }, - "color": { - "render": "#00c", - "mappings": [ - { - "if": "fixme~*", - "then": "#ff00ff" - }, - { - "if": "building=house", - "then": "#a00" - }, - { - "if": "building=shed", - "then": "#563e02" - }, - { - "if": { - "or": [ - "building=garage", - "building=garages" - ] - }, - "then": "#f9bfbb" - }, - { - "if": "building=yes", - "then": "#0774f2" - } - ] - } - } - ], "tagRenderings": [ { "id": "Reference", @@ -140,6 +100,10 @@ "render": "This building is a {building}", "question": "What kind of building is this?" } + ], + "pointRendering": [], + "lineRendering": [ + {} ] }, { @@ -160,7 +124,7 @@ "maxCacheAge": 0 }, "minzoom": 18, - "mapRendering": [ + "pointRendering": [ { "label": { "render": "
    {addr:housenumber}
    ", @@ -170,7 +134,9 @@ "point", "centroid" ] - }, + } + ], + "lineRendering": [ { "width": { "render": 1 @@ -216,28 +182,6 @@ "_osm_obj:building=feat(get)('_overlaps_with_properties')?.building", "_imported_osm_object_found:=Number(feat.properties.identificatie)==Number(feat(get)('_overlaps_with_properties')['ref:bag'])" ], - "mapRendering": [ - { - "width": { - "render": 5, - "mappings": [ - { - "if": "_imported_osm_object_found=true", - "then": "1" - } - ] - }, - "color": { - "render": "#00a", - "mappings": [ - { - "if": "_imported_osm_object_found=true", - "then": "#0f0" - } - ] - } - } - ], "tagRenderings": [ { "id": "Import button", @@ -374,6 +318,30 @@ "id": "Buidling function", "render": "The current function of the building is {gebruiksdoel}" } + ], + "pointRendering": [ + { + "label": { + "render": "
    {_bag_obj:addr:housenumber}
    ", + "mappings": [ + { + "if": "_imported_osm_object_found=true", + "then": "
    {_bag_obj:addr:housenumber}
    " + } + ] + }, + "location": [ + "point", + "centroid" + ] + } + ], + "lineRendering": [ + { + "width": { + "render": 1 + } + } ] }, { @@ -399,7 +367,18 @@ "_osm_obj:addr:street:=feat(get)('_closed_osm_addr')['addr:street']", "_imported_osm_object_found:=(feat.properties.woonplaats==feat(get)('_closed_osm_addr')['addr:city'])&&(feat(get)('_bag_obj:addr:housenumber')==feat(get)('_closed_osm_addr')['addr:housenumber'])&&(feat.properties.postcode==feat(get)('_closed_osm_addr')['addr:postcode'])&&(feat.properties.openbare_ruimte==feat(get)('_closed_osm_addr')['addr:street'])" ], - "mapRendering": [ + "tagRenderings": [ + { + "id": "Import button", + "render": "{import_button(osm:adresses, addr:city=$woonplaats; addr:housenumber=$_bag_obj:addr:housenumber; addr:postcode=$postcode; addr:street=$openbare_ruimte; ref:bag=$_bag_obj:ref:bag; source=BAG; source:date=$_bag_obj:source:date, Upload this adress to OpenStreetMap)}", + "condition": "_imported_osm_object_found=false" + }, + { + "id": "Address", + "render": "{openbare_ruimte} {_bag_obj:addr:housenumber}, {woonplaats} {postcode}" + } + ], + "pointRendering": [ { "label": { "render": "
    {_bag_obj:addr:housenumber}
    ", @@ -414,25 +393,15 @@ "point", "centroid" ] - }, + } + ], + "lineRendering": [ { "width": { "render": 1 } } - ], - "tagRenderings": [ - { - "id": "Import button", - "render": "{import_button(osm:adresses, addr:city=$woonplaats; addr:housenumber=$_bag_obj:addr:housenumber; addr:postcode=$postcode; addr:street=$openbare_ruimte; ref:bag=$_bag_obj:ref:bag; source=BAG; source:date=$_bag_obj:source:date, Upload this adress to OpenStreetMap)}", - "condition": "_imported_osm_object_found=false" - }, - { - "id": "Address", - "render": "{openbare_ruimte} {_bag_obj:addr:housenumber}, {woonplaats} {postcode}" - } ] } - ], - "hideFromOverview": true + ] } diff --git a/assets/themes/benches/benches.json b/assets/themes/benches/benches.json index 9e839ce27..6156ccebb 100644 --- a/assets/themes/benches/benches.json +++ b/assets/themes/benches/benches.json @@ -22,6 +22,24 @@ "eu": "Eserlekuak", "pl": "Ławki" }, + "description": { + "en": "This map shows all benches that are recorded in OpenStreetMap: Individual benches, and benches belonging to public transport stops or shelters.", + "de": "Diese Karte zeigt alle Sitzbänke, die in OpenStreetMap eingetragen sind: Alleinstehende Bänke und Bänke, die zu Haltestellen oder Unterständen gehören.", + "fr": "Cette carte affiche les bancs cartographiés dans OpenStreetMap, entre autres : bancs des transports en commun, bancs publics, etc.", + "nl": "Deze kaart toont alle zitbanken die zijn opgenomen in OpenStreetMap: individuele banken en banken bij bushaltes.", + "it": "Questa mappa mostra tutte le panchine che sono state aggiunte su OpenStreetMap: panchine individuali e quelle alle fermate del trasporto pubblico o nei ripari. Se disponi di un account OpenStreetMap puoi mappare delle nuove panchine o modificare i dettagli di quelle esistenti.", + "ru": "На этой карте показаны все скамейки, записанные в OpenStreetMap: отдельные скамейки, а также скамейки, относящиеся к остановкам общественного транспорта или навесам. Имея учётную запись OpenStreetMap, вы можете наносить на карту новые скамейки или редактировать информацию о существующих скамейках.", + "ja": "このマップには、OpenStreetMapに記録されているすべてのベンチが表示されます。個々のベンチ、および公共交通機関の停留所または避難場所に属するベンチです。OpenStreetMapアカウントを使用すると、新しいベンチをマップしたり、既存のベンチの詳細を編集したりできます。", + "zh_Hant": "這份地圖顯示開放街圖上所有記錄的長椅:單獨的長椅,屬於大眾運輸站點或涼亭的長椅。", + "hu": "Ez a térkép megjeleníti az OpenStreetMap-en rögzített összes padot: egyes padokat, valamint tömegközlekedési megállókban vagy menedékhelyeken található padokat. OpenStreetMap-fiókkal Ön is felrajzolhat új padokat, vagy szerkesztheti a meglévő padok részleteit.", + "ca": "Aquest mapa mostra tots els bancs que hi ha a OpenStreetMap: bancs individuals i els bancs que hi ha a parades o refugis de transport públic.", + "es": "Este mapa muestra todos los bancos que están registrados en OpenStreetMap: Bancos individuales, bancos que pertenecen a paradas o marquesinas del transporte público.", + "nb_NO": "Viser alle benker som er registrert i OpenStreetMap: Individuelle benker, og benker som tilhører offentlig transport eller -skur. Med en OpenStreetMap-konto kan du kartlegge nye benker eller redigere eksisterende.", + "da": "Dette kort viser alle bænke, der er registreret i OpenStreetMap: Individuelle bænke og bænke, der hører til offentlige transportpladser eller shelters. Med en OpenStreetMap-konto kan du kortlægge nye bænke eller redigere detaljer om eksisterende bænke.", + "cs": "Tato mapa zobrazuje všechny lavičky, které jsou zaznamenány v OpenStreetMap: samostatné lavičky a lavičky patřící k zastávkám veřejné dopravy nebo přístřeškům.", + "eu": "OpenStreetMap-en erregistratzen diren banku guztiak erakusten ditu mapa honek: garraio publikoko geralekuetako edo babeslekuetako banakako bankuak eta bankuak.", + "pl": "Mapa ta pokazuje wszystkie ławki zarejestrowane w OpenStreetMap: ławki indywidualne oraz ławki należące do przystanków komunikacji miejskiej lub wiat." + }, "shortDescription": { "en": "A map of benches", "de": "Eine Karte aller Sitzbänke", @@ -43,33 +61,14 @@ "eu": "Eserleku mapa bat", "pl": "Mapa ławek" }, - "description": { - "en": "This map shows all benches that are recorded in OpenStreetMap: Individual benches, and benches belonging to public transport stops or shelters.", - "de": "Diese Karte zeigt alle Sitzbänke, die in OpenStreetMap eingetragen sind: Alleinstehende Bänke und Bänke, die zu Haltestellen oder Unterständen gehören.", - "fr": "Cette carte affiche les bancs cartographiés dans OpenStreetMap, entre autres : bancs des transports en commun, bancs publics, etc.", - "nl": "Deze kaart toont alle zitbanken die zijn opgenomen in OpenStreetMap: individuele banken en banken bij bushaltes.", - "it": "Questa mappa mostra tutte le panchine che sono state aggiunte su OpenStreetMap: panchine individuali e quelle alle fermate del trasporto pubblico o nei ripari. Se disponi di un account OpenStreetMap puoi mappare delle nuove panchine o modificare i dettagli di quelle esistenti.", - "ru": "На этой карте показаны все скамейки, записанные в OpenStreetMap: отдельные скамейки, а также скамейки, относящиеся к остановкам общественного транспорта или навесам. Имея учётную запись OpenStreetMap, вы можете наносить на карту новые скамейки или редактировать информацию о существующих скамейках.", - "ja": "このマップには、OpenStreetMapに記録されているすべてのベンチが表示されます。個々のベンチ、および公共交通機関の停留所または避難場所に属するベンチです。OpenStreetMapアカウントを使用すると、新しいベンチをマップしたり、既存のベンチの詳細を編集したりできます。", - "zh_Hant": "這份地圖顯示開放街圖上所有記錄的長椅:單獨的長椅,屬於大眾運輸站點或涼亭的長椅。", - "hu": "Ez a térkép megjeleníti az OpenStreetMap-en rögzített összes padot: egyes padokat, valamint tömegközlekedési megállókban vagy menedékhelyeken található padokat. OpenStreetMap-fiókkal Ön is felrajzolhat új padokat, vagy szerkesztheti a meglévő padok részleteit.", - "ca": "Aquest mapa mostra tots els bancs que hi ha a OpenStreetMap: bancs individuals i els bancs que hi ha a parades o refugis de transport públic.", - "es": "Este mapa muestra todos los bancos que están registrados en OpenStreetMap: Bancos individuales, bancos que pertenecen a paradas o marquesinas del transporte público.", - "nb_NO": "Viser alle benker som er registrert i OpenStreetMap: Individuelle benker, og benker som tilhører offentlig transport eller -skur. Med en OpenStreetMap-konto kan du kartlegge nye benker eller redigere eksisterende.", - "da": "Dette kort viser alle bænke, der er registreret i OpenStreetMap: Individuelle bænke og bænke, der hører til offentlige transportpladser eller shelters. Med en OpenStreetMap-konto kan du kortlægge nye bænke eller redigere detaljer om eksisterende bænke.", - "cs": "Tato mapa zobrazuje všechny lavičky, které jsou zaznamenány v OpenStreetMap: samostatné lavičky a lavičky patřící k zastávkám veřejné dopravy nebo přístřeškům.", - "eu": "OpenStreetMap-en erregistratzen diren banku guztiak erakusten ditu mapa honek: garraio publikoko geralekuetako edo babeslekuetako banakako bankuak eta bankuak.", - "pl": "Mapa ta pokazuje wszystkie ławki zarejestrowane w OpenStreetMap: ławki indywidualne oraz ławki należące do przystanków komunikacji miejskiej lub wiat." - }, "icon": "./assets/themes/benches/bench_poi.svg", - "startLat": 0, - "startLon": 0, - "startZoom": 1, - "widenFactor": 1.5, + "credits": [ + "Florian Edelmann" + ], "layers": [ "picnic_table", "bench", "bench_at_pt" ], - "credits": "Florian Edelmann" + "widenFactor": 1.5 } \ No newline at end of file diff --git a/assets/themes/bicycle_rental/bicycle_rental.json b/assets/themes/bicycle_rental/bicycle_rental.json index b50ccd237..2d07e6932 100644 --- a/assets/themes/bicycle_rental/bicycle_rental.json +++ b/assets/themes/bicycle_rental/bicycle_rental.json @@ -16,20 +16,6 @@ "eu": "Bizikleta alokairua", "pl": "Wypożyczanie rowerów" }, - "shortDescription": { - "en": "A map with bicycle rental stations and bicycle rental shops", - "nl": "Een kaart met fietsverhuurpunten en fietsverhuurzaken", - "de": "Eine Karte mit Fahrradverleihstationen und Fahrradverleihgeschäften", - "id": "Peta dengan stasiun persewaan sepeda dan toko penyewaan sepeda", - "fr": "Une carte avec des stations et magasins de location de vélos", - "es": "Un mapa con estaciones de alquiler de bicicletas y tiendas de alquiler de bicicletas", - "nb_NO": "Sykkelutleiestasjoner og sykkelutleiebutikker", - "ca": "Un mapa amb estacions de lloguer de bicicletes i botigues de lloguer de bicicletes", - "da": "Et kort med cykeludlejningsstationer og cykeludlejningsbutikker", - "cs": "Mapa se stanicemi a obchody pro vypůjčení kol", - "eu": "Bizikletak alokatzeko estazioen eta bizikletak alokatzeko denden mapa", - "pl": "Mapa ze stacjami wypożyczania rowerów i wypożyczalniami rowerów" - }, "description": { "en": "On this map, you'll find the many bicycle rental stations as they are known by OpenStreetMap", "nl": "Op deze kaart vind je verschillende fietsverhuurpunten en fietsverhuurzaken", @@ -44,12 +30,23 @@ "it": "In questa mappa trovi i luoghi conosciuti da OpenStreetMap dove puoi noleggiare delle biciclette", "pl": "Na tej mapie znajdziesz wiele stacji wynajmu rowerów, znanych w OpenStreetMap" }, + "shortDescription": { + "en": "A map with bicycle rental stations and bicycle rental shops", + "nl": "Een kaart met fietsverhuurpunten en fietsverhuurzaken", + "de": "Eine Karte mit Fahrradverleihstationen und Fahrradverleihgeschäften", + "id": "Peta dengan stasiun persewaan sepeda dan toko penyewaan sepeda", + "fr": "Une carte avec des stations et magasins de location de vélos", + "es": "Un mapa con estaciones de alquiler de bicicletas y tiendas de alquiler de bicicletas", + "nb_NO": "Sykkelutleiestasjoner og sykkelutleiebutikker", + "ca": "Un mapa amb estacions de lloguer de bicicletes i botigues de lloguer de bicicletes", + "da": "Et kort med cykeludlejningsstationer og cykeludlejningsbutikker", + "cs": "Mapa se stanicemi a obchody pro vypůjčení kol", + "eu": "Bizikletak alokatzeko estazioen eta bizikletak alokatzeko denden mapa", + "pl": "Mapa ze stacjami wypożyczania rowerów i wypożyczalniami rowerów" + }, "icon": "./assets/themes/bicycle_rental/logo.svg", - "startLat": 0, - "startLon": 0, - "startZoom": 1, - "widenFactor": 0.05, "layers": [ "bicycle_rental" - ] + ], + "widenFactor": 0.05 } \ No newline at end of file diff --git a/assets/themes/bicyclelib/bicyclelib.json b/assets/themes/bicyclelib/bicyclelib.json index 0280afe89..a203661f5 100644 --- a/assets/themes/bicyclelib/bicyclelib.json +++ b/assets/themes/bicyclelib/bicyclelib.json @@ -40,10 +40,6 @@ "pl": "Biblioteka rowerowa to miejsce, w którym można wypożyczyć rowery, często za niewielką opłatą roczną. Godnym uwagi przypadkiem zastosowania są biblioteki rowerowe dla dzieci, które pozwalają im zmienić rower na większy, gdy wyrosną z obecnego roweru" }, "icon": "./assets/themes/bicyclelib/logo.svg", - "startLat": 0, - "startLon": 0, - "startZoom": 1, - "widenFactor": 1.5, "layers": [ { "builtin": "bicycle_library", @@ -51,5 +47,6 @@ "minzoom": 0 } } - ] + ], + "widenFactor": 1.5 } \ No newline at end of file diff --git a/assets/themes/binoculars/binoculars.json b/assets/themes/binoculars/binoculars.json index 0c9bcb72f..a255913bc 100644 --- a/assets/themes/binoculars/binoculars.json +++ b/assets/themes/binoculars/binoculars.json @@ -17,22 +17,6 @@ "eu": "Binokularrak", "pl": "Lornetki" }, - "shortDescription": { - "en": "A map with fixed binoculars", - "nl": "Een kaart met publieke verrekijker", - "de": "Eine Karte mit festinstallierten Ferngläsern", - "it": "Una cartina dei binocoli pubblici fissi", - "nb_NO": "Et kart over fastmonterte kikkerter", - "zh_Hant": "固定望遠鏡的地圖", - "hu": "Rögzített távcsövek (binokulárok) térképe", - "fr": "Une carte de jumelles panoramiques", - "es": "Un mapa con prismáticos fijos", - "ca": "Un mapa amb prismàtics fixos", - "da": "Et kort over fastgjorte kikkerter", - "cs": "Mapa s pevnými dalekohledy", - "eu": "Prismatiko finkoak dituen mapa", - "pl": "Mapa ze stałymi lornetkami" - }, "description": { "en": "A map with binoculars fixed in place with a pole. It can typically be found on touristic locations, viewpoints, on top of panoramic towers or occasionally on a nature reserve.", "nl": "Een kaart met verrekijkers die op een vaste plaats zijn gemonteerd", @@ -49,12 +33,25 @@ "eu": "Zutoin batean prismatiko finkoak dituen mapa. Leku turistikoetan, begiratokietan, dorre panoramikoen gainean edo, batzuetan, erreserba natural batean egoten da.", "pl": "Mapa z lornetkami zamocowanymi na słupku. Zwykle można je odnaleźć w lokalizacjach turystycznych, punktach widokowych, na szczytach wież panoramicznych lub czasami w rezerwacie przyrody." }, + "shortDescription": { + "en": "A map with fixed binoculars", + "nl": "Een kaart met publieke verrekijker", + "de": "Eine Karte mit festinstallierten Ferngläsern", + "it": "Una cartina dei binocoli pubblici fissi", + "nb_NO": "Et kart over fastmonterte kikkerter", + "zh_Hant": "固定望遠鏡的地圖", + "hu": "Rögzített távcsövek (binokulárok) térképe", + "fr": "Une carte de jumelles panoramiques", + "es": "Un mapa con prismáticos fijos", + "ca": "Un mapa amb prismàtics fixos", + "da": "Et kort over fastgjorte kikkerter", + "cs": "Mapa s pevnými dalekohledy", + "eu": "Prismatiko finkoak dituen mapa", + "pl": "Mapa ze stałymi lornetkami" + }, "icon": "./assets/layers/binocular/telescope.svg", - "startLat": 0, - "startLon": 0, - "startZoom": 1, - "widenFactor": 1.5, "layers": [ "binocular" - ] + ], + "widenFactor": 1.5 } \ No newline at end of file diff --git a/assets/themes/blind_osm/blind_osm.json b/assets/themes/blind_osm/blind_osm.json index 29acc6835..8669e4096 100644 --- a/assets/themes/blind_osm/blind_osm.json +++ b/assets/themes/blind_osm/blind_osm.json @@ -28,9 +28,9 @@ "pl": "Pomóż umieszczać na mapie obiekty ważne dla niewidomych" }, "icon": "./assets/themes/blind_osm/Blindicon.svg", + "startZoom": 20, "startLat": 52.99238, "startLon": 6.570614, - "startZoom": 20, "defaultBackgroundId": "maptiler.backdrop", "layers": [ { diff --git a/assets/themes/bookcases/bookcases.json b/assets/themes/bookcases/bookcases.json index 4f6bd0b29..0f2f1f721 100644 --- a/assets/themes/bookcases/bookcases.json +++ b/assets/themes/bookcases/bookcases.json @@ -37,11 +37,8 @@ "pl": "Publiczny regał na książki to mała przyuliczna szafka, pudełko, stara budka telefoniczna lub inne przedmioty, w których przechowywane są książki. Każdy może w nich zostawić lub zabrać książkę. Celem tej mapy jest zebranie wszystkich tych regałów." }, "icon": "./assets/themes/bookcases/bookcase.svg", - "startLat": 0, - "startLon": 0, - "startZoom": 1, - "widenFactor": 1, "layers": [ "public_bookcase" - ] + ], + "widenFactor": 1 } \ No newline at end of file diff --git a/assets/themes/buurtnatuur/buurtnatuur.json b/assets/themes/buurtnatuur/buurtnatuur.json index f5394dcef..1a62d6cf6 100644 --- a/assets/themes/buurtnatuur/buurtnatuur.json +++ b/assets/themes/buurtnatuur/buurtnatuur.json @@ -1,27 +1,26 @@ { - "#dont-translate": "*", "id": "buurtnatuur", "title": { "nl": "Breng jouw buurtnatuur in kaart" }, - "shortDescription": { - "nl": "Met deze tool kan je natuur in je buurt in kaart brengen en meer informatie geven over je favoriete plekje" - }, - "hideFromOverview": true, - "enableShareScreen": false, - "enableMoreQuests": false, "description": { "nl": "logo-groenmeld je aan voor e-mailupdates." }, + "shortDescription": { + "nl": "Met deze tool kan je natuur in je buurt in kaart brengen en meer informatie geven over je favoriete plekje" + }, "descriptionTail": { "nl": "

    Tips

    • Over groen ingekleurde gebieden weten we alles wat we willen weten.
    • Bij rood ingekleurde gebieden ontbreekt nog heel wat info: klik een gebied aan en beantwoord de vragen.
    • Je kan altijd een vraag overslaan als je het antwoord niet weet of niet zeker bent
    • Je kan altijd een foto toevoegen
    • Je kan ook zelf een gebied toevoegen door op de kaart te klikken
    • Open buurtnatuur.be op je smartphone om al wandelend foto's te maken en vragen te beantwoorden

    De oorspronkelijke data komt van OpenStreetMap en je antwoorden worden daar bewaard.
    Omdat iedereen vrij kan meewerken aan dit project, kunnen we niet garanderen dat er geen fouten opduiken.Kan je hier niet aanpassen wat je wilt, dan kan je dat zelf via OpenStreetMap.org doen. Groen kan geen enkele verantwoordelijkheid nemen over de kaart.

    Je privacy is belangrijk. We tellen wel hoeveel gebruikers deze website bezoeken. We plaatsen een cookie waar geen persoonlijke informatie in bewaard wordt. Als je inlogt, komt er een tweede cookie bij met je inloggegevens.
    " }, "icon": "./assets/themes/buurtnatuur/logo.svg", + "socialImage": "./assets/themes/buurtnatuur/social_image.jpg", + "startZoom": 16, "startLat": 50.8435, "startLon": 4.3688, - "startZoom": 16, - "widenFactor": 1.2, - "socialImage": "./assets/themes/buurtnatuur/social_image.jpg", + "credits": [ + "Pieter Vander Vennet" + ], + "hideFromOverview": true, "layers": [ { "id": "nature_reserve_buurtnatuur", @@ -89,45 +88,9 @@ } } ], - "mapRendering": [ - { - "icon": "circle:#ffffff;./assets/themes/buurtnatuur/nature_reserve.svg", - "iconSize": "50,50", - "location": [ - "point" - ], - "anchor": "center" - }, - { - "color": { - "render": "#3c3", - "mappings": [ - { - "if": { - "and": [ - "name=", - "noname=", - "operator=", - "access=", - "access:description=", - "leisure=park" - ] - }, - "then": "#cc1100" - }, - { - "if": { - "and": [ - "name=", - "noname=" - ] - }, - "then": "#fccb37" - } - ] - }, - "width": "5" - } + "pointRendering": [], + "lineRendering": [ + {} ] }, { @@ -196,32 +159,9 @@ } } ], - "mapRendering": [ - { - "icon": "circle:#ffffff;./assets/themes/buurtnatuur/park.svg", - "iconSize": "40,40", - "location": [ - "point" - ], - "anchor": "center" - }, - { - "color": { - "render": "#3c3", - "mappings": [ - { - "if": { - "and": [ - "name=", - "noname=" - ] - }, - "then": "#fccb37" - } - ] - }, - "width": "5" - } + "pointRendering": [], + "lineRendering": [ + {} ] }, { @@ -291,50 +231,9 @@ } } ], - "mapRendering": [ - { - "icon": "circle:#ffffff;./assets/themes/buurtnatuur/forest.svg", - "iconSize": "40,40", - "location": [ - "point" - ], - "anchor": "center" - }, - { - "color": { - "render": "#3a3", - "mappings": [ - { - "if": { - "and": [ - "operator=", - "access=", - "access:description=" - ] - }, - "then": "#cc1100" - }, - { - "if": { - "and": [ - "operator=" - ] - }, - "then": "#cccc00" - }, - { - "if": { - "and": [ - "name=", - "noname=" - ] - }, - "then": "#fccb37" - } - ] - }, - "width": "5" - } + "pointRendering": [], + "lineRendering": [ + {} ] }, "viewpoint" @@ -597,5 +496,8 @@ } ] }, - "credits": "Pieter Vander Vennet" + "enableShareScreen": false, + "enableMoreQuests": false, + "widenFactor": 1.2, + "#dont-translate": "*" } \ No newline at end of file diff --git a/assets/themes/cafes_and_pubs/cafes_and_pubs.json b/assets/themes/cafes_and_pubs/cafes_and_pubs.json index 89a8dee81..6dba31fa2 100644 --- a/assets/themes/cafes_and_pubs/cafes_and_pubs.json +++ b/assets/themes/cafes_and_pubs/cafes_and_pubs.json @@ -36,11 +36,8 @@ "pl": "Kawiarnie, puby i bary" }, "icon": "./assets/layers/cafe_pub/pub.svg", - "startLat": 0, - "startLon": 0, - "startZoom": 1, - "widenFactor": 1.5, "layers": [ "cafe_pub" - ] + ], + "widenFactor": 1.5 } \ No newline at end of file diff --git a/assets/themes/campersite/campersite.json b/assets/themes/campersite/campersite.json index 0587436a4..48dc140c2 100644 --- a/assets/themes/campersite/campersite.json +++ b/assets/themes/campersite/campersite.json @@ -19,23 +19,6 @@ "eu": "Kanpinak", "pl": "Miejsca dla kamperów" }, - "shortDescription": { - "en": "Find sites to spend the night with your camper", - "it": "Trova aree dove passare la notte con il tuo camper", - "ru": "Найти места остановки, чтобы провести ночь в автофургоне", - "ja": "キャンパーと夜を共にするキャンプサイトを見つける", - "fr": "Trouver des sites pour passer la nuit avec votre camping-car", - "zh_Hant": "露營者尋找渡過夜晚的場地", - "nl": "Vind locaties waar je de nacht kan doorbrengen met je mobilehome", - "pt_BR": "Encontre locais para passar a noite com o seu campista", - "de": "Finden Sie Plätze zum Übernachten mit Ihrem Wohnmobil", - "hu": "Helyek, ahol lakóautóval eltöltheti az éjszakát", - "es": "Encuentra sitios para pasar la noche con tu caravana", - "da": "Find steder, hvor du kan overnatte med din autocamper", - "ca": "Troba llocs on passar la nit amb la teua caravana", - "cs": "Najděte místa, kde můžete strávit noc se svým karavanem", - "pl": "Znajdź miejsca, w których możesz spędzić noc w kamperze" - }, "description": { "en": "This site collects all official camper stopover places and places where you can dump grey and black water. You can add details about the services provided and the cost. Add pictures and reviews.", "it": "Questo sito raccoglie tutti i luoghi ufficiali dove sostare con il camper e aree dove è possibile scaricare acque grigie e nere. Puoi aggiungere dettagli riguardanti i servizi forniti e il loro costo. Aggiungi foto e recensioni. Questo è al contempo un sito web e una web app. I dati sono memorizzati su OpenStreetMap in modo tale che siano per sempre liberi e riutilizzabili da qualsiasi app.", @@ -53,12 +36,31 @@ "eu": "Karabanak gelditzeko leku ofizial guztiak eta ur gris eta beltzak botatzeko lekuak biltzen ditu. Emandako zerbitzuei eta kostuari buruzko xehetasunak gehitu ditzakezu. Erantsi argazkiak eta aipamenak.", "pl": "Na tej stronie zebrano wszystkie oficjalne miejsca postoju kamperów oraz miejsca, w których można wylać zanieczyszczoną wodę. Możesz dodać szczegóły dotyczące świadczonych usług i kosztów. Dodaj zdjęcia i recenzje." }, + "shortDescription": { + "en": "Find sites to spend the night with your camper", + "it": "Trova aree dove passare la notte con il tuo camper", + "ru": "Найти места остановки, чтобы провести ночь в автофургоне", + "ja": "キャンパーと夜を共にするキャンプサイトを見つける", + "fr": "Trouver des sites pour passer la nuit avec votre camping-car", + "zh_Hant": "露營者尋找渡過夜晚的場地", + "nl": "Vind locaties waar je de nacht kan doorbrengen met je mobilehome", + "pt_BR": "Encontre locais para passar a noite com o seu campista", + "de": "Finden Sie Plätze zum Übernachten mit Ihrem Wohnmobil", + "hu": "Helyek, ahol lakóautóval eltöltheti az éjszakát", + "es": "Encuentra sitios para pasar la noche con tu caravana", + "da": "Find steder, hvor du kan overnatte med din autocamper", + "ca": "Troba llocs on passar la nit amb la teua caravana", + "cs": "Najděte místa, kde můžete strávit noc se svým karavanem", + "pl": "Znajdź miejsca, w których możesz spędzić noc w kamperze" + }, "icon": "./assets/themes/campersite/caravan.svg", + "socialImage": "./assets/themes/campersite/social_image.jpg", + "startZoom": 14, "startLat": 43.14, "startLon": 3.14, - "startZoom": 14, - "widenFactor": 1.5, - "socialImage": "./assets/themes/campersite/social_image.jpg", + "credits": [ + "joost schouppe" + ], "layers": [ { "id": "caravansites", @@ -908,32 +910,9 @@ } } ], - "mapRendering": [ - { - "icon": { - "render": "circle:white;./assets/themes/campersite/caravan.svg", - "mappings": [ - { - "if": { - "and": [ - "fee=no" - ] - }, - "then": "circle:white;./assets/themes/campersite/caravan_green.svg" - } - ] - }, - "iconSize": "40,40", - "location": [ - "point", - "centroid" - ], - "anchor": "center" - }, - { - "color": "#00f", - "width": "8" - } + "pointRendering": [], + "lineRendering": [ + {} ] }, { @@ -1531,19 +1510,9 @@ } } ], - "mapRendering": [ - { - "icon": "circle:white;./assets/themes/campersite/sanitary_dump_station.svg", - "iconSize": "32,32", - "location": [ - "point" - ], - "anchor": "center" - }, - { - "color": "#00f", - "width": "8" - } + "pointRendering": [], + "lineRendering": [ + {} ] } ], @@ -1653,5 +1622,5 @@ } ] }, - "credits": "joost schouppe" + "widenFactor": 1.5 } \ No newline at end of file diff --git a/assets/themes/charging_stations/charging_stations.json b/assets/themes/charging_stations/charging_stations.json index 85405c1ee..38631084f 100644 --- a/assets/themes/charging_stations/charging_stations.json +++ b/assets/themes/charging_stations/charging_stations.json @@ -19,6 +19,23 @@ "cs": "Nabíjecí stanice", "pl": "Stacje ładowania" }, + "description": { + "en": "On this open map, one can find and mark information about charging stations", + "it": "Su questa mappa aperta, puoi individuare le stazioni di ricarica o aggiungere informazioni", + "ja": "このオープンマップでは充電ステーションに関する情報を見つけてマークすることができます", + "ru": "На этой карте вы можно найти и отметить информацию о зарядных станциях", + "zh_Hant": "在這份開放地圖上,你可以尋找與標示充電站的資訊", + "de": "Auf dieser freien Karte kann man Informationen zu Ladestationen finden und hinzufügen", + "hu": "Ezen a térképen a elektromos töltőpontokról szóló információkat lehet megtalálni és megadni", + "fr": "Sur cette carte l’on trouve et ajoute des informations sur les points de recharge", + "nl": "Met deze kaart kan je informatie over oplaadpunten vinden en toevoegen", + "es": "En este mapa, uno puede encontrar y marcar información sobre estaciones de carga", + "nb_NO": "Finn og merk info om ladestasjoner", + "da": "På dette åbne kort kan man finde og markere oplysninger om ladestandere", + "ca": "A aquest mapa, un pot trobar i marcar informació sobre punts de càrrega", + "cs": "Na této otevřené mapě lze vyhledávat a označovat informace o nabíjecích stanicích", + "pl": "Na tej otwartej mapie można znaleźć i zaznaczyć informacje o stacjach ładowania" + }, "shortDescription": { "en": "A worldwide map of charging stations", "it": "Una mappa mondiale di postazioni di ricarica", @@ -37,29 +54,9 @@ "eu": "Karga-estazioen munduko mapa", "pl": "Światowa mapa stacji ładowania" }, - "description": { - "en": "On this open map, one can find and mark information about charging stations", - "it": "Su questa mappa aperta, puoi individuare le stazioni di ricarica o aggiungere informazioni", - "ja": "このオープンマップでは充電ステーションに関する情報を見つけてマークすることができます", - "ru": "На этой карте вы можно найти и отметить информацию о зарядных станциях", - "zh_Hant": "在這份開放地圖上,你可以尋找與標示充電站的資訊", - "de": "Auf dieser freien Karte kann man Informationen zu Ladestationen finden und hinzufügen", - "hu": "Ezen a térképen a elektromos töltőpontokról szóló információkat lehet megtalálni és megadni", - "fr": "Sur cette carte l’on trouve et ajoute des informations sur les points de recharge", - "nl": "Met deze kaart kan je informatie over oplaadpunten vinden en toevoegen", - "es": "En este mapa, uno puede encontrar y marcar información sobre estaciones de carga", - "nb_NO": "Finn og merk info om ladestasjoner", - "da": "På dette åbne kort kan man finde og markere oplysninger om ladestandere", - "ca": "A aquest mapa, un pot trobar i marcar informació sobre punts de càrrega", - "cs": "Na této otevřené mapě lze vyhledávat a označovat informace o nabíjecích stanicích", - "pl": "Na tej otwartej mapie można znaleźć i zaznaczyć informacje o stacjach ładowania" - }, "icon": "./assets/themes/charging_stations/logo.svg", - "startLat": 0, - "startLon": 0, - "startZoom": 1, - "widenFactor": 1.5, "layers": [ "charging_station" - ] + ], + "widenFactor": 1.5 } \ No newline at end of file diff --git a/assets/themes/climbing/climbing.json b/assets/themes/climbing/climbing.json index 74f35070d..3526c7fa7 100644 --- a/assets/themes/climbing/climbing.json +++ b/assets/themes/climbing/climbing.json @@ -50,11 +50,9 @@ "pl": "Mapa wspinaczkowa została pierwotnie stworzona przez Christiana Neumanna. Jeśli masz uwagi lub pytania, skontaktuj się z nim.

    < p>Projekt wykorzystuje dane projektu OpenStreetMap.

    " }, "icon": "./assets/themes/climbing/climbing_icon.svg", - "startLat": 0, - "startLon": 0, - "startZoom": 1, - "widenFactor": 1.5, - "customCss": "./assets/themes/climbing/climbing.css", + "credits": [ + "Christian Neumann " + ], "layers": [ { "builtin": [ @@ -501,5 +499,6 @@ } } ], - "credits": "Christian Neumann " + "customCss": "./assets/themes/climbing/climbing.css", + "widenFactor": 1.5 } diff --git a/assets/themes/clock/clock.json b/assets/themes/clock/clock.json index 9f427f7e3..c6869e8a0 100644 --- a/assets/themes/clock/clock.json +++ b/assets/themes/clock/clock.json @@ -22,9 +22,6 @@ "pl": "Mapa pokazująca wszystkie zegary publiczne" }, "icon": "./assets/layers/clock/clock.svg", - "startLat": 0, - "startLon": 0, - "startZoom": 0, "layers": [ "clock" ] diff --git a/assets/themes/cycle_highways/cycle_highways.json b/assets/themes/cycle_highways/cycle_highways.json index bb73cf702..121d408ce 100644 --- a/assets/themes/cycle_highways/cycle_highways.json +++ b/assets/themes/cycle_highways/cycle_highways.json @@ -14,10 +14,6 @@ "cs": "Cyklodálnice", "pl": "Ścieżki rowerowe" }, - "hideFromOverview": true, - "icon": "./assets/themes/cycle_highways/fietssnelwegen-logo.svg", - "#overpassUrl": "https://overpass.kumi.systems/api/interpreter", - "overpassTimeout": 60, "description": { "en": "This map shows cycle highways", "de": "Diese Karte zeigt Radschnellwege", @@ -31,15 +27,15 @@ "cs": "Tato mapa zobrazuje cyklostezky", "pl": "Ta mapa pokazuje ścieżki rowerowe" }, + "icon": "./assets/themes/cycle_highways/fietssnelwegen-logo.svg", + "startZoom": 10, "startLat": 51.1599, "startLon": 3.3475, - "startZoom": 10, - "clustering": { - "maxZoom": 1 - }, - "widenFactor": 1.1, - "enableDownload": true, - "enablePdfDownload": true, + "defaultBackgroundId": "maptiler.backdrop", + "credits": [ + "L'imaginaire" + ], + "hideFromOverview": true, "layers": [ { "id": "cycle_highways", @@ -232,43 +228,18 @@ ] } ], - "mapRendering": [ - { - "color": { - "render": "#ff7392", - "mappings": [ - { - "if": "state=", - "then": "#00acfc" - }, - { - "if": "state=temporary", - "then": "#00acfc" - } - ] - }, - "width": "4", - "dashArray": { - "render": "", - "mappings": [ - { - "if": "state=temporary", - "then": "12 10" - }, - { - "if": "note:state=has_highway_no", - "then": "0 8" - }, - { - "if": "note:state=has_highway_under_construction", - "then": "12 10" - } - ] - } - } + "pointRendering": [], + "lineRendering": [ + {} ] } ], - "defaultBackgroundId": "maptiler.backdrop", - "credits": "L'imaginaire" + "enableDownload": true, + "enablePdfDownload": true, + "overpassTimeout": 60, + "widenFactor": 1.1, + "#overpassUrl": "https://overpass.kumi.systems/api/interpreter", + "clustering": { + "maxZoom": 1 + } } \ No newline at end of file diff --git a/assets/themes/cycle_infra/cycle_infra.json b/assets/themes/cycle_infra/cycle_infra.json index 5dbfd7b86..d3736d4e5 100644 --- a/assets/themes/cycle_infra/cycle_infra.json +++ b/assets/themes/cycle_infra/cycle_infra.json @@ -17,6 +17,20 @@ "cs": "Cyklistická infrastruktura", "pl": "Infrastruktura rowerowa" }, + "description": { + "en": "A map where you can view and edit things related to the bicycle infrastructure. Made during #osoc21.", + "nl": "Een kaart waar je info over de fietsinfrastructuur kan bekijken en bewerken. Gemaakt tijdens #osoc21.", + "de": "Eine Karte zum Ansehen und Bearbeiten verschiedener Elementen der Fahrradinfrastruktur. Erstellt während #osoc21.", + "it": "Una cartina dove vedere e modificare gli elementi riguardanti l’infrastruttura dei velocipedi. Realizzata durante #osoc21.", + "zh_Hant": "可以檢視與編輯單車相關設施的地圖,在 #os0c21時製作。", + "hu": "Kerékpáros infrastruktúrával kapcsolatos dolgokat megjelenítő és szerkesztésre felkínáló térkép. Az #osoc21 (Open Summer of Code) alatt készült.", + "fr": "Une carte montrant les aménagements cyclables et où l’on peut rajouter des informations. Réalisée durant #osoc21.", + "es": "Un mapa en el que puedes ver y editar cosas relacionadas con la infraestructura ciclista. Hecho durante #osoc21.", + "ca": "Un mapa on es poden veure i editar coses relacionades amb la infraestructura ciclista. Fet durant #osoc21.", + "da": "Et kort, hvor du kan se og redigere ting relateret til cykelinfrastrukturen. Lavet under #osoc21.", + "cs": "Mapa, kde můžete prohlížet a upravovat věci související s cyklistickou infrastrukturou. Vytvořeno během #osoc21.", + "pl": "Mapa, na której możesz przeglądać i edytować rzeczy związane z infrastrukturą rowerową. Wykonane podczas #osoc21." + }, "shortDescription": { "en": "A map where you can view and edit things related to the bicycle infrastructure.", "nl": "Een kaart waar je info over de fietsinfrastructuur kan bekijken en bewerken.", @@ -32,31 +46,17 @@ "cs": "Mapa, kde můžete prohlížet a upravovat věci související s cyklistickou infrastrukturou.", "pl": "Mapa, na której możesz przeglądać i edytować rzeczy związane z infrastrukturą rowerową." }, - "description": { - "en": "A map where you can view and edit things related to the bicycle infrastructure. Made during #osoc21.", - "nl": "Een kaart waar je info over de fietsinfrastructuur kan bekijken en bewerken. Gemaakt tijdens #osoc21.", - "de": "Eine Karte zum Ansehen und Bearbeiten verschiedener Elementen der Fahrradinfrastruktur. Erstellt während #osoc21.", - "it": "Una cartina dove vedere e modificare gli elementi riguardanti l’infrastruttura dei velocipedi. Realizzata durante #osoc21.", - "zh_Hant": "可以檢視與編輯單車相關設施的地圖,在 #os0c21時製作。", - "hu": "Kerékpáros infrastruktúrával kapcsolatos dolgokat megjelenítő és szerkesztésre felkínáló térkép. Az #osoc21 (Open Summer of Code) alatt készült.", - "fr": "Une carte montrant les aménagements cyclables et où l’on peut rajouter des informations. Réalisée durant #osoc21.", - "es": "Un mapa en el que puedes ver y editar cosas relacionadas con la infraestructura ciclista. Hecho durante #osoc21.", - "ca": "Un mapa on es poden veure i editar coses relacionades amb la infraestructura ciclista. Fet durant #osoc21.", - "da": "Et kort, hvor du kan se og redigere ting relateret til cykelinfrastrukturen. Lavet under #osoc21.", - "cs": "Mapa, kde můžete prohlížet a upravovat věci související s cyklistickou infrastrukturou. Vytvořeno během #osoc21.", - "pl": "Mapa, na której możesz przeglądać i edytować rzeczy związane z infrastrukturą rowerową. Wykonane podczas #osoc21." - }, - "hideFromOverview": false, "icon": "./assets/themes/cycle_infra/cycle-infra.svg", + "socialImage": "./assets/themes/cycle_infra/cycle-infra.svg", + "startZoom": 11, "startLat": 51, "startLon": 3.75, - "startZoom": 11, - "widenFactor": 1.5, - "socialImage": "./assets/themes/cycle_infra/cycle-infra.svg", - "enableDownload": true, + "hideFromOverview": false, "layers": [ "cycleways_and_roads", "barrier", "crossings" - ] + ], + "enableDownload": true, + "widenFactor": 1.5 } \ No newline at end of file diff --git a/assets/themes/cyclenodes/cyclenodes.json b/assets/themes/cyclenodes/cyclenodes.json index 5789a55cc..1f88db7ea 100644 --- a/assets/themes/cyclenodes/cyclenodes.json +++ b/assets/themes/cyclenodes/cyclenodes.json @@ -23,23 +23,21 @@ "pl": "Mapa ta przedstawia sieci węzłów rowerowych i umożliwia łatwe dodawanie nowych węzłów" }, "icon": "./assets/themes/cyclenodes/logo.svg", - "hideFromOverview": true, + "startZoom": 11, "startLat": 51.755515, "startLon": 14.327545, - "startZoom": 11, - "widenFactor": 0.05, - "clustering": { - "maxZoom": 11, - "minNeededElements": 1000000 - }, + "credits": [ + "Sebastian Kürten" + ], + "hideFromOverview": true, "layers": [ { "id": "node2node", "name": { - "en": "node to node links", + "en": "Node to node links", "de": "Knotenpunktverbindungen", "es": "enlaces nodo a nodo", - "nl": "verbindingen van node naar node", + "nl": "Verbindingen van node naar node", "fr": "liens noeud à noeud", "ca": "enllaços node a node", "cs": "propojení mezi uzly", @@ -57,10 +55,10 @@ "minzoom": 12, "title": { "render": { - "en": "node to node link", + "en": "Node to node link", "de": "Knotenpunktverbindung", "es": "enlace nodo a nodo", - "nl": "node-naar-node verbinding", + "nl": "Node-naar-node verbinding", "fr": "lien noeud à noeud", "ca": "Enllaç node a node", "cs": "propojení mezi uzly", @@ -70,10 +68,10 @@ { "if": "ref~*", "then": { - "en": "node to node link {ref}", + "en": "Node to node link {ref}", "de": "Knotenpunktverbindung {ref}", "es": "enlace nodo a nodo {ref}", - "nl": "node-naar-node verbinding {ref}", + "nl": "Node-naar-node verbinding {ref}", "fr": "lien noeud à noeud {ref}", "ca": "Enllaç node a node {ref}", "cs": "propojení mezi uzly {ref}", @@ -82,58 +80,51 @@ } ] }, - "mapRendering": [ + "tagRenderings": [ + { + "builtin": "survey_date", + "override": { + "question": { + "en": "When was this node to node link last surveyed?", + "de": "Wann wurde diese Knotenpunktverbindung zuletzt überprüft?", + "es": "¿Cuándo se sondeó este enlace nodo a nodo por última vez?", + "nl": "Wanneer werd deze node-naar-node verbinding het laast gesurveyed?", + "fr": "Quand cette liaison de nœud à nœud a-t-elle été contrôlée sur le terrain pour la dernière fois ?", + "ca": "Quan es va comprovar per última vegada aquest enllaç node a node presencialment?", + "cs": "Kdy bylo toto propojení mezi uzly naposledy zkontrolováno?", + "pl": "Kiedy ostatnio badano to połączenie węzła z węzłem?" + }, + "render": { + "en": "This node to node link was last surveyed on {survey:date}", + "de": "Diese Knotenpunktverbindung wurde zuletzt am {survey:date} überprüft", + "es": "Este enlace nodo a nodo se sondeó por última vez el {survey:date}", + "nl": "Deze node-naar-node verbinding werd het laast gesurveyed op {survey:date}", + "fr": "Cette lien de nœud à nœud a été vérifié sur le terrain le {survey:date}", + "ca": "Aquest enllaç node a node es va sondejar per última vegada el {survey:date}", + "cs": "Toto propojení mezi uzly bylo naposledy zkontrolováno dne {survey:date}", + "pl": "To połączenie węzła z węzłem było ostatnio sprawdzane w dniu {survey:date}" + } + }, + "id": "node2node-survey:date" + }, + "export_as_gpx" + ], + "lineRendering": [ { "width": "4", "color": "#00a703" } - ], - "tagRenderings": [ - { - "question": { - "en": "When was this node to node link last surveyed?", - "de": "Wann wurde diese Knotenpunktverbindung zuletzt überprüft?", - "es": "¿Cuándo se sondeó este enlace nodo a nodo por última vez?", - "nl": "Wanneer werd deze node-naar-node verbinding het laast gesurveyed?", - "fr": "Quand cette liaison de nœud à nœud a-t-elle été contrôlée sur le terrain pour la dernière fois ?", - "ca": "Quan es va comprovar per última vegada aquest enllaç node a node presencialment?", - "cs": "Kdy bylo toto propojení mezi uzly naposledy zkontrolováno?", - "pl": "Kiedy ostatnio badano to połączenie węzła z węzłem?" - }, - "render": { - "en": "This node to node link was last surveyed on {survey:date}", - "de": "Diese Knotenpunktverbindung wurde zuletzt am {survey:date} überprüft", - "es": "Este enlace nodo a nodo se sondeó por última vez el {survey:date}", - "nl": "Deze node-naar-node verbinding werd het laast gesurveyed op {survey:date}", - "fr": "Cette lien de nœud à nœud a été vérifié sur le terrain le {survey:date}", - "ca": "Aquest enllaç node a node es va sondejar per última vegada el {survey:date}", - "cs": "Toto propojení mezi uzly bylo naposledy zkontrolováno dne {survey:date}", - "pl": "To połączenie węzła z węzłem było ostatnio sprawdzane w dniu {survey:date}" - }, - "freeform": { - "key": "survey:date", - "type": "date" - }, - "mappings": [ - { - "if": "survey:date:={_now:date}", - "then": "Surveyed today!" - } - ], - "id": "node2node-survey:date" - }, - "export_as_gpx" ] }, { "id": "node", "name": { - "en": "nodes", + "en": "Nodes", "de": "Knotenpunkte", "ca": "nodes", "es": "nodos", "nb_NO": "noder", - "nl": "knooppunten", + "nl": "Knooppunten", "fr": "noeuds", "pa_PK": "نوڈ", "cs": "uzly", @@ -147,7 +138,7 @@ ] } }, - "mapRendering": [ + "pointRendering": [ { "location": [ "point", @@ -157,11 +148,11 @@ "mappings": [ { "if": "rcn_ref~*", - "then": "
    {rcn_ref}
    " + "then": "
    {rcn_ref}
    " }, { "if": "rcn_ref=", - "then": "
    ?
    " + "then": "
    ?
    " } ] } @@ -170,11 +161,11 @@ "minzoom": 12, "title": { "render": { - "en": "cycle node {rcn_ref}", + "en": "Cycle node {rcn_ref}", "de": "Knotenpunkt {rcn_ref}", "es": "nodo ciclista {rcn_ref}", "nb_NO": "sykkelnode {rcn_ref}", - "nl": "fietsknooppunt {rcn_ref}", + "nl": "Fietsknooppunt {rcn_ref}", "fr": "nœud cycliste {rcn_ref}", "ca": "node ciclista {rcn_ref}", "cs": "uzel cyklu {rcn_ref}", @@ -183,36 +174,48 @@ }, "tagRenderings": [ { + "id": "node-rxn_ref", "question": { - "en": "When was this cycle node last surveyed?", - "de": "Wann wurde dieser Fahrradknotenpunkt zuletzt überprüft?", - "es": "¿Cuándo fue sondeado este nodo ciclista por última vez?", - "nl": "Wanneer is dit fietsknooppunt voor het laatst gecontroleerd?", - "fr": "Quand ce nœud cyclable a-t-il été vérifié sur le terrain pour la dernière fois ?", - "ca": "Quan va ser sondejat aquest node ciclista per última vegada?", - "cs": "Kdy byl tento uzel cyklu naposledy zkontrolován?", - "pl": "Kiedy ostatni raz badano ten węzeł rowerowy?" - }, - "render": { - "en": "This cycle node was last surveyed on {survey:date}", - "de": "Dieser Fahrradknoten wurde zuletzt überprüft am {survey:date}", - "es": "Este nodo ciclista se sondeó por última vez el {survey:date}", - "nl": "Dit fietsknooppunt is voor het laatst gecontroleerd op {survey:date}", - "fr": "Ce nœud cycliste a été verifié pour la dernière fois le {survey:date}", - "ca": "Aquest node ciclista es va sondejar per última vegada el {survey:date}", - "cs": "Tento uzel cyklu byl naposledy zkontrolován dne {survey:date}", - "pl": "Ten węzeł rowerowy był ostatnio badany w dniu {survey:date}" + "en": "What is the reference number of this cycling node?", + "nl": "Wat is het referentienummer van dit fietsknooppunt?" }, "freeform": { - "key": "survey:date", - "type": "date" - }, - "mappings": [ - { - "if": "survey:date:={_now:date}", - "then": "Surveyed today!" + "key": "rcn_ref", + "type": "int", + "placeholder": { + "en": "e.g. 1", + "nl": "bijv. 1" } - ], + }, + "render": { + "en": "This cycling node has reference number {rcn_ref}", + "nl": "Dit fietsknooppunt heeft referentienummer {rcn_ref}" + } + }, + { + "builtin": "survey_date", + "override": { + "question": { + "en": "When was this cycle node last surveyed?", + "de": "Wann wurde dieser Fahrradknotenpunkt zuletzt überprüft?", + "es": "¿Cuándo fue sondeado este nodo ciclista por última vez?", + "nl": "Wanneer is dit fietsknooppunt voor het laatst gecontroleerd?", + "fr": "Quand ce nœud cyclable a-t-il été vérifié sur le terrain pour la dernière fois ?", + "ca": "Quan va ser sondejat aquest node ciclista per última vegada?", + "cs": "Kdy byl tento uzel cyklu naposledy zkontrolován?", + "pl": "Kiedy ostatni raz badano ten węzeł rowerowy?" + }, + "render": { + "en": "This cycle node was last surveyed on {survey:date}", + "de": "Dieser Fahrradknoten wurde zuletzt überprüft am {survey:date}", + "es": "Este nodo ciclista se sondeó por última vez el {survey:date}", + "nl": "Dit fietsknooppunt is voor het laatst gecontroleerd op {survey:date}", + "fr": "Ce nœud cycliste a été verifié pour la dernière fois le {survey:date}", + "ca": "Aquest node ciclista es va sondejar per última vegada el {survey:date}", + "cs": "Tento uzel cyklu byl naposledy zkontrolován dne {survey:date}", + "pl": "Ten węzeł rowerowy był ostatnio badany w dniu {survey:date}" + } + }, "id": "node-survey:date" }, { @@ -238,13 +241,101 @@ }, "freeform": { "key": "expected_rcn_route_relations", - "type": "int" + "type": "int", + "placeholder": { + "en": "e.g. 3", + "nl": "bijv. 3" + } }, "id": "node-expected_rcn_route_relations" }, "images" + ], + "presets": [ + { + "tags": [ + "rcn_ref=?", + "network:type=node_network" + ], + "title": { + "en": "a cycling node", + "nl": "een fietsknooppunt" + }, + "snapToLayer": [ + "cycleways_and_roads" + ] + } ] + }, + { + "builtin": [ + "guidepost" + ], + "override": { + "minzoom": 16, + "source": { + "osmTags": { + "and": [ + "information=guidepost", + "bicycle=yes" + ] + } + }, + "presets": [ + { + "tags": [ + "tourism=information", + "information=guidepost", + "bicycle=yes" + ] + } + ], + "name": { + "en": "Cycling guideposts" + }, + "title": { + "render": { + "en": "Cycling guidepost" + } + } + }, + "hideTagRenderingsWithLabels": [ + "type" + ] + }, + { + "builtin": "route_marker", + "override": { + "minzoom": 16, + "pointRendering": [ + { + "icon": "./assets/themes/cyclenodes/route_marker.svg" + } + ], + "presets": [ + { + "tags": [ + "tourism=information", + "information=route_marker", + "network:type=node_network", + "bicycle=yes" + ], + "title": { + "en": "a route marker for a node to node link" + }, + "=exampleImages": [ + "./assets/layers/route_marker/bicycle_route_marker.jpg" + ] + } + ] + } + }, + { + "builtin": "cycleways_and_roads", + "override": { + "name": null, + "shownByDefault": false + } } - ], - "credits": "Sebastian Kürten" -} \ No newline at end of file + ] +} diff --git a/assets/themes/cyclenodes/license_info.json b/assets/themes/cyclenodes/license_info.json index 469e824d7..faf7743b7 100644 --- a/assets/themes/cyclenodes/license_info.json +++ b/assets/themes/cyclenodes/license_info.json @@ -8,5 +8,16 @@ "sources": [ "https://github.com/mobanisto/MapComplete/commit/1aeb1fdb5b09908d67907f3c816152bfebfdcc79" ] + }, + { + "path": "route_marker.svg", + "license": "CC0-1.0", + "authors": [ + "Robin van der Linde", + "MarianSigler" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:Sinnbild_Radfahrer,_StVO_1992.svg" + ] } ] \ No newline at end of file diff --git a/assets/themes/cyclenodes/logo.svg b/assets/themes/cyclenodes/logo.svg index 6a860858a..3d44d5d96 100644 --- a/assets/themes/cyclenodes/logo.svg +++ b/assets/themes/cyclenodes/logo.svg @@ -15,13 +15,13 @@ - - - + + + - \ No newline at end of file + diff --git a/assets/themes/cyclenodes/route_marker.svg b/assets/themes/cyclenodes/route_marker.svg new file mode 100644 index 000000000..c5c49be16 --- /dev/null +++ b/assets/themes/cyclenodes/route_marker.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/assets/themes/cyclenodes/route_marker.svg.license b/assets/themes/cyclenodes/route_marker.svg.license new file mode 100644 index 000000000..234c11e02 --- /dev/null +++ b/assets/themes/cyclenodes/route_marker.svg.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: Robin van der Linde; MarianSigler +SPDX-License-Identifier: CC0-1.0 \ No newline at end of file diff --git a/assets/themes/cyclestreets/cyclestreets.json b/assets/themes/cyclestreets/cyclestreets.json index 377ae003e..39a242c90 100644 --- a/assets/themes/cyclestreets/cyclestreets.json +++ b/assets/themes/cyclestreets/cyclestreets.json @@ -18,6 +18,21 @@ "eu": "Bidegorriak", "pl": "Ulice rowerowe" }, + "description": { + "nl": "Een fietsstraat is een straat waar
    • automobilisten geen fietsers mogen inhalen
    • Er een maximumsnelheid van 30km/u geldt
    • Fietsers gemotoriseerde voertuigen links mogen inhalen
    • Fietsers nog steeds voorrang aan rechts moeten verlenen - ook aan auto's en voetgangers op het zebrapad


    Op deze open kaart kan je alle gekende fietsstraten zien en kan je ontbrekende fietsstraten aanduiden. Fietszones worden aangeduid door elke straat apart als fietsstraat te markeren.
    Om de kaart aan te passen, moet je je aanmelden met OpenStreetMap en helemaal inzoomen tot straatniveau. ", + "en": "A cyclestreet is is a street where motorized traffic is not allowed to overtake cyclists. They are signposted by a special traffic sign. Cyclestreets can be found in the Netherlands and Belgium, but also in Germany and France. ", + "ja": "cyclestreetとは、自動車がサイクリストを追い越すことができない道です。専用の道路標識で表示されます。Cyclestreetsはオランダやベルギーにもありますが、ドイツやフランスにもあります。 ", + "zh_Hant": "單車街道是機動車輛受限制,只允許單車通行的道路。通常會有路標顯示特別的交通指標。單車街道通常在荷蘭、比利時看到,但德國與法國也有。 ", + "de": "Eine Fahrradstraße ist eine Straße, auf der motorisierter Verkehr Radfahrer nicht überholen darf. Sie sind durch ein spezielles Verkehrsschild gekennzeichnet. Fahrradstraßen gibt es in den Niederlanden und Belgien, aber auch in Deutschland und Frankreich. ", + "it": "Una strada ciclabile è una strada dove il traffico motorizzato non può superare i velocipedi. La sua presenza è segnalata da un cartello stradale specifico. Le strade ciclabili sono diffuse in Olanda e Belgio, ma si possono trovare anche in Germania e in Francia. ", + "hu": "A kerékpárosutca (cyclestreet, Fahrradstraße) olyan utca, ahol gépjármű nem előzhet meg kerékpárost. Az ilyen utcákat külön közlekedési tábla jelzi. Kerékpárosutcák találhatók Hollandiában és Belgiumban, valamint Németországban és Franciaországban is. ", + "es": "Una ciclocalle es una calle en la que el tráfico motorizado no puede sobrepasar a los ciclistas. Están marcados por una señal de tráfico especial. Las ciclocalles se pueden encontrar en los Países Bajos y Bélgica, pero también en Alemania y Francia. ", + "fr": "Une rue cyclable est une rue où les véhicules motorisés ne sont pas autorisés à dépasser les cyclistes. Elles sont signalées par un signal routier particulier. On trouve des rues cyclables en Belgique et aux Pays-Bas, mais aussi en Allemagne et en France. ", + "da": "En cykelgade er en gade, hvor motoriseret trafik ikke må overhale cyklister. De er skiltet med et særligt trafikskilt. Cykelgader findes i Holland og Belgien, men også i Tyskland og Frankrig. ", + "ca": "Un ciclocarrer és un carrer en el que el trànsit motoritzat no pot sobrepassar als ciclistes. Està senyalitzat per una senyal de trànsit especial. Els ciclocarrers es poden trobar a Holanda i Bèlgica, però també a Alemnya i França. ", + "cs": "Cyklostezka je ulice, kde motorizovaná doprava nesmí předjíždět cyklisty. Jsou označeny speciální dopravní značkou. Cyklostezky najdete v Nizozemsku a Belgii, ale také v Německu a Francii. ", + "pl": "Ulica rowerowa to ulica, na której ruch samochodowy nie może wyprzedzać rowerzystów. Są one oznaczone specjalnym znakiem drogowym. Ulice rowerowe można znaleźć w Holandii i Belgii, ale także w Niemczech i Francji. " + }, "shortDescription": { "nl": "Een kaart met alle gekende fietsstraten", "en": "A map of cyclestreets", @@ -34,30 +49,10 @@ "cs": "Mapa cyklostezek", "pl": "Mapa ulic rowerowych" }, - "description": { - "nl": "Een fietsstraat is een straat waar
    • automobilisten geen fietsers mogen inhalen
    • Er een maximumsnelheid van 30km/u geldt
    • Fietsers gemotoriseerde voertuigen links mogen inhalen
    • Fietsers nog steeds voorrang aan rechts moeten verlenen - ook aan auto's en voetgangers op het zebrapad


    Op deze open kaart kan je alle gekende fietsstraten zien en kan je ontbrekende fietsstraten aanduiden. Fietszones worden aangeduid door elke straat apart als fietsstraat te markeren.
    Om de kaart aan te passen, moet je je aanmelden met OpenStreetMap en helemaal inzoomen tot straatniveau. ", - "en": "A cyclestreet is is a street where motorized traffic is not allowed to overtake cyclists. They are signposted by a special traffic sign. Cyclestreets can be found in the Netherlands and Belgium, but also in Germany and France. ", - "ja": "cyclestreetとは、自動車がサイクリストを追い越すことができない道です。専用の道路標識で表示されます。Cyclestreetsはオランダやベルギーにもありますが、ドイツやフランスにもあります。 ", - "zh_Hant": "單車街道是機動車輛受限制,只允許單車通行的道路。通常會有路標顯示特別的交通指標。單車街道通常在荷蘭、比利時看到,但德國與法國也有。 ", - "de": "Eine Fahrradstraße ist eine Straße, auf der motorisierter Verkehr Radfahrer nicht überholen darf. Sie sind durch ein spezielles Verkehrsschild gekennzeichnet. Fahrradstraßen gibt es in den Niederlanden und Belgien, aber auch in Deutschland und Frankreich. ", - "it": "Una strada ciclabile è una strada dove il traffico motorizzato non può superare i velocipedi. La sua presenza è segnalata da un cartello stradale specifico. Le strade ciclabili sono diffuse in Olanda e Belgio, ma si possono trovare anche in Germania e in Francia. ", - "hu": "A kerékpárosutca (cyclestreet, Fahrradstraße) olyan utca, ahol gépjármű nem előzhet meg kerékpárost. Az ilyen utcákat külön közlekedési tábla jelzi. Kerékpárosutcák találhatók Hollandiában és Belgiumban, valamint Németországban és Franciaországban is. ", - "es": "Una ciclocalle es una calle en la que el tráfico motorizado no puede sobrepasar a los ciclistas. Están marcados por una señal de tráfico especial. Las ciclocalles se pueden encontrar en los Países Bajos y Bélgica, pero también en Alemania y Francia. ", - "fr": "Une rue cyclable est une rue où les véhicules motorisés ne sont pas autorisés à dépasser les cyclistes. Elles sont signalées par un signal routier particulier. On trouve des rues cyclables en Belgique et aux Pays-Bas, mais aussi en Allemagne et en France. ", - "da": "En cykelgade er en gade, hvor motoriseret trafik ikke må overhale cyklister. De er skiltet med et særligt trafikskilt. Cykelgader findes i Holland og Belgien, men også i Tyskland og Frankrig. ", - "ca": "Un ciclocarrer és un carrer en el que el trànsit motoritzat no pot sobrepassar als ciclistes. Està senyalitzat per una senyal de trànsit especial. Els ciclocarrers es poden trobar a Holanda i Bèlgica, però també a Alemnya i França. ", - "cs": "Cyklostezka je ulice, kde motorizovaná doprava nesmí předjíždět cyklisty. Jsou označeny speciální dopravní značkou. Cyklostezky najdete v Nizozemsku a Belgii, ale také v Německu a Francii. ", - "pl": "Ulica rowerowa to ulica, na której ruch samochodowy nie może wyprzedzać rowerzystów. Są one oznaczone specjalnym znakiem drogowym. Ulice rowerowe można znaleźć w Holandii i Belgii, ale także w Niemczech i Francji. " - }, "icon": "./assets/themes/cyclestreets/logo.svg", - "startLat": 51.2095, "startZoom": 14, + "startLat": 51.2095, "startLon": 3.2228, - "widenFactor": 2, - "clustering": { - "maxZoom": 12, - "minNeededElements": 200 - }, "layers": [ { "id": "fietsstraat", @@ -108,68 +103,9 @@ "tagRenderings": [ "images" ], - "mapRendering": [ - { - "icon": { - "render": "./assets/themes/cyclestreets/F111.svg", - "mappings": [ - { - "if": "traffic_sign=DE:244.1,1020-30", - "then": "./assets/themes/cyclestreets/Zeichen_244_1020-30.svg" - }, - { - "if": "traffic_sign=DE:244.1,1022-12,1024-10", - "then": "./assets/themes/cyclestreets/Zeichen_244_KFZ_frei.svg" - }, - { - "if": "traffic_sign=DE:244.1,1022-12", - "then": "./assets/themes/cyclestreets/Zeichen_244_1022-12.svg" - }, - { - "if": "traffic_sign=DE:244.1,1024-10", - "then": "./assets/themes/cyclestreets/Zeichen_244_1024-10.svg" - }, - { - "if": "_country=de", - "then": "./assets/themes/cyclestreets/Zeichen_244.svg" - }, - { - "if": "_country=fi", - "then": "./assets/themes/cyclestreets/Finland_road_sign_E28.svg" - } - ] - }, - "iconSize": { - "render": "40,40,center", - "mappings": [ - { - "if": { - "or": [ - "traffic_sign=DE:244.1,1020-30", - "traffic_sign=DE:244.1,1022-12,1024-10" - ] - }, - "then": "40,62,center" - }, - { - "if": { - "or": [ - "traffic_sign=DE:244.1,1022-12", - "traffic_sign=DE:244.1,1024-10" - ] - }, - "then": "40,70,center" - } - ] - }, - "location": [ - "projected_centerpoint" - ] - }, - { - "color": "#0000ff", - "width": "10" - } + "pointRendering": [], + "lineRendering": [ + {} ] }, { @@ -257,29 +193,9 @@ "tagRenderings": [ "images" ], - "mapRendering": [ - { - "icon": { - "render": "./assets/themes/cyclestreets/F113.svg", - "mappings": [ - { - "if": "_country=de", - "then": "./assets/themes/cyclestreets/Zeichen_244a.svg" - }, - { - "if": "_country=fi", - "then": "./assets/themes/cyclestreets/Finland_road_sign_E29.svg" - } - ] - }, - "location": [ - "projected_centerpoint" - ] - }, - { - "color": "#09f9dd", - "width": "5" - } + "pointRendering": [], + "lineRendering": [ + {} ] }, { @@ -357,39 +273,9 @@ "tagRenderings": [ "images" ], - "mapRendering": [ - { - "icon": "./assets/svg/pencil.svg", - "location": [ - "projected_centerpoint" - ] - }, - { - "color": { - "render": "#aaaaaa", - "mappings": [ - { - "then": "#0000ff", - "if": { - "or": [ - "cyclestreet=yes", - "bicycle_road=yes" - ] - } - }, - { - "then": "#09f9dd", - "if": { - "or": [ - "proposed:cyclestreet=yes", - "proposed:bicycle_road=yes" - ] - } - } - ] - }, - "width": "5" - } + "pointRendering": [], + "lineRendering": [ + {} ] } ], @@ -754,5 +640,10 @@ } } ] + }, + "widenFactor": 2, + "clustering": { + "maxZoom": 12, + "minNeededElements": 200 } } \ No newline at end of file diff --git a/assets/themes/cyclofix/cyclofix.json b/assets/themes/cyclofix/cyclofix.json index cbf7b8caf..a26ddb2c9 100644 --- a/assets/themes/cyclofix/cyclofix.json +++ b/assets/themes/cyclofix/cyclofix.json @@ -34,13 +34,11 @@ "ca": "L'objectiu d'aquest mapa és presentar als ciclistes una solució fàcil d'utilitzar per trobar la infraestructura adequada per a les seves necessitats.

    Pots fer un seguiment de la teva ubicació precisa (només mòbil) i seleccionar capes que siguin rellevants per a tu a la cantonada inferior esquerra. També podeu utilitzar aquesta eina per afegir o editar pins (punts d'interès) al mapa i proporcionar més dades responent a les preguntes.

    Tots els canvis que feu es desaran automàticament a la base de dades global d'OpenStreetMap i es poden ser reutilitzat lliurement per altres persones.

    Per obtenir més informació sobre el projecte cyclofix, aneu a cyclofix.osm.be .", "pl": "Celem tej mapy jest zaprezentowanie rowerzystom łatwego w użyciu rozwiązania umożliwiającego znalezienie infrastruktury odpowiedniej dla ich potrzeb.

    Możesz śledzić swoją dokładną lokalizację (tylko na urządzeniach mobilnych) i wybierać w lewym dolnym rogu warstwy, które są dla Ciebie odpowiednie. Możesz także użyć tego narzędzia, aby dodać lub edytować pinezki (interesujące miejsca) na mapie i dostarczyć więcej danych, odpowiadając na pytania.

    Wszystkie wprowadzone zmiany zostaną automatycznie zapisane w globalnej bazie danych OpenStreetMap i mogą być swobodnie ponownie wykorzystywane przez innych.

    Więcej informacji o projekcie cyclofix można znaleźć na stronie cyclofix.osm.be ." }, - "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", - "startLat": 0, - "startLon": 0, - "startZoom": 1, - "widenFactor": 2, "socialImage": "./assets/themes/cyclofix/logo.svg", + "credits": [ + "Originally created during Open Summer of Code by Pieter Fiers, Thibault Declercq, Pierre Barban, Joost Schouppe and Pieter Vander Vennet" + ], "layers": [ "bike_cafe", "bike_shop", @@ -135,5 +133,6 @@ "minzoom": 18 } } - ] + ], + "widenFactor": 2 } diff --git a/assets/themes/drinking_water/drinking_water.json b/assets/themes/drinking_water/drinking_water.json index eb6cd55de..8d1f1cc8c 100644 --- a/assets/themes/drinking_water/drinking_water.json +++ b/assets/themes/drinking_water/drinking_water.json @@ -38,8 +38,6 @@ "icon": "./assets/themes/drinking_water/logo.svg", "startLat": 50.8465573, "startLon": 4.351697, - "startZoom": 16, - "widenFactor": 2, "layers": [ "drinking_water" ] diff --git a/assets/themes/education/education.json b/assets/themes/education/education.json index 8bf305a85..4a08c6f44 100644 --- a/assets/themes/education/education.json +++ b/assets/themes/education/education.json @@ -1,16 +1,5 @@ { "id": "education", - "description": { - "en": "On this map, you'll find information about all types of schools and education and can easily add more information", - "nl": "Deze kaart toont info over verschillende onderwijsinstellingen zoals kleuterscholen, middelbare scholen en tertiair onderwijs.", - "de": "Auf dieser Karte können Sie Informationen über Bildungseinrichtungen finden und hinzufügen", - "fr": "Sur cette carte, vous trouverez des informations concernant tous les types d'écoles et d'enseignement. Vous pouvez facilement ajouter plus d'informations", - "ca": "En aquest mapa trobareu informació sobre tots els tipus d'escoles i educació i podreu afegir fàcilment més informació", - "da": "På dette kort finder du information om alle typer skoler og uddannelse og kan nemt tilføje flere oplysninger", - "cs": "Na této mapě najdete informace o všech typech škol a vzdělávání a můžete snadno přidat další informace", - "es": "En este mapa, encontrará información sobre todos los tipos de escuelas y centros de educación y puede añadir fácilmente más información", - "pl": "Na tej mapie znajdziesz informacje o wszystkich typach szkół i edukacji, a także możesz łatwo dodać więcej informacji" - }, "title": { "en": "Education", "nl": "Onderwijs", @@ -25,14 +14,22 @@ "eu": "Hezkuntza", "pl": "Edukacja" }, - "startLat": 0, - "startLon": 0, - "startZoom": 0, + "description": { + "en": "On this map, you'll find information about all types of schools and education and can easily add more information", + "nl": "Deze kaart toont info over verschillende onderwijsinstellingen zoals kleuterscholen, middelbare scholen en tertiair onderwijs.", + "de": "Auf dieser Karte können Sie Informationen über Bildungseinrichtungen finden und hinzufügen", + "fr": "Sur cette carte, vous trouverez des informations concernant tous les types d'écoles et d'enseignement. Vous pouvez facilement ajouter plus d'informations", + "ca": "En aquest mapa trobareu informació sobre tots els tipus d'escoles i educació i podreu afegir fàcilment més informació", + "da": "På dette kort finder du information om alle typer skoler og uddannelse og kan nemt tilføje flere oplysninger", + "cs": "Na této mapě najdete informace o všech typech škol a vzdělávání a můžete snadno přidat další informace", + "es": "En este mapa, encontrará información sobre todos los tipos de escuelas y centros de educación y puede añadir fácilmente más información", + "pl": "Na tej mapie znajdziesz informacje o wszystkich typach szkół i edukacji, a także możesz łatwo dodać więcej informacji" + }, "icon": "./assets/layers/school/college.svg", - "#layers:note": "kindergarten_childcare must be _below_ school, as it can 'catch' primary schools which do have an integrated preschool", "layers": [ "tertiary_education", "school", "kindergarten_childcare" - ] + ], + "#layers:note": "kindergarten_childcare must be _below_ school, as it can 'catch' primary schools which do have an integrated preschool" } \ No newline at end of file diff --git a/assets/themes/elongated_coin/elongated_coin.json b/assets/themes/elongated_coin/elongated_coin.json index 705cfad02..d3e98e5d6 100644 --- a/assets/themes/elongated_coin/elongated_coin.json +++ b/assets/themes/elongated_coin/elongated_coin.json @@ -17,10 +17,10 @@ "pl": "Znajdź prasy do groszy, aby stworzyć własne wydłużone monety." }, "icon": "./assets/themes/elongated_coin/penny.svg", - "layers": [ - "elongated_coin" - ], + "startZoom": 11, "startLat": 53.0565, "startLon": 8.7492, - "startZoom": 11 + "layers": [ + "elongated_coin" + ] } \ No newline at end of file diff --git a/assets/themes/elongated_coin/penny.svg b/assets/themes/elongated_coin/penny.svg index a544fa722..3ceaccc0f 100644 --- a/assets/themes/elongated_coin/penny.svg +++ b/assets/themes/elongated_coin/penny.svg @@ -1,13 +1,13 @@ + inkscape:current-layer="svg16" + inkscape:pageshadow="0" /> + transform="matrix(1.9997517,0,0,1.9997517,0,99.370201)">
    You can help contribute too!Zoom in enough and all streets will show up. You can click one and a Wikidata-search box will popup. With a few clicks, you can add an etymology link. Note that you need a free OpenStreetMap account to do this.", "nl": "Op deze kaart zie je waar een plaats naar is vernoemd. De straten, gebouwen, ... komen uit OpenStreetMap, waar een link naar Wikidata werd gelegd. In de popup zie je het Wikipedia-artikel van hetgeen naarwaar het vernoemd is of de Wikidata-box.

    Je kan zelf ook meehelpen!Als je ver inzoomt, krijg je alle straten te zien. Klik je een straat aan, dan krijg je een zoekfunctie waarmee je snel een nieuwe link kan leggen. Je hebt hiervoor een gratis OpenStreetMap account nodig.", @@ -44,15 +30,22 @@ "ca": "En aquest mapa, podeu veure el nom d'un objecte. Els carrers, edificis, ... provenen d'OpenStreetMap que tenen un enllaça a Wikidata. A la finestra emergent, veuràs l'article de la Viquipèdia (si existeix) o un quadre de wikidata amb el nom de l'objecte. Si l'objecte en si té una pàgina de viquipèdia, també es mostrarà.

    També pots ajudar a contribuir!Amplia prou i tots els carrers apareixerà. Podeu fer clic en un i apareixerà un quadre de cerca de Wikidata. Amb uns quants clics, podeu afegir un enllaç d'etimologia. Tingueu en compte que necessiteu un compte d'OpenStreetMap gratuït per fer-ho.", "pl": "Na tej mapie możesz zobaczyć, od czego pochodzi nazwa obiektu. Ulice, budynki,... pochodzą z OpenStreetMap, który został powiązany z Wikidanymi. W wyskakującym okienku zobaczysz artykuł w Wikipedii (jeśli istnieje) lub pole wikidanych zawierające nazwę obiektu. Jeśli sam obiekt ma stronę w Wikipedii, ona również zostanie wyświetlona.

    Ty też możesz pomóc!Powiększ wystarczająco mapę i wszystkie ulice się pojawią. Możesz kliknąć jedną, a pojawi się okno wyszukiwania Wikidanych. Za pomocą kilku kliknięć możesz dodać odnośnik etymologiczny. Pamiętaj, że potrzebujesz do tego darmowego konta OpenStreetMap." }, - "icon": "./assets/layers/etymology/logo.svg", - "startLat": 0, - "startLon": 0, - "startZoom": 1, - "widenFactor": 2, - "clustering": { - "maxZoom": 14, - "minNeededElements": 250 + "shortDescription": { + "en": "What is the origin of a toponym?", + "nl": "Wat is de oorsprong van een plaatsnaam?", + "de": "Woher stammt der Name einer Straße oder eines Ortes?", + "it": "Qual è l’origine di un toponimo?", + "zh_Hant": "地名的由來是?", + "hu": "Mi az eredete egy helynévnek?", + "fr": "Quelle est l'origine de ce toponyme ?", + "es": "¿Cual es el origen de un topónimo?", + "ca": "Quin és l'origen d'un topònim?", + "da": "Hvad er oprindelsen af et stednavn?", + "cs": "Jaký je původ toponyma?", + "pl": "Jakie jest pochodzenie toponimów?" }, + "icon": "./assets/layers/etymology/logo.svg", + "hideFromOverview": false, "layers": [ "etymology", { @@ -292,5 +285,9 @@ } } ], - "hideFromOverview": false + "widenFactor": 2, + "clustering": { + "maxZoom": 14, + "minNeededElements": 250 + } } \ No newline at end of file diff --git a/assets/themes/facadegardens/facadegardens.json b/assets/themes/facadegardens/facadegardens.json index d49651470..1786d61ee 100644 --- a/assets/themes/facadegardens/facadegardens.json +++ b/assets/themes/facadegardens/facadegardens.json @@ -15,6 +15,20 @@ "cs": "Fasádní zahrady", "pl": "Ogrody fasadowe" }, + "description": { + "nl": "Ontharde voortuintjes, groene gevels en bomen ín de stad brengen naast rust ook een mooiere stad, een grotere biodiversiteit, een verkoelend effect en een betere luchtkwaliteit.
    Klimaan VZW en 'Mechelen Klimaatneutraal' willen met het project Klim(t)aan je Gevel bestaande en nieuwe geveltuintjes in kaart brengen als voorbeeld voor mensen zelf een tuintje willen aanleggen of voor stadwandelaars die houden van de natuur.
    Meer info over het project op klimaan.be.", + "en": "Facade gardens, green facades and trees in the city not only bring peace and quiet, but also a more beautiful city, greater biodiversity, a cooling effect and better air quality.
    Klimaan VZW and Mechelen Klimaatneutraal want to map existing and new facade gardens as an example for people who want to build their own garden or for city walkers who love nature.
    More info about the project at klimaan.be.", + "ja": "ファサード庭園、都市の緑のファサードと樹木は、平和と静けさをもたらすだけでなく、より美しい都市、より大きな生物多様性、冷却効果、より良い大気質をもたらす。
    KlimaanのVZWとMechelenのKlimaatneutraalは、自分で庭を作りたい人や自然を愛する都市の歩行者のために、既存のファサード庭園と新しいファサード庭園のマッピングしたいと考えています。
    このプロジェクトに関する詳細情報はklimaanにあります。", + "fr": "Les jardins muraux en ville n’apportent pas seulement paix et tranquillité mais contribuent à embellir la ville, favoriser la biodiversité, régule la température et assainit l’air.
    Klimaan VZW et Mechelen Klimaatneutraal veulent cartographier les jardins muraux comme exemple pour les personnes souhaitant en construire ainsi que celles aimant la nature.
    Plus d’infos sur klimaan.be.", + "de": "Fassadengärten, grüne Fassaden und Bäume in der Stadt bringen nicht nur Ruhe und Frieden, sondern auch eine schönere Stadt, eine größere Artenvielfalt, einen Kühleffekt und eine bessere Luftqualität.
    Klimaan VZW und Mechelen Klimaatneutraal wollen bestehende und neue Fassadengärten als Beispiel für Menschen, die ihren eigenen Garten anlegen wollen, oder für naturverbundene Stadtspaziergänger kartieren.
    Mehr Informationen über das Projekt unter klimaan.be.", + "it": "I giardini veritcali e gli alberi in città non solo portano pace e tranquillità ma creano anche un ambiente più bello, aumentano la biodiversità, rendono il clima più fresco e migliorano la qualità dell’aria.
    Klimaan VZW e Mechelen Klimaatneutraal vogliono mappare sia i giardini verticali esistenti che quelli nuovi per mostrarli a quanti vogliono costruire un loro proprio giardino o per quelli che amano la natura e vogliono camminare per la città.
    Per ulteriori informazioni visita klimaan.be.", + "hu": "A homlokzatkertek, zöld homlokzatok és fák a városban nemcsak békét és nyugalmat, hanem szebb várost, nagyobb biológiai sokféleséget, hűsítő hatást és jobb levegőminőséget is hoznak.
    A Klimaan VZW és a Mechelen Klimaatneutraal a meglévő és új homlokzati kerteket szeretné feltérképezni, hogy példaként szolgáljanak a saját kertet építeni vágyóknak vagy a természetet kedvelő városi sétálóknak.
    További információ a projektről a klimaan.be oldalon.", + "da": "Facadehaver, grønne facader og træer i byen bringer ikke kun fred og ro, men også en smukkere by , større biodiversitet, en kølende effekt og bedre luftkvalitet.
    Klimaan VZW og Mechelen Klimaatneutraal ønsker at kortlægge eksisterende og nye facadehaver som et eksempel for folk, der vil bygge deres egen have eller for byvandrere, der elsker naturen.
    Mere info om projektet på klimaan.be.", + "cs": "Fasádní zahrady, zelené fasády a stromy ve městě přinášejí nejen klid a pohodu, ale také krásnější město, větší biodiverzitu, ochlazující efekt a lepší kvalitu ovzduší.
    Klimaan VZW a Mechelen Klimaatneutraal chtějí zmapovat stávající i nové fasádní zahrady jako příklad pro lidi, kteří si chtějí vybudovat vlastní zahradu, nebo pro městské chodce, kteří mají rádi přírodu.
    Více informací o projektu najdete na klimaan.be.", + "es": "Los jardines de fachada, las fachadas verdes y los árboles en la ciudad no sólo aportan paz y tranquilidad, sino también una ciudad más bella, una mayor biodiversidad, un efecto refrescante y una mejor calidad del aire.
    Klimaan VZW y Mechelen Klimaatneutraal quieren trazar un mapa de los jardines de fachada existentes y nuevos como ejemplo para las personas que quieran construir su propio jardín o para los paseantes urbanos amantes de la naturaleza.
    Más información sobre el proyecto en klimaan.be.", + "ca": "Els Jardins de façana, façanes verdes i arbres de la ciutat no només aporten pau i tranquil·litat, sinó també una ciutat més bella , una major biodiversitat, un efecte de refredament i una millor qualitat de l'aire.
    Klimaan VZW i Mechelen Klimaatneutraal volen cartografiar els jardins de façana existents i nous com a exemple per a les persones que volen construir el seu propi jardí o per als excursionistes de la ciutat que estimen la natura.
    Més informació sobre el projecte a klimaan.be.", + "pl": "Ogrody fasadowe, zielone fasady i drzewa w mieście nie tylko zapewniają ciszę i spokój, ale także piękniejsze miasto, większą różnorodność biologiczną, efekt chłodzący i lepszą jakość powietrza.
    Klimaan VZW i Mechelen Klimaatneutraal chcą zmapować istniejące i nowe ogrody fasadowe jako przykład dla osób chcących zbudować własny ogród lub dla spacerowiczów kochających przyrodę.
    Więcej informacji o projekcie na klimaan.be." + }, "shortDescription": { "nl": "Deze kaart toont geveltuintjes met foto's en bruikbare info over oriëntatie, zonlicht en planttypes.", "en": "This map shows facade gardens with pictures and useful info about orientation, sunshine and plant types.", @@ -30,25 +44,13 @@ "ca": "Aquest mapa mostra jardins a façanes amb fotografies i informació útil sobre l'orientació, llum del sol i els tipus de plantes.", "pl": "Mapa przedstawia ogrody fasadowe ze zdjęciami i przydatnymi informacjami na temat orientacji, nasłonecznienia i rodzajów roślin." }, - "description": { - "nl": "Ontharde voortuintjes, groene gevels en bomen ín de stad brengen naast rust ook een mooiere stad, een grotere biodiversiteit, een verkoelend effect en een betere luchtkwaliteit.
    Klimaan VZW en 'Mechelen Klimaatneutraal' willen met het project Klim(t)aan je Gevel bestaande en nieuwe geveltuintjes in kaart brengen als voorbeeld voor mensen zelf een tuintje willen aanleggen of voor stadwandelaars die houden van de natuur.
    Meer info over het project op klimaan.be.", - "en": "Facade gardens, green facades and trees in the city not only bring peace and quiet, but also a more beautiful city, greater biodiversity, a cooling effect and better air quality.
    Klimaan VZW and Mechelen Klimaatneutraal want to map existing and new facade gardens as an example for people who want to build their own garden or for city walkers who love nature.
    More info about the project at klimaan.be.", - "ja": "ファサード庭園、都市の緑のファサードと樹木は、平和と静けさをもたらすだけでなく、より美しい都市、より大きな生物多様性、冷却効果、より良い大気質をもたらす。
    KlimaanのVZWとMechelenのKlimaatneutraalは、自分で庭を作りたい人や自然を愛する都市の歩行者のために、既存のファサード庭園と新しいファサード庭園のマッピングしたいと考えています。
    このプロジェクトに関する詳細情報はklimaanにあります。", - "fr": "Les jardins muraux en ville n’apportent pas seulement paix et tranquillité mais contribuent à embellir la ville, favoriser la biodiversité, régule la température et assainit l’air.
    Klimaan VZW et Mechelen Klimaatneutraal veulent cartographier les jardins muraux comme exemple pour les personnes souhaitant en construire ainsi que celles aimant la nature.
    Plus d’infos sur klimaan.be.", - "de": "Fassadengärten, grüne Fassaden und Bäume in der Stadt bringen nicht nur Ruhe und Frieden, sondern auch eine schönere Stadt, eine größere Artenvielfalt, einen Kühleffekt und eine bessere Luftqualität.
    Klimaan VZW und Mechelen Klimaatneutraal wollen bestehende und neue Fassadengärten als Beispiel für Menschen, die ihren eigenen Garten anlegen wollen, oder für naturverbundene Stadtspaziergänger kartieren.
    Mehr Informationen über das Projekt unter klimaan.be.", - "it": "I giardini veritcali e gli alberi in città non solo portano pace e tranquillità ma creano anche un ambiente più bello, aumentano la biodiversità, rendono il clima più fresco e migliorano la qualità dell’aria.
    Klimaan VZW e Mechelen Klimaatneutraal vogliono mappare sia i giardini verticali esistenti che quelli nuovi per mostrarli a quanti vogliono costruire un loro proprio giardino o per quelli che amano la natura e vogliono camminare per la città.
    Per ulteriori informazioni visita klimaan.be.", - "hu": "A homlokzatkertek, zöld homlokzatok és fák a városban nemcsak békét és nyugalmat, hanem szebb várost, nagyobb biológiai sokféleséget, hűsítő hatást és jobb levegőminőséget is hoznak.
    A Klimaan VZW és a Mechelen Klimaatneutraal a meglévő és új homlokzati kerteket szeretné feltérképezni, hogy példaként szolgáljanak a saját kertet építeni vágyóknak vagy a természetet kedvelő városi sétálóknak.
    További információ a projektről a klimaan.be oldalon.", - "da": "Facadehaver, grønne facader og træer i byen bringer ikke kun fred og ro, men også en smukkere by , større biodiversitet, en kølende effekt og bedre luftkvalitet.
    Klimaan VZW og Mechelen Klimaatneutraal ønsker at kortlægge eksisterende og nye facadehaver som et eksempel for folk, der vil bygge deres egen have eller for byvandrere, der elsker naturen.
    Mere info om projektet på klimaan.be.", - "cs": "Fasádní zahrady, zelené fasády a stromy ve městě přinášejí nejen klid a pohodu, ale také krásnější město, větší biodiverzitu, ochlazující efekt a lepší kvalitu ovzduší.
    Klimaan VZW a Mechelen Klimaatneutraal chtějí zmapovat stávající i nové fasádní zahrady jako příklad pro lidi, kteří si chtějí vybudovat vlastní zahradu, nebo pro městské chodce, kteří mají rádi přírodu.
    Více informací o projektu najdete na klimaan.be.", - "es": "Los jardines de fachada, las fachadas verdes y los árboles en la ciudad no sólo aportan paz y tranquilidad, sino también una ciudad más bella, una mayor biodiversidad, un efecto refrescante y una mejor calidad del aire.
    Klimaan VZW y Mechelen Klimaatneutraal quieren trazar un mapa de los jardines de fachada existentes y nuevos como ejemplo para las personas que quieran construir su propio jardín o para los paseantes urbanos amantes de la naturaleza.
    Más información sobre el proyecto en klimaan.be.", - "ca": "Els Jardins de façana, façanes verdes i arbres de la ciutat no només aporten pau i tranquil·litat, sinó també una ciutat més bella , una major biodiversitat, un efecte de refredament i una millor qualitat de l'aire.
    Klimaan VZW i Mechelen Klimaatneutraal volen cartografiar els jardins de façana existents i nous com a exemple per a les persones que volen construir el seu propi jardí o per als excursionistes de la ciutat que estimen la natura.
    Més informació sobre el projecte a klimaan.be.", - "pl": "Ogrody fasadowe, zielone fasady i drzewa w mieście nie tylko zapewniają ciszę i spokój, ale także piękniejsze miasto, większą różnorodność biologiczną, efekt chłodzący i lepszą jakość powietrza.
    Klimaan VZW i Mechelen Klimaatneutraal chcą zmapować istniejące i nowe ogrody fasadowe jako przykład dla osób chcących zbudować własny ogród lub dla spacerowiczów kochających przyrodę.
    Więcej informacji o projekcie na klimaan.be." - }, "icon": "./assets/themes/facadegardens/geveltuin.svg", + "startZoom": 15, "startLat": 51.02768, "startLon": 4.480705, - "startZoom": 15, - "widenFactor": 1.5, + "credits": [ + "joost schouppe; stla" + ], "layers": [ { "id": "facadegardens", @@ -572,77 +574,16 @@ } } ], - "mapRendering": [ - { - "icon": { - "render": "circle:white;./assets/themes/facadegardens/geveltuin.svg", - "mappings": [ - { - "if": { - "and": [ - "direct_sunlight=yes" - ] - }, - "then": "circle:white;./assets/themes/facadegardens/zon.svg" - }, - { - "if": { - "and": [ - "direct_sunlight=partial" - ] - }, - "then": "circle:white;./assets/themes/facadegardens/halfzon.svg" - }, - { - "if": { - "and": [ - "direct_sunlight=no" - ] - }, - "then": "circle:white;./assets/themes/facadegardens/schaduw.svg" - } - ] - }, - "iconBadges": [ - { - "if": "plant~.*vine.*", - "then": "circle:white;./assets/themes/facadegardens/klimplant.svg" - }, - { - "if": "plant~.*groundcover.*", - "then": "circle:white;./assets/themes/facadegardens/bodembedekker.svg" - }, - { - "if": "edible=true", - "then": "circle:white;./assets/themes/facadegardens/eetbaar.svg" - }, - { - "if": "rain_barel=yes", - "then": "circle:white;./assets/themes/facadegardens/gevelton.svg" - }, - { - "if": "plant~.*shrub.*", - "then": "circle:white;./assets/themes/facadegardens/struik.svg" - }, - { - "if": "plant~.*flower.*", - "then": "circle:white;./assets/themes/facadegardens/bloei.svg" - } - ], - "iconSize": "50,50", - "location": [ - "point", - "centroid" - ], - "anchor": "center" - } - ], "deletion": true, "allowMove": { "enableImproveAccuracy": true, "enableRelocation": false - } + }, + "pointRendering": [], + "lineRendering": [ + {} + ] } ], - "credits": "joost schouppe; stla" + "widenFactor": 1.5 } \ No newline at end of file diff --git a/assets/themes/food/food.json b/assets/themes/food/food.json index 387ae5dc1..f67168967 100644 --- a/assets/themes/food/food.json +++ b/assets/themes/food/food.json @@ -29,11 +29,8 @@ "pl": "Restauracje i fast foody" }, "icon": "./assets/layers/food/restaurant.svg", - "startLat": 0, - "startLon": 0, - "startZoom": 1, - "widenFactor": 3, "layers": [ "food" - ] + ], + "widenFactor": 3 } \ No newline at end of file diff --git a/assets/themes/fritures/fritures.json b/assets/themes/fritures/fritures.json index 224083e67..ed43b57a6 100644 --- a/assets/themes/fritures/fritures.json +++ b/assets/themes/fritures/fritures.json @@ -24,10 +24,6 @@ "pl": "Na tej mapie znajdziesz swój ulubiony sklep z frytkami!" }, "icon": "./assets/themes/fritures/logo.svg", - "startLat": 0, - "startLon": 0, - "startZoom": 1, - "widenFactor": 3, "layers": [ { "builtin": "food", @@ -71,5 +67,6 @@ "name": null } } - ] + ], + "widenFactor": 3 } \ 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 2c2b757ca..53fe8a7ef 100644 --- a/assets/themes/fruit_trees/fruit_trees.json +++ b/assets/themes/fruit_trees/fruit_trees.json @@ -3,17 +3,13 @@ "title": { "nl": "Open Boomgaardenkaart" }, - "shortDescription": { - "nl": "Boomgaarden en fruitbomen" - }, "description": { "nl": "Op deze kaart vindt je boomgaarden en fruitbomen" }, + "shortDescription": { + "nl": "Boomgaarden en fruitbomen" + }, "icon": "./assets/themes/fruit_trees/fruit_tree.svg", - "startLat": 0, - "startLon": 0, - "startZoom": 1, - "widenFactor": 2, "hideFromOverview": true, "layers": [ { @@ -51,19 +47,9 @@ } } ], - "mapRendering": [ - { - "icon": "./assets/themes/buurtnatuur/forest.svg", - "iconSize": "40,40", - "location": [ - "point" - ], - "anchor": "center" - }, - { - "color": "#00f", - "width": "8" - } + "pointRendering": [], + "lineRendering": [ + {} ] }, { @@ -155,20 +141,11 @@ } } ], - "mapRendering": [ - { - "icon": "./assets/themes/fruit_trees/fruit_tree.svg", - "iconSize": "40,40", - "location": [ - "point" - ], - "anchor": "center" - }, - { - "color": "#00f", - "width": "8" - } + "pointRendering": [], + "lineRendering": [ + {} ] } - ] + ], + "widenFactor": 2 } \ No newline at end of file diff --git a/assets/themes/ghostbikes/ghostbikes.json b/assets/themes/ghostbikes/ghostbikes.json index 73a2e76c4..20fc16a36 100644 --- a/assets/themes/ghostbikes/ghostbikes.json +++ b/assets/themes/ghostbikes/ghostbikes.json @@ -38,14 +38,11 @@ "pl": "Duch roweru to pomnik upamiętniający rowerzystę, który zginął w wypadku drogowym, w postaci białego roweru umieszczonego na stałe w pobliżu miejsca wypadku.

    Na tej mapie każdy może zobaczyć wszystkie takie duchy roweru znane w OpenStreetMap. Czy brakuje ducha roweru? Każdy może tu dodać lub zaktualizować informacje - wystarczy posiadać (bezpłatne) konto OpenStreetMap.

    Istnieje automatyczne konto na Mastodonie, na którym publikowany jest miesięczny przegląd duchów roweru na całym świecie

    " }, "icon": "./assets/themes/ghostbikes/logo.svg", - "startZoom": 1, - "startLat": 0, - "startLon": 0, - "widenFactor": 5, + "defaultBackgroundId": "maptiler.backdrop", "layers": [ "ghost_bike" ], - "defaultBackgroundId": "maptiler.backdrop", + "widenFactor": 5, "clustering": { "maxZoom": 0 } diff --git a/assets/themes/grb/grb.json b/assets/themes/grb/grb.json index 842090ff7..1d8512e4b 100644 --- a/assets/themes/grb/grb.json +++ b/assets/themes/grb/grb.json @@ -3,9 +3,6 @@ "title": { "nl": "GRB import helper" }, - "shortDescription": { - "nl": "Grb import helper tool" - }, "description": { "nl": "Dit thema helpt het GRB importeren.", "en": "This theme is an attempt to help automating the GRB import.", @@ -18,17 +15,18 @@ "cs": "Toto téma je pokusem o automatizaci importu GRB.", "pl": "Ten temat jest próbą pomocy w automatyzacji importu GRB." }, + "shortDescription": { + "nl": "Grb import helper tool" + }, "icon": "./assets/themes/grb/logo.svg", + "startZoom": 9, "startLat": 51.0249, "startLon": 4.026489, - "startZoom": 9, - "widenFactor": 2, - "clustering": { - "maxZoom": 15 - }, - "overrideAll": { - "minzoom": 15 - }, + "defaultBackgroundId": "AGIVFlandersGRB", + "credits": [ + "Pieter Vander Vennet" + ], + "hideFromOverview": true, "layers": [ { "id": "osm-buildings", @@ -47,49 +45,6 @@ }, "maxCacheAge": 0 }, - "mapRendering": [ - { - "width": { - "render": "2", - "mappings": [ - { - "if": "fixme~*", - "then": "5" - } - ] - }, - "color": { - "render": "#00c", - "mappings": [ - { - "if": "fixme~*", - "then": "#ff00ff" - }, - { - "if": "building=house", - "then": "#a00" - }, - { - "if": "building=shed", - "then": "#563e02" - }, - { - "if": { - "or": [ - "building=garage", - "building=garages" - ] - }, - "then": "#f9bfbb" - }, - { - "if": "building=yes", - "then": "#0774f2" - } - ] - } - } - ], "title": "OSM-gebouw", "tagRenderings": [ { @@ -276,6 +231,10 @@ } ] } + ], + "pointRendering": [], + "lineRendering": [ + {} ] }, { @@ -482,60 +441,9 @@ "_imported_osm_still_fresh!=true" ] }, - "mapRendering": [ - { - "label": { - "render": "
    {addr:housenumber}
    ", - "condition": "addr:housenumber~*" - }, - "iconSize": "50,50", - "icon": { - "mappings": [ - { - "if": "_intersects_with_other_features~*", - "then": "./assets/themes/grb/warning.svg" - }, - { - "if": "addr:housenumber~*", - "then": "./assets/themes/grb/housenumber_blank.svg" - } - ] - }, - "location": [ - "point", - "centroid" - ], - "anchor": "center" - }, - { - "width": { - "render": 5, - "mappings": [ - { - "if": "_imported=yes", - "then": "1" - } - ] - }, - "color": { - "render": "#00a", - "mappings": [ - { - "if": "_imported=yes", - "then": "#00ff00" - }, - { - "if": { - "and": [ - "_imported_osm_object_found=true", - "_imported_osm_still_fresh=true" - ] - }, - "then": "#0f0" - } - ] - } - } + "pointRendering": [], + "lineRendering": [ + {} ] }, { @@ -545,14 +453,12 @@ "source": { "osmTags": "highway=service" }, - "mapRendering": [ - { - "width": 4, - "color": "#888888" - } - ], "title": "Service road", - "tagRenderings": [] + "tagRenderings": [], + "pointRendering": [], + "lineRendering": [ + {} + ] }, { "id": "generic_osm_object", @@ -584,13 +490,6 @@ }, "maxCacheAge": 0 }, - "mapRendering": [ - { - "color": "#ccc", - "width": "1", - "fill": "no" - } - ], "title": { "render": { "*": "Other OSM-Object" @@ -598,6 +497,10 @@ }, "tagRenderings": [ "all_tags" + ], + "pointRendering": [], + "lineRendering": [ + {} ] }, "address", @@ -773,9 +676,13 @@ } } ], - "hideFromOverview": true, - "defaultBackgroundId": "AGIVFlandersGRB", + "overrideAll": { + "minzoom": 15 + }, + "widenFactor": 2, "overpassMaxZoom": 15, "osmApiTileSize": 17, - "credits": "Pieter Vander Vennet" + "clustering": { + "maxZoom": 15 + } } \ No newline at end of file diff --git a/assets/themes/grb_fixme/grb_fixme.json b/assets/themes/grb_fixme/grb_fixme.json index 52c290236..77a0b209b 100644 --- a/assets/themes/grb_fixme/grb_fixme.json +++ b/assets/themes/grb_fixme/grb_fixme.json @@ -3,25 +3,18 @@ "title": { "nl": "GRB Fixup" }, - "shortDescription": { - "nl": "Grb Fixup" - }, "description": { "nl": "Gebouwen met een FIXME - wss GRB-import die gefixed moeten worden" }, + "shortDescription": { + "nl": "Grb Fixup" + }, "icon": "./assets/svg/bug.svg", + "startZoom": 14, "startLat": 51.2132, "startLon": 3.231, - "startZoom": 14, - "widenFactor": 2, - "clustering": { - "maxZoom": 15 - }, - "overrideAll": { - "source": { - "maxCacheAge": 0 - } - }, + "defaultBackgroundId": "AGIVFlandersGRB", + "hideFromOverview": true, "layers": [ { "id": "osm-buildings-fixme", @@ -38,65 +31,6 @@ "calculatedTags": [ "_grbNumber=(feat.properties.fixme?.match(/GRB thinks that this has number ([0-9a-zA-Z;]+)/) ?? ['','none']) [1]" ], - "mapRendering": [ - { - "width": { - "render": "2", - "mappings": [ - { - "if": "fixme~*", - "then": "5" - } - ] - }, - "color": { - "render": "#00c", - "mappings": [ - { - "if": "fixme~*", - "then": "#ff00ff" - }, - { - "if": "building=house", - "then": "#a00" - }, - { - "if": "building=shed", - "then": "#563e02" - }, - { - "if": { - "or": [ - "building=garage", - "building=garages" - ] - }, - "then": "#f9bfbb" - }, - { - "if": "building=yes", - "then": "#0774f2" - } - ] - } - }, - { - "location": [ - "point", - "centroid" - ], - "label": { - "mappings": [ - { - "if": "addr:housenumber~*", - "then": "
    {addr:housenumber}
    " - } - ] - }, - "iconSize": "40,40", - "anchor": "center" - } - ], "title": "OSM-gebouw", "tagRenderings": [ { @@ -280,7 +214,11 @@ }, "all_tags" ], - "minzoom": 14 + "minzoom": 14, + "pointRendering": [], + "lineRendering": [ + {} + ] }, { "builtin": "address", @@ -301,8 +239,15 @@ } } ], - "hideFromOverview": true, - "defaultBackgroundId": "AGIVFlandersGRB", + "overrideAll": { + "source": { + "maxCacheAge": 0 + } + }, + "widenFactor": 2, "overpassMaxZoom": 15, - "osmApiTileSize": 17 + "osmApiTileSize": 17, + "clustering": { + "maxZoom": 15 + } } \ No newline at end of file diff --git a/assets/themes/guideposts/guideposts.json b/assets/themes/guideposts/guideposts.json index 3bf3cd1d4..61ba49312 100644 --- a/assets/themes/guideposts/guideposts.json +++ b/assets/themes/guideposts/guideposts.json @@ -15,7 +15,6 @@ "pl": "Drogowskazy (znane również jako \"palce na słupkach\") często znajdują się wzdłuż oficjalnych szlaków pieszych, rowerowych, narciarskich lub konnych i wskazują drogę do różnych miejsc. Ponadto często noszą nazwy regionu lub miejsca i wskazują wysokość.\n\nPozycja drogowskazu może być wykorzystana przez turystę/rowerzystę/jeźdźca/narciarza jako potwierdzenie aktualnej pozycji, zwłaszcza jeśli korzysta z drukowanej mapy bez odbiornika GPS. " }, "icon": "./assets/layers/guidepost/guidepost.svg", - "startZoom": 2, "layers": [ "guidepost" ] diff --git a/assets/themes/hackerspaces/hackerspaces.json b/assets/themes/hackerspaces/hackerspaces.json index b99c8b16f..a8bf4a070 100644 --- a/assets/themes/hackerspaces/hackerspaces.json +++ b/assets/themes/hackerspaces/hackerspaces.json @@ -17,20 +17,6 @@ "eu": "Hackerspace", "pl": "Hackerspace'y" }, - "shortDescription": { - "en": "A map of hackerspaces", - "de": "Eine Karte von Hackerspaces", - "it": "Una cartina degli hackerspace", - "zh_Hant": "駭客空間的地圖", - "hu": "Hackerspace-ek térképe", - "nl": "Een kaart van hackerspaces", - "fr": "Une carte des ateliers numériques ouverts", - "da": "Et kort over hackerspaces", - "cs": "Mapa označující Hackerspaces", - "es": "Un mapa de hackerspaces", - "ca": "Un mapa dels hackerspaces", - "pl": "Mapa hackerspaceów" - }, "description": { "en": "On this map you can see hackerspaces, add a new hackerspace or update data directly", "de": "Auf dieser Karte können Sie Hackerspaces sehen, einen neuen Hackerspace hinzufügen oder Daten direkt aktualisieren", @@ -45,12 +31,23 @@ "ca": "En aquest mapa podeu veure els hackerspaces, afegir un nou hackerspace o actualitzar les dades directament", "pl": "Na tej mapie możesz zobaczyć hackerspace, dodać nową hackerspace lub bezpośrednio zaktualizować dane" }, + "shortDescription": { + "en": "A map of hackerspaces", + "de": "Eine Karte von Hackerspaces", + "it": "Una cartina degli hackerspace", + "zh_Hant": "駭客空間的地圖", + "hu": "Hackerspace-ek térképe", + "nl": "Een kaart van hackerspaces", + "fr": "Une carte des ateliers numériques ouverts", + "da": "Et kort over hackerspaces", + "cs": "Mapa označující Hackerspaces", + "es": "Un mapa de hackerspaces", + "ca": "Un mapa dels hackerspaces", + "pl": "Mapa hackerspaceów" + }, "icon": "./assets/themes/hackerspaces/glider.svg", - "startLat": 0, - "startLon": 0, - "startZoom": 1, - "widenFactor": 5, "layers": [ "hackerspace" - ] + ], + "widenFactor": 5 } \ No newline at end of file diff --git a/assets/themes/hailhydrant/hailhydrant.json b/assets/themes/hailhydrant/hailhydrant.json index c82595161..697015a6b 100644 --- a/assets/themes/hailhydrant/hailhydrant.json +++ b/assets/themes/hailhydrant/hailhydrant.json @@ -17,22 +17,6 @@ "cs": "Hydranty, hasicí přístroje, požární stanice a stanice záchranné služby", "pl": "Hydranty, gaśnice, remizy strażackie i pogotowia ratunkowe" }, - "shortDescription": { - "en": "Map to show hydrants, extinguishers, fire stations, and ambulance stations.", - "ja": "消火栓、消火器、消防署消火栓、消火器、消防署、および救急ステーションを表示します。", - "zh_Hant": "顯示消防栓、滅火器、消防隊與急救站的地圖。", - "ru": "Карта пожарных гидрантов, огнетушителей, пожарных станций и станций скорой помощи.", - "fr": "Carte indiquant les bornes incendies, extincteurs, casernes de pompiers et ambulanciers.", - "de": "Hydranten, Feuerlöscher, Feuerwachen und Rettungswachen.", - "it": "Carta che mostra gli idranti, gli estintori, le caserme dei vigili del fuoco e le stazioni delle ambulanze.", - "hu": "Térkép tűzcsapok, tűzoltó készülékek, tűzoltóságok és mentőállomások megjelenítéséhez.", - "es": "Mapa para mostrar bocas de incendios, extintores, parques de bomberos y parques de ambulancias.", - "ca": "Mapa per a mostrar hidrants, extintors, parcs de bombers i estacions d'ambulàncies.", - "nl": "Kaart om hydranten, brandblussers, brandweerkazernes en ambulanceposten weer te geven.", - "da": "Kort for at vise brandhaner, brandslukkere, brandstationer og ambulancestationer.", - "cs": "Mapa zobrazující hydranty, hasicí přístroje, požární stanice a stanice záchranné služby.", - "pl": "Mapa przedstawiająca hydranty, gaśnice, remizy strażackie i karetki pogotowia." - }, "description": { "en": "On this map you can find and update hydrants, fire stations, ambulance stations, and extinguishers in your favorite neighborhoods.", "ja": "このマップでは、お気に入りの近隣にある消火栓、消防署、救急ステーション、消火器を検索して更新できます。\n\n正確な位置を追跡し(モバイルのみ)、左下コーナーで関連するレイヤを選択できます。このツールを使用して、マップにピン(注視点)を追加または編集したり、利用可能な質問に答えることによって追加の詳細を提供することもできます。\n\nすべての変更は自動的にOpenStreetMapのグローバルデータベースに保存され、他のユーザが自由に再利用できます。", @@ -49,17 +33,35 @@ "cs": "Na této mapě můžete najít a aktualizovat informace o hydrantech, stanicích záchranné služby, hasičských stanicích a hasicích přístrojích ve vašich oblíbených čtvrtích.", "pl": "Na tej mapie możesz znaleźć i zaktualizować hydranty, remizy strażackie, karetki pogotowia i gaśnice w swoich ulubionych dzielnicach." }, + "shortDescription": { + "en": "Map to show hydrants, extinguishers, fire stations, and ambulance stations.", + "ja": "消火栓、消火器、消防署消火栓、消火器、消防署、および救急ステーションを表示します。", + "zh_Hant": "顯示消防栓、滅火器、消防隊與急救站的地圖。", + "ru": "Карта пожарных гидрантов, огнетушителей, пожарных станций и станций скорой помощи.", + "fr": "Carte indiquant les bornes incendies, extincteurs, casernes de pompiers et ambulanciers.", + "de": "Hydranten, Feuerlöscher, Feuerwachen und Rettungswachen.", + "it": "Carta che mostra gli idranti, gli estintori, le caserme dei vigili del fuoco e le stazioni delle ambulanze.", + "hu": "Térkép tűzcsapok, tűzoltó készülékek, tűzoltóságok és mentőállomások megjelenítéséhez.", + "es": "Mapa para mostrar bocas de incendios, extintores, parques de bomberos y parques de ambulancias.", + "ca": "Mapa per a mostrar hidrants, extintors, parcs de bombers i estacions d'ambulàncies.", + "nl": "Kaart om hydranten, brandblussers, brandweerkazernes en ambulanceposten weer te geven.", + "da": "Kort for at vise brandhaner, brandslukkere, brandstationer og ambulancestationer.", + "cs": "Mapa zobrazující hydranty, hasicí přístroje, požární stanice a stanice záchranné služby.", + "pl": "Mapa przedstawiająca hydranty, gaśnice, remizy strażackie i karetki pogotowia." + }, "icon": "./assets/themes/hailhydrant/logo.svg", + "startZoom": 6, "startLat": 13.67801, "startLon": 121.6625, - "startZoom": 6, - "widenFactor": 3, + "defaultBackgroundId": "HDM_HOT", + "credits": [ + "Erwin Olario" + ], "layers": [ "hydrant", "extinguisher", "fire_station", "ambulancestation" ], - "defaultBackgroundId": "HDM_HOT", - "credits": "Erwin Olario" + "widenFactor": 3 } \ No newline at end of file diff --git a/assets/themes/healthcare/healthcare.json b/assets/themes/healthcare/healthcare.json index d48a9dd99..51c577f0c 100644 --- a/assets/themes/healthcare/healthcare.json +++ b/assets/themes/healthcare/healthcare.json @@ -27,10 +27,9 @@ "pl": "Na tej mapie pokazane są różne elementy związane z opieką zdrowotną" }, "icon": "./assets/layers/doctors/doctors.svg", + "startZoom": 16, "startLat": 50.8465573, "startLon": 4.351697, - "startZoom": 16, - "widenFactor": 2, "layers": [ "doctors", "physiotherapist", @@ -117,5 +116,6 @@ "minzoom": 18 } } - ] + ], + "widenFactor": 2 } diff --git a/assets/themes/hotels/hotels.json b/assets/themes/hotels/hotels.json index 37ffaab4e..cc7676565 100644 --- a/assets/themes/hotels/hotels.json +++ b/assets/themes/hotels/hotels.json @@ -27,9 +27,9 @@ "pl": "Na tej mapie znajdziesz hotele w Twojej okolicy" }, "icon": "./assets/layers/hotel/hotel.svg", + "startZoom": 13, "startLat": 50.8552, "startLon": 4.3755, - "startZoom": 13, "layers": [ "hotel" ] diff --git a/assets/themes/icecream/icecream.json b/assets/themes/icecream/icecream.json new file mode 100644 index 000000000..3d7e00a1b --- /dev/null +++ b/assets/themes/icecream/icecream.json @@ -0,0 +1,13 @@ +{ + "id": "icecream", + "title": { + "en": "Icecream" + }, + "description": { + "en": "A map showing ice cream parlors and ice cream vending machines" + }, + "icon": "./assets/layers/ice_cream/ice_cream.svg", + "layers": [ + "ice_cream" + ] +} diff --git a/assets/themes/indoors/indoors.json b/assets/themes/indoors/indoors.json index 895fe4fde..281c084ae 100644 --- a/assets/themes/indoors/indoors.json +++ b/assets/themes/indoors/indoors.json @@ -27,10 +27,9 @@ "pl": "Na tej mapie pokazane są publicznie dostępne miejsca w pomieszczeniach zamkniętych" }, "icon": "./assets/layers/entrance/entrance.svg", + "startZoom": 14, "startLat": 51.17181, "startLon": 4.144383, - "startZoom": 14, - "widenFactor": 2, "layers": [ { "builtin": "indoors", @@ -49,5 +48,6 @@ "pedestrian_path", "elevator", "entrance" - ] + ], + "widenFactor": 2 } \ No newline at end of file diff --git a/assets/themes/kerbs_and_crossings/kerbs_and_crossings.json b/assets/themes/kerbs_and_crossings/kerbs_and_crossings.json index c83a256a5..108cfd410 100644 --- a/assets/themes/kerbs_and_crossings/kerbs_and_crossings.json +++ b/assets/themes/kerbs_and_crossings/kerbs_and_crossings.json @@ -29,6 +29,9 @@ "startZoom": 19, "startLat": 53.23776, "startLon": 6.53812, + "credits": [ + "Robin van der Linde" + ], "layers": [ { "builtin": "cycleways_and_roads", @@ -71,7 +74,9 @@ "pl": "Przejście dla pieszych i/lub przejazd dla rowerów", "cs": "Přechod pro chodce a/nebo cyklisty" }, - "snapToLayer": "cycleways_and_roads", + "snapToLayer": [ + "cycleways_and_roads" + ], "maxSnapDistance": 25 } ], @@ -81,6 +86,5 @@ } }, "kerbs" - ], - "credits": "Robin van der Linde" + ] } \ No newline at end of file diff --git a/assets/themes/mapcomplete-changes/mapcomplete-changes.json b/assets/themes/mapcomplete-changes/mapcomplete-changes.json index b9f29b9db..6d893730d 100644 --- a/assets/themes/mapcomplete-changes/mapcomplete-changes.json +++ b/assets/themes/mapcomplete-changes/mapcomplete-changes.json @@ -10,6 +10,16 @@ "es": "Cambios realizados con MapComplete", "pl": "Zmiany wprowadzone za pomocą MapComplete" }, + "description": { + "en": "This maps shows all the changes made with MapComplete", + "ca": "Aquest mapa mostra tots els canvis fets amb MapComplete", + "de": "Diese Karte zeigt alle mit MapComplete vorgenommenen Änderungen", + "fr": "Cette carte montre tous les changements faits avec MapComplete", + "nl": "Deze kaart toont alle wijzigingen die met MapComplete gemaakt werden", + "pl": "Ta mapa pokazuje wszystkie zmiany wprowadzone za pomocą MapComplete", + "cs": "Tato mapa zobrazuje všechny změny provedené pomocí MapComplete", + "es": "Este mapa muestra todos los cambios realizados con MapComplete" + }, "shortDescription": { "en": "Show changes made with MapComplete", "ca": "Mostra els canvis fets amb MapComplete", @@ -19,23 +29,8 @@ "es": "Mostrar cambios realizados con MapComplete", "pl": "Pokaż zmiany wprowadzone za pomocą MapComplete" }, - "description": { - "en": "This maps shows all the changes made with MapComplete", - "ca": "Aquest mapa mostra tots els canvis fets amb MapComplete", - "de": "Diese Karte zeigt alle mit MapComplete vorgenommenen Änderungen", - "pl": "Ta mapa pokazuje wszystkie zmiany wprowadzone za pomocą MapComplete", - "fr": "Cette carte montre tous les changements faits avec MapComplete", - "nl": "Deze kaart toont alle wijzigingen die met MapComplete gemaakt werden", - "cs": "Tato mapa zobrazuje všechny změny provedené pomocí MapComplete", - "es": "Este mapa muestra todos los cambios realizados con MapComplete" - }, "icon": "./assets/svg/logo.svg", "hideFromOverview": true, - "startLat": 0, - "startLon": 0, - "startZoom": 1, - "widenFactor": 0.05, - "clustering": false, "layers": [ { "id": "mapcomplete-changes", @@ -225,327 +220,327 @@ } } ], - "mapRendering": [ + "pointRendering": [ { "location": [ "point", "centroid" ], - "icon": { - "render": "teardrop:#00cc00", - "mappings": [ - { - "if": "theme=advertising", - "then": "./assets/themes/advertising/icon.svg" - }, - { - "if": "theme=aed", - "then": "./assets/themes/aed/aed.svg" - }, - { - "if": "theme=artwork", - "then": "./assets/themes/artwork/artwork.svg" - }, - { - "if": "theme=atm", - "then": "./assets/themes/atm/logo.svg" - }, - { - "if": "theme=bag", - "then": "./assets/themes/bag/logo.svg" - }, - { - "if": "theme=benches", - "then": "./assets/themes/benches/bench_poi.svg" - }, - { - "if": "theme=bicycle_rental", - "then": "./assets/themes/bicycle_rental/logo.svg" - }, - { - "if": "theme=bicyclelib", - "then": "./assets/themes/bicyclelib/logo.svg" - }, - { - "if": "theme=binoculars", - "then": "./assets/layers/binocular/telescope.svg" - }, - { - "if": "theme=blind_osm", - "then": "./assets/themes/blind_osm/Blindicon.svg" - }, - { - "if": "theme=bookcases", - "then": "./assets/themes/bookcases/bookcase.svg" - }, - { - "if": "theme=buurtnatuur", - "then": "./assets/themes/buurtnatuur/logo.svg" - }, - { - "if": "theme=cafes_and_pubs", - "then": "./assets/layers/cafe_pub/pub.svg" - }, - { - "if": "theme=campersite", - "then": "./assets/themes/campersite/caravan.svg" - }, - { - "if": "theme=charging_stations", - "then": "./assets/themes/charging_stations/logo.svg" - }, - { - "if": "theme=climbing", - "then": "./assets/themes/climbing/climbing_icon.svg" - }, - { - "if": "theme=clock", - "then": "./assets/layers/clock/clock.svg" - }, - { - "if": "theme=cycle_highways", - "then": "./assets/themes/cycle_highways/fietssnelwegen-logo.svg" - }, - { - "if": "theme=cycle_infra", - "then": "./assets/themes/cycle_infra/cycle-infra.svg" - }, - { - "if": "theme=cyclenodes", - "then": "./assets/themes/cyclenodes/logo.svg" - }, - { - "if": "theme=cyclestreets", - "then": "./assets/themes/cyclestreets/logo.svg" - }, - { - "if": "theme=cyclofix", - "then": "./assets/themes/cyclofix/logo.svg" - }, - { - "if": "theme=drinking_water", - "then": "./assets/themes/drinking_water/logo.svg" - }, - { - "if": "theme=education", - "then": "./assets/layers/school/college.svg" - }, - { - "if": "theme=elongated_coin", - "then": "./assets/themes/elongated_coin/penny.svg" - }, - { - "if": "theme=etymology", - "then": "./assets/layers/etymology/logo.svg" - }, - { - "if": "theme=facadegardens", - "then": "./assets/themes/facadegardens/geveltuin.svg" - }, - { - "if": "theme=food", - "then": "./assets/layers/food/restaurant.svg" - }, - { - "if": "theme=fritures", - "then": "./assets/themes/fritures/logo.svg" - }, - { - "if": "theme=fruit_trees", - "then": "./assets/themes/fruit_trees/fruit_tree.svg" - }, - { - "if": "theme=ghostbikes", - "then": "./assets/themes/ghostbikes/logo.svg" - }, - { - "if": "theme=grb", - "then": "./assets/themes/grb/logo.svg" - }, - { - "if": "theme=grb_fixme", - "then": "./assets/svg/bug.svg" - }, - { - "if": "theme=hackerspaces", - "then": "./assets/themes/hackerspaces/glider.svg" - }, - { - "if": "theme=hailhydrant", - "then": "./assets/themes/hailhydrant/logo.svg" - }, - { - "if": "theme=healthcare", - "then": "./assets/layers/doctors/doctors.svg" - }, - { - "if": "theme=hotels", - "then": "./assets/layers/hotel/hotel.svg" - }, - { - "if": "theme=indoors", - "then": "./assets/layers/entrance/entrance.svg" - }, - { - "if": "theme=kerbs_and_crossings", - "then": "./assets/layers/kerbs/KerbIcon.svg" - }, - { - "if": "theme=mapcomplete-changes", - "then": "./assets/svg/logo.svg" - }, - { - "if": "theme=maproulette", - "then": "./assets/layers/maproulette/logomark.svg" - }, - { - "if": "theme=maps", - "then": "./assets/themes/maps/logo.svg" - }, - { - "if": "theme=maxspeed", - "then": "./assets/themes/maxspeed/maxspeed_logo.svg" - }, - { - "if": "theme=nature", - "then": "./assets/themes/nature/logo.svg" - }, - { - "if": "theme=notes", - "then": "./assets/themes/notes/logo.svg" - }, - { - "if": "theme=observation_towers", - "then": "./assets/layers/observation_tower/Tower_observation.svg" - }, - { - "if": "theme=onwheels", - "then": "./assets/themes/onwheels/crest.svg" - }, - { - "if": "theme=openwindpowermap", - "then": "./assets/themes/openwindpowermap/logo.svg" - }, - { - "if": "theme=osm_community_index", - "then": "./assets/themes/osm_community_index/osm.svg" - }, - { - "if": "theme=parkings", - "then": "./assets/themes/parkings/parkings.svg" - }, - { - "if": "theme=personal", - "then": "./assets/svg/addSmall.svg" - }, - { - "if": "theme=pets", - "then": "./assets/layers/dogpark/dog-park.svg" - }, - { - "if": "theme=play_forests", - "then": "./assets/layers/play_forest/icon.svg" - }, - { - "if": "theme=playgrounds", - "then": "./assets/themes/playgrounds/playground.svg" - }, - { - "if": "theme=postal_codes", - "then": "./assets/themes/postal_codes/townhall.svg" - }, - { - "if": "theme=postboxes", - "then": "./assets/layers/postboxes/postbox.svg" - }, - { - "if": "theme=rainbow_crossings", - "then": "./assets/themes/rainbow_crossings/logo.svg" - }, - { - "if": "theme=shops", - "then": "./assets/themes/shops/shop.svg" - }, - { - "if": "theme=sidewalks", - "then": "./assets/svg/bug.svg" - }, - { - "if": "theme=speelplekken", - "then": "./assets/themes/speelplekken/logo.svg" - }, - { - "if": "theme=sport_pitches", - "then": "./assets/layers/sport_pitch/table_tennis.svg" - }, - { - "if": "theme=sports", - "then": "./assets/themes/sports/sport.svg" - }, - { - "if": "theme=stations", - "then": "./assets/themes/stations/rail-light.svg" - }, - { - "if": "theme=street_lighting", - "then": "./assets/layers/street_lamps/street_lamp.svg" - }, - { - "if": "theme=street_lighting_assen", - "then": "./assets/layers/street_lamps/street_lamp.svg" - }, - { - "if": "theme=surveillance", - "then": "./assets/themes/surveillance/logo.svg" - }, - { - "if": "theme=toerisme_vlaanderen", - "then": "./assets/themes/toerisme_vlaanderen/logo.svg" - }, - { - "if": "theme=toilets", - "then": "./assets/themes/toilets/toilets.svg" - }, - { - "if": "theme=transit", - "then": "./assets/layers/transit_stops/bus_stop.svg" - }, - { - "if": "theme=trees", - "then": "./assets/themes/trees/logo.svg" - }, - { - "if": "theme=uk_addresses", - "then": "./assets/themes/uk_addresses/housenumber_unknown.svg" - }, - { - "if": "theme=vending_machine", - "then": "./assets/layers/vending_machine/vending_machine.svg" - }, - { - "if": "theme=walls_and_buildings", - "then": "./assets/layers/walls_and_buildings/walls_and_buildings.png" - }, - { - "if": "theme=waste", - "then": "./assets/layers/recycling/recycling-14.svg" - }, - { - "if": "theme=waste_assen", - "then": "./assets/layers/recycling/recycling-14.svg" - }, - { - "if": "theme=waste_basket", - "then": "./assets/themes/waste_basket/waste_basket.svg" - }, - { - "if": "theme=width", - "then": "./assets/themes/width/icon.svg" - } - ] - }, "iconSize": "30,30", - "anchor": "center" + "anchor": "center", + "marker": [ + { + "icon": { + "render": "teardrop:#00cc00", + "mappings": [ + { + "if": "theme=advertising", + "then": "./assets/themes/advertising/icon.svg" + }, + { + "if": "theme=aed", + "then": "./assets/themes/aed/aed.svg" + }, + { + "if": "theme=artwork", + "then": "./assets/themes/artwork/artwork.svg" + }, + { + "if": "theme=atm", + "then": "./assets/themes/atm/logo.svg" + }, + { + "if": "theme=bag", + "then": "./assets/themes/bag/logo.svg" + }, + { + "if": "theme=benches", + "then": "./assets/themes/benches/bench_poi.svg" + }, + { + "if": "theme=bicycle_rental", + "then": "./assets/themes/bicycle_rental/logo.svg" + }, + { + "if": "theme=bicyclelib", + "then": "./assets/themes/bicyclelib/logo.svg" + }, + { + "if": "theme=binoculars", + "then": "./assets/layers/binocular/telescope.svg" + }, + { + "if": "theme=blind_osm", + "then": "./assets/themes/blind_osm/Blindicon.svg" + }, + { + "if": "theme=bookcases", + "then": "./assets/themes/bookcases/bookcase.svg" + }, + { + "if": "theme=buurtnatuur", + "then": "./assets/themes/buurtnatuur/logo.svg" + }, + { + "if": "theme=cafes_and_pubs", + "then": "./assets/layers/cafe_pub/pub.svg" + }, + { + "if": "theme=campersite", + "then": "./assets/themes/campersite/caravan.svg" + }, + { + "if": "theme=charging_stations", + "then": "./assets/themes/charging_stations/logo.svg" + }, + { + "if": "theme=climbing", + "then": "./assets/themes/climbing/climbing_icon.svg" + }, + { + "if": "theme=clock", + "then": "./assets/layers/clock/clock.svg" + }, + { + "if": "theme=cycle_highways", + "then": "./assets/themes/cycle_highways/fietssnelwegen-logo.svg" + }, + { + "if": "theme=cycle_infra", + "then": "./assets/themes/cycle_infra/cycle-infra.svg" + }, + { + "if": "theme=cyclenodes", + "then": "./assets/themes/cyclenodes/logo.svg" + }, + { + "if": "theme=cyclestreets", + "then": "./assets/themes/cyclestreets/logo.svg" + }, + { + "if": "theme=cyclofix", + "then": "./assets/themes/cyclofix/logo.svg" + }, + { + "if": "theme=drinking_water", + "then": "./assets/themes/drinking_water/logo.svg" + }, + { + "if": "theme=education", + "then": "./assets/layers/school/college.svg" + }, + { + "if": "theme=elongated_coin", + "then": "./assets/themes/elongated_coin/penny.svg" + }, + { + "if": "theme=etymology", + "then": "./assets/layers/etymology/logo.svg" + }, + { + "if": "theme=facadegardens", + "then": "./assets/themes/facadegardens/geveltuin.svg" + }, + { + "if": "theme=food", + "then": "./assets/layers/food/restaurant.svg" + }, + { + "if": "theme=fritures", + "then": "./assets/themes/fritures/logo.svg" + }, + { + "if": "theme=fruit_trees", + "then": "./assets/themes/fruit_trees/fruit_tree.svg" + }, + { + "if": "theme=ghostbikes", + "then": "./assets/themes/ghostbikes/logo.svg" + }, + { + "if": "theme=grb", + "then": "./assets/themes/grb/logo.svg" + }, + { + "if": "theme=grb_fixme", + "then": "./assets/svg/bug.svg" + }, + { + "if": "theme=hackerspaces", + "then": "./assets/themes/hackerspaces/glider.svg" + }, + { + "if": "theme=hailhydrant", + "then": "./assets/themes/hailhydrant/logo.svg" + }, + { + "if": "theme=healthcare", + "then": "./assets/layers/doctors/doctors.svg" + }, + { + "if": "theme=hotels", + "then": "./assets/layers/hotel/hotel.svg" + }, + { + "if": "theme=indoors", + "then": "./assets/layers/entrance/entrance.svg" + }, + { + "if": "theme=kerbs_and_crossings", + "then": "./assets/layers/kerbs/KerbIcon.svg" + }, + { + "if": "theme=maproulette", + "then": "./assets/layers/maproulette/logomark.svg" + }, + { + "if": "theme=maps", + "then": "./assets/themes/maps/logo.svg" + }, + { + "if": "theme=maxspeed", + "then": "./assets/themes/maxspeed/maxspeed_logo.svg" + }, + { + "if": "theme=nature", + "then": "./assets/themes/nature/logo.svg" + }, + { + "if": "theme=notes", + "then": "./assets/themes/notes/logo.svg" + }, + { + "if": "theme=observation_towers", + "then": "./assets/layers/observation_tower/Tower_observation.svg" + }, + { + "if": "theme=onwheels", + "then": "./assets/themes/onwheels/crest.svg" + }, + { + "if": "theme=openwindpowermap", + "then": "./assets/themes/openwindpowermap/logo.svg" + }, + { + "if": "theme=osm_community_index", + "then": "./assets/themes/osm_community_index/osm.svg" + }, + { + "if": "theme=parkings", + "then": "./assets/themes/parkings/parkings.svg" + }, + { + "if": "theme=personal", + "then": "./assets/svg/addSmall.svg" + }, + { + "if": "theme=pets", + "then": "./assets/layers/dogpark/dog-park.svg" + }, + { + "if": "theme=play_forests", + "then": "./assets/layers/play_forest/icon.svg" + }, + { + "if": "theme=playgrounds", + "then": "./assets/themes/playgrounds/playground.svg" + }, + { + "if": "theme=postal_codes", + "then": "./assets/themes/postal_codes/townhall.svg" + }, + { + "if": "theme=postboxes", + "then": "./assets/layers/postboxes/postbox.svg" + }, + { + "if": "theme=rainbow_crossings", + "then": "./assets/themes/rainbow_crossings/logo.svg" + }, + { + "if": "theme=shops", + "then": "./assets/themes/shops/shop.svg" + }, + { + "if": "theme=sidewalks", + "then": "./assets/svg/bug.svg" + }, + { + "if": "theme=speelplekken", + "then": "./assets/themes/speelplekken/logo.svg" + }, + { + "if": "theme=sport_pitches", + "then": "./assets/layers/sport_pitch/table_tennis.svg" + }, + { + "if": "theme=sports", + "then": "./assets/themes/sports/sport.svg" + }, + { + "if": "theme=stations", + "then": "./assets/themes/stations/rail-light.svg" + }, + { + "if": "theme=street_lighting", + "then": "./assets/layers/street_lamps/street_lamp.svg" + }, + { + "if": "theme=street_lighting_assen", + "then": "./assets/layers/street_lamps/street_lamp.svg" + }, + { + "if": "theme=surveillance", + "then": "./assets/themes/surveillance/logo.svg" + }, + { + "if": "theme=toerisme_vlaanderen", + "then": "./assets/themes/toerisme_vlaanderen/logo.svg" + }, + { + "if": "theme=toilets", + "then": "./assets/themes/toilets/toilets.svg" + }, + { + "if": "theme=transit", + "then": "./assets/layers/transit_stops/bus_stop.svg" + }, + { + "if": "theme=trees", + "then": "./assets/themes/trees/logo.svg" + }, + { + "if": "theme=uk_addresses", + "then": "./assets/themes/uk_addresses/housenumber_unknown.svg" + }, + { + "if": "theme=vending_machine", + "then": "./assets/layers/vending_machine/vending_machine.svg" + }, + { + "if": "theme=walls_and_buildings", + "then": "./assets/layers/walls_and_buildings/walls_and_buildings.png" + }, + { + "if": "theme=waste", + "then": "./assets/layers/recycling/recycling-14.svg" + }, + { + "if": "theme=waste_assen", + "then": "./assets/layers/recycling/recycling-14.svg" + }, + { + "if": "theme=waste_basket", + "then": "./assets/themes/waste_basket/waste_basket.svg" + }, + { + "if": "theme=width", + "then": "./assets/themes/width/icon.svg" + } + ] + } + } + ] } ], "filter": [ @@ -675,9 +670,9 @@ "en": "User language (iso-code) {search}", "ca": "Idioma de l'usuari (codi iso) {search}", "de": "Benutzersprache (ISO-Code) {search}", - "pl": "Język użytkownika (kod iso) {search}", "fr": "Langage utilisateur (code-ISO) {search}", "nl": "De taal van de bijdrager is {search}", + "pl": "Język użytkownika (kod iso) {search}", "cs": "Jazyk uživatele (iso-kód) {search}", "es": "Use idioma (ISO-code) {search}" } @@ -715,9 +710,9 @@ "en": "Changeset added at least one image", "ca": "El conjunt de canvis ha afegit almenys una imatge", "de": "Im Änderungssatz wurde mindestens ein Bild hinzugefügt", - "pl": "Zestaw zmian dodał co najmniej jedno zdjęcie", "fr": "Le groupe de modifications a ajouté au moins une image", "nl": "Changeset bevat minstens één afbeelding", + "pl": "Zestaw zmian dodał co najmniej jedno zdjęcie", "cs": "Sada změn přidala alespoň jeden obrázek", "es": "El conjunto de cambios ha añadido al menos una imagen" } @@ -769,5 +764,7 @@ ] } } - ] -} \ No newline at end of file + ], + "widenFactor": 0.05, + "clustering": false +} diff --git a/assets/themes/mapcomplete-changes/mapcomplete-changes.proto.json b/assets/themes/mapcomplete-changes/mapcomplete-changes.proto.json index fab5d5e31..81e929aa9 100644 --- a/assets/themes/mapcomplete-changes/mapcomplete-changes.proto.json +++ b/assets/themes/mapcomplete-changes/mapcomplete-changes.proto.json @@ -117,7 +117,7 @@ } } ], - "mapRendering": [ + "pointRendering": [ { "location": [ "point", @@ -283,12 +283,16 @@ "_embedded_cs:themes=feat.get('_embedded_cs').map(cs => cs.theme)", "_embedded_cs:users=feat.get('_embedded_cs').map(cs => cs['_last_edit:contributor'])" ], - "+mapRendering": [ + "+pointRendering": [ { "location": [ "point" ], - "icon": "statistics:black", + "marker": [ + { + "icon": "statistics:black" + } + ], "iconSize": "30,30", "anchor": "center" } diff --git a/assets/themes/maproulette/maproulette.json b/assets/themes/maproulette/maproulette.json index 860ffce2c..287d48753 100644 --- a/assets/themes/maproulette/maproulette.json +++ b/assets/themes/maproulette/maproulette.json @@ -24,11 +24,9 @@ "ca": "Tema que mostra les tasques de MapRoulette, que us permet cercar-les, filtrar-les i solucionar-les.", "pl": "Temat pokazujący zadania MapRoulette, umożliwiający ich wyszukiwanie, filtrowanie i naprawianie." }, - "hideFromOverview": true, "icon": "./assets/layers/maproulette/logomark.svg", - "startLat": 0, - "startLon": 0, "startZoom": 4, + "hideFromOverview": true, "layers": [ "maproulette" ] diff --git a/assets/themes/maps/maps.json b/assets/themes/maps/maps.json index d6a4136ae..f77b87387 100644 --- a/assets/themes/maps/maps.json +++ b/assets/themes/maps/maps.json @@ -16,20 +16,6 @@ "cs": "Mapa map", "pl": "Mapa map" }, - "shortDescription": { - "en": "This theme shows all (touristic) maps that OpenStreetMap knows of", - "nl": "Dit thema toont alle (toeristische) kaarten die OpenStreetMap kent", - "fr": "Cette carte affiche toutes les cartes (plans) mappés dans OpenStreetMap", - "ja": "このテーマには、OpenStreetMapが知っているすべての(観光)マップが表示されます", - "zh_Hant": "這份主題顯示所有已知的開放街圖上的 (旅遊) 地圖", - "de": "Dieses Thema zeigt alle (touristischen) Karten, die OpenStreetMap kennt", - "it": "Questo tema mostra tutte le mappe (turistiche) di cui OpenStreetMap dispone", - "es": "Este tema muestra todos los mapas (turísticos) que OpenStreetMap conoce", - "da": "Dette tema viser alle (turisme) kort, som OpenStreetMap kender til", - "cs": "Toto téma zobrazuje všechny (turistické) mapy, které zná OpenStreetMap", - "ca": "Aquest tema mostra tots els mapes (turístics) que OpenStreetMap coneix", - "pl": "Ten motyw pokazuje wszystkie mapy (turystyczne), które zna OpenStreetMap" - }, "description": { "en": "On this map you can find all maps OpenStreetMap knows - typically a big map on an information board showing the area, city or region, e.g. a tourist map on the back of a billboard, a map of a nature reserve, a map of cycling networks in the region, ...)

    If a map is missing, you can easily map this map on OpenStreetMap.", "nl": "Op deze kaart kan je alle kaarten zien die OpenStreetMap kent.

    Ontbreekt er een kaart, dan kan je die kaart hier ook gemakelijk aan deze kaart toevoegen.", @@ -44,13 +30,24 @@ "ca": "En aquest mapa podeu trobar tots els mapes que OpenStreetMap coneix, normalment un mapa gran en un tauler informatiu que mostra la zona, la ciutat o la regió, p. un mapa turístic al dors d'una tanca publicitària, un mapa d'una reserva natural, un mapa de les xarxes ciclistes de la regió, ...)

    Si falta un mapa, podeu mapejar aquest mapa fàcilment a OpenStreetMap.", "pl": "Na tej mapie możesz znaleźć wszystkie mapy, jakie zna OpenStreetMap - zazwyczaj duże mapy na tablicy informacyjnej pokazująca obszar, miasto lub region, np. mapy turystyczne na odwrocie billboardu, mapy rezerwatu przyrody, mapy sieci rowerowych w regionie, ...)

    Jeśli brakuje mapy, możesz łatwo zmapować ją na OpenStreetMap." }, + "shortDescription": { + "en": "This theme shows all (touristic) maps that OpenStreetMap knows of", + "nl": "Dit thema toont alle (toeristische) kaarten die OpenStreetMap kent", + "fr": "Cette carte affiche toutes les cartes (plans) mappés dans OpenStreetMap", + "ja": "このテーマには、OpenStreetMapが知っているすべての(観光)マップが表示されます", + "zh_Hant": "這份主題顯示所有已知的開放街圖上的 (旅遊) 地圖", + "de": "Dieses Thema zeigt alle (touristischen) Karten, die OpenStreetMap kennt", + "it": "Questo tema mostra tutte le mappe (turistiche) di cui OpenStreetMap dispone", + "es": "Este tema muestra todos los mapas (turísticos) que OpenStreetMap conoce", + "da": "Dette tema viser alle (turisme) kort, som OpenStreetMap kender til", + "cs": "Toto téma zobrazuje všechny (turistické) mapy, které zná OpenStreetMap", + "ca": "Aquest tema mostra tots els mapes (turístics) que OpenStreetMap coneix", + "pl": "Ten motyw pokazuje wszystkie mapy (turystyczne), które zna OpenStreetMap" + }, "icon": "./assets/themes/maps/logo.svg", - "startLat": 0, - "startLon": 0, - "startZoom": 1, - "widenFactor": 5, "defaultBackgroundId": "maptiler.backdrop", "layers": [ "map" - ] + ], + "widenFactor": 5 } \ No newline at end of file diff --git a/assets/themes/maxspeed/maxspeed.json b/assets/themes/maxspeed/maxspeed.json index d6c083ebd..e7df2d453 100644 --- a/assets/themes/maxspeed/maxspeed.json +++ b/assets/themes/maxspeed/maxspeed.json @@ -15,18 +15,6 @@ "eu": "Abiadiura", "pl": "Prędkość maksymalna" }, - "shortDescription": { - "en": "This map shows the legally allowed maximum speed on every road.", - "de": "Diese Karte zeigt die zulässige Höchstgeschwindigkeit auf jeder Straße.", - "fr": "Cette carte montre la vitesse maximale autorisée sur les routes.", - "nl": "Deze kaart toont de maximumsnelheid voor elke straat.", - "da": "Dette kort viser den lovligt tilladte maksimale hastighed på hver vej.", - "cs": "Tato mapa zobrazuje zákonem povolenou maximální rychlost na každé silnici.", - "es": "Este mapa muestra la velocidad máxima permitida legalmente en cada carretera.", - "ca": "Aquest mapa mostra la velocitat màxima permesa legalment a cada carretera.", - "zh_Hant": "這份地圖顯示每一條道路的法定允許的最高速限。", - "pl": "Ta mapa pokazuje prawnie dozwoloną maksymalną prędkość na każdej drodze." - }, "description": { "en": "This map shows the legally allowed maximum speed on every road. If a maxspeed is missing or wrong, you can correct it here.", "de": "Diese Karte zeigt die zulässige Höchstgeschwindigkeit auf jeder Straße. Wenn eine Höchstgeschwindigkeit fehlt oder falsch ist, können Sie dies hier korrigieren.", @@ -39,14 +27,23 @@ "zh_Hant": "這份地圖顯示每一條道路的法定允許的最高速限,如果有缺漏的最高速限或是標示錯誤,你可以在這邊更正資訊。", "pl": "Ta mapa pokazuje prawnie dozwoloną maksymalną prędkość na każdej drodze. Jeśli brakuje maksymalnej prędkości lub jest ona nieprawidłowa, możesz ją tutaj poprawić." }, + "shortDescription": { + "en": "This map shows the legally allowed maximum speed on every road.", + "de": "Diese Karte zeigt die zulässige Höchstgeschwindigkeit auf jeder Straße.", + "fr": "Cette carte montre la vitesse maximale autorisée sur les routes.", + "nl": "Deze kaart toont de maximumsnelheid voor elke straat.", + "da": "Dette kort viser den lovligt tilladte maksimale hastighed på hver vej.", + "cs": "Tato mapa zobrazuje zákonem povolenou maximální rychlost na každé silnici.", + "es": "Este mapa muestra la velocidad máxima permitida legalmente en cada carretera.", + "ca": "Aquest mapa mostra la velocitat màxima permesa legalment a cada carretera.", + "zh_Hant": "這份地圖顯示每一條道路的法定允許的最高速限。", + "pl": "Ta mapa pokazuje prawnie dozwoloną maksymalną prędkość na każdej drodze." + }, "icon": "./assets/themes/maxspeed/maxspeed_logo.svg", - "startLat": 0, - "startLon": 0, - "startZoom": 1, - "widenFactor": 0.01, "layers": [ "maxspeed", "speed_camera", "speed_display" - ] + ], + "widenFactor": 0.01 } \ No newline at end of file diff --git a/assets/themes/nature/nature.json b/assets/themes/nature/nature.json index 1f1abe718..50bc46930 100644 --- a/assets/themes/nature/nature.json +++ b/assets/themes/nature/nature.json @@ -13,18 +13,6 @@ "zh_Hant": "投入自然懷抱", "pl": "W naturze" }, - "shortDescription": { - "en": "A map for nature lovers, with interesting POI's", - "nl": "Deze kaart bevat informatie voor natuurliefhebbers", - "de": "Eine Karte mit interessanten Orten für Naturliebhaber", - "es": "Un mapa para amantes de la naturaleza, con PDIs interesantes", - "fr": "Une carte pour les amoureux de la nature", - "da": "Et kort for naturelskere med interessante POI'er", - "cs": "Mapa pro milovníky přírody se zajímavými body zájmu", - "ca": "Un mapa per als amants de la natura, amb PDI interessants", - "zh_Hant": "為了自然愛好者,以及有趣的興趣點的地圖", - "pl": "Mapa dla miłośników przyrody z ciekawymi punktami POI" - }, "description": { "en": "On this map, one can find interesting information for tourists and nature lovers.", "nl": "Op deze kaart vind je informatie voor natuurliefhebbers, zoals info over het natuurgebied waar je inzit, vogelkijkhutten, informatieborden, ...", @@ -37,11 +25,22 @@ "zh_Hant": "在這份地圖,你可以找到觀光客與自然愛好者感興趣的資訊...", "pl": "Na tej mapie można znaleźć ciekawe informacje dla turystów i miłośników przyrody." }, + "shortDescription": { + "en": "A map for nature lovers, with interesting POI's", + "nl": "Deze kaart bevat informatie voor natuurliefhebbers", + "de": "Eine Karte mit interessanten Orten für Naturliebhaber", + "es": "Un mapa para amantes de la naturaleza, con PDIs interesantes", + "fr": "Une carte pour les amoureux de la nature", + "da": "Et kort for naturelskere med interessante POI'er", + "cs": "Mapa pro milovníky přírody se zajímavými body zájmu", + "ca": "Un mapa per als amants de la natura, amb PDI interessants", + "zh_Hant": "為了自然愛好者,以及有趣的興趣點的地圖", + "pl": "Mapa dla miłośników przyrody z ciekawymi punktami POI" + }, "icon": "./assets/themes/nature/logo.svg", + "startZoom": 12, "startLat": 51.20875, "startLon": 3.22435, - "startZoom": 12, - "widenFactor": 2, "layers": [ "drinking_water", "birdhide", @@ -59,5 +58,6 @@ "minzoom": 16 } } - ] + ], + "widenFactor": 2 } diff --git a/assets/themes/notes/notes.json b/assets/themes/notes/notes.json index b483afb9f..925c4d670 100644 --- a/assets/themes/notes/notes.json +++ b/assets/themes/notes/notes.json @@ -1,8 +1,5 @@ { "id": "notes", - "startLat": 0, - "startLon": 0, - "startZoom": 0, "title": { "en": "Notes on OpenStreetMap", "hu": "Jegyzetek az OpenStreetMapen", @@ -31,10 +28,10 @@ "pl": "Uwaga to pinezka na mapie z tekstem wskazującym, że coś jest nie tak.

    Pamiętaj o skorzystaniu z widoku filtra, aby wyszukać użytkowników i tekst ." }, "icon": "./assets/themes/notes/logo.svg", - "clustering": false, - "enableDownload": true, "layers": [ "note", "fixme" - ] + ], + "enableDownload": true, + "clustering": false } \ No newline at end of file diff --git a/assets/themes/observation_towers/observation_towers.json b/assets/themes/observation_towers/observation_towers.json index b2b7f5643..49f0a7fa1 100644 --- a/assets/themes/observation_towers/observation_towers.json +++ b/assets/themes/observation_towers/observation_towers.json @@ -16,21 +16,6 @@ "cs": "Rozhledny", "pl": "Wieże obserwacyjne" }, - "shortDescription": { - "en": "Publicly accessible towers to enjoy the view", - "nl": "Publieke uitkijktorens om van het panorama te genieten", - "de": "Öffentlich zugängliche Türme zum Genießen der Aussicht", - "it": "Torri pubblicamente accessibili per godere della vista", - "zh_Hant": "開發可及能觀景的高塔", - "hu": "Nyilvános tornyok, hogy gyönyörködhessünk a kilátásban", - "es": "Torres accesibles públicamente para disfrutar de la vista", - "fr": "Tours libres d’accès pour admirer la vue", - "nb_NO": "Offentlig tilgjengelige tårn for å nyte utsikten", - "da": "Offentligt tilgængelige tårne for at nyde udsigten", - "cs": "Veřejně přístupné věže s výhledem", - "ca": "Torres accesibles públicament per a disfrutar de la vista", - "pl": "Publicznie dostępne wieże do podziwiania widoku" - }, "description": { "nl": "Publieke uitkijktorens om van het panorama te genieten", "en": "Publicly accessible towers to enjoy the view", @@ -46,12 +31,24 @@ "ca": "Torres accesibles públicament per a disfrutar de la vista", "pl": "Publicznie dostępne wieże do podziwiania widoku" }, + "shortDescription": { + "en": "Publicly accessible towers to enjoy the view", + "nl": "Publieke uitkijktorens om van het panorama te genieten", + "de": "Öffentlich zugängliche Türme zum Genießen der Aussicht", + "it": "Torri pubblicamente accessibili per godere della vista", + "zh_Hant": "開發可及能觀景的高塔", + "hu": "Nyilvános tornyok, hogy gyönyörködhessünk a kilátásban", + "es": "Torres accesibles públicamente para disfrutar de la vista", + "fr": "Tours libres d’accès pour admirer la vue", + "nb_NO": "Offentlig tilgjengelige tårn for å nyte utsikten", + "da": "Offentligt tilgængelige tårne for at nyde udsigten", + "cs": "Veřejně přístupné věže s výhledem", + "ca": "Torres accesibles públicament per a disfrutar de la vista", + "pl": "Publicznie dostępne wieże do podziwiania widoku" + }, "icon": "./assets/layers/observation_tower/Tower_observation.svg", - "startLat": 0, - "startLon": 0, - "startZoom": 1, - "widenFactor": 5, "layers": [ "observation_tower" - ] + ], + "widenFactor": 5 } \ No newline at end of file diff --git a/assets/themes/onwheels/onwheels.json b/assets/themes/onwheels/onwheels.json index dfe085543..4a0ed1e5b 100644 --- a/assets/themes/onwheels/onwheels.json +++ b/assets/themes/onwheels/onwheels.json @@ -25,10 +25,9 @@ "pl": "Na tej mapie pokazane są miejsca publicznie dostępne dla wózków inwalidzkich, które można łatwo dodać" }, "icon": "./assets/themes/onwheels/crest.svg", + "startZoom": 17, "startLat": 50.86622, "startLon": 4.350103, - "startZoom": 17, - "widenFactor": 2, "hideFromOverview": false, "layers": [ { @@ -527,5 +526,6 @@ } ] }, - "enableDownload": true + "enableDownload": true, + "widenFactor": 2 } diff --git a/assets/themes/openwindpowermap/openwindpowermap.json b/assets/themes/openwindpowermap/openwindpowermap.json index da25e1b4c..8e87a1aa4 100644 --- a/assets/themes/openwindpowermap/openwindpowermap.json +++ b/assets/themes/openwindpowermap/openwindpowermap.json @@ -17,7 +17,6 @@ "cs": "Větrné elektrárny", "pl": "Generatory wiatrowe" }, - "icon": "./assets/themes/openwindpowermap/logo.svg", "description": { "en": "A map for showing and editing wind turbines.", "fr": "Une carte indiquant les éoliennes et permettant leur édition.", @@ -33,14 +32,17 @@ "ca": "Un mapa per a mostrar i editar turbines eòliques.", "pl": "Mapa do pokazywania i edytowania turbin wiatrowych." }, + "icon": "./assets/themes/openwindpowermap/logo.svg", + "startZoom": 8, "startLat": 50.52, "startLon": 4.643, - "startZoom": 8, - "clustering": { - "maxZoom": 8 - }, + "credits": [ + "Seppe Santens" + ], "layers": [ "windturbine" ], - "credits": "Seppe Santens" + "clustering": { + "maxZoom": 8 + } } \ No newline at end of file diff --git a/assets/themes/osm_community_index/osm_community_index.json b/assets/themes/osm_community_index/osm_community_index.json index 612b7f7a5..ee7c9a1e9 100644 --- a/assets/themes/osm_community_index/osm_community_index.json +++ b/assets/themes/osm_community_index/osm_community_index.json @@ -31,11 +31,11 @@ "pl": "Indeks zasobów społeczności dotyczących OpenStreetMap." }, "icon": "./assets/themes/osm_community_index/osm.svg", + "startZoom": 16, "startLat": 50.8465573, "startLon": 4.351697, - "startZoom": 16, - "clustering": false, "layers": [ "osm_community_index" - ] + ], + "clustering": false } \ No newline at end of file diff --git a/assets/themes/parkings/parkings.json b/assets/themes/parkings/parkings.json index 104c2393c..c9a18cfb2 100644 --- a/assets/themes/parkings/parkings.json +++ b/assets/themes/parkings/parkings.json @@ -19,22 +19,6 @@ "eu": "Aparkalekua", "pl": "Parking" }, - "shortDescription": { - "nl": "Deze kaart toont verschillende parkeerplekken", - "en": "This map shows different parking spots", - "de": "Diese Karte zeigt Parkplätze", - "it": "Questa cartina mostra diversi posti dove parcheggiare", - "nb_NO": "Dette kartet viser forskjellige parkeringsplasser", - "zh_Hant": "這地圖顯示不同的停車空間", - "id": "Peta ini menunjukkan tempat parkir yang berbeda", - "hu": "Ez a térkép különböző parkolókat jelenít meg", - "es": "Este mapa muestra diferentes puntos de aparcamiento", - "fr": "Cette montre les emplacements de parking", - "da": "Dette kort viser forskellige parkeringspladser", - "ca": "Aquest mapa mostra diferents punts d'aparcament", - "cs": "Na této mapě jsou vyznačena různá parkovací místa", - "pl": "Ta mapa pokazuje różne miejsca parkingowe" - }, "description": { "nl": "Deze kaart toont verschillende parkeerplekken", "en": "This map shows different parking spots", @@ -51,14 +35,30 @@ "cs": "Na této mapě jsou vyznačena různá parkovací místa", "pl": "Ta mapa pokazuje różne miejsca parkingowe" }, + "shortDescription": { + "nl": "Deze kaart toont verschillende parkeerplekken", + "en": "This map shows different parking spots", + "de": "Diese Karte zeigt Parkplätze", + "it": "Questa cartina mostra diversi posti dove parcheggiare", + "nb_NO": "Dette kartet viser forskjellige parkeringsplasser", + "zh_Hant": "這地圖顯示不同的停車空間", + "id": "Peta ini menunjukkan tempat parkir yang berbeda", + "hu": "Ez a térkép különböző parkolókat jelenít meg", + "es": "Este mapa muestra diferentes puntos de aparcamiento", + "fr": "Cette montre les emplacements de parking", + "da": "Dette kort viser forskellige parkeringspladser", + "ca": "Aquest mapa mostra diferents punts d'aparcament", + "cs": "Na této mapě jsou vyznačena různá parkovací místa", + "pl": "Ta mapa pokazuje różne miejsca parkingowe" + }, "icon": "./assets/themes/parkings/parkings.svg", + "startZoom": 12, "startLat": 51.20875, "startLon": 3.22435, - "startZoom": 12, - "widenFactor": 1.2, "layers": [ "parking", "parking_spaces", "parking_ticket_machine" - ] + ], + "widenFactor": 1.2 } \ No newline at end of file diff --git a/assets/themes/personal/personal.json b/assets/themes/personal/personal.json index a519486de..9909ee88c 100644 --- a/assets/themes/personal/personal.json +++ b/assets/themes/personal/personal.json @@ -35,20 +35,17 @@ "pl": "Utwórz osobisty temat w oparciu o wszystkie dostępne warstwy wszystkich tematów. Aby wyświetlić dane, otwórz wybór warstwy" }, "icon": "./assets/svg/addSmall.svg", - "clustering": { - "maxZoom": 19 - }, - "startLat": 0, - "startLon": 0, - "startZoom": 0, - "widenFactor": 1.2, - "#note": "The 'overpassMaxZoom' should be exactly the same as or less then the minzzom in overrideAll", - "overpassMaxZoom": 15, + "layers": [], "overrideAll": { "minzoom": 17, "syncSelection": "theme-only", "shownByDefault": false }, "enableNoteImports": false, - "layers": [] + "widenFactor": 1.2, + "overpassMaxZoom": 15, + "clustering": { + "maxZoom": 19 + }, + "#note": "The 'overpassMaxZoom' should be exactly the same as or less then the minzzom in overrideAll" } \ No newline at end of file diff --git a/assets/themes/pets/pets.json b/assets/themes/pets/pets.json index 35ce7534f..691a7e479 100644 --- a/assets/themes/pets/pets.json +++ b/assets/themes/pets/pets.json @@ -27,6 +27,9 @@ "startZoom": 10, "startLat": 55, "startLon": 12, + "credits": [ + "Niels Elgaard Larsen" + ], "layers": [ "dogpark", { @@ -224,6 +227,5 @@ "name": null } } - ], - "credits": "Niels Elgaard Larsen" + ] } diff --git a/assets/themes/play_forests/play_forests.json b/assets/themes/play_forests/play_forests.json index 947e42a12..4b27c1e6a 100644 --- a/assets/themes/play_forests/play_forests.json +++ b/assets/themes/play_forests/play_forests.json @@ -3,19 +3,16 @@ "title": { "nl": "Speelbossen" }, - "shortDescription": { - "nl": "Deze kaart toont speelbossen" - }, "description": { "nl": "Een speelbos is een zone in een bos die vrij toegankelijk is voor spelende kinderen. Deze wordt in bossen van het Agentschap Natuur en bos altijd aangeduid met het overeenkomstige bord." }, + "shortDescription": { + "nl": "Deze kaart toont speelbossen" + }, "icon": "./assets/layers/play_forest/icon.svg", - "startLat": 0, - "startLon": 0, - "startZoom": 1, "hideFromOverview": true, - "widenFactor": 3, "layers": [ "play_forest" - ] + ], + "widenFactor": 3 } \ No newline at end of file diff --git a/assets/themes/playgrounds/playgrounds.json b/assets/themes/playgrounds/playgrounds.json index 50fd8786d..32c82105d 100644 --- a/assets/themes/playgrounds/playgrounds.json +++ b/assets/themes/playgrounds/playgrounds.json @@ -19,6 +19,23 @@ "eu": "Jolas parkeak", "pl": "Place zabaw" }, + "description": { + "nl": "Op deze kaart vind je speeltuinen en kan je zelf meer informatie en foto's toevoegen", + "en": "On this map, you find playgrounds and can add more information", + "fr": "Cette carte affiche les aires de jeux et permet d'ajouter plus d'informations", + "ja": "この地図では遊び場を見つけ情報を追加することができます", + "zh_Hant": "在這份地圖上,你可以尋找遊樂場以及其相關資訊", + "ru": "На этой карте можно найти игровые площадки и добавить дополнительную информацию", + "de": "Auf dieser Karte finden Sie Spielplätze und können weitere Informationen hinzufügen", + "it": "In questa cartina vengono mostrati i parchi giochi a cui è possibile aggiungere dettagli", + "id": "Di peta ini, Anda menemukan taman bermain dan dapat menambahkan lebih banyak informasi", + "hu": "Ezen a térképen játszótereket találsz, és további információkat adhatsz hozzájuk", + "es": "En este mapa, puedes encontrar parques y añadir más información", + "da": "På dette kort finder du legepladser og kan tilføje flere oplysninger", + "ca": "A aquest mapa, pots trobar parcs i afegir més informació", + "cs": "Na této mapě najdete dětská hřiště a můžete k nim přidat další informace", + "pl": "Na tej mapie znajdziesz place zabaw, możesz też dodać o nich więcej informacji" + }, "shortDescription": { "nl": "Een kaart met speeltuinen", "en": "A map with playgrounds", @@ -37,28 +54,10 @@ "cs": "Mapa dětských hřišť", "pl": "Mapa z placami zabaw" }, - "description": { - "nl": "Op deze kaart vind je speeltuinen en kan je zelf meer informatie en foto's toevoegen", - "en": "On this map, you find playgrounds and can add more information", - "fr": "Cette carte affiche les aires de jeux et permet d'ajouter plus d'informations", - "ja": "この地図では遊び場を見つけ情報を追加することができます", - "zh_Hant": "在這份地圖上,你可以尋找遊樂場以及其相關資訊", - "ru": "На этой карте можно найти игровые площадки и добавить дополнительную информацию", - "de": "Auf dieser Karte finden Sie Spielplätze und können weitere Informationen hinzufügen", - "it": "In questa cartina vengono mostrati i parchi giochi a cui è possibile aggiungere dettagli", - "id": "Di peta ini, Anda menemukan taman bermain dan dapat menambahkan lebih banyak informasi", - "hu": "Ezen a térképen játszótereket találsz, és további információkat adhatsz hozzájuk", - "es": "En este mapa, puedes encontrar parques y añadir más información", - "da": "På dette kort finder du legepladser og kan tilføje flere oplysninger", - "ca": "A aquest mapa, pots trobar parcs i afegir més informació", - "cs": "Na této mapě najdete dětská hřiště a můžete k nim přidat další informace", - "pl": "Na tej mapie znajdziesz place zabaw, możesz też dodać o nich więcej informacji" - }, "icon": "./assets/themes/playgrounds/playground.svg", + "startZoom": 13, "startLat": 50.535, "startLon": 4.399, - "startZoom": 13, - "widenFactor": 5, "layers": [ "playground", { @@ -70,5 +69,6 @@ "minzoom": 16 } } - ] + ], + "widenFactor": 5 } \ No newline at end of file diff --git a/assets/themes/postal_codes/postal_codes.json b/assets/themes/postal_codes/postal_codes.json index 1c2760c36..0ec523fa4 100644 --- a/assets/themes/postal_codes/postal_codes.json +++ b/assets/themes/postal_codes/postal_codes.json @@ -17,23 +17,6 @@ "it": "Codici postali", "pl": "Kody pocztowe" }, - "shortDescription": { - "en": "Postal codes", - "id": "Kode pos", - "hu": "Irányítószámok", - "de": "Postleitzahlen", - "ca": "Codis postals", - "es": "Códigos postales", - "nb_NO": "Postkoder", - "nl": "Postcodes", - "fr": "Codes postaux", - "da": "Postnumre", - "pa_PK": "ڈاک کوڈ", - "cs": "Poštovní směrovací čísla", - "zh_Hant": "郵遞區號", - "it": "Codici postali", - "pl": "Kody pocztowe" - }, "description": { "en": "Postal codes", "id": "Kode pos", @@ -50,14 +33,25 @@ "zh_Hant": "郵遞區號", "pl": "Kody pocztowe" }, + "shortDescription": { + "en": "Postal codes", + "id": "Kode pos", + "hu": "Irányítószámok", + "de": "Postleitzahlen", + "ca": "Codis postals", + "es": "Códigos postales", + "nb_NO": "Postkoder", + "nl": "Postcodes", + "fr": "Codes postaux", + "da": "Postnumre", + "pa_PK": "ڈاک کوڈ", + "cs": "Poštovní směrovací čísla", + "zh_Hant": "郵遞區號", + "it": "Codici postali", + "pl": "Kody pocztowe" + }, "icon": "./assets/themes/postal_codes/townhall.svg", - "startLat": 0, - "startLon": 0, - "startZoom": 1, - "widenFactor": 0.05, "hideFromOverview": true, - "clustering": false, - "overpassTimeout": 180, "layers": [ { "id": "postal_code_boundary", @@ -129,22 +123,11 @@ ] } }, - "mapRendering": [ - { - "label": "
    {postal_code}
    ", - "location": [ - "point", - "centroid" - ] - }, - { - "color": "#00f", - "width": "4", - "fill": "no", - "dashArray": "8 8" - } - ], - "isShown": "_country=be" + "isShown": "_country=be", + "pointRendering": [], + "lineRendering": [ + {} + ] }, { "id": "wrong_postal_code", @@ -157,11 +140,9 @@ } }, "title": "Boundary relation with addr:postcode={addr:postcode}", - "mapRendering": [ - { - "color": "#f00", - "width": 1 - } + "pointRendering": [], + "lineRendering": [ + {} ] }, { @@ -215,18 +196,14 @@ ] } }, - "mapRendering": [ - { - "icon": "./assets/themes/postal_codes/townhall.svg", - "iconSize": "40,40", - "location": [ - "point", - "centroid" - ], - "anchor": "center" - } - ], - "isShown": "_country=be" + "isShown": "_country=be", + "pointRendering": [], + "lineRendering": [ + {} + ] } - ] + ], + "overpassTimeout": 180, + "widenFactor": 0.05, + "clustering": false } \ No newline at end of file diff --git a/assets/themes/postboxes/postboxes.json b/assets/themes/postboxes/postboxes.json index 2b3053045..491d46d3c 100644 --- a/assets/themes/postboxes/postboxes.json +++ b/assets/themes/postboxes/postboxes.json @@ -15,6 +15,20 @@ "cs": "Mapa poštovních schránek a pošt", "pl": "Mapa skrzynek i urzędów pocztowych" }, + "description": { + "en": "On this map you can find and add data of post offices and post boxes. You can use this map to find where you can mail your next postcard! :)
    Spotted an error or is a post box missing? You can edit this map with a free OpenStreetMap account.", + "it": "In questa cartina puoi veder e modificare gli uffici postali e le buche delle lettere. Puoi usare questa cartina per trovare dove imbucare la tua prossima cartolina! :)
    Hai trovato un errore o una buca delle lettere mancante? Puoi modificare questa cartina con un account gratuito su OpenStreetMap.", + "zh_Hant": "在這份地圖你能找到與新增有關郵局與郵筒的資料,你可以用這份地圖找到寄送您下張明信片的地方!:)
    發現錯誤或是有郵筒遺漏嗎?你可以用免費的開放街圖帳號來編輯。 ", + "hu": "Ezen a térképen postahivatalok és postaládák adatait találod és egészítheted ki. Utánanézhetsz, hogy hol adhatod fel a következő képeslapodat! :)
    Hibát találtál, vagy hiányzik egy postaláda? Ezt a térképet mindössze egy ingyenes OpenStreetMap-fiókkal szerkesztheted. ", + "de": "Auf dieser Karte können Sie Daten von Poststellen und Briefkästen finden und ergänzen. Sie können diese Karte nutzen, um herauszufinden, wo Sie Ihre nächste Postkarte versenden können :)
    Haben Sie einen Fehler entdeckt oder fehlt ein Briefkasten? Sie können die Kartenddaten mit einem kostenlosen OpenStreetMap-Konto bearbeiten.", + "es": "En este mapa podrás buscar y añadir los datos de las oficinas de correos y buzones de correo. ¡Puedes utilizar este mapa para encontrar dónde enviar tu próxima postal! :)
    ¿Has detectado un error o falta algún buzón de correo? Puedes editar este mapa con una cuenta gratuita de OpenStreetMap.", + "nl": "Op deze kaart kan je informatie over brievenbussen en postkantoren vinden en toevoegen. Je kan deze kaart gebruiken om te achterhalen waar je je volgende postkaart naar kan sturen! :)
    Zie je een fout of ontbreekt een brievenbus? Dan kan je deze kaart aanpassen met een gratis OpenStreetMap account. ", + "fr": "Trouvez et ajoutez des bureaux de poste et boîtes à lettres sur cette carte. Utilisez cette carte où vous pouvez envoyer vos cartes postales ! :)
    Vous avez trouvez une erreur ou une boîte à lettres est manquante ? Vous pouvez modifier cette carte avec un compte OpenStreetMap gratuit.", + "da": "På dette kort kan du finde og tilføje data for posthuse og postkasser. Du kan bruge dette kort til at finde, hvor du kan sende dit næste postkort! :)
    Har du fundet en fejl, eller mangler der en postboks? Du kan redigere dette kort med en gratis OpenStreetMap-konto. ", + "ca": "A aquest mapa pots afegir dades d'oficines de correus i bústies de correus. ¡Pots utilitzar aquest mapa per a trobar on pots enviar la teva pròxima postal! :)
    Has trobat una errada o algo que falta? Pots editar aquest mapa amb un compte gratuït d'OpenStreetMap.", + "cs": "Na této mapě můžete najít a přidat údaje o poštách a poštovních schránkách. Pomocí této mapy můžete zjistit, kam můžete poslat svou příští pohlednici! :)
    Všimli jste si chyby nebo vám chybí poštovní schránka? Tuto mapu můžete upravovat pomocí bezplatného účtu OpenStreetMap.", + "pl": "Na tej mapie możesz znaleźć i dodać dane urzędów pocztowych i skrzynek pocztowych. Możesz skorzystać z tej mapy, aby dowiedzieć się, gdzie możesz wysłać kolejną pocztówkę! :)
    Zauważyłeś błąd lub brakuje skrzynki pocztowej? Możesz edytować tę mapę za pomocą bezpłatnego konta OpenStreetMap." + }, "shortDescription": { "en": "A map showing postboxes and post offices", "de": "Eine Karte die Briefkästen und Poststellen anzeigt", @@ -30,33 +44,21 @@ "cs": "Mapa s poštovními schránkami a poštami", "pl": "Mapa pokazująca skrzynki pocztowe i urzędy pocztowe" }, - "description": { - "en": "On this map you can find and add data of post offices and post boxes. You can use this map to find where you can mail your next postcard! :)
    Spotted an error or is a post box missing? You can edit this map with a free OpenStreetMap account.", - "it": "In questa cartina puoi veder e modificare gli uffici postali e le buche delle lettere. Puoi usare questa cartina per trovare dove imbucare la tua prossima cartolina! :)
    Hai trovato un errore o una buca delle lettere mancante? Puoi modificare questa cartina con un account gratuito su OpenStreetMap.", - "zh_Hant": "在這份地圖你能找到與新增有關郵局與郵筒的資料,你可以用這份地圖找到寄送您下張明信片的地方!:)
    發現錯誤或是有郵筒遺漏嗎?你可以用免費的開放街圖帳號來編輯。 ", - "hu": "Ezen a térképen postahivatalok és postaládák adatait találod és egészítheted ki. Utánanézhetsz, hogy hol adhatod fel a következő képeslapodat! :)
    Hibát találtál, vagy hiányzik egy postaláda? Ezt a térképet mindössze egy ingyenes OpenStreetMap-fiókkal szerkesztheted. ", - "de": "Auf dieser Karte können Sie Daten von Poststellen und Briefkästen finden und ergänzen. Sie können diese Karte nutzen, um herauszufinden, wo Sie Ihre nächste Postkarte versenden können :)
    Haben Sie einen Fehler entdeckt oder fehlt ein Briefkasten? Sie können die Kartenddaten mit einem kostenlosen OpenStreetMap-Konto bearbeiten.", - "es": "En este mapa podrás buscar y añadir los datos de las oficinas de correos y buzones de correo. ¡Puedes utilizar este mapa para encontrar dónde enviar tu próxima postal! :)
    ¿Has detectado un error o falta algún buzón de correo? Puedes editar este mapa con una cuenta gratuita de OpenStreetMap.", - "nl": "Op deze kaart kan je informatie over brievenbussen en postkantoren vinden en toevoegen. Je kan deze kaart gebruiken om te achterhalen waar je je volgende postkaart naar kan sturen! :)
    Zie je een fout of ontbreekt een brievenbus? Dan kan je deze kaart aanpassen met een gratis OpenStreetMap account. ", - "fr": "Trouvez et ajoutez des bureaux de poste et boîtes à lettres sur cette carte. Utilisez cette carte où vous pouvez envoyer vos cartes postales ! :)
    Vous avez trouvez une erreur ou une boîte à lettres est manquante ? Vous pouvez modifier cette carte avec un compte OpenStreetMap gratuit.", - "da": "På dette kort kan du finde og tilføje data for posthuse og postkasser. Du kan bruge dette kort til at finde, hvor du kan sende dit næste postkort! :)
    Har du fundet en fejl, eller mangler der en postboks? Du kan redigere dette kort med en gratis OpenStreetMap-konto. ", - "ca": "A aquest mapa pots afegir dades d'oficines de correus i bústies de correus. ¡Pots utilitzar aquest mapa per a trobar on pots enviar la teva pròxima postal! :)
    Has trobat una errada o algo que falta? Pots editar aquest mapa amb un compte gratuït d'OpenStreetMap.", - "cs": "Na této mapě můžete najít a přidat údaje o poštách a poštovních schránkách. Pomocí této mapy můžete zjistit, kam můžete poslat svou příští pohlednici! :)
    Všimli jste si chyby nebo vám chybí poštovní schránka? Tuto mapu můžete upravovat pomocí bezplatného účtu OpenStreetMap.", - "pl": "Na tej mapie możesz znaleźć i dodać dane urzędów pocztowych i skrzynek pocztowych. Możesz skorzystać z tej mapy, aby dowiedzieć się, gdzie możesz wysłać kolejną pocztówkę! :)
    Zauważyłeś błąd lub brakuje skrzynki pocztowej? Możesz edytować tę mapę za pomocą bezpłatnego konta OpenStreetMap." - }, "icon": "./assets/layers/postboxes/postbox.svg", + "startZoom": 13, "startLat": 53.5511, "startLon": 9.9937, - "startZoom": 13, - "widenFactor": 1.5, - "clustering": { - "maxZoom": 14, - "minNeededElements": 100 - }, - "credits": "nicolelaine", + "credits": [ + "nicolelaine" + ], "layers": [ "postboxes", "postoffices", "parcel_lockers" - ] + ], + "widenFactor": 1.5, + "clustering": { + "maxZoom": 14, + "minNeededElements": 100 + } } \ No newline at end of file diff --git a/assets/themes/rainbow_crossings/rainbow_crossings.json b/assets/themes/rainbow_crossings/rainbow_crossings.json index a597f67a4..43848d75e 100644 --- a/assets/themes/rainbow_crossings/rainbow_crossings.json +++ b/assets/themes/rainbow_crossings/rainbow_crossings.json @@ -25,10 +25,9 @@ "pl": "Na tej mapie pokazane są tęczowo pomalowane przejścia dla pieszych, które można łatwo dodać" }, "icon": "./assets/themes/rainbow_crossings/logo.svg", + "startZoom": 16, "startLat": 50.8465573, "startLon": 4.351697, - "startZoom": 16, - "widenFactor": 2, "layers": [ { "builtin": "rainbow_crossings", @@ -54,5 +53,6 @@ "name": null } } - ] + ], + "widenFactor": 2 } \ No newline at end of file diff --git a/assets/themes/shops/shops.json b/assets/themes/shops/shops.json index f5b1605a9..0024d9837 100644 --- a/assets/themes/shops/shops.json +++ b/assets/themes/shops/shops.json @@ -18,21 +18,6 @@ "eu": "Denda", "pl": "Sklepy" }, - "shortDescription": { - "en": "An editable map with basic shop information", - "fr": "Carte modifiable affichant les informations de base des magasins", - "ja": "基本的なショップ情報を含む編集可能なマップ", - "de": "Eine bearbeitbare Karte mit grundlegenden Geschäftsinformationen", - "it": "Una cartina modificabile con informazioni di base dei negozi", - "hu": "Szerkeszthető térkép üzletek alapvető adataival", - "es": "Un mapa editable con información básica sobre tiendas", - "nl": "Een bewerkbare kaart met simpele informatie over winkels", - "da": "Et redigerbart kort med grundlæggende butiksoplysninger", - "ca": "Un mapa editable amb informació bàsica sobre botigues", - "cs": "Upravitelná mapa se základními informacemi o obchodech", - "zh_Hant": "有基本商家資訊的可編輯性的地圖", - "pl": "Edytowalna mapa z podstawowymi informacjami o sklepach" - }, "description": { "en": "On this map, one can mark basic information about shops, add opening hours and phone numbers", "fr": "Sur cette carte, vous pouvez ajouter des informations sur les magasins, leurs horaires d'ouverture et leurs numéros de téléphone", @@ -48,13 +33,26 @@ "cs": "Na této mapě můžete označit základní informace o obchodech, přidat otevírací dobu a telefonní čísla", "pl": "Na mapie tej można zaznaczyć podstawowe informacje o sklepach, dodać godziny otwarcia oraz numery telefonów" }, + "shortDescription": { + "en": "An editable map with basic shop information", + "fr": "Carte modifiable affichant les informations de base des magasins", + "ja": "基本的なショップ情報を含む編集可能なマップ", + "de": "Eine bearbeitbare Karte mit grundlegenden Geschäftsinformationen", + "it": "Una cartina modificabile con informazioni di base dei negozi", + "hu": "Szerkeszthető térkép üzletek alapvető adataival", + "es": "Un mapa editable con información básica sobre tiendas", + "nl": "Een bewerkbare kaart met simpele informatie over winkels", + "da": "Et redigerbart kort med grundlæggende butiksoplysninger", + "ca": "Un mapa editable amb informació bàsica sobre botigues", + "cs": "Upravitelná mapa se základními informacemi o obchodech", + "zh_Hant": "有基本商家資訊的可編輯性的地圖", + "pl": "Edytowalna mapa z podstawowymi informacjami o sklepach" + }, "icon": "./assets/themes/shops/shop.svg", - "startLat": 0, - "startLon": 0, - "startZoom": 1, - "widenFactor": 3, "layers": [ "shops", - "pharmacy" - ] -} \ No newline at end of file + "pharmacy", + "ice_cream" + ], + "widenFactor": 3 +} diff --git a/assets/themes/sidewalks/sidewalks.json b/assets/themes/sidewalks/sidewalks.json index 4958a6424..9737577b8 100644 --- a/assets/themes/sidewalks/sidewalks.json +++ b/assets/themes/sidewalks/sidewalks.json @@ -17,19 +17,6 @@ "eu": "Espaloiak", "pl": "Chodniki" }, - "shortDescription": { - "en": "Sidewalk mapping", - "ca": "Mapejat de voreres", - "de": "Kartierung von Bürgersteigen", - "es": "Mapeo de aceras", - "nl": "Voetpaden in kaart brengen", - "fr": "Cartographier des trottoirs", - "it": "Mappatura del marciapiede", - "da": "Kortlægning af fortov", - "pa_PK": "فُت‌پیتھ دا نقشہ بݨاؤݨ", - "cs": "Mapování chodníků", - "pl": "Mapowanie chodnika" - }, "description": { "en": "Experimental theme", "ru": "Экспериментальная тема", @@ -45,11 +32,20 @@ "zh_Hant": "實驗性的主題", "pl": "Temat eksperymentalny" }, + "shortDescription": { + "en": "Sidewalk mapping", + "ca": "Mapejat de voreres", + "de": "Kartierung von Bürgersteigen", + "es": "Mapeo de aceras", + "nl": "Voetpaden in kaart brengen", + "fr": "Cartographier des trottoirs", + "it": "Mappatura del marciapiede", + "da": "Kortlægning af fortov", + "pa_PK": "فُت‌پیتھ دا نقشہ بݨاؤݨ", + "cs": "Mapování chodníků", + "pl": "Mapowanie chodnika" + }, "icon": "./assets/svg/bug.svg", - "startLat": 0, - "startLon": 0, - "startZoom": 1, - "widenFactor": 0.05, "hideFromOverview": true, "layers": [ { @@ -250,81 +246,12 @@ ] } ], - "mapRendering": [ - { - "location": [ - "start", - "end" - ], - "icon": "circle:#ccc", - "iconSize": "3,3", - "anchor": "center" - }, - { - "#": "The center line", - "color": "#ffffff55", - "width": 8, - "lineCap": "butt" - }, - { - "#": "left", - "color": "#888", - "dashArray": { - "render": "", - "mappings": [ - { - "if": "sidewalk:left=", - "then": "1,12" - } - ] - }, - "width": { - "render": 6, - "mappings": [ - { - "if": { - "or": [ - "sidewalk:left=no", - "sidewalk:left=separate" - ] - }, - "then": 0 - } - ] - }, - "offset": -6, - "lineCap": "butt" - }, - { - "color": "#888", - "dashArray": { - "render": "", - "mappings": [ - { - "if": "sidewalk:right=", - "then": "1,12" - } - ] - }, - "width": { - "render": 6, - "mappings": [ - { - "if": { - "or": [ - "sidewalk:right=no", - "sidewalk:right=separate" - ] - }, - "then": 0 - } - ] - }, - "lineCap": "butt", - "offset": 6 - } - ], - "allowSplit": true + "allowSplit": true, + "pointRendering": [], + "lineRendering": [ + {} + ] } - ] + ], + "widenFactor": 0.05 } \ No newline at end of file diff --git a/assets/themes/speelplekken/speelplekken.json b/assets/themes/speelplekken/speelplekken.json index 3b382ed8b..58681c9c3 100644 --- a/assets/themes/speelplekken/speelplekken.json +++ b/assets/themes/speelplekken/speelplekken.json @@ -3,31 +3,20 @@ "title": { "nl": "Welkom bij de groendoener!" }, + "description": { + "nl": "

    Welkom bij de Groendoener!

    De Zuidrand dat is spelen, ravotten, chillen, wandelen,… in het groen. Meer dan 200 grote en kleine speelplekken liggen er in parken, in bossen en op pleintjes te wachten om ontdekt te worden. De verschillende speelplekken werden getest én goedgekeurd door kinder- en jongerenreporters uit de Zuidrand. Met leuke challenges dagen de reporters jou uit om ook op ontdekking te gaan. Klik op een speelplek op de kaart, bekijk het filmpje en ga op verkenning!

    Het project groendoener kadert binnen het strategisch project Beleefbare Open Ruimte in de Antwerpse Zuidrand en is een samenwerking tussen het departement Leefmilieu van provincie Antwerpen, Sportpret vzw, een OpenStreetMap-België Consultent en Createlli vzw. Het project kwam tot stand met steun van Departement Omgeving van de Vlaamse Overheid.
    " + }, "shortDescription": { "*": "En jij? Wat ga jij doen in het groen?", "nl": "Speelplekken in de Antwerpse Zuidrand" }, - "description": { - "nl": "

    Welkom bij de Groendoener!

    De Zuidrand dat is spelen, ravotten, chillen, wandelen,… in het groen. Meer dan 200 grote en kleine speelplekken liggen er in parken, in bossen en op pleintjes te wachten om ontdekt te worden. De verschillende speelplekken werden getest én goedgekeurd door kinder- en jongerenreporters uit de Zuidrand. Met leuke challenges dagen de reporters jou uit om ook op ontdekking te gaan. Klik op een speelplek op de kaart, bekijk het filmpje en ga op verkenning!

    Het project groendoener kadert binnen het strategisch project Beleefbare Open Ruimte in de Antwerpse Zuidrand en is een samenwerking tussen het departement Leefmilieu van provincie Antwerpen, Sportpret vzw, een OpenStreetMap-België Consultent en Createlli vzw. Het project kwam tot stand met steun van Departement Omgeving van de Vlaamse Overheid.
    " - }, "icon": "./assets/themes/speelplekken/logo.svg", - "hideFromOverview": true, - "lockLocation": [ - [ - 4.291534423828125, - 51.061249423389796 - ], - [ - 4.604301452636719, - 51.23978120350654 - ] - ], + "socialImage": "./assets/themes/speelplekken/social_image.jpg", + "startZoom": 12, "startLat": 51.17174, "startLon": 4.449462, - "startZoom": 12, - "widenFactor": 1.2, - "socialImage": "./assets/themes/speelplekken/social_image.jpg", "defaultBackgroundId": "maptiler.backdrop", + "hideFromOverview": true, "layers": [ { "id": "shadow", @@ -37,11 +26,9 @@ "osmTags": "shadow=yes", "isOsmCache": false }, - "mapRendering": [ - { - "color": "#444444", - "width": "1" - } + "pointRendering": [], + "lineRendering": [ + {} ] }, { @@ -221,30 +208,12 @@ "questions", "reviews" ], - "mapRendering": [ - { - "color": { - "render": "#6d6", - "mappings": [ - { - "if": "color~*", - "then": "{color}" - }, - { - "if": "colour~*", - "then": "{colour}" - } - ] - }, - "width": "9" - } + "pointRendering": [], + "lineRendering": [ + {} ] } ], - "clustering": { - "maxZoom": 6, - "minNeededElements": 100 - }, "overrideAll": { "+tagRenderings": [ { @@ -262,5 +231,20 @@ } ], "isShown": "_is_shadowed!=yes" + }, + "lockLocation": [ + [ + 4.291534423828125, + 51.061249423389796 + ], + [ + 4.604301452636719, + 51.23978120350654 + ] + ], + "widenFactor": 1.2, + "clustering": { + "maxZoom": 6, + "minNeededElements": 100 } } \ No newline at end of file diff --git a/assets/themes/sport_pitches/sport_pitches.json b/assets/themes/sport_pitches/sport_pitches.json index 7238a34e9..4d594d265 100644 --- a/assets/themes/sport_pitches/sport_pitches.json +++ b/assets/themes/sport_pitches/sport_pitches.json @@ -16,22 +16,6 @@ "cs": "Sportovní hřiště", "pl": "Boiska sportowe" }, - "shortDescription": { - "nl": "Deze kaart toont sportvelden", - "fr": "Une carte montrant les terrains de sport", - "en": "A map showing sport pitches", - "ja": "スポーツ競技場を示す地図", - "zh_Hant": "顯示運動場地的地圖", - "ru": "Карта, отображающая спортивные площадки", - "de": "Eine Karte mit Sportplätzen", - "it": "Una cartina che mostra i campi sportivi", - "hu": "Sportpályatérkép", - "es": "Un mapa que muestra pistas de deportes", - "da": "Et kort, der viser sportspladser", - "ca": "Un mapa que mostra pistes d'esports", - "cs": "Mapa sportovních hřišť", - "pl": "Mapa przedstawiająca boiska sportowe" - }, "description": { "nl": "Een sportveld is een ingerichte plaats met infrastructuur om een sport te beoefenen", "fr": "Un terrain de sport est une zone faite pour pratiquer un sport", @@ -48,12 +32,25 @@ "cs": "Sportovní hřiště je plocha, na které se provozují sporty", "pl": "Boisko sportowe to teren, na którym uprawia się sport" }, + "shortDescription": { + "nl": "Deze kaart toont sportvelden", + "fr": "Une carte montrant les terrains de sport", + "en": "A map showing sport pitches", + "ja": "スポーツ競技場を示す地図", + "zh_Hant": "顯示運動場地的地圖", + "ru": "Карта, отображающая спортивные площадки", + "de": "Eine Karte mit Sportplätzen", + "it": "Una cartina che mostra i campi sportivi", + "hu": "Sportpályatérkép", + "es": "Un mapa que muestra pistas de deportes", + "da": "Et kort, der viser sportspladser", + "ca": "Un mapa que mostra pistes d'esports", + "cs": "Mapa sportovních hřišť", + "pl": "Mapa przedstawiająca boiska sportowe" + }, "icon": "./assets/layers/sport_pitch/table_tennis.svg", - "startLat": 0, - "startLon": 0, - "startZoom": 1, - "widenFactor": 2, "layers": [ "sport_pitch" - ] + ], + "widenFactor": 2 } \ No newline at end of file diff --git a/assets/themes/sports/sports.json b/assets/themes/sports/sports.json index 85b9d2ed6..2daf56304 100644 --- a/assets/themes/sports/sports.json +++ b/assets/themes/sports/sports.json @@ -13,6 +13,16 @@ "eu": "Kirolak", "pl": "Sporty" }, + "description": { + "en": "All about sports, find sport pitches, fitness centres and more.", + "nl": "Alles over sport: vind sportvelden, fitnesscentra en meer.", + "de": "Alles über Sport. Finden Sie Sportplätze, Fitnesscenter und vieles mehr.", + "ca": "Tot sobre esports, troba camps d'esport, gimnasos i molt més.", + "es": "Todo sobre deportes, encuentra campos de deporte, gimnasios y mucho más.", + "cs": "Vše o sportu, sportovní hřiště, fitness centra a další.", + "fr": "Tout sur les sports, trouver les terrains de sport, les salles de sport et plus encore.", + "pl": "Wszystko o sporcie, znajdź boiska sportowe, centra fitness i nie tylko." + }, "shortDescription": { "en": "Map showing sport facilities.", "nl": "Kaart met sportfaciliteiten.", @@ -24,20 +34,7 @@ "zh_Hant": "顯示運動設施的地圖。", "pl": "Mapa pokazująca obiekty sportowe." }, - "description": { - "en": "All about sports, find sport pitches, fitness centres and more.", - "nl": "Alles over sport: vind sportvelden, fitnesscentra en meer.", - "de": "Alles über Sport. Finden Sie Sportplätze, Fitnesscenter und vieles mehr.", - "ca": "Tot sobre esports, troba camps d'esport, gimnasos i molt més.", - "es": "Todo sobre deportes, encuentra campos de deporte, gimnasios y mucho más.", - "cs": "Vše o sportu, sportovní hřiště, fitness centra a další.", - "fr": "Tout sur les sports, trouver les terrains de sport, les salles de sport et plus encore.", - "pl": "Wszystko o sporcie, znajdź boiska sportowe, centra fitness i nie tylko." - }, "icon": "./assets/themes/sports/sport.svg", - "startLat": 0, - "startLon": 0, - "startZoom": 1, "layers": [ "sport_pitch", "fitness_centre", diff --git a/assets/themes/stations/stations.json b/assets/themes/stations/stations.json index eb9ba9f0c..9ca1c8f2a 100644 --- a/assets/themes/stations/stations.json +++ b/assets/themes/stations/stations.json @@ -23,11 +23,8 @@ "pl": "Przeglądaj, edytuj i dodawaj szczegóły do stacji kolejowej" }, "icon": "./assets/themes/stations/rail-light.svg", - "startLat": 0, - "startLon": 0, - "startZoom": 0, - "hideFromOverview": true, "defaultBackgroundId": "maptiler.backdrop", + "hideFromOverview": true, "layers": [ { "builtin": "indoors", @@ -97,25 +94,9 @@ "zh_Hant": "顯示火車站的圖層", "pl": "Warstwa pokazująca stacje kolejowe" }, - "mapRendering": [ - { - "icon": "./assets/themes/stations/rail-light.svg", - "location": [ - "point", - "centroid" - ], - "label": { - "mappings": [ - { - "if": "name~*", - "then": "
    {name}
    " - } - ] - } - }, - { - "color": "green" - } + "pointRendering": [], + "lineRendering": [ + {} ] }, { @@ -407,14 +388,9 @@ } } ], - "mapRendering": [ - { - "icon": "./assets/themes/stations/departures_board.svg", - "location": [ - "point", - "centroid" - ] - } + "pointRendering": [], + "lineRendering": [ + {} ] } ] diff --git a/assets/themes/street_lighting/street_lighting.json b/assets/themes/street_lighting/street_lighting.json index 7d1c8da7f..e2428ac36 100644 --- a/assets/themes/street_lighting/street_lighting.json +++ b/assets/themes/street_lighting/street_lighting.json @@ -35,6 +35,9 @@ "startZoom": 19, "startLat": 52.99319, "startLon": 6.56113, + "credits": [ + "Robin van der Linde" + ], "layers": [ "street_lamps", { @@ -90,11 +93,6 @@ } ] }, - "mapRendering": [ - { - "color": "#ff0" - } - ], "tagRenderings": [ "images", { @@ -191,7 +189,11 @@ ] } ], - "allowSplit": true + "allowSplit": true, + "pointRendering": [], + "lineRendering": [ + {} + ] }, { "id": "all_streets", @@ -248,19 +250,6 @@ } ] }, - "mapRendering": [ - { - "color": { - "render": "#a9a9a9", - "mappings": [ - { - "if": "lit=no", - "then": "#303030" - } - ] - } - } - ], "tagRenderings": [ "images", { @@ -357,8 +346,11 @@ ] } ], - "allowSplit": true + "allowSplit": true, + "pointRendering": [], + "lineRendering": [ + {} + ] } - ], - "credits": "Robin van der Linde" + ] } diff --git a/assets/themes/street_lighting_assen/street_lighting_assen.json b/assets/themes/street_lighting_assen/street_lighting_assen.json index 4b0031431..31f2f733c 100644 --- a/assets/themes/street_lighting_assen/street_lighting_assen.json +++ b/assets/themes/street_lighting_assen/street_lighting_assen.json @@ -10,6 +10,10 @@ "startZoom": 19, "startLat": 52.99319, "startLon": 6.56113, + "credits": [ + "Robin van der Linde" + ], + "hideFromOverview": true, "layers": [ "street_lamps", { @@ -28,27 +32,12 @@ "_has_closeby_feature=Number(feat.properties._closest_osm_street_lamp_distance) < 5 ? 'yes' : 'no'" ], "title": "Straatlantaarn in dataset", - "mapRendering": [ - { - "location": [ - "point", - "centroid" - ], - "icon": { - "render": "circle:red", - "mappings": [ - { - "if": "_has_closeby_feature=yes", - "then": "circle:#008000aa" - } - ] - }, - "iconSize": "20,20", - "anchor": "center" - } - ], "tagRenderings": [ "all_tags" + ], + "pointRendering": [], + "lineRendering": [ + {} ] }, { @@ -67,7 +56,5 @@ ] } } - ], - "hideFromOverview": true, - "credits": "Robin van der Linde" + ] } \ No newline at end of file diff --git a/assets/themes/surveillance/surveillance.json b/assets/themes/surveillance/surveillance.json index 4e616eb45..d9223319c 100644 --- a/assets/themes/surveillance/surveillance.json +++ b/assets/themes/surveillance/surveillance.json @@ -16,22 +16,6 @@ "cs": "Dohled pod dohledem", "pl": "Monitoring monitoringu" }, - "shortDescription": { - "en": "Surveillance cameras and other means of surveillance", - "nl": "Bewakingscameras en dergelijke", - "ja": "監視カメラおよびその他の監視手段", - "zh_Hant": "監視鏡頭與其他型式的監視", - "fr": "Caméras et autres dispositifs de surveillance", - "pl": "Kamery monitorujące i inne środki nadzoru", - "de": "Überwachungskameras und andere Mittel zur Überwachung", - "it": "Telecamere di sorveglianza e altri mezzi di sorveglianza", - "hu": "Térfigyelő kamerák és más figyelőeszközök", - "da": "Overvågningskameraer og andre overvågningsmidler", - "nb_NO": "Overvåkningskameraer og andre typer overvåkning", - "ca": "Càmeres de vigilància i altres tipus de vigilància", - "es": "Cámaras de vigilancia y otros medios de vigilancia", - "cs": "Bezpečnostní kamery a další prostředky sledování" - }, "description": { "en": "On this open map, you can find surveillance cameras.", "nl": "Op deze open kaart kan je bewakingscamera's vinden.", @@ -49,13 +33,26 @@ "es": "En este mapa abierto, puede encontrar cámaras de vigilancia.", "cs": "Na této otevřené mapě najdete bezpečnostní kamery." }, + "shortDescription": { + "en": "Surveillance cameras and other means of surveillance", + "nl": "Bewakingscameras en dergelijke", + "ja": "監視カメラおよびその他の監視手段", + "zh_Hant": "監視鏡頭與其他型式的監視", + "fr": "Caméras et autres dispositifs de surveillance", + "pl": "Kamery monitorujące i inne środki nadzoru", + "de": "Überwachungskameras und andere Mittel zur Überwachung", + "it": "Telecamere di sorveglianza e altri mezzi di sorveglianza", + "hu": "Térfigyelő kamerák és más figyelőeszközök", + "da": "Overvågningskameraer og andre overvågningsmidler", + "nb_NO": "Overvåkningskameraer og andre typer overvåkning", + "ca": "Càmeres de vigilància i altres tipus de vigilància", + "es": "Cámaras de vigilancia y otros medios de vigilancia", + "cs": "Bezpečnostní kamery a další prostředky sledování" + }, "icon": "./assets/themes/surveillance/logo.svg", - "startLat": 0, - "startLon": 0, - "startZoom": 1, - "widenFactor": 2, "defaultBackgroundId": "maptiler.carto", "layers": [ "surveillance_camera" - ] -} + ], + "widenFactor": 2 +} \ No newline at end of file diff --git a/assets/themes/toerisme_vlaanderen/toerisme_vlaanderen.json b/assets/themes/toerisme_vlaanderen/toerisme_vlaanderen.json index 6436b4362..e118e86fd 100644 --- a/assets/themes/toerisme_vlaanderen/toerisme_vlaanderen.json +++ b/assets/themes/toerisme_vlaanderen/toerisme_vlaanderen.json @@ -1,22 +1,21 @@ { "id": "toerisme_vlaanderen", - "credits": "Commissioned theme for Toerisme Vlaandere", - "customCss": "./assets/themes/toerisme_vlaanderen/custom.css", + "title": { + "nl": "Pin je punt" + }, "mustHaveLanguage": [ "nl" ], - "title": { - "nl": "Pin je punt" + "description": { + "nl": "

    Pin je punt is een open toerismekaart waarin wandelaars en fietsers nuttige info verzamelen voor andere wandelaars en fietsers.

    Klik op de exacte locatie op de kaart om een punt toe te voegen of op een bestaand punt om het te wijzigen.
    We verzamelen:

    1. Laadpunten voor elektrische fietsen
    2. Openbare toiletten
    3. Zit- en picknickbankjes
    4. Uitkijktorens
    5. Fietsherstelpunten
    6. Fietsverhuurpunten
    7. Speeltuinen

    " }, "shortDescription": { "nl": "

    Pin je punt is een open toerismekaart waarin wandelaars en fietsers nuttige gegevens verzamelen die handig zijn voor andere wandelaars en fietsers.

    Met de steun van Toerisme Vlaanderen

    " }, - "description": { - "nl": "

    Pin je punt is een open toerismekaart waarin wandelaars en fietsers nuttige info verzamelen voor andere wandelaars en fietsers.

    Klik op de exacte locatie op de kaart om een punt toe te voegen of op een bestaand punt om het te wijzigen.
    We verzamelen:

    1. Laadpunten voor elektrische fietsen
    2. Openbare toiletten
    3. Zit- en picknickbankjes
    4. Uitkijktorens
    5. Fietsherstelpunten
    6. Fietsverhuurpunten
    7. Speeltuinen

    " - }, "descriptionTail": { "nl": "

    Een initiatief van de 5 provinciale toeristische organisaties en Toerisme Vlaanderen

    Meer informatie op toerismevlaanderen.be

    " }, + "icon": "./assets/themes/toerisme_vlaanderen/logo.svg", "extraLink": { "icon": "./assets/svg/pop-out.svg", "href": "https://mapcomplete.org/{theme}.html?lat={lat}&lon={lon}&z={zoom}&language={language}", @@ -28,11 +27,13 @@ "nl": "Open in volledig scherm" } }, - "icon": "./assets/themes/toerisme_vlaanderen/logo.svg", "startZoom": 8, "startLat": 50.8536, "startLon": 4.433, - "widenFactor": 1.5, + "credits": [ + "Commissioned theme for Toerisme Vlaandere" + ], + "hideFromOverview": true, "layers": [ { "builtin": [ @@ -236,7 +237,8 @@ ] } ], - "hideFromOverview": true, + "customCss": "./assets/themes/toerisme_vlaanderen/custom.css", + "enableShareScreen": false, "enableMoreQuests": false, - "enableShareScreen": false + "widenFactor": 1.5 } \ No newline at end of file diff --git a/assets/themes/toilets/toilets.json b/assets/themes/toilets/toilets.json index 7ccbf6ff5..3879b0385 100644 --- a/assets/themes/toilets/toilets.json +++ b/assets/themes/toilets/toilets.json @@ -34,14 +34,14 @@ "es": "Mapa de aseos públicos", "cs": "Mapa veřejných toalet" }, + "icon": "./assets/themes/toilets/toilets.svg", "startZoom": 12, "startLat": 51.2095, "startLon": 3.2222, - "widenFactor": 3, - "icon": "./assets/themes/toilets/toilets.svg", "layers": [ "toilet", "toilet_at_amenity", "shower" - ] + ], + "widenFactor": 3 } \ No newline at end of file diff --git a/assets/themes/transit/transit.json b/assets/themes/transit/transit.json index 6351a6a9b..84c4a6abb 100644 --- a/assets/themes/transit/transit.json +++ b/assets/themes/transit/transit.json @@ -31,6 +31,9 @@ "startZoom": 20, "startLat": 53.21333, "startLon": 6.56963, + "credits": [ + "Robin van der Linde" + ], "layers": [ "transit_stops", "transit_routes", @@ -63,6 +66,5 @@ "shelter-type" ] } - ], - "credits": "Robin van der Linde" + ] } diff --git a/assets/themes/trees/trees.json b/assets/themes/trees/trees.json index c02a0cf48..52589dcc4 100644 --- a/assets/themes/trees/trees.json +++ b/assets/themes/trees/trees.json @@ -21,23 +21,6 @@ "pt_BR": "Árvores", "eu": "Zuhaitzak" }, - "shortDescription": { - "en": "Map all the trees", - "nl": "Breng bomen in kaart", - "fr": "Cartographions tous les arbres", - "it": "Mappa tutti gli alberi", - "ja": "すべての樹木をマッピングする", - "zh_Hant": "所有樹木的地圖", - "ru": "Карта деревьев", - "pl": "Mapa wszystkich drzew", - "de": "Kartieren Sie alle Bäume", - "nb_NO": "Kartlegg alle trærne", - "hu": "Az összes fa feltérképezése", - "ca": "Mapeja tots els arbres", - "es": "Mapa de los Árboles", - "da": "Kortlæg alle træer", - "cs": "Zmapujte všechny stromy" - }, "description": { "nl": "Breng bomen in kaart!", "en": "Map all the trees!", @@ -56,20 +39,39 @@ "pt_BR": "Mapeie todas as árvores!", "pl": "Zmapuj wszystkie drzewa!" }, + "shortDescription": { + "en": "Map all the trees", + "nl": "Breng bomen in kaart", + "fr": "Cartographions tous les arbres", + "it": "Mappa tutti gli alberi", + "ja": "すべての樹木をマッピングする", + "zh_Hant": "所有樹木的地圖", + "ru": "Карта деревьев", + "pl": "Mapa wszystkich drzew", + "de": "Kartieren Sie alle Bäume", + "nb_NO": "Kartlegg alle trærne", + "hu": "Az összes fa feltérképezése", + "ca": "Mapeja tots els arbres", + "es": "Mapa de los Árboles", + "da": "Kortlæg alle træer", + "cs": "Zmapujte všechny stromy" + }, "icon": "./assets/themes/trees/logo.svg", + "socialImage": "./assets/themes/trees/logo.svg", + "startZoom": 8, "startLat": 50.642, "startLon": 4.482, - "startZoom": 8, - "widenFactor": 0.2, - "socialImage": "./assets/themes/trees/logo.svg", - "clustering": { - "maxZoom": 19, - "minNeededElements": 25 - }, - "osmApiTileSize": 18, + "defaultBackgroundId": "AGIV", + "credits": [ + "Midgard" + ], "layers": [ "tree_node" ], - "defaultBackgroundId": "AGIV", - "credits": "Midgard" + "widenFactor": 0.2, + "osmApiTileSize": 18, + "clustering": { + "maxZoom": 19, + "minNeededElements": 25 + } } \ No newline at end of file diff --git a/assets/themes/uk_addresses/uk_addresses.json b/assets/themes/uk_addresses/uk_addresses.json index 619b0ee93..fe386e1fc 100644 --- a/assets/themes/uk_addresses/uk_addresses.json +++ b/assets/themes/uk_addresses/uk_addresses.json @@ -9,38 +9,22 @@ "mustHaveLanguage": [ "en" ], + "description": { + "en": "Help us collect addresses and make them freely available. Each address contributed will be added to OpenStreetMap so you will need to create an account and log in before you start. Please do not copy addresses from the internet or other sources subject to copyright. This website works well on mobile so a good option is to contibute the addresses closest to you." + }, "shortDescription": { "en": "Help to build an open dataset of addresses in Great Britain", "de": "Helfen Sie beim Aufbau eines offenen Datensatzes britischer Adressen", "it": "Aiuta a costruire un dataset libero per gli indirizzi nel Regno Unito" }, - "description": { - "en": "Help us collect addresses and make them freely available. Each address contributed will be added to OpenStreetMap so you will need to create an account and log in before you start. Please do not copy addresses from the internet or other sources subject to copyright. This website works well on mobile so a good option is to contibute the addresses closest to you." - }, "icon": "./assets/themes/uk_addresses/housenumber_unknown.svg", + "startZoom": 7, "startLat": 53.21261, "startLon": -1.47216, - "startZoom": 7, - "widenFactor": 1.01, - "hideFromOverview": true, - "clustering": { - "minNeededFeatures": 25, - "maxZoom": 16 - }, - "tileLayerSources": [ - { - "id": "property-boundaries", - "url": "https://tiles.osmuk.org/PropertyBoundaries/{z}/{x}/{y}.png", - "isOverlay": true, - "min_zoom": 18, - "max_zoom": 20, - "defaultState": false, - "name": { - "en": "Property boundaries by osmuk.org", - "de": "Grenzverläufe gemäß osmuk.org" - } - } + "credits": [ + "Pieter Vander Vennet, Rob Nickerson, Russ Garrett" ], + "hideFromOverview": true, "layers": [ { "id": "raw_inspire_polygons", @@ -55,24 +39,14 @@ "calculatedTags": [ "_has_address=overlapWith(feat)('address').length > 0" ], - "mapRendering": [ - { - "width": 2, - "color": { - "render": "#00f", - "mappings": [ - { - "if": "_has_address=true", - "then": "#0f0" - } - ] - } - } - ], "shownByDefault": false, "name": { "en": "Inspire polygons" - } + }, + "pointRendering": [], + "lineRendering": [ + {} + ] }, { "id": "to_import", @@ -162,35 +136,11 @@ ] } ], - "mapRendering": [ - { - "icon": { - "render": "./assets/themes/uk_addresses/housenumber_unknown.svg", - "mappings": [ - { - "if": { - "and": [ - "_embedding_object:id~*", - "_embedding_object:id!=false" - ] - }, - "then": "./assets/themes/uk_addresses/housenumber_unknown_small.svg" - }, - { - "if": "_imported=yes", - "then": "./assets/themes/uk_addresses/housenumber_unknown_small.svg" - } - ] - }, - "iconSize": "40,40", - "location": [ - "point", - "centroid" - ], - "anchor": "center" - } - ], - "description": "Alamat" + "description": "Alamat", + "pointRendering": [], + "lineRendering": [ + {} + ] }, { "id": "address", @@ -631,65 +581,32 @@ } } ], - "mapRendering": [ - { - "label": { - "render": "
    {addr:housenumber}
    ", - "condition": "addr:housenumber~*" - }, - "iconSize": "50,50", - "icon": { - "render": "./assets/layers/address/housenumber_blank.svg", - "mappings": [ - { - "if": { - "or": [ - { - "and": [ - "addr:housenumber=", - "nohousenumber!=yes" - ] - }, - "addr:street=" - ] - }, - "then": "./assets/themes/uk_addresses/housenumber_unknown.svg" - } - ] - }, - "location": [ - "point", - "centroid" - ], - "anchor": "center" - }, - { - "color": { - "render": "#00f", - "mappings": [ - { - "if": { - "or": [ - { - "and": [ - "addr:housenumber=", - "nohousenumber!=yes" - ] - }, - "addr:street=" - ] - }, - "then": "#ff0" - } - ] - }, - "width": "3" - } + "pointRendering": [], + "lineRendering": [ + {} ] }, "named_streets" ], + "tileLayerSources": [ + { + "id": "property-boundaries", + "url": "https://tiles.osmuk.org/PropertyBoundaries/{z}/{x}/{y}.png", + "isOverlay": true, + "min_zoom": 18, + "max_zoom": 20, + "defaultState": false, + "name": { + "en": "Property boundaries by osmuk.org", + "de": "Grenzverläufe gemäß osmuk.org" + } + } + ], "enableShareScreen": false, "enableMoreQuests": false, - "credits": "Pieter Vander Vennet, Rob Nickerson, Russ Garrett" + "widenFactor": 1.01, + "clustering": { + "minNeededFeatures": 25, + "maxZoom": 16 + } } \ No newline at end of file diff --git a/assets/themes/vending_machine/vending_machine.json b/assets/themes/vending_machine/vending_machine.json index 31d0a99e5..55e92092b 100644 --- a/assets/themes/vending_machine/vending_machine.json +++ b/assets/themes/vending_machine/vending_machine.json @@ -21,9 +21,9 @@ "pl": "Znajdź wszelakie automaty sprzedające" }, "icon": "./assets/layers/vending_machine/vending_machine.svg", + "startZoom": 19, "startLat": 53.21102, "startLon": 6.56511, - "startZoom": 19, "layers": [ "vending_machine", { diff --git a/assets/themes/walkingnodes/license_info.json b/assets/themes/walkingnodes/license_info.json new file mode 100644 index 000000000..ab0fef0f1 --- /dev/null +++ b/assets/themes/walkingnodes/license_info.json @@ -0,0 +1,20 @@ +[ + { + "path": "logo.svg", + "license": "GPL-3.0-only", + "authors": [ + "sebkur" + ], + "sources": [ + "https://github.com/mobanisto/MapComplete/commit/1aeb1fdb5b09908d67907f3c816152bfebfdcc79" + ] + }, + { + "path": "route_marker.svg", + "license": "CC0-1.0", + "authors": [ + "Robin van der Linde" + ], + "sources": [] + } +] \ No newline at end of file diff --git a/assets/themes/walkingnodes/logo.svg b/assets/themes/walkingnodes/logo.svg new file mode 100644 index 000000000..b68593076 --- /dev/null +++ b/assets/themes/walkingnodes/logo.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/themes/walkingnodes/logo.svg.license b/assets/themes/walkingnodes/logo.svg.license new file mode 100644 index 000000000..3176633b8 --- /dev/null +++ b/assets/themes/walkingnodes/logo.svg.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: sebkur +SPDX-License-Identifier: GPL-3.0-only \ No newline at end of file diff --git a/assets/themes/walkingnodes/route_marker.svg b/assets/themes/walkingnodes/route_marker.svg new file mode 100644 index 000000000..4679b9285 --- /dev/null +++ b/assets/themes/walkingnodes/route_marker.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/themes/walkingnodes/route_marker.svg.license b/assets/themes/walkingnodes/route_marker.svg.license new file mode 100644 index 000000000..75299f884 --- /dev/null +++ b/assets/themes/walkingnodes/route_marker.svg.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: Robin van der Linde +SPDX-License-Identifier: CC0-1.0 \ No newline at end of file diff --git a/assets/themes/walkingnodes/walkingnodes.json b/assets/themes/walkingnodes/walkingnodes.json new file mode 100644 index 000000000..b709cdfc8 --- /dev/null +++ b/assets/themes/walkingnodes/walkingnodes.json @@ -0,0 +1,299 @@ +{ + "id": "walkingnodes", + "title": { + "en": "Walking Node Networks", + "nl": "Wandelknooppuntnetwerken" + }, + "description": { + "en": "This map shows walking node networks and allows you to add new nodes easily", + "nl": "Deze kaart toont wandelknooppunten en laat je toe om eenvoudigweg nieuwe knooppunten toe te voegen" + }, + "icon": "./assets/themes/walkingnodes/logo.svg", + "startZoom": 11, + "startLat": 51.755515, + "startLon": 14.327545, + "credits": [ + "Sebastian Kürten" + ], + "hideFromOverview": true, + "layers": [ + { + "id": "node2node", + "name": { + "en": "Node to node links", + "de": "Knotenpunktverbindungen", + "es": "enlaces nodo a nodo", + "nl": "Verbindingen van node naar node", + "fr": "liens noeud à noeud", + "ca": "enllaços node a node", + "cs": "propojení mezi uzly", + "pl": "łącza węzeł do węzła" + }, + "source": { + "osmTags": { + "and": [ + "network=rwn", + "network:type=node_network", + "route=foot" + ] + } + }, + "minzoom": 12, + "title": { + "render": { + "en": "Node to node link", + "de": "Knotenpunktverbindung", + "es": "enlace nodo a nodo", + "nl": "Node-naar-node verbinding", + "fr": "lien noeud à noeud", + "ca": "Enllaç node a node", + "cs": "propojení mezi uzly", + "pl": "połączenie węzła z węzłem" + }, + "mappings": [ + { + "if": "ref~*", + "then": { + "en": "Node to node link {ref}", + "de": "Knotenpunktverbindung {ref}", + "es": "enlace nodo a nodo {ref}", + "nl": "Node-naar-node verbinding {ref}", + "fr": "lien noeud à noeud {ref}", + "ca": "Enllaç node a node {ref}", + "cs": "propojení mezi uzly {ref}", + "pl": "połączenie węzła z węzłem {ref}" + } + } + ] + }, + "lineRendering": [ + { + "width": "4", + "color": "#452b29" + } + ], + "tagRenderings": [ + { + "builtin": "survey_date", + "override": { + "question": { + "en": "When was this node to node link last surveyed?", + "de": "Wann wurde diese Knotenpunktverbindung zuletzt überprüft?", + "es": "¿Cuándo se sondeó este enlace nodo a nodo por última vez?", + "nl": "Wanneer werd deze node-naar-node verbinding het laast gesurveyed?", + "fr": "Quand cette liaison de nœud à nœud a-t-elle été contrôlée sur le terrain pour la dernière fois ?", + "ca": "Quan es va comprovar per última vegada aquest enllaç node a node presencialment?", + "cs": "Kdy bylo toto propojení mezi uzly naposledy zkontrolováno?", + "pl": "Kiedy ostatnio badano to połączenie węzła z węzłem?" + }, + "render": { + "en": "This node to node link was last surveyed on {survey:date}", + "de": "Diese Knotenpunktverbindung wurde zuletzt am {survey:date} überprüft", + "es": "Este enlace nodo a nodo se sondeó por última vez el {survey:date}", + "nl": "Deze node-naar-node verbinding werd het laast gesurveyed op {survey:date}", + "fr": "Cette lien de nœud à nœud a été vérifié sur le terrain le {survey:date}", + "ca": "Aquest enllaç node a node es va sondejar per última vegada el {survey:date}", + "cs": "Toto propojení mezi uzly bylo naposledy zkontrolováno dne {survey:date}", + "pl": "To połączenie węzła z węzłem było ostatnio sprawdzane w dniu {survey:date}" + } + }, + "id": "node2node-survey:date" + }, + "export_as_gpx" + ] + }, + { + "id": "node", + "name": { + "en": "Nodes", + "de": "Knotenpunkte", + "ca": "nodes", + "es": "nodos", + "nb_NO": "noder", + "nl": "Knooppunten", + "fr": "noeuds", + "pa_PK": "نوڈ", + "cs": "uzly", + "eu": "nodoak", + "pl": "węzły" + }, + "source": { + "osmTags": { + "and": [ + "rwn_ref~*" + ] + } + }, + "pointRendering": [ + { + "location": [ + "point", + "centroid" + ], + "label": { + "mappings": [ + { + "if": "rwn_ref~*", + "then": "
    {rwn_ref}
    " + }, + { + "if": "rwn_ref=", + "then": "
    ?
    " + } + ] + } + } + ], + "minzoom": 12, + "title": { + "render": { + "en": "Walking node {rwn_ref}", + "nl": "Wandelknooppunt {rwn_ref}" + } + }, + "tagRenderings": [ + { + "id": "node-rwn_ref", + "question": { + "en": "What is the reference number of this walking node?", + "nl": "Wat is het referentienummer van dit wandelknooppunt?" + }, + "freeform": { + "key": "rwn_ref", + "type": "int", + "placeholder": { + "en": "e.g. 1", + "nl": "bijv. 1" + } + }, + "render": { + "en": "This walking node has reference number {rwn_ref}", + "nl": "Dit wandelknooppunt heeft referentienummer {rwn_ref}" + } + }, + { + "builtin": "survey_date", + "override": { + "question": { + "en": "When was this walking node last surveyed?", + "nl": "Wanneer is dit wandelknooppunt het laatst gesurveyed?" + }, + "render": { + "en": "This walking node was last surveyed on {survey:date}", + "nl": "Dit wandelknooppunt werd het laatst gesurveyed op {survey:date}" + } + } + }, + { + "question": { + "en": "How many other walking nodes does this node link to?", + "nl": "Met hoeveel andere wandelknooppunten heeft dit knooppunt een verbinding?" + }, + "render": { + "en": "This node links to {expected_rwn_route_relations} other walking nodes.", + "nl": "Dit knooppunt verbindt met {expected_rwn_route_relations} andere wandelknooppunten." + }, + "freeform": { + "key": "expected_rwn_route_relations", + "type": "int", + "placeholder": { + "en": "e.g. 3", + "nl": "bijv. 3" + } + }, + "id": "node-expected_rwn_route_relations" + }, + "images" + ], + "presets": [ + { + "tags": [ + "rwn_ref=?", + "network:type=node_network" + ], + "title": { + "en": "a walking node", + "nl": "een wandelknooppunt" + }, + "snapToLayer": [ + "cycleways_and_roads" + ] + } + ] + }, + { + "builtin": [ + "guidepost" + ], + "override": { + "minzoom": 16, + "source": { + "osmTags": { + "and": [ + "information=guidepost", + "hiking=yes" + ] + } + }, + "presets": [ + { + "tags": [ + "tourism=information", + "information=guidepost", + "hiking=yes" + ] + } + ], + "name": { + "en": "Hiking guideposts" + }, + "title": { + "render": { + "en": "Hiking guidepost" + } + } + }, + "hideTagRenderingsWithLabels": [ + "type" + ] + }, + { + "builtin": "route_marker", + "override": { + "minzoom": 16, + "pointRendering": [ + { + "marker": [ + { + "icon": "./assets/themes/walkingnodes/route_marker.svg" + } + ] + } + ], + "presets": [ + { + "tags": [ + "tourism=information", + "information=route_marker", + "network:type=node_network", + "hiking=yes" + ], + "title": { + "en": "a route marker for a node to node link" + }, + "=exampleImages": [ + "./assets/layers/route_marker/walking_route_marker.jpg" + ] + } + ] + } + }, + { + "builtin": "cycleways_and_roads", + "override": { + "name": null, + "shownByDefault": false + } + } + ] +} diff --git a/assets/themes/walls_and_buildings/walls_and_buildings.json b/assets/themes/walls_and_buildings/walls_and_buildings.json index ed32a1d3d..ed4aee801 100644 --- a/assets/themes/walls_and_buildings/walls_and_buildings.json +++ b/assets/themes/walls_and_buildings/walls_and_buildings.json @@ -26,13 +26,13 @@ "pl": "Specjalna warstwa zabudowana zapewniająca wszystkie mury i budynki. Warstwa ta jest przydatna w ustawieniach wstępnych obiektów, które można umieścić przy ścianach (np. AED, skrzynki pocztowe, wejścia, adresy, kamery monitorujące itp.). Warstwa ta jest domyślnie niewidoczna i użytkownik nie może jej przełączać." }, "icon": "./assets/layers/walls_and_buildings/walls_and_buildings.png", + "startZoom": 16, "startLat": 50.8465573, "startLon": 4.351697, - "startZoom": 16, - "widenFactor": 2, + "hideFromOverview": true, "layers": [ "walls_and_buildings", "entrance" ], - "hideFromOverview": true + "widenFactor": 2 } \ No newline at end of file diff --git a/assets/themes/waste_assen/waste_assen.json b/assets/themes/waste_assen/waste_assen.json index 0484d4ef8..57e627bb6 100644 --- a/assets/themes/waste_assen/waste_assen.json +++ b/assets/themes/waste_assen/waste_assen.json @@ -10,6 +10,10 @@ "startZoom": 19, "startLat": 53.24865, "startLon": 6.60075, + "credits": [ + "Robin van der Linde" + ], + "hideFromOverview": true, "layers": [ { "builtin": "waste_basket", @@ -32,27 +36,12 @@ "_has_closeby_feature=Number(feat.properties._closest_osm_waste_basket_distance) < 10 ? 'yes' : 'no'" ], "title": "Afvalbak in dataset", - "mapRendering": [ - { - "location": [ - "point", - "centroid" - ], - "icon": { - "render": "circle:red", - "mappings": [ - { - "if": "_has_closeby_feature=yes", - "then": "circle:#008000aa" - } - ] - }, - "iconSize": "20,20", - "anchor": "center" - } - ], "tagRenderings": [ "all_tags" + ], + "pointRendering": [], + "lineRendering": [ + {} ] }, "recycling", @@ -74,35 +63,14 @@ "_has_closeby_waste_disposal=Number(feat.properties._closest_osm_waste_disposal_distance) < 10 ? 'yes' : 'no'" ], "title": "Recyclingcontainer in dataset", - "mapRendering": [ - { - "location": [ - "point", - "centroid" - ], - "icon": { - "render": "circle:red", - "mappings": [ - { - "if": "_has_closeby_recycling=yes", - "then": "circle:#008000aa" - }, - { - "if": "_has_closeby_waste_disposal=yes", - "then": "circle:#008000aa" - } - ] - }, - "iconSize": "20,20", - "anchor": "center" - } - ], "tagRenderings": [ "all_tags" + ], + "pointRendering": [], + "lineRendering": [ + {} ] }, "waste_disposal" - ], - "hideFromOverview": true, - "credits": "Robin van der Linde" + ] } \ No newline at end of file diff --git a/assets/themes/waste_basket/waste_basket.json b/assets/themes/waste_basket/waste_basket.json index 240dae1c1..b8226380c 100644 --- a/assets/themes/waste_basket/waste_basket.json +++ b/assets/themes/waste_basket/waste_basket.json @@ -17,6 +17,20 @@ "cs": "Odpadkový koš", "pl": "Kosz na śmieci" }, + "description": { + "en": "On this map, you'll find waste baskets near you. If a waste basket is missing on this map, you can add it yourself", + "nl": "Op deze kaart vind je vuilnisbakken waar je afval in kan smijten. Ontbreekt er een vuilnisbak? Dan kan je die zelf toevoegen", + "de": "Auf dieser Karte findest Du Abfalleimer in Deiner Nähe. Wenn ein Abfalleimer auf dieser Karte fehlt, kannst du ihn selbst hinzufügen", + "it": "In questa cartina troverai i cestini dei rifiuti nei tuoi paraggi. Se manca un cestino, puoi inserirlo tu stesso", + "zh_Hant": "在這份地圖當中,你可以找到你附近的垃圾筒。如果地圖有遺漏垃圾筒,你可以自己加上去", + "hu": "Ezen a térképen megtalálhatod a közeledben lévő szemeteskosarakat. Ha hiányzik egy kuka a térképről, te is felrajzolhatod", + "fr": "Retrouvez les poubelles près de vous. Si une poubelle est manquante, vous pouvez l’ajouter vous même", + "da": "På dette kort finder du affaldskurve i nærheden af dig. Hvis der mangler en affaldskurv på dette kort, kan du selv tilføje den", + "ca": "A aquest mapa trobaràs les papereres a prop teua. Si falta una paperera al mapa pots afegir-la tu mateix", + "es": "En este mapa, encontrará las papeleras cercanas a usted. Si falta una papelera en el mapa, puede añadirla usted mismo", + "cs": "Na této mapě najdete koše na odpadky ve vašem okolí. Pokud na této mapě odpadkový koš chybí, můžete jej přidat sami", + "pl": "Na tej mapie znajdziesz kosze na śmieci w twojej okolicy. Jeśli brakuje kosza, możesz go dodać" + }, "shortDescription": { "en": "A map with waste baskets", "nl": "Een kaart met vuilnisbakken", @@ -32,25 +46,7 @@ "cs": "Mapa odpadkových košů", "pl": "Mapa koszy na śmieci" }, - "description": { - "en": "On this map, you'll find waste baskets near you. If a waste basket is missing on this map, you can add it yourself", - "nl": "Op deze kaart vind je vuilnisbakken waar je afval in kan smijten. Ontbreekt er een vuilnisbak? Dan kan je die zelf toevoegen", - "de": "Auf dieser Karte findest Du Abfalleimer in Deiner Nähe. Wenn ein Abfalleimer auf dieser Karte fehlt, kannst du ihn selbst hinzufügen", - "it": "In questa cartina troverai i cestini dei rifiuti nei tuoi paraggi. Se manca un cestino, puoi inserirlo tu stesso", - "zh_Hant": "在這份地圖當中,你可以找到你附近的垃圾筒。如果地圖有遺漏垃圾筒,你可以自己加上去", - "hu": "Ezen a térképen megtalálhatod a közeledben lévő szemeteskosarakat. Ha hiányzik egy kuka a térképről, te is felrajzolhatod", - "fr": "Retrouvez les poubelles près de vous. Si une poubelle est manquante, vous pouvez l’ajouter vous même", - "da": "På dette kort finder du affaldskurve i nærheden af dig. Hvis der mangler en affaldskurv på dette kort, kan du selv tilføje den", - "ca": "A aquest mapa trobaràs les papereres a prop teua. Si falta una paperera al mapa pots afegir-la tu mateix", - "es": "En este mapa, encontrará las papeleras cercanas a usted. Si falta una papelera en el mapa, puede añadirla usted mismo", - "cs": "Na této mapě najdete koše na odpadky ve vašem okolí. Pokud na této mapě odpadkový koš chybí, můžete jej přidat sami", - "pl": "Na tej mapie znajdziesz kosze na śmieci w twojej okolicy. Jeśli brakuje kosza, możesz go dodać" - }, "icon": "./assets/themes/waste_basket/waste_basket.svg", - "startLat": 0, - "startLon": 0, - "startZoom": 1, - "widenFactor": 2, "layers": [ { "builtin": "waste_basket", @@ -58,5 +54,6 @@ "minzoom": 12 } } - ] + ], + "widenFactor": 2 } \ No newline at end of file diff --git a/assets/themes/width/width.json b/assets/themes/width/width.json index 9778da329..43163a44e 100644 --- a/assets/themes/width/width.json +++ b/assets/themes/width/width.json @@ -1,38 +1,20 @@ { "id": "width", - "description": { - "nl": "

    De straat is opgebruikt

    Er is steeds meer druk op de openbare ruimte. Voetgangers, fietsers, steps, auto's, bussen, bestelwagens, buggies, cargobikes, ... willen allemaal hun deel van de openbare ruimte en de straat.

    In deze studie nemen we Brugge onder de loep en kijken we hoe breed elke straat is én hoe breed elke straat zou moeten zijn voor een veilig én vlot verkeer.

    Legende

        Straat te smal voor veilig verkeer
        Straat is breed genoeg veilig verkeer
        Straat zonder voetpad, te smal als ook voetgangers plaats krijgen
        Autoluw, autoloos of enkel plaatselijk verkeer


    Een gestippelde lijn is een straat waar ook voor fietsers éénrichtingsverkeer geldt.
    Klik op een straat om meer informatie te zien." - }, "title": { "nl": "Straatbreedtes" }, "mustHaveLanguage": [ "nl" ], - "hideFromOverview": true, - "enableUserBadge": false, - "enableShareScreen": false, - "enableLayers": false, - "enableMoreQuests": false, - "enableSearch": false, - "enableBackgroundLayerSelection": false, + "description": { + "nl": "

    De straat is opgebruikt

    Er is steeds meer druk op de openbare ruimte. Voetgangers, fietsers, steps, auto's, bussen, bestelwagens, buggies, cargobikes, ... willen allemaal hun deel van de openbare ruimte en de straat.

    In deze studie nemen we Brugge onder de loep en kijken we hoe breed elke straat is én hoe breed elke straat zou moeten zijn voor een veilig én vlot verkeer.

    Legende

        Straat te smal voor veilig verkeer
        Straat is breed genoeg veilig verkeer
        Straat zonder voetpad, te smal als ook voetgangers plaats krijgen
        Autoluw, autoloos of enkel plaatselijk verkeer


    Een gestippelde lijn is een straat waar ook voor fietsers éénrichtingsverkeer geldt.
    Klik op een straat om meer informatie te zien." + }, "icon": "./assets/themes/width/icon.svg", + "startZoom": 14, "startLat": 51.20875, "startLon": 3.22435, - "startZoom": 14, - "widenFactor": 0.05, - "clustering": false, - "lockLocation": [ - [ - 3.2006263732910156, - 51.22699040520305 - ], - [ - 3.2529830932617188, - 51.190748429411705 - ] - ], "defaultBackgroundId": "alidade.smooth_dark", + "hideFromOverview": true, "layers": [ { "id": "street_with_width", @@ -204,71 +186,28 @@ ] } ], - "mapRendering": [ - { - "location": [ - "point" - ], - "icon": "./assets/themes/width/icon.svg", - "iconSize": "40,40", - "anchor": "center" - }, - { - "width": "4", - "color": { - "render": "#00f", - "mappings": [ - { - "if": { - "or": [ - "access=destination", - "highway=pedestrian", - "motor_vehicle=no", - "motor_vehicle=destination" - ] - }, - "then": "lightgrey" - }, - { - "if": { - "and": [ - "_width:difference!~-.*", - "_width:difference:no_pedestrians~-.*" - ] - }, - "then": "orange" - }, - { - "if": "_width:difference~-.*", - "then": "#0f0" - }, - { - "if": "_width:difference!~-.*", - "then": "#f00" - } - ] - }, - "dashArray": { - "render": "", - "mappings": [ - { - "if": { - "and": [ - "oneway=yes", - { - "or": [ - "oneway:bicycle=yes", - "oneway:bicycle=" - ] - } - ] - }, - "then": "5 6" - } - ] - } - } + "pointRendering": [], + "lineRendering": [ + {} ] } - ] + ], + "lockLocation": [ + [ + 3.2006263732910156, + 51.22699040520305 + ], + [ + 3.2529830932617188, + 51.190748429411705 + ] + ], + "enableUserBadge": false, + "enableShareScreen": false, + "enableMoreQuests": false, + "enableLayers": false, + "enableSearch": false, + "enableBackgroundLayerSelection": false, + "widenFactor": 0.05, + "clustering": false } diff --git a/index.html b/index.html index 5d850ae9e..702a11a83 100644 --- a/index.html +++ b/index.html @@ -2,8 +2,8 @@ - - + + diff --git a/langs/en.json b/langs/en.json index 578a8b4b9..517f735ba 100644 --- a/langs/en.json +++ b/langs/en.json @@ -174,6 +174,8 @@ "downloadAsPngHelper": "Ideal to include in reports", "downloadAsSvg": "Download an SVG of the current map", "downloadAsSvgHelper": "Compatible with Inkscape or Adobe Illustrator; will need further processing", + "downloadAsSvgLinesOnly": "Download an SVG of the current map only containing lines", + "downloadAsSvgLinesOnlyHelper": "Self-intersecting lines are broken up, can be used with some 3D-software", "downloadCSV": "Download visible data as CSV", "downloadCSVHelper": "Compatible with LibreOffice Calc, Excel, …", "downloadFeatureAsGeojson": "Download as GeoJSON-file", @@ -629,6 +631,11 @@ "description": "a number", "feedback": "This is not a number" }, + "id": { + "description": "an identifier", + "invalidCharacter": "An id can only contain letters, digits and underscores", + "shouldBeLonger": "An id should be at least 3 characters long" + }, "int": { "description": "a whole number" }, diff --git a/langs/layers/ca.json b/langs/layers/ca.json index 3a1727430..0ffa5e902 100644 --- a/langs/layers/ca.json +++ b/langs/layers/ca.json @@ -5110,7 +5110,7 @@ } }, "last_click": { - "mapRendering": { + "pointRendering": { "0": { "label": { "mappings": { @@ -8567,13 +8567,6 @@ }, "transit_routes": { "description": "Capa que mostra les línies d'autobús", - "mapRendering": { - "0": { - "color": { - "render": "#ff0000" - } - } - }, "name": "Línies de bus", "tagRenderings": { "colour": { @@ -9391,17 +9384,6 @@ } } }, - "mapRendering": { - "0": { - "iconSize": { - "mappings": { - "0": { - "then": "Paperera" - } - } - } - } - }, "name": "Paperera", "presets": { "0": { diff --git a/langs/layers/cs.json b/langs/layers/cs.json index 55a89642b..2335ae547 100644 --- a/langs/layers/cs.json +++ b/langs/layers/cs.json @@ -5382,9 +5382,7 @@ "title": "rozcestník" } }, - "title": { - "render": "Rozcestník" - } + "title": "Rozcestník" }, "hackerspace": { "description": "Hackerspace", @@ -5922,7 +5920,7 @@ } }, "last_click": { - "mapRendering": { + "pointRendering": { "0": { "label": { "mappings": { @@ -9528,13 +9526,6 @@ }, "transit_routes": { "description": "Vrstva zobrazující autobusové linky", - "mapRendering": { - "0": { - "color": { - "render": "#ff0000" - } - } - }, "name": "Autobusové linky", "tagRenderings": { "colour": { @@ -10396,17 +10387,6 @@ } } }, - "mapRendering": { - "0": { - "iconSize": { - "mappings": { - "0": { - "then": "Odpadkový koš" - } - } - } - } - }, "name": "Odpadkový koš", "presets": { "0": { diff --git a/langs/layers/da.json b/langs/layers/da.json index bdce798cd..d8b23f43c 100644 --- a/langs/layers/da.json +++ b/langs/layers/da.json @@ -2077,7 +2077,7 @@ "name": "Dit tilbagelagte spor" }, "last_click": { - "mapRendering": { + "pointRendering": { "0": { "label": { "render": "Klik her for at tilføje et nyt punkt" @@ -2701,13 +2701,6 @@ }, "transit_routes": { "description": "Lag, der viser buslinjer", - "mapRendering": { - "0": { - "color": { - "render": "#ff0000" - } - } - }, "name": "Buslinjer", "tagRenderings": { "colour": { @@ -3116,17 +3109,6 @@ } } }, - "mapRendering": { - "0": { - "iconSize": { - "mappings": { - "0": { - "then": "Affaldskurv" - } - } - } - } - }, "name": "Affaldskurv", "presets": { "0": { diff --git a/langs/layers/de.json b/langs/layers/de.json index fe221f7d3..0d26d4507 100644 --- a/langs/layers/de.json +++ b/langs/layers/de.json @@ -5391,9 +5391,7 @@ "title": "ein Wegweiser" } }, - "title": { - "render": "Wegweiser" - } + "title": "Wegweiser" }, "hackerspace": { "description": "Hackerspace", @@ -5932,7 +5930,7 @@ } }, "last_click": { - "mapRendering": { + "pointRendering": { "0": { "label": { "mappings": { @@ -9590,13 +9588,6 @@ }, "transit_routes": { "description": "Ebene mit Buslinien", - "mapRendering": { - "0": { - "color": { - "render": "#ff0000" - } - } - }, "name": "Buslinien", "tagRenderings": { "colour": { @@ -10458,17 +10449,6 @@ } } }, - "mapRendering": { - "0": { - "iconSize": { - "mappings": { - "0": { - "then": "Abfalleimer" - } - } - } - } - }, "name": "Mülleimer", "presets": { "0": { diff --git a/langs/layers/en.json b/langs/layers/en.json index fa8efd5d0..bed9a57f5 100644 --- a/langs/layers/en.json +++ b/langs/layers/en.json @@ -284,6 +284,47 @@ "render": "Ambulance Station" } }, + "animal_shelter": { + "description": "An animal shelter is a facility where animals in trouble are brought and facility's staff (volunteers or not) feeds them and cares of them, rehabilitating and healing them if necessary. This definition includes kennels for abandoned dogs, catteries for abandoned cats, shelters for other abandoned pets and wildlife recovery centres. ", + "name": "Animal shelters", + "presets": { + "0": { + "title": "an animal shelter" + } + }, + "tagRenderings": { + "2": { + "question": "What is the name of this animal shelter?", + "render": "This animal shelter is named {name}" + }, + "6": { + "mappings": { + "0": { + "then": "Animals are kept here until adopted by a new owner" + }, + "1": { + "then": "Animals are taken care of for the rest of their lives" + }, + "2": { + "then": "Injured animals are rehabilitated here until they can be released in nature again " + } + }, + "question": "What is the purpose of the animal shelter?" + }, + "7": { + "question": "When is this animal shelter opened?", + "render": "{opening_hours_table()}" + } + }, + "title": { + "mappings": { + "0": { + "then": "{name}" + } + }, + "render": "Animal shelter" + } + }, "artwork": { "description": "An open map of statues, busts, graffitis and other artwork all over the world", "name": "Artworks", @@ -4175,6 +4216,7 @@ "name": "Drinking water", "presets": { "0": { + "description": "Typically a drinking fountain, water tap, water well or natural spring", "title": "a drinking water" } }, @@ -5391,9 +5433,29 @@ "title": "a guidepost" } }, - "title": { - "render": "Guidepost" - } + "tagRenderings": { + "type": { + "mappings": { + "0": { + "then": "This guidepost shows bicycle routes" + }, + "1": { + "then": "This guidepost shows hiking routes" + }, + "2": { + "then": "This guidepost shows mountain bike routes" + }, + "3": { + "then": "This guidepost shows horse riding routes" + }, + "4": { + "then": "This guidepost shows ski routes" + } + }, + "question": "What kind of routes are shown on this guidepost?" + } + }, + "title": "Guideposts" }, "hackerspace": { "description": "Hackerspace", @@ -5649,6 +5711,30 @@ } } }, + "ice_cream": { + "description": "A place where ice cream is sold over the counter", + "name": "Ice cream parlors", + "presets": { + "0": { + "description": "A shop where one can buy only icecream and related items. Ice cream is normally hand-scooped.", + "title": "an ice cream parlor" + } + }, + "tagRenderings": { + "1": { + "question": "What is the name of this ice cream parlor?", + "render": "This ice cream parlor is named {name}" + } + }, + "title": { + "mappings": { + "0": { + "then": "{name}" + } + }, + "render": "Ice cream parlor" + } + }, "icons": { "description": "A layer acting as library for icon-tagrenderings, especially to show as badge next to a POI" }, @@ -5932,7 +6018,7 @@ } }, "last_click": { - "mapRendering": { + "pointRendering": { "0": { "label": { "mappings": { @@ -8181,6 +8267,41 @@ "render": "Recycling facility" } }, + "route_marker": { + "description": "Route markers are small markers often found along official hiking/cycling/riding/skiing routes to indicate the direction of the route.", + "name": "Route markers", + "presets": { + "0": { + "description": "A route marker is a small marker often found along official hiking/cycling/riding/skiing routes to indicate the direction of the route.", + "title": "a route marker" + } + }, + "tagRenderings": { + "type": { + "mappings": { + "0": { + "then": "This is a route marker for a bicycle route." + }, + "1": { + "then": "This is a route marker for a hiking route." + }, + "2": { + "then": "This is a route marker for a mountain bike route." + }, + "3": { + "then": "This is a route marker for a horse riding route." + }, + "4": { + "then": "This is a route marker for a ski route." + } + }, + "question": "For what kind of route is this marker?" + } + }, + "title": { + "render": "Route marker" + } + }, "school": { "name": "Primary and secondary schools", "presets": { @@ -8391,6 +8512,20 @@ "render": "This is a {shop}" } }, + "key_cutter": { + "mappings": { + "0": { + "then": "This shop is also specialized in key cutting" + }, + "1": { + "then": "This shop offers key cutting as a service" + }, + "2": { + "then": "This shops does not offer key cutting as a service" + } + }, + "question": "Does this shop offer key cutting?" + }, "organic": { "mappings": { "0": { @@ -8497,7 +8632,38 @@ }, "slow_roads": { "description": "All carfree roads", + "name": "Paths, carfree and slow roads", "tagRenderings": { + "explanation": { + "mappings": { + "0": { + "then": "This is a living street" + }, + "1": { + "then": "This is a wide, carfree street" + }, + "2": { + "then": "This is a footway" + }, + "3": { + "then": "This is a small path" + }, + "4": { + "then": "This is a bridleway" + }, + "5": { + "then": "This is a land access road" + } + } + }, + "slow_road_is_lit": { + "mappings": { + "1": { + "then": "Not lit" + } + }, + "question": "Is this road lit at night?" + }, "slow_roads-surface": { "mappings": { "0": { @@ -8525,8 +8691,29 @@ "then": "The surface is paved" } }, + "question": "What surface does this road have?", "render": "The surface is {surface}" } + }, + "title": { + "mappings": { + "1": { + "then": "Footway" + }, + "2": { + "then": "Cycleway" + }, + "3": { + "then": "Pedestrian street" + }, + "4": { + "then": "Living street" + }, + "5": { + "then": "Small path" + } + }, + "render": "Slow road" } }, "speed_camera": { @@ -9562,6 +9749,7 @@ } }, "trail": { + "description": "Waymarked trails", "name": "Trails", "tagRenderings": { "Color": { @@ -9578,7 +9766,47 @@ "3": { "then": "Yellow trail" } - } + }, + "question": "What is the reference colour of this trail?", + "render": "The reference colour is {colour}" + }, + "Name": { + "question": "What is the name of this trail?", + "render": "This trail is called {name}" + }, + "Operator tag": { + "mappings": { + "0": { + "then": "This trail is maintained by Natuurpunt" + }, + "1": { + "then": "This trail is maintained by {operator}" + } + }, + "question": "Who maintains this trail?", + "render": "This trail is maintained by {operator}" + }, + "Wheelchair access": { + "mappings": { + "0": { + "then": "This trail is wheelchair-accessible" + }, + "1": { + "then": "This trail is not wheelchair accessible" + } + }, + "question": "Is this trail wheelchair accessible?" + }, + "pushchair access": { + "mappings": { + "0": { + "then": "This trail is accessible with a pushchair" + }, + "1": { + "then": "This trail is not accessible with a pushchair" + } + }, + "question": "Is this trail accessible with a pushchair?" }, "trail-length": { "render": "The trail is {_length:km} kilometers long" @@ -9590,13 +9818,6 @@ }, "transit_routes": { "description": "Layer showing bus lines", - "mapRendering": { - "0": { - "color": { - "render": "#ff0000" - } - } - }, "name": "Bus lines", "tagRenderings": { "colour": { @@ -10458,17 +10679,6 @@ } } }, - "mapRendering": { - "0": { - "iconSize": { - "mappings": { - "0": { - "then": "Waste Basket" - } - } - } - } - }, "name": "Waste Basket", "presets": { "0": { diff --git a/langs/layers/es.json b/langs/layers/es.json index afc4d9784..6f9104781 100644 --- a/langs/layers/es.json +++ b/langs/layers/es.json @@ -2981,7 +2981,7 @@ } }, "last_click": { - "mapRendering": { + "pointRendering": { "0": { "label": { "render": "Haga clic aquí para añadir un nuevo ítem" @@ -4246,11 +4246,6 @@ "question": "¿De qué color es la luz que emite esta lámpara?", "render": "Esta lámpara emite luz {light:colour}" }, - "count": { - "mappings": { - "0": {} - } - }, "direction": { "question": "¿Hacia donde apunta esta lámpara?", "render": "Esta lámpara apunta hacia {light:direction}" @@ -4879,17 +4874,6 @@ } } } - }, - "mapRendering": { - "0": { - "iconSize": { - "mappings": { - "0": { - "then": "Papelera" - } - } - } - } } }, "windturbine": { diff --git a/langs/layers/fil.json b/langs/layers/fil.json index f8763de68..df662aa44 100644 --- a/langs/layers/fil.json +++ b/langs/layers/fil.json @@ -1,6 +1,6 @@ { "last_click": { - "mapRendering": { + "pointRendering": { "0": { "label": { "render": "I-click ito para mag-dagdag ng bagong bagay" diff --git a/langs/layers/fr.json b/langs/layers/fr.json index 195888cee..d1d813804 100644 --- a/langs/layers/fr.json +++ b/langs/layers/fr.json @@ -3962,7 +3962,7 @@ } }, "last_click": { - "mapRendering": { + "pointRendering": { "0": { "label": { "mappings": { @@ -6773,17 +6773,6 @@ } } }, - "mapRendering": { - "0": { - "iconSize": { - "mappings": { - "0": { - "then": "Poubelle" - } - } - } - } - }, "name": "Poubelle", "presets": { "0": { diff --git a/langs/layers/hu.json b/langs/layers/hu.json index be2714d5d..385cc8dc4 100644 --- a/langs/layers/hu.json +++ b/langs/layers/hu.json @@ -340,9 +340,6 @@ "description": "Létesítmény, ahonnan kerékpár kölcsönözhető hosszabb időre", "tagRenderings": { "bicycle-library-target-group": { - "mappings": { - "0": {} - }, "question": "Ki kölcsönözhet itt kerékpárt?" }, "bicycle_library-charge": { @@ -619,7 +616,7 @@ } }, "last_click": { - "mapRendering": { + "pointRendering": { "0": { "label": { "render": "Új elem hozzáadásához kattints ide" diff --git a/langs/layers/id.json b/langs/layers/id.json index f4a2884ad..18a967782 100644 --- a/langs/layers/id.json +++ b/langs/layers/id.json @@ -365,7 +365,7 @@ } }, "last_click": { - "mapRendering": { + "pointRendering": { "0": { "label": { "render": "Klik di sini untuk menambahkan item baru" @@ -721,17 +721,6 @@ } }, "waste_basket": { - "mapRendering": { - "0": { - "iconSize": { - "mappings": { - "0": { - "then": "Keranjang Sampah" - } - } - } - } - }, "name": "Keranjang Sampah", "presets": { "0": { diff --git a/langs/layers/it.json b/langs/layers/it.json index 57f73f988..e26f3b9af 100644 --- a/langs/layers/it.json +++ b/langs/layers/it.json @@ -1443,7 +1443,7 @@ } }, "last_click": { - "mapRendering": { + "pointRendering": { "0": { "label": { "render": "Aggiungi nuovo elemento" @@ -2677,17 +2677,6 @@ } } }, - "mapRendering": { - "0": { - "iconSize": { - "mappings": { - "0": { - "then": "Cestino dei rifiuti" - } - } - } - } - }, "name": "Cestino dei rifiuti", "presets": { "0": { diff --git a/langs/layers/nb_NO.json b/langs/layers/nb_NO.json index 4be55ca72..b3d9e57d3 100644 --- a/langs/layers/nb_NO.json +++ b/langs/layers/nb_NO.json @@ -509,7 +509,7 @@ } }, "last_click": { - "mapRendering": { + "pointRendering": { "0": { "label": { "render": "Legg til nytt element" diff --git a/langs/layers/nl.json b/langs/layers/nl.json index 1976e41f8..35f8706f0 100644 --- a/langs/layers/nl.json +++ b/langs/layers/nl.json @@ -3272,13 +3272,6 @@ "render": "Klok" } }, - "crab_address": { - "tagRenderings": { - "render_crab": { - "render": "Volgens het CRAB ligt hier {STRAATNM} {HUISNR} (label: {HNRLABEL})" - } - } - }, "crossings": { "description": "Oversteekplaatsen voor voetgangers en fietsers", "name": "Oversteekplaatsen", @@ -5195,6 +5188,14 @@ } } }, + "ice_cream": { + "tagRenderings": { + "1": { + "question": "Wat is de naam van dit ijssalon?", + "render": "Dit ijssalon heet {name}" + } + } + }, "indoors": { "description": "Een basis voor indoor-navigatie: toont binnenruimtes", "name": "Binnenruimtes", @@ -5397,7 +5398,7 @@ } }, "last_click": { - "mapRendering": { + "pointRendering": { "0": { "label": { "mappings": { @@ -7623,6 +7624,9 @@ "tagRenderings": { "explanation": { "mappings": { + "0": { + "then": "
    Dit is een woonerf:
    • Voetgangers mogen hier de volledige breedte van de straat gebruiken
    • Gemotoriseerd verkeer mag maximaal 20km/h rijden
    " + }, "1": { "then": "Dit is een brede, autovrije straat" }, @@ -7640,6 +7644,14 @@ } } }, + "slow_road_is_lit": { + "mappings": { + "1": { + "then": "Niet verlicht" + } + }, + "question": "Is deze weg 's nachts verlicht?" + }, "slow_roads-surface": { "mappings": { "0": { @@ -7687,6 +7699,9 @@ }, "4": { "then": "Woonerf" + }, + "5": { + "then": "Klein pad" } }, "render": "Trage weg" @@ -8707,13 +8722,6 @@ }, "transit_routes": { "description": "Laag met buslijnen", - "mapRendering": { - "0": { - "color": { - "render": "#ff0000" - } - } - }, "name": "Buslijnen", "tagRenderings": { "colour": { @@ -9406,17 +9414,6 @@ } } }, - "mapRendering": { - "0": { - "iconSize": { - "mappings": { - "0": { - "then": "Vuilnisbak" - } - } - } - } - }, "name": "Vuilnisbak", "presets": { "0": { diff --git a/langs/layers/pl.json b/langs/layers/pl.json index 8182259ae..05d24d891 100644 --- a/langs/layers/pl.json +++ b/langs/layers/pl.json @@ -1605,6 +1605,7 @@ "name": "Restauracje i fast-foody", "presets": { "0": { + "description": "Warstwa przedstawiająca restauracje i obiekty typu fast-food (ze specjalnym renderowaniem dla frytek)", "title": "restauracja" } }, @@ -1870,7 +1871,7 @@ } }, "last_click": { - "mapRendering": { + "pointRendering": { "0": { "label": { "mappings": { diff --git a/langs/layers/pt.json b/langs/layers/pt.json index 835167ba8..f18d13631 100644 --- a/langs/layers/pt.json +++ b/langs/layers/pt.json @@ -807,7 +807,7 @@ } }, "last_click": { - "mapRendering": { + "pointRendering": { "0": { "label": { "render": "Adicionar novo item" diff --git a/langs/layers/ru.json b/langs/layers/ru.json index 49cfa19c6..28aa63ae3 100644 --- a/langs/layers/ru.json +++ b/langs/layers/ru.json @@ -1980,17 +1980,6 @@ } }, "waste_basket": { - "mapRendering": { - "0": { - "iconSize": { - "mappings": { - "0": { - "then": "Контейнер для мусора" - } - } - } - } - }, "name": "Контейнер для мусора", "presets": { "0": { diff --git a/langs/layers/zh_Hant.json b/langs/layers/zh_Hant.json index dd9c456cb..665049c57 100644 --- a/langs/layers/zh_Hant.json +++ b/langs/layers/zh_Hant.json @@ -563,7 +563,7 @@ "name": "消防栓地圖" }, "last_click": { - "mapRendering": { + "pointRendering": { "0": { "label": { "render": "點這邊新增新項目" diff --git a/langs/themes/ca.json b/langs/themes/ca.json index 8a1246094..f63ec5abd 100644 --- a/langs/themes/ca.json +++ b/langs/themes/ca.json @@ -479,8 +479,10 @@ "name": "enllaços node a node", "tagRenderings": { "node2node-survey:date": { - "question": "Quan es va comprovar per última vegada aquest enllaç node a node presencialment?", - "render": "Aquest enllaç node a node es va sondejar per última vegada el {survey:date}" + "override": { + "question": "Quan es va comprovar per última vegada aquest enllaç node a node presencialment?", + "render": "Aquest enllaç node a node es va sondejar per última vegada el {survey:date}" + } } }, "title": { @@ -500,8 +502,10 @@ "render": "Aquest node enllaça a {expected_rcn_route_relations} altres nodes ciclistes." }, "node-survey:date": { - "question": "Quan va ser sondejat aquest node ciclista per última vegada?", - "render": "Aquest node ciclista es va sondejar per última vegada el {survey:date}" + "override": { + "question": "Quan va ser sondejat aquest node ciclista per última vegada?", + "render": "Aquest node ciclista es va sondejar per última vegada el {survey:date}" + } } }, "title": { @@ -1337,6 +1341,32 @@ "description": "Troba màquines expenedores per a tot", "title": "Màquines expenedores" }, + "walkingnodes": { + "layers": { + "0": { + "name": "enllaços node a node", + "tagRenderings": { + "node2node-survey:date": { + "override": { + "question": "Quan es va comprovar per última vegada aquest enllaç node a node presencialment?", + "render": "Aquest enllaç node a node es va sondejar per última vegada el {survey:date}" + } + } + }, + "title": { + "mappings": { + "0": { + "then": "Enllaç node a node {ref}" + } + }, + "render": "Enllaç node a node" + } + }, + "1": { + "name": "nodes" + } + } + }, "walls_and_buildings": { "description": "Capa construïda especial que proporciona totes les parets i edificis. Aquesta capa és útil als predefinits per a objectes que es poden col·locar a les parets (p. ex. DEA, bústies de correus, entrades, adreces, càmeres de vigilància, ...). Aquesta capa és invisible per defecte i no es pot activar per l'usuari.", "title": "Murs i edificis" diff --git a/langs/themes/cs.json b/langs/themes/cs.json index c4b77d074..e91715a55 100644 --- a/langs/themes/cs.json +++ b/langs/themes/cs.json @@ -479,8 +479,10 @@ "name": "propojení mezi uzly", "tagRenderings": { "node2node-survey:date": { - "question": "Kdy bylo toto propojení mezi uzly naposledy zkontrolováno?", - "render": "Toto propojení mezi uzly bylo naposledy zkontrolováno dne {survey:date}" + "override": { + "question": "Kdy bylo toto propojení mezi uzly naposledy zkontrolováno?", + "render": "Toto propojení mezi uzly bylo naposledy zkontrolováno dne {survey:date}" + } } }, "title": { @@ -500,8 +502,10 @@ "render": "Tento uzel je propojen s {expected_rcn_route_relations} dalšími uzly cyklu." }, "node-survey:date": { - "question": "Kdy byl tento uzel cyklu naposledy zkontrolován?", - "render": "Tento uzel cyklu byl naposledy zkontrolován dne {survey:date}" + "override": { + "question": "Kdy byl tento uzel cyklu naposledy zkontrolován?", + "render": "Tento uzel cyklu byl naposledy zkontrolován dne {survey:date}" + } } }, "title": { @@ -1341,6 +1345,32 @@ "description": "Najít prodejní automaty na vše", "title": "Prodejní automaty" }, + "walkingnodes": { + "layers": { + "0": { + "name": "propojení mezi uzly", + "tagRenderings": { + "node2node-survey:date": { + "override": { + "question": "Kdy bylo toto propojení mezi uzly naposledy zkontrolováno?", + "render": "Toto propojení mezi uzly bylo naposledy zkontrolováno dne {survey:date}" + } + } + }, + "title": { + "mappings": { + "0": { + "then": "propojení mezi uzly {ref}" + } + }, + "render": "propojení mezi uzly" + } + }, + "1": { + "name": "uzly" + } + } + }, "walls_and_buildings": { "description": "Speciální zabudovaná vrstva poskytující všechny stěny a budovy. Tato vrstva je užitečná v předvolbách pro objekty, které lze umístit ke stěnám (např. AED, poštovní schránky, vchody, adresy, bezpečnostní kamery, …). Tato vrstva je ve výchozím nastavení neviditelná a uživatel ji nemůže přepínat.", "title": "Stěny a budovy" diff --git a/langs/themes/de.json b/langs/themes/de.json index fffb6847b..65872df80 100644 --- a/langs/themes/de.json +++ b/langs/themes/de.json @@ -479,8 +479,10 @@ "name": "Knotenpunktverbindungen", "tagRenderings": { "node2node-survey:date": { - "question": "Wann wurde diese Knotenpunktverbindung zuletzt überprüft?", - "render": "Diese Knotenpunktverbindung wurde zuletzt am {survey:date} überprüft" + "override": { + "question": "Wann wurde diese Knotenpunktverbindung zuletzt überprüft?", + "render": "Diese Knotenpunktverbindung wurde zuletzt am {survey:date} überprüft" + } } }, "title": { @@ -500,8 +502,10 @@ "render": "Dieser Knoten ist mit {expected_rcn_route_relations} anderen Knoten des Fahrradknotenpunktnetzwerkes verbunden." }, "node-survey:date": { - "question": "Wann wurde dieser Fahrradknotenpunkt zuletzt überprüft?", - "render": "Dieser Fahrradknoten wurde zuletzt überprüft am {survey:date}" + "override": { + "question": "Wann wurde dieser Fahrradknotenpunkt zuletzt überprüft?", + "render": "Dieser Fahrradknoten wurde zuletzt überprüft am {survey:date}" + } } }, "title": { @@ -1341,6 +1345,32 @@ "description": "Finde Verkaufautomaten für Alles", "title": "Verkaufsautomaten" }, + "walkingnodes": { + "layers": { + "0": { + "name": "Knotenpunktverbindungen", + "tagRenderings": { + "node2node-survey:date": { + "override": { + "question": "Wann wurde diese Knotenpunktverbindung zuletzt überprüft?", + "render": "Diese Knotenpunktverbindung wurde zuletzt am {survey:date} überprüft" + } + } + }, + "title": { + "mappings": { + "0": { + "then": "Knotenpunktverbindung {ref}" + } + }, + "render": "Knotenpunktverbindung" + } + }, + "1": { + "name": "Knotenpunkte" + } + } + }, "walls_and_buildings": { "description": "Spezielle Ebene, die alle Wände und Gebäude bereitstellt. Diese Ebene ist nützlich in Voreinstellungen für Objekte, die an Wänden platziert werden können (z. B. AEDs, Briefkästen, Eingänge, Adressen, Überwachungskameras, ...). Diese Ebene ist standardmäßig unsichtbar und kann vom Benutzer nicht umgeschaltet werden.", "title": "Wände und Gebäude" diff --git a/langs/themes/en.json b/langs/themes/en.json index da64985f9..b3c9d1496 100644 --- a/langs/themes/en.json +++ b/langs/themes/en.json @@ -476,36 +476,72 @@ "description": "This map shows cycle node networks and allows you to add new nodes easily", "layers": { "0": { - "name": "node to node links", + "name": "Node to node links", "tagRenderings": { "node2node-survey:date": { - "question": "When was this node to node link last surveyed?", - "render": "This node to node link was last surveyed on {survey:date}" + "override": { + "question": "When was this node to node link last surveyed?", + "render": "This node to node link was last surveyed on {survey:date}" + } } }, "title": { "mappings": { "0": { - "then": "node to node link {ref}" + "then": "Node to node link {ref}" } }, - "render": "node to node link" + "render": "Node to node link" } }, "1": { - "name": "nodes", + "name": "Nodes", + "presets": { + "0": { + "title": "a cycling node" + } + }, "tagRenderings": { "node-expected_rcn_route_relations": { + "freeform": { + "placeholder": "e.g. 3" + }, "question": "How many other cycle nodes does this node link to?", "render": "This node links to {expected_rcn_route_relations} other cycle nodes." }, + "node-rxn_ref": { + "freeform": { + "placeholder": "e.g. 1" + }, + "question": "What is the reference number of this cycling node?", + "render": "This cycling node has reference number {rcn_ref}" + }, "node-survey:date": { - "question": "When was this cycle node last surveyed?", - "render": "This cycle node was last surveyed on {survey:date}" + "override": { + "question": "When was this cycle node last surveyed?", + "render": "This cycle node was last surveyed on {survey:date}" + } } }, "title": { - "render": "cycle node {rcn_ref}" + "render": "Cycle node {rcn_ref}" + } + }, + "2": { + "override": { + "name": "Cycling guideposts", + "title": { + "render": "Cycling guidepost" + } + } + }, + "3": { + "override": { + "presets": { + "0": { + "title": "a route marker for a node to node link" + } + } } } }, @@ -838,6 +874,10 @@ "description": "On this map, you'll find hotels in your area", "title": "Hotels" }, + "icecream": { + "description": "A map showing ice cream parlors and ice cream vending machines", + "title": "Icecream" + }, "indoors": { "description": "On this map, publicly accessible indoor places are shown", "title": "Indoors" @@ -1341,6 +1381,81 @@ "description": "Find vending machines for everything", "title": "Vending Machines" }, + "walkingnodes": { + "description": "This map shows walking node networks and allows you to add new nodes easily", + "layers": { + "0": { + "name": "Node to node links", + "tagRenderings": { + "node2node-survey:date": { + "override": { + "question": "When was this node to node link last surveyed?", + "render": "This node to node link was last surveyed on {survey:date}" + } + } + }, + "title": { + "mappings": { + "0": { + "then": "Node to node link {ref}" + } + }, + "render": "Node to node link" + } + }, + "1": { + "name": "Nodes", + "presets": { + "0": { + "title": "a walking node" + } + }, + "tagRenderings": { + "node-expected_rwn_route_relations": { + "freeform": { + "placeholder": "e.g. 3" + }, + "question": "How many other walking nodes does this node link to?", + "render": "This node links to {expected_rwn_route_relations} other walking nodes." + }, + "node-rwn_ref": { + "freeform": { + "placeholder": "e.g. 1" + }, + "question": "What is the reference number of this walking node?", + "render": "This walking node has reference number {rwn_ref}" + }, + "survey_date": { + "override": { + "question": "When was this walking node last surveyed?", + "render": "This walking node was last surveyed on {survey:date}" + } + } + }, + "title": { + "render": "Walking node {rwn_ref}" + } + }, + "2": { + "override": { + "name": "Hiking guideposts", + "title": { + "render": "Hiking guidepost" + } + } + }, + "3": { + "override": { + "presets": { + "0": { + "title": "a route marker for a node to node link" + } + } + } + } + }, + "title": "Walking Node Networks" + }, "walls_and_buildings": { "description": "Special builtin layer providing all walls and buildings. This layer is useful in presets for objects which can be placed against walls (e.g. AEDs, postboxes, entrances, addresses, surveillance cameras, …). This layer is invisible by default and not toggleable by the user.", "title": "Walls and buildings" diff --git a/langs/themes/es.json b/langs/themes/es.json index 18edd77e1..c86c0b9b0 100644 --- a/langs/themes/es.json +++ b/langs/themes/es.json @@ -479,8 +479,10 @@ "name": "enlaces nodo a nodo", "tagRenderings": { "node2node-survey:date": { - "question": "¿Cuándo se sondeó este enlace nodo a nodo por última vez?", - "render": "Este enlace nodo a nodo se sondeó por última vez el {survey:date}" + "override": { + "question": "¿Cuándo se sondeó este enlace nodo a nodo por última vez?", + "render": "Este enlace nodo a nodo se sondeó por última vez el {survey:date}" + } } }, "title": { @@ -500,8 +502,10 @@ "render": "Este nodo enlaza a {expected_rcn_route_relations} otros nodos ciclistas." }, "node-survey:date": { - "question": "¿Cuándo fue sondeado este nodo ciclista por última vez?", - "render": "Este nodo ciclista se sondeó por última vez el {survey:date}" + "override": { + "question": "¿Cuándo fue sondeado este nodo ciclista por última vez?", + "render": "Este nodo ciclista se sondeó por última vez el {survey:date}" + } } }, "title": { @@ -1341,6 +1345,32 @@ "description": "Encontrar máquinas expendedoras para todo", "title": "Máquinas expendedoras" }, + "walkingnodes": { + "layers": { + "0": { + "name": "enlaces nodo a nodo", + "tagRenderings": { + "node2node-survey:date": { + "override": { + "question": "¿Cuándo se sondeó este enlace nodo a nodo por última vez?", + "render": "Este enlace nodo a nodo se sondeó por última vez el {survey:date}" + } + } + }, + "title": { + "mappings": { + "0": { + "then": "enlace nodo a nodo {ref}" + } + }, + "render": "enlace nodo a nodo" + } + }, + "1": { + "name": "nodos" + } + } + }, "walls_and_buildings": { "description": "Capa especial incorporada que proporciona todas las paredes y edificios. Esta capa es útil en los preajustes para objetos que pueden colocarse contra las paredes (por ejemplo: AEDs, buzones de correos, entradas, direcciones, cámaras de vigilancia, ...). Esta capa es invisible por defecto y no puede ser activada por el usuario.", "title": "Muros y edificios" diff --git a/langs/themes/eu.json b/langs/themes/eu.json index dd1e7cdd7..51f685316 100644 --- a/langs/themes/eu.json +++ b/langs/themes/eu.json @@ -323,6 +323,13 @@ "trees": { "title": "Zuhaitzak" }, + "walkingnodes": { + "layers": { + "1": { + "name": "nodoak" + } + } + }, "waste": { "title": "Hondakinak eta birziklapena" } diff --git a/langs/themes/fr.json b/langs/themes/fr.json index 21da83331..13d795eb9 100644 --- a/langs/themes/fr.json +++ b/langs/themes/fr.json @@ -476,8 +476,10 @@ "name": "liens noeud à noeud", "tagRenderings": { "node2node-survey:date": { - "question": "Quand cette liaison de nœud à nœud a-t-elle été contrôlée sur le terrain pour la dernière fois ?", - "render": "Cette lien de nœud à nœud a été vérifié sur le terrain le {survey:date}" + "override": { + "question": "Quand cette liaison de nœud à nœud a-t-elle été contrôlée sur le terrain pour la dernière fois ?", + "render": "Cette lien de nœud à nœud a été vérifié sur le terrain le {survey:date}" + } } }, "title": { @@ -497,8 +499,10 @@ "render": "Ce noeud est lié à {expected_rcn_route_relations} d'autres noeuds cyclistes." }, "node-survey:date": { - "question": "Quand ce nœud cyclable a-t-il été vérifié sur le terrain pour la dernière fois ?", - "render": "Ce nœud cycliste a été verifié pour la dernière fois le {survey:date}" + "override": { + "question": "Quand ce nœud cyclable a-t-il été vérifié sur le terrain pour la dernière fois ?", + "render": "Ce nœud cycliste a été verifié pour la dernière fois le {survey:date}" + } } }, "title": { @@ -1280,6 +1284,32 @@ "description": "Trouver tous les distributeurs", "title": "Distributeurs" }, + "walkingnodes": { + "layers": { + "0": { + "name": "liens noeud à noeud", + "tagRenderings": { + "node2node-survey:date": { + "override": { + "question": "Quand cette liaison de nœud à nœud a-t-elle été contrôlée sur le terrain pour la dernière fois ?", + "render": "Cette lien de nœud à nœud a été vérifié sur le terrain le {survey:date}" + } + } + }, + "title": { + "mappings": { + "0": { + "then": "lien noeud à noeud {ref}" + } + }, + "render": "lien noeud à noeud" + } + }, + "1": { + "name": "noeuds" + } + } + }, "walls_and_buildings": { "description": "Couche intégrée spéciale fournissant tous les murs et bâtiments. Cette couche est utile dans les préréglages pour les objets qui peuvent être placés contre les murs (par exemple, les DEA, les boîtes aux lettres, les entrées, les adresses, les caméras de surveillance, …). Ce calque est invisible par défaut et non inchangeable par l'utilisateur.", "title": "Murs et bâtiments" diff --git a/langs/themes/nb_NO.json b/langs/themes/nb_NO.json index 6ede5f79d..b4348f768 100644 --- a/langs/themes/nb_NO.json +++ b/langs/themes/nb_NO.json @@ -736,6 +736,13 @@ "shortDescription": "Kartlegg alle trærne", "title": "Trær" }, + "walkingnodes": { + "layers": { + "1": { + "name": "noder" + } + } + }, "walls_and_buildings": { "title": "Murer og bygninger" }, diff --git a/langs/themes/nl.json b/langs/themes/nl.json index 2affa3f47..9a41c12ed 100644 --- a/langs/themes/nl.json +++ b/langs/themes/nl.json @@ -427,36 +427,55 @@ "description": "Deze kaart toont fietsknooppunten en laat je toe om eenvoudigweg nieuwe knooppunten toe te voegen", "layers": { "0": { - "name": "verbindingen van node naar node", + "name": "Verbindingen van node naar node", "tagRenderings": { "node2node-survey:date": { - "question": "Wanneer werd deze node-naar-node verbinding het laast gesurveyed?", - "render": "Deze node-naar-node verbinding werd het laast gesurveyed op {survey:date}" + "override": { + "question": "Wanneer werd deze node-naar-node verbinding het laast gesurveyed?", + "render": "Deze node-naar-node verbinding werd het laast gesurveyed op {survey:date}" + } } }, "title": { "mappings": { "0": { - "then": "node-naar-node verbinding {ref}" + "then": "Node-naar-node verbinding {ref}" } }, - "render": "node-naar-node verbinding" + "render": "Node-naar-node verbinding" } }, "1": { - "name": "knooppunten", + "name": "Knooppunten", + "presets": { + "0": { + "title": "een fietsknooppunt" + } + }, "tagRenderings": { "node-expected_rcn_route_relations": { + "freeform": { + "placeholder": "bijv. 3" + }, "question": "Met hoeveel andere fietsknooppunten heeft dit knooppunt een verbinding?", "render": "Dit knooppunt verbindt met {expected_rcn_route_relations} andere fietsknooppunten." }, + "node-rxn_ref": { + "freeform": { + "placeholder": "bijv. 1" + }, + "question": "Wat is het referentienummer van dit fietsknooppunt?", + "render": "Dit fietsknooppunt heeft referentienummer {rcn_ref}" + }, "node-survey:date": { - "question": "Wanneer is dit fietsknooppunt voor het laatst gecontroleerd?", - "render": "Dit fietsknooppunt is voor het laatst gecontroleerd op {survey:date}" + "override": { + "question": "Wanneer is dit fietsknooppunt voor het laatst gecontroleerd?", + "render": "Dit fietsknooppunt is voor het laatst gecontroleerd op {survey:date}" + } } }, "title": { - "render": "fietsknooppunt {rcn_ref}" + "render": "Fietsknooppunt {rcn_ref}" } } }, @@ -1446,6 +1465,64 @@ "description": "Vind verkoopautomaten voor alles", "title": "Verkoopautomaten" }, + "walkingnodes": { + "description": "Deze kaart toont wandelknooppunten en laat je toe om eenvoudigweg nieuwe knooppunten toe te voegen", + "layers": { + "0": { + "name": "Verbindingen van node naar node", + "tagRenderings": { + "node2node-survey:date": { + "override": { + "question": "Wanneer werd deze node-naar-node verbinding het laast gesurveyed?", + "render": "Deze node-naar-node verbinding werd het laast gesurveyed op {survey:date}" + } + } + }, + "title": { + "mappings": { + "0": { + "then": "Node-naar-node verbinding {ref}" + } + }, + "render": "Node-naar-node verbinding" + } + }, + "1": { + "name": "Knooppunten", + "presets": { + "0": { + "title": "een wandelknooppunt" + } + }, + "tagRenderings": { + "node-expected_rwn_route_relations": { + "freeform": { + "placeholder": "bijv. 3" + }, + "question": "Met hoeveel andere wandelknooppunten heeft dit knooppunt een verbinding?", + "render": "Dit knooppunt verbindt met {expected_rwn_route_relations} andere wandelknooppunten." + }, + "node-rwn_ref": { + "freeform": { + "placeholder": "bijv. 1" + }, + "question": "Wat is het referentienummer van dit wandelknooppunt?", + "render": "Dit wandelknooppunt heeft referentienummer {rwn_ref}" + }, + "survey_date": { + "override": { + "question": "Wanneer is dit wandelknooppunt het laatst gesurveyed?", + "render": "Dit wandelknooppunt werd het laatst gesurveyed op {survey:date}" + } + } + }, + "title": { + "render": "Wandelknooppunt {rwn_ref}" + } + } + }, + "title": "Wandelknooppuntnetwerken" + }, "walls_and_buildings": { "description": "Speciale ingebouwde laag voor alle muren en gebouwen. Deze laag is nuttig in voorkeuzen voor objecten die tegen muren geplaatst kunnen worden (bv. AEDs, brievenbussen, ingangen, adressen, beveiligingscamera's,…). Deze laag is standaard onzichtbaar en niet in te schakelen door de gebruiker.", "title": "Muren en gebouwen" diff --git a/langs/themes/pa_PK.json b/langs/themes/pa_PK.json index 5fcf26d14..9a25fa676 100644 --- a/langs/themes/pa_PK.json +++ b/langs/themes/pa_PK.json @@ -267,6 +267,13 @@ "trees": { "title": "رُکھ" }, + "walkingnodes": { + "layers": { + "1": { + "name": "نوڈ" + } + } + }, "waste_basket": { "title": "کوڑے دی ٹوکری" } diff --git a/langs/themes/pl.json b/langs/themes/pl.json index 716d42353..ed7eba7b0 100644 --- a/langs/themes/pl.json +++ b/langs/themes/pl.json @@ -479,8 +479,10 @@ "name": "łącza węzeł do węzła", "tagRenderings": { "node2node-survey:date": { - "question": "Kiedy ostatnio badano to połączenie węzła z węzłem?", - "render": "To połączenie węzła z węzłem było ostatnio sprawdzane w dniu {survey:date}" + "override": { + "question": "Kiedy ostatnio badano to połączenie węzła z węzłem?", + "render": "To połączenie węzła z węzłem było ostatnio sprawdzane w dniu {survey:date}" + } } }, "title": { @@ -500,8 +502,10 @@ "render": "Ten węzeł łączy się z innymi węzłami rowerowymi {expected_rcn_route_relations}." }, "node-survey:date": { - "question": "Kiedy ostatni raz badano ten węzeł rowerowy?", - "render": "Ten węzeł rowerowy był ostatnio badany w dniu {survey:date}" + "override": { + "question": "Kiedy ostatni raz badano ten węzeł rowerowy?", + "render": "Ten węzeł rowerowy był ostatnio badany w dniu {survey:date}" + } } }, "title": { @@ -1341,6 +1345,32 @@ "description": "Znajdź wszelakie automaty sprzedające", "title": "Automaty sprzedające" }, + "walkingnodes": { + "layers": { + "0": { + "name": "łącza węzeł do węzła", + "tagRenderings": { + "node2node-survey:date": { + "override": { + "question": "Kiedy ostatnio badano to połączenie węzła z węzłem?", + "render": "To połączenie węzła z węzłem było ostatnio sprawdzane w dniu {survey:date}" + } + } + }, + "title": { + "mappings": { + "0": { + "then": "połączenie węzła z węzłem {ref}" + } + }, + "render": "połączenie węzła z węzłem" + } + }, + "1": { + "name": "węzły" + } + } + }, "walls_and_buildings": { "description": "Specjalna warstwa zabudowana zapewniająca wszystkie mury i budynki. Warstwa ta jest przydatna w ustawieniach wstępnych obiektów, które można umieścić przy ścianach (np. AED, skrzynki pocztowe, wejścia, adresy, kamery monitorujące itp.). Warstwa ta jest domyślnie niewidoczna i użytkownik nie może jej przełączać.", "title": "Ściany i budynki" diff --git a/package-lock.json b/package-lock.json index ae016280b..c6621b901 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "mapcomplete", - "version": "0.33.10", + "version": "0.34.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "mapcomplete", - "version": "0.33.10", + "version": "0.34.0", "license": "GPL-3.0-or-later", "dependencies": { "@rgossiaux/svelte-headlessui": "^1.0.2", @@ -42,6 +42,7 @@ "lz-string": "^1.4.4", "mangrove-reviews-typescript": "^1.1.0", "maplibre-gl": "^3.5.0", + "nano-markdown": "^1.2.2", "opening_hours": "^3.6.0", "osm-auth": "^2.2.0", "osmtogeojson": "^3.0.0-beta.5", @@ -5844,9 +5845,9 @@ } }, "node_modules/dependency-cruiser/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -9047,6 +9048,11 @@ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, + "node_modules/nano-markdown": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/nano-markdown/-/nano-markdown-1.2.2.tgz", + "integrity": "sha512-xp0zc42GsE0JVpcTxICpANgNbVfyhk2pUdRV3cDDxzqVZeXSZgrPGruwlj+umFQxo10BKD1qmWdEdxj1x+A0QQ==" + }, "node_modules/nanoid": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", @@ -9107,9 +9113,9 @@ } }, "node_modules/node-abi/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -10581,9 +10587,9 @@ } }, "node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -10614,9 +10620,9 @@ } }, "node_modules/semver-try-require/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -10729,9 +10735,9 @@ "dev": true }, "node_modules/sharp/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -11696,9 +11702,9 @@ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, "node_modules/tough-cookie": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz", - "integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", "optional": true, "peer": true, "dependencies": { @@ -17686,9 +17692,9 @@ } }, "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -20110,6 +20116,11 @@ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, + "nano-markdown": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/nano-markdown/-/nano-markdown-1.2.2.tgz", + "integrity": "sha512-xp0zc42GsE0JVpcTxICpANgNbVfyhk2pUdRV3cDDxzqVZeXSZgrPGruwlj+umFQxo10BKD1qmWdEdxj1x+A0QQ==" + }, "nanoid": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", @@ -20158,9 +20169,9 @@ } }, "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -21190,9 +21201,9 @@ } }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true }, "semver-try-require": { @@ -21214,9 +21225,9 @@ } }, "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -21306,9 +21317,9 @@ "dev": true }, "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -21988,9 +21999,9 @@ } }, "tough-cookie": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz", - "integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", "optional": true, "peer": true, "requires": { diff --git a/package.json b/package.json index c0b631172..fb06d8845 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mapcomplete", - "version": "0.33.13", + "version": "0.34.4", "repository": "https://github.com/pietervdvn/MapComplete", "description": "A small website to edit OSM easily", "bugs": "https://github.com/pietervdvn/MapComplete/issues", @@ -8,7 +8,6 @@ "main": "index.ts", "type": "module", "config": { - "#": "Use MAPCOMPLETE_CONFIGURATION to use an additional configuration, e.g. `MAPCOMPLETE_CONFIGURATION=config_hetzner`", "#oauth_credentials:comment": [ "`oauth_credentials` are the OAuth-2 credentials for the production-OSM server and the test-server.", "Are you deploying your own instance? Register your application too.", @@ -39,7 +38,7 @@ "start": "npm run generate:layeroverview && npm run strt", "strt": "vite --host | sed 's/localhost:/127.0.0.1:/g'", "strttest": "export NODE_OPTIONS=--max_old_space_size=8364 && parcel serve test.html assets/templates/*.svg assets/templates/fonts/*.ttf", - "watch:css": "tailwindcss -i index.css -o public/css/index-tailwind-output.css --watch", + "watch:css": "tailwindcss -i src/index.css -o public/css/index-tailwind-output.css --watch", "generate:css": "tailwindcss -i src/index.css -o public/css/index-tailwind-output.css", "generate:doctests": "doctest-ts-improved . --ignore .*.spec.ts --ignore .*ConfigJson.ts", "test:run-only": "vitest --run test", @@ -60,7 +59,9 @@ "generate:licenses": "vite-node scripts/generateLicenseInfo.ts -- --no-fail", "query:licenses": "vite-node scripts/generateLicenseInfo.ts -- --query", "generate:contributor-list": "vite-node scripts/generateContributors.ts", - "generate:schemas": "ts2json-schema -p Models/ThemeConfig/Json/ -o Docs/Schemas/ -t tsconfig.json -R . -m \".*ConfigJson\" && vite-node scripts/fixSchemas.ts ", + "generate:schemas": "ts2json-schema -p src/Models/ThemeConfig/Json/ -o Docs/Schemas/ -t tsconfig.json -R . -m \".*ConfigJson\" && echo 'tsjson is done' && vite-node scripts/fixSchemas.ts ", + "fix:schemas": "vite-node scripts/fixSchemas.ts ", + "watch:schemas": "cd Models/ThemeConfig/Json & ls | entr -s 'npm run generate:schemas' ", "generate:service-worker": "tsc src/service-worker.ts --outFile public/service-worker.js && git_hash=$(git rev-parse HEAD) && sed -i \"s/GITHUB-COMMIT/$git_hash/\" public/service-worker.js", "optimize-images": "cd assets/generated/ && find -name '*.png' -exec optipng '{}' \\; && echo 'PNGs are optimized'", "generate:stats": "vite-node scripts/GenerateSeries.ts", @@ -73,7 +74,7 @@ "lint:prettier": "prettier --check '**/*.ts' '**/*.svelte'", "format": "prettier --write '**/*.ts' '**/*.svelte'", "clean:tests": "find . -type f -name \"*.doctest.ts\" | xargs -r rm", - "clean": "rm -rf .cache/ && (find *.html | grep -v \"^\\(404\\|index\\|land\\|test\\|studio\\|theme\\|style_test\\|statistics\\|leaderboard).html\" | xargs -r rm) && (ls | grep \"^index_[a-zA-Z_-]\\+\\.ts$\" | xargs -r rm)", + "clean": "rm -rf .cache/ && (find *.html | grep -v \"^\\(404\\|index\\|land\\|test\\|studio\\|theme\\|style_test\\|statistics\\|leaderboard\\).html\" | xargs -r rm) && (ls | grep \"^index_[a-zA-Z_-]\\+\\.ts$\" | xargs -r rm)", "generate:dependency-graph": "node_modules/.bin/depcruise --exclude \"^node_modules\" --output-type dot Logic/State/MapState.ts > dependencies.dot && dot dependencies.dot -T svg -o dependencies.svg && rm dependencies.dot", "weblate-add-upstream": "git remote add weblate-github git@github.com:weblate/MapComplete.git && git remote add weblate-hosted-core https://hosted.weblate.org/git/mapcomplete/core/ && git remote add weblate-hosted-layers https://hosted.weblate.org/git/mapcomplete/layers/", "weblate-merge": "git remote update weblate-github; git merge weblate-github/weblate-mapcomplete-core weblate-github/weblate-mapcomplete-layers weblate-github/weblate-mapcomplete-layer-translations", @@ -126,6 +127,7 @@ "libphonenumber-js": "^1.10.8", "lz-string": "^1.4.4", "mangrove-reviews-typescript": "^1.1.0", + "nano-markdown": "^1.2.2", "maplibre-gl": "^3.5.0", "opening_hours": "^3.6.0", "osm-auth": "^2.2.0", diff --git a/public/assets/docs/CyclofixIntro.png b/public/assets/docs/CyclofixIntro.png new file mode 100644 index 000000000..e0c9b64cb Binary files /dev/null and b/public/assets/docs/CyclofixIntro.png differ diff --git a/public/assets/docs/CyclofixLayers.png b/public/assets/docs/CyclofixLayers.png new file mode 100644 index 000000000..8e4bd9036 Binary files /dev/null and b/public/assets/docs/CyclofixLayers.png differ diff --git a/public/assets/docs/CyclofixMap.png b/public/assets/docs/CyclofixMap.png new file mode 100644 index 000000000..a17786c9e Binary files /dev/null and b/public/assets/docs/CyclofixMap.png differ diff --git a/public/assets/docs/NodesAndLines.svg b/public/assets/docs/NodesAndLines.svg new file mode 100644 index 000000000..db1bcb385 --- /dev/null +++ b/public/assets/docs/NodesAndLines.svg @@ -0,0 +1,151 @@ + + + + + + + + + + + + + amenity=bench +backrest=yes +material=wood + + highway=path +surface=ground + + + + + + + + + + + + barrier=gate + + + + diff --git a/public/assets/docs/PredefinedOption.png b/public/assets/docs/PredefinedOption.png new file mode 100644 index 000000000..5e50afa51 Binary files /dev/null and b/public/assets/docs/PredefinedOption.png differ diff --git a/public/assets/docs/QuestionCombined.png b/public/assets/docs/QuestionCombined.png new file mode 100644 index 000000000..49f9bb604 Binary files /dev/null and b/public/assets/docs/QuestionCombined.png differ diff --git a/public/assets/docs/QuestionMulti.png b/public/assets/docs/QuestionMulti.png new file mode 100644 index 000000000..cb23a4a48 Binary files /dev/null and b/public/assets/docs/QuestionMulti.png differ diff --git a/public/assets/docs/QuestionPredefinedOptions.png b/public/assets/docs/QuestionPredefinedOptions.png new file mode 100644 index 000000000..a2c9e8914 Binary files /dev/null and b/public/assets/docs/QuestionPredefinedOptions.png differ diff --git a/public/assets/docs/QuestionTextField.png b/public/assets/docs/QuestionTextField.png new file mode 100644 index 000000000..cdf28b776 Binary files /dev/null and b/public/assets/docs/QuestionTextField.png differ diff --git a/public/assets/docs/RenderMulti.png b/public/assets/docs/RenderMulti.png new file mode 100644 index 000000000..e1821104e Binary files /dev/null and b/public/assets/docs/RenderMulti.png differ diff --git a/public/assets/docs/SpelOpDeWagen.jpg b/public/assets/docs/SpelOpDeWagen.jpg new file mode 100644 index 000000000..a0ce1dcea Binary files /dev/null and b/public/assets/docs/SpelOpDeWagen.jpg differ diff --git a/public/assets/docs/UIExample.png b/public/assets/docs/UIExample.png new file mode 100644 index 000000000..1bfeea827 Binary files /dev/null and b/public/assets/docs/UIExample.png differ diff --git a/public/css/index-tailwind-output.css b/public/css/index-tailwind-output.css index 6f99ba039..1da46e851 100644 --- a/public/css/index-tailwind-output.css +++ b/public/css/index-tailwind-output.css @@ -785,6 +785,10 @@ video { margin: 0.5rem; } +.m-4 { + margin: 1rem; +} + .m-1 { margin: 0.25rem; } @@ -797,10 +801,6 @@ video { margin: 0px; } -.m-4 { - margin: 1rem; -} - .m-3 { margin: 0.75rem; } @@ -813,6 +813,16 @@ video { margin: 1px; } +.mx-2 { + margin-left: 0.5rem; + margin-right: 0.5rem; +} + +.my-1 { + margin-top: 0.25rem; + margin-bottom: 0.25rem; +} + .mx-1 { margin-left: 0.25rem; margin-right: 0.25rem; @@ -838,16 +848,6 @@ video { margin-bottom: 0.75rem; } -.mx-2 { - margin-left: 0.5rem; - margin-right: 0.5rem; -} - -.my-1 { - margin-top: 0.25rem; - margin-bottom: 0.25rem; -} - .mx-4 { margin-left: 1rem; margin-right: 1rem; @@ -1129,10 +1129,6 @@ video { height: 16rem; } -.h-96 { - height: 24rem; -} - .max-h-12 { max-height: 3rem; } @@ -1145,8 +1141,8 @@ video { max-height: 1.75rem; } -.max-h-screen { - max-height: 100vh; +.max-h-60 { + max-height: 15rem; } .w-full { @@ -1219,15 +1215,15 @@ video { width: 2.5rem; } -.w-48 { - width: 12rem; -} - .w-min { width: -webkit-min-content; width: min-content; } +.w-48 { + width: 12rem; +} + .w-auto { width: auto; } @@ -1350,6 +1346,10 @@ video { align-items: stretch; } +.justify-start { + justify-content: flex-start; +} + .justify-end { justify-content: flex-end; } @@ -1492,14 +1492,14 @@ video { word-break: break-all; } -.rounded { - border-radius: 0.25rem; -} - .rounded-full { border-radius: 9999px; } +.rounded { + border-radius: 0.25rem; +} + .rounded-xl { border-radius: 0.75rem; } @@ -1586,6 +1586,14 @@ video { border-bottom-width: 2px; } +.border-l-4 { + border-left-width: 4px; +} + +.border-l { + border-left-width: 1px; +} + .border-t { border-top-width: 1px; } @@ -1594,10 +1602,6 @@ video { border-right-width: 1px; } -.border-l { - border-left-width: 1px; -} - .border-dashed { border-style: dashed; } @@ -1632,10 +1636,25 @@ video { border-color: rgb(107 114 128 / var(--tw-border-opacity)); } +.border-gray-800 { + --tw-border-opacity: 1; + border-color: rgb(31 41 55 / var(--tw-border-opacity)); +} + .border-opacity-50 { --tw-border-opacity: 0.5; } +.bg-gray-500 { + --tw-bg-opacity: 1; + background-color: rgb(107 114 128 / var(--tw-bg-opacity)); +} + +.bg-white { + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity)); +} + .bg-red-400 { --tw-bg-opacity: 1; background-color: rgb(248 113 113 / var(--tw-bg-opacity)); @@ -1646,11 +1665,6 @@ video { background-color: rgb(0 0 0 / var(--tw-bg-opacity)); } -.bg-white { - --tw-bg-opacity: 1; - background-color: rgb(255 255 255 / var(--tw-bg-opacity)); -} - .bg-gray-200 { --tw-bg-opacity: 1; background-color: rgb(229 231 235 / var(--tw-bg-opacity)); @@ -1698,6 +1712,11 @@ video { padding: 3rem; } +.px-2 { + padding-left: 0.5rem; + padding-right: 0.5rem; +} + .px-1 { padding-left: 0.25rem; padding-right: 0.25rem; @@ -1713,9 +1732,8 @@ video { padding-right: 0.75rem; } -.px-2 { - padding-left: 0.5rem; - padding-right: 0.5rem; +.pr-12 { + padding-right: 3rem; } .pl-1 { @@ -2077,6 +2095,10 @@ video { _: string; } +.\[a-zA-Z0-9\:_\] { + a-z-a--z0-9: ; +} + :root { /* * The main colour scheme of mapcomplete is configured here. @@ -2220,7 +2242,29 @@ input[type=text] { * This very important section defines what the various input elements look like within the 'low-interaction' and 'interactive'-blocks */ +button.small, .button.small { + line-height: 1rem; + margin: 0; + margin-left: 0.5rem; + padding: 0.25rem; + padding-left: 0.5rem; + padding-right: 0.5rem; + height: -webkit-fit-content; + height: -moz-fit-content; + height: fit-content; + font-size: unset; + border: 2px solid var(--button-background); + border-radius: 0.5rem; + font-weight: normal; + transition: all 250ms; + --tw-text-opacity: 1; + --tw-bg-opacity: 1; + background: var(--low-interaction-background); + color: var(--low-interaction-foreground); +} + button, .button { + align-items: center; display: inline-flex; line-height: 1.25rem; margin: 0.2rem; @@ -2229,7 +2273,6 @@ button, .button { padding-right: 0.6rem; font-size: large; font-weight: bold; - /*-- invisible border: rendered on hover*/ border: 2px solid var(--button-background); border-radius: 0.5rem; transition: all 250ms; @@ -2243,21 +2286,6 @@ button, .button { box-shadow: 0 5px 10px #88888888; } -button.small, .button.small { - line-height: 1rem; - margin: 0; - padding: 0.1rem; - font-size: unset; - /*-- invisible border: rendered on hover*/ - border: 2px solid var(--low-interaction-background); - border-radius: 0.1rem; - transition: all 250ms; - --tw-text-opacity: 1; - --tw-bg-opacity: 1; - background: var(--low-interaction-background); - color: var(--low-interaction-foreground); -} - button.selected, .button.selected { background-color: var(--catch-detail-color); border-color: var(--catch-detail-color); @@ -2445,6 +2473,37 @@ select:hover { border: 2px dotted #ff9143; } +.warning { + /* The class to convey important information, but not as grave as 'alert' */ + background-color: var(--low-interaction-background); + color: var(--alert-foreground-color); + font-weight: bold; + border-radius: 1em; + margin: 0.25em; + text-align: center; + padding: 0.15em 0.3em; + border: 3px dotted #ff9143; +} + +.low-interaction .warning { + background-color: var(--interactive-background); +} + +.information { + /* The class to convey important information which does _not_ denote an error... */ + background-color: var(--low-interaction-background); + color: var(--alert-foreground-color); + border-radius: 1em; + margin: 0.25em; + text-align: center; + padding: 0.15em 0.3em; + border: 3px dotted var(--catch-detail-color-contrast); +} + +.low-interaction .interactive { + background-color: var(--interactive-background); +} + .subtle { /* For all information that is not important for 99% of the users */ color: #999; @@ -2648,6 +2707,10 @@ a.link-underline { overflow-y: hidden; } +.min-h-32 { + min-height: 8rem; +} + .hover\:bg-indigo-200:hover { --tw-bg-opacity: 1; background-color: rgb(199 210 254 / var(--tw-bg-opacity)); @@ -2887,5 +2950,3 @@ a.link-underline { width: 33.333333%; } } - - diff --git a/scripts/Script.ts b/scripts/Script.ts index 1ff5a0161..48a727b22 100644 --- a/scripts/Script.ts +++ b/scripts/Script.ts @@ -13,7 +13,9 @@ export default abstract class Script { ScriptUtils.fixUtils() const args = [...process.argv] args.splice(0, 2) - this.main(args).then((_) => console.log("All done")) + this.main(args) + .then((_) => console.log("All done")) + .catch((e) => console.log("ERROR:", e)) } public printHelp() { diff --git a/scripts/ScriptUtils.ts b/scripts/ScriptUtils.ts index ac86735bf..26b4fc238 100644 --- a/scripts/ScriptUtils.ts +++ b/scripts/ScriptUtils.ts @@ -100,7 +100,7 @@ export default class ScriptUtils { .filter((path) => path.indexOf("license_info.json") < 0) } - public static getThemeFiles(): { parsed: LayoutConfigJson; path: string }[] { + public static getThemeFiles(): { parsed: LayoutConfigJson; path: string; raw: string }[] { return this.getThemePaths().map((path) => { try { const contents = readFileSync(path, { encoding: "utf8" }) @@ -108,7 +108,7 @@ export default class ScriptUtils { throw "The file " + path + " is empty, did you properly save?" } const parsed = JSON.parse(contents) - return { parsed: parsed, path: path } + return { parsed: parsed, path: path, raw: contents } } catch (e) { console.error("Could not read file ", path, "due to ", e) throw e diff --git a/scripts/build.sh b/scripts/build.sh index b530e79ea..3c3cc385b 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -24,13 +24,12 @@ fi -SRC_MAPS="" BRANCH=`git rev-parse --abbrev-ref HEAD` echo "The branch name is $BRANCH" if [ $BRANCH = "develop" ] then - # SRC_MAPS="--sourcemap" - echo "Source maps are NOT enabled as they consume to much RAM" + SRC_MAPS="--sourcemap" + echo "Source maps are enabled " fi if [ $BRANCH = "master" ] || [ $BRANCH = "develop" ] @@ -46,6 +45,7 @@ else fi export NODE_OPTIONS=--max-old-space-size=7000 +which vite vite build $SRC_MAPS # Copy the layer files, as these might contain assets (e.g. svgs) cp -r assets/layers/ dist/assets/layers/ diff --git a/scripts/fixSchemas.ts b/scripts/fixSchemas.ts index 7e1672b9d..3acfec8ee 100644 --- a/scripts/fixSchemas.ts +++ b/scripts/fixSchemas.ts @@ -1,39 +1,54 @@ import ScriptUtils from "./ScriptUtils" import { readFileSync, writeFileSync } from "fs" +import { JsonSchema } from "../src/UI/Studio/jsonSchema" +import { ConfigMeta } from "../src/UI/Studio/configMeta" +import { Utils } from "../src/Utils" +import Validators from "../src/UI/InputElement/Validators" +import { AllKnownLayouts } from "../src/Customizations/AllKnownLayouts" +import { AllSharedLayers } from "../src/Customizations/AllSharedLayers" -/** - * Extracts the data from the scheme file and writes them in a flatter structure - */ - -export type JsonSchemaType = - | string - | { $ref: string; description: string } - | { type: string } - | JsonSchemaType[] - -export interface JsonSchema { - description?: string - type?: JsonSchemaType - properties?: any - items?: JsonSchema - allOf?: JsonSchema[] - anyOf: JsonSchema[] - enum: JsonSchema[] - $ref: string +const metainfo = { + type: "One of the inputValidator types", + typeHelper: "Helper arguments for the type input, comma-separated. Same as 'args'", + types: "Is multiple types are allowed for this field, then first show a mapping to pick the appropriate subtype. `Types` should be `;`-separated and contain precisely the same amount of subtypes", + typesdefault: "Works in conjuction with `types`: this type will be selected by default", + group: "A kind of label. Items with the same group name will be placed in the same region", + default: "The default value which is used if no value is specified", + question: "The question to ask in the tagRenderingConfig", + iftrue: "For booleans only - text to show with 'yes'", + iffalse: "For booleans only - text to show with 'no'", + ifunset: + "Only applicable if _not_ a required item. This will appear in the 'not set'-option as extra description", + inline: "A text, containing `{value}`. This will be used as freeform rendering and will be included into the rendering", + suggestions: + 'a javascript expression generating mappings; executed in an environment which has access to `layers: Map` and `themes: Map`. Should return an array of type `{if: \'value=*\', then: string}[]`. Example: `return Array.from(layers.keys()).map(key => ({if: "value="+key, then: key+" - "+layers.get(key).description}))`. This code is executed at compile time, so no CSP is needed ', + title: "a title that is given to a MultiType", + multianswer: "set to 'true' if multiple options should be selectable", } +/** + * Applies 'onEach' on every leaf of the JSONSchema + * @param onEach + * @param scheme + * @param fullScheme + * @param path + * @param isHandlingReference + * @param required + * @constructor + */ function WalkScheme( - onEach: (schemePart: JsonSchema) => T, + onEach: (schemePart: JsonSchema, path: string[]) => T, scheme: JsonSchema, fullScheme: JsonSchema & { definitions?: any } = undefined, path: string[] = [], - isHandlingReference = [] -): { path: string[]; t: T }[] { - const results: { path: string[]; t: T }[] = [] + isHandlingReference = [], + required: string[], + skipRoot = false +): { path: string[]; required: boolean; t: T }[] { + const results: { path: string[]; required: boolean; t: T }[] = [] if (scheme === undefined) { return [] } - if (scheme["$ref"] !== undefined) { const ref = scheme["$ref"] const prefix = "#/definitions/" @@ -42,45 +57,63 @@ function WalkScheme( } const definitionName = ref.substr(prefix.length) if (isHandlingReference.indexOf(definitionName) >= 0) { + // We abort here to avoid infinite recursion return [] } + // The 'scheme' might contain some extra info, such as 'description' + // This effectively overwrites properties from the loaded scheme const loadedScheme = fullScheme.definitions[definitionName] - return WalkScheme(onEach, loadedScheme, fullScheme, path, [ - ...isHandlingReference, - definitionName, - ]) + const syntheticScheme = { ...loadedScheme, ...scheme } + syntheticScheme["child-description"] = loadedScheme.description + delete syntheticScheme["$ref"] + return WalkScheme( + onEach, + syntheticScheme, + fullScheme, + path, + [...isHandlingReference, definitionName], + required, + skipRoot + ) } fullScheme = fullScheme ?? scheme - var t = onEach(scheme) - if (t !== undefined) { - results.push({ - path, - t, - }) + if (!skipRoot) { + let t = onEach(scheme, path) + if (t !== undefined) { + const isRequired = required?.indexOf(path.at(-1)) >= 0 + results.push({ + path, + required: isRequired, + t, + }) + } } - function walk(v: JsonSchema) { + function walk(v: JsonSchema, skipRoot = false) { if (v === undefined) { return } - results.push(...WalkScheme(onEach, v, fullScheme, path, isHandlingReference)) + results.push( + ...WalkScheme(onEach, v, fullScheme, path, isHandlingReference, v.required, skipRoot) + ) } - function walkEach(scheme: JsonSchema[]) { + function walkEach(scheme: JsonSchema[], skipRoot: boolean = false) { if (scheme === undefined) { return } - scheme.forEach((v) => walk(v)) + scheme.forEach((v) => walk(v, skipRoot)) } { walkEach(scheme.enum) - walkEach(scheme.anyOf) + walkEach(scheme.anyOf, true) walkEach(scheme.allOf) if (Array.isArray(scheme.items)) { + // walk and walkEach are local functions which push to the result array walkEach(scheme.items) } else { walk(scheme.items) @@ -89,7 +122,14 @@ function WalkScheme( for (const key in scheme.properties) { const prop = scheme.properties[key] results.push( - ...WalkScheme(onEach, prop, fullScheme, [...path, key], isHandlingReference) + ...WalkScheme( + onEach, + prop, + fullScheme, + [...path, key], + isHandlingReference, + scheme.required + ) ) } } @@ -97,32 +137,218 @@ function WalkScheme( return results } -function extractMeta(typename: string, path: string) { - const themeSchema = JSON.parse( - readFileSync("./Docs/Schemas/" + typename + ".schema.json", { encoding: "utf8" }) - ) - const withTypes = WalkScheme((schemePart) => { +function extractHintsFrom( + description: string, + fieldnames: string[], + path: (string | number)[], + type: any, + schemepart: any +): Record { + if (!description) { + return {} + } + const hints = {} + const lines = description.split("\n") + for (const fieldname of fieldnames) { + const hintIndex = lines.findIndex((line) => + line + .trim() + .toLocaleLowerCase() + .startsWith(fieldname + ":") + ) + if (hintIndex < 0) { + continue + } + const hintLine = lines[hintIndex].substring((fieldname + ":").length).trim() + if (fieldname === "type") { + hints["typehint"] = hintLine + } else { + hints[fieldname] = hintLine + } + } + + if (hints["types"]) { + const notRequired = hints["ifunset"] !== undefined + const numberOfExpectedSubtypes = hints["types"].replaceAll("|", ";").split(";").length + if (!Array.isArray(type) && !notRequired) { + throw ( + "At " + + path.join(".") + + "Invalid hint in the documentation: `types` indicates that there are " + + numberOfExpectedSubtypes + + " subtypes, but object does not support subtypes. Did you mean `type` instead?\n\tTypes are: " + + hints["types"] + + "\n: hints: " + + JSON.stringify(hints) + + " req:" + + JSON.stringify(schemepart) + ) + } + const numberOfActualTypes = type.length + if ( + numberOfActualTypes !== numberOfExpectedSubtypes && + notRequired && + numberOfActualTypes + 1 !== numberOfExpectedSubtypes + ) { + throw `At ${path.join( + "." + )}\nInvalid hint in the documentation: \`types\` indicates that there are ${numberOfExpectedSubtypes} subtypes, but there are ${numberOfActualTypes} subtypes +\tTypes are: ${hints["types"]}` + } + } + + if (hints["suggestions"]) { + const suggestions = hints["suggestions"] + const f = new Function("{ layers, themes, validators }", suggestions) + hints["suggestions"] = f({ + layers: AllSharedLayers.sharedLayers, + themes: AllKnownLayouts.allKnownLayouts, + validators: Validators, + }) + } + return hints +} + +/** + * Extracts the 'configMeta' from the given schema, based on attributes in the description + * @param fieldnames + * @param fullSchema + */ +function addMetafields(fieldnames: string[], fullSchema: JsonSchema): ConfigMeta[] { + const fieldNamesSet = new Set(fieldnames) + const onEach = (schemePart, path) => { if (schemePart.description === undefined) { return } - const typeHint = schemePart.description - .split("\n") - .find((line) => line.trim().toLocaleLowerCase().startsWith("type:")) - ?.substr("type:".length) - ?.trim() const type = schemePart.items?.anyOf ?? schemePart.type ?? schemePart.anyOf - return { typeHint, type, description: schemePart.description } - }, themeSchema) + let description = schemePart.description - const paths = withTypes.map(({ path, t }) => ({ path, ...t })) - writeFileSync("./assets/" + path + ".json", JSON.stringify(paths, null, " ")) - console.log("Written meta to ./assets/" + path) + let hints = extractHintsFrom(description, fieldnames, path, type, schemePart) + const childDescription = schemePart["child-description"] + if (childDescription) { + const childHints = extractHintsFrom( + childDescription, + fieldnames, + path, + type, + schemePart + ) + hints = { ...childHints, ...hints } + description = description ?? childDescription + } + + const cleanedDescription: string[] = [] + for (const line of description.split("\n")) { + const keyword = line.split(":").at(0).trim().toLowerCase() + if (fieldNamesSet.has(keyword)) { + continue + } + cleanedDescription.push(line) + } + return { + hints, + type, + description: cleanedDescription.filter((l) => l !== "").join("\n"), + } + } + + return WalkScheme(onEach, fullSchema, fullSchema, [], [], fullSchema.required).map( + ({ path, required, t }) => ({ path, required, ...t }) + ) +} + +function substituteReferences( + paths: ConfigMeta[], + origSchema: JsonSchema, + allDefinitions: Record +) { + for (const path of paths) { + if (!Array.isArray(path.type)) { + continue + } + + for (let i = 0; i < path.type.length; i++) { + const typeElement = path.type[i] + const ref = typeElement["$ref"] + if (!ref) { + continue + } + const name = ref.substring("#/definitions/".length) + if (name.startsWith("{") || name.startsWith("Record<")) { + continue + } + if (origSchema["definitions"]?.[name]) { + path.type[i] = origSchema["definitions"]?.[name] + continue + } + + if (name === "DeleteConfigJson" || name === "TagRenderingConfigJson") { + const target = allDefinitions[name] + if (!target) { + throw "Cannot expand reference for type " + name + "; it does not exist " + } + path.type[i] = target + } + } + } +} + +function validateMeta(path: ConfigMeta): string | undefined { + if (path.path.length == 0) { + return + } + const ctx = "Definition for field '" + path.path.join(".") + "'" + if (path.hints.group === undefined && path.path.length == 1) { + return ( + ctx + + " does not have a group set (but it is a top-level element which should have a group) " + ) + } + if (path.hints.group === "hidden") { + return undefined + } + if (path.hints.typehint === "tag") { + return undefined + } + if (path.path[0] == "mapRendering" || path.path[0] == "tagRenderings") { + return undefined + } + if (path.hints.question === undefined && !Array.isArray(path.type)) { + /* return ( + ctx + + " does not have a question set. As such, MapComplete-studio users will not be able to set this property" +) //*/ + } + + return undefined +} + +function extractMeta( + typename: string, + path: string, + allDefinitions: Record +): string[] { + const schema: JsonSchema = JSON.parse( + readFileSync("./Docs/Schemas/" + typename + ".schema.json", { encoding: "utf8" }) + ) + + const metakeys = Array.from(Object.keys(metainfo)).map((s) => s.toLowerCase()) + + const paths = addMetafields(metakeys, schema) + + substituteReferences(paths, schema, allDefinitions) + + const fullPath = "./src/assets/schemas/" + path + ".json" + writeFileSync(fullPath, JSON.stringify(paths, null, " ")) + console.log("Written meta to " + fullPath) + return Utils.NoNull(paths.map((p) => validateMeta(p))) } function main() { const allSchemas = ScriptUtils.readDirRecSync("./Docs/Schemas").filter((pth) => pth.endsWith("JSC.ts") ) + const allDefinitions: Record = {} for (const path of allSchemas) { const dir = path.substring(0, path.lastIndexOf("/")) const name = path.substring(path.lastIndexOf("/"), path.length - "JSC.ts".length) @@ -137,14 +363,29 @@ function main() { def["additionalProperties"] = false } } + + allDefinitions[name.substring(1)] = parsed writeFileSync(dir + "/" + name + ".schema.json", JSON.stringify(parsed, null, " "), { encoding: "utf8", }) } - - extractMeta("LayoutConfigJson", "layoutconfigmeta") - extractMeta("TagRenderingConfigJson", "tagrenderingconfigmeta") - extractMeta("QuestionableTagRenderingConfigJson", "questionabletagrenderingconfigmeta") + const errs: string[] = [] + errs.push(...extractMeta("LayerConfigJson", "layerconfigmeta", allDefinitions)) + errs.push(...extractMeta("LayoutConfigJson", "layoutconfigmeta", allDefinitions)) + errs.push(...extractMeta("TagRenderingConfigJson", "tagrenderingconfigmeta", allDefinitions)) + errs.push( + ...extractMeta( + "QuestionableTagRenderingConfigJson", + "questionabletagrenderingconfigmeta", + allDefinitions + ) + ) + if (errs.length > 0) { + for (const err of errs) { + console.error(err) + } + console.log((errs.length < 25 ? "Only " : "") + errs.length + " errors to solve") + } } main() diff --git a/scripts/generateDocs.ts b/scripts/generateDocs.ts index 0123ab028..d95a9a1a8 100644 --- a/scripts/generateDocs.ts +++ b/scripts/generateDocs.ts @@ -1,6 +1,6 @@ import Combine from "../src/UI/Base/Combine" import BaseUIElement from "../src/UI/BaseUIElement" -import { existsSync, mkdirSync, writeFile, writeFileSync } from "fs" +import { existsSync, mkdirSync, readFileSync, writeFile, writeFileSync } from "fs" import { AllKnownLayouts } from "../src/Customizations/AllKnownLayouts" import TableOfContents from "../src/UI/Base/TableOfContents" import SimpleMetaTaggers from "../src/Logic/SimpleMetaTagger" @@ -15,6 +15,7 @@ import themeOverview from "../src/assets/generated/theme_overview.json" import LayoutConfig from "../src/Models/ThemeConfig/LayoutConfig" import bookcases from "../src/assets/generated/themes/bookcases.json" import fakedom from "fake-dom" + import Hotkeys from "../src/UI/Base/Hotkeys" import { QueryParameters } from "../src/Logic/Web/QueryParameters" import Link from "../src/UI/Base/Link" @@ -26,10 +27,11 @@ import ThemeViewState from "../src/Models/ThemeViewState" import Validators from "../src/UI/InputElement/Validators" import questions from "../src/assets/generated/layers/questions.json" import { LayerConfigJson } from "../src/Models/ThemeConfig/Json/LayerConfigJson" - +import { Utils } from "../src/Utils" +import { TagUtils } from "../src/Logic/Tags/TagUtils" function WriteFile( filename, - html: BaseUIElement, + html: string | BaseUIElement, autogenSource: string[], options?: { noTableOfContents: boolean @@ -116,7 +118,7 @@ function GenLayerOverviewText(): BaseUIElement { } const allLayers: LayerConfig[] = Array.from(AllSharedLayers.sharedLayers.values()).filter( - (layer) => layer.source === null + (layer) => layer["source"] === null ) const builtinLayerIds: Set = new Set() @@ -154,17 +156,17 @@ function GenLayerOverviewText(): BaseUIElement { "MapComplete has a few data layers available in the theme which have special properties through builtin-hooks. Furthermore, there are some normal layers (which are built from normal Theme-config files) but are so general that they get a mention here.", new Title("Priviliged layers", 1), new List(Constants.priviliged_layers.map((id) => "[" + id + "](#" + id + ")")), - ...Constants.priviliged_layers - .map((id) => AllSharedLayers.sharedLayers.get(id)) - .map((l) => - l.GenerateDocumentation( - themesPerLayer.get(l.id), - layerIsNeededBy, - DependencyCalculator.getLayerDependencies(l), - Constants.added_by_default.indexOf(l.id) >= 0, - Constants.no_include.indexOf(l.id) < 0 - ) - ), + ...Utils.NoNull( + Constants.priviliged_layers.map((id) => AllSharedLayers.sharedLayers.get(id)) + ).map((l) => + l.GenerateDocumentation( + themesPerLayer.get(l.id), + layerIsNeededBy, + DependencyCalculator.getLayerDependencies(l), + Constants.added_by_default.indexOf(l.id) >= 0, + Constants.no_include.indexOf(l.id) < 0 + ) + ), new Title("Normal layers", 1), "The following layers are included in MapComplete:", new List( @@ -185,7 +187,7 @@ function GenOverviewsForSingleLayer( callback: (layer: LayerConfig, element: BaseUIElement, inlineSource: string) => void ): void { const allLayers: LayerConfig[] = Array.from(AllSharedLayers.sharedLayers.values()).filter( - (layer) => layer.source !== null + (layer) => layer["source"] !== null ) const builtinLayerIds: Set = new Set() allLayers.forEach((l) => builtinLayerIds.add(l.id)) @@ -307,10 +309,41 @@ function generateWikipage() { }) } +function studioDocsFor(source: string, target: string) { + const lines = readFileSync(source, "utf8").split("\n") + + const sections: string[][] = [] + let currentSection: string[] = [] + for (let line of lines) { + if (line.trim().startsWith("# ")) { + sections.push(currentSection) + currentSection = [] + } + line = line.replace('src="../../public/', 'src="./') + line = line.replace('src="../../', 'src="./') + currentSection.push(line) + } + sections.push(currentSection) + writeFileSync( + target, + JSON.stringify({ + sections: sections.map((s) => s.join("\n")).filter((s) => s.length > 0), + }) + ) +} + +function studioDocs() { + studioDocsFor("./Docs/Studio/Introduction.md", "./src/assets/studio_introduction.json") + studioDocsFor( + "./Docs/Studio/TagRenderingIntro.md", + "./src/assets/studio_tagrenderings_intro.json" + ) +} + console.log("Starting documentation generation...") ScriptUtils.fixUtils() +studioDocs() generateWikipage() - GenOverviewsForSingleLayer((layer, element, inlineSource) => { ScriptUtils.erasableLog("Exporting layer documentation for", layer.id) if (!existsSync("./Docs/Layers")) { @@ -358,6 +391,7 @@ const qLayer = new LayerConfig(questions, "questions.json", tru WriteFile("./Docs/BuiltinQuestions.md", qLayer.GenerateDocumentation([], new Map(), []), [ "assets/layers/questions/questions.json", ]) +WriteFile("./Docs/Tags_format.md", TagUtils.generateDocs(), ["src/Logic/Tags/TagUtils.ts"]) { // Generate the builtinIndex which shows interlayer dependencies @@ -422,4 +456,5 @@ QueryParameters.GetQueryParameter( new ThemeViewState(new LayoutConfig(bookcases)) WriteFile("./Docs/Hotkeys.md", Hotkeys.generateDocumentation(), []) } + console.log("Generated docs") diff --git a/scripts/generateImageAnalysis.ts b/scripts/generateImageAnalysis.ts index b5b36f6bf..13478819e 100644 --- a/scripts/generateImageAnalysis.ts +++ b/scripts/generateImageAnalysis.ts @@ -15,7 +15,13 @@ import Constants from "../src/Models/Constants" export default class GenerateImageAnalysis extends Script { constructor() { super( - "Downloads (from overpass) all tags which have an imgur-image; then analyses the licenses" + [ + "Downloads (from overpass) all tags which have an imgur-image; then analyses the licenses and downloads all the images", + "", + "Arguments:", + "Path to download the images to", + "Path to save the overview to", + ].join("\n") ) } @@ -380,11 +386,12 @@ export default class GenerateImageAnalysis extends Script { console.log("Args are", args) const cached = args.indexOf("--cached") < 0 args = args.filter((a) => a !== "--cached") - const datapath = args[0] ?? "../../git/MapComplete-data/ImageLicenseInfo" + const datapath = args[1] ?? "../../git/MapComplete-data/ImageLicenseInfo" + const imageBackupPath = args[0] await this.downloadData(datapath, cached) await this.downloadMetadata(datapath) - await this.downloadAllImages(datapath, "/home/pietervdvn/data/imgur-image-backup") + await this.downloadAllImages(datapath, imageBackupPath) this.analyze(datapath) } } diff --git a/scripts/generateIncludedImages.ts b/scripts/generateIncludedImages.ts index 5d5295b0a..ef1e9c9ea 100644 --- a/scripts/generateIncludedImages.ts +++ b/scripts/generateIncludedImages.ts @@ -1,11 +1,10 @@ import * as fs from "fs" - function genImages(dryrun = false) { console.log("Generating images") const dir = fs.readdirSync("./assets/svg") let module = - 'import Img from "./UI/Base/Img";\nimport {FixedUiElement} from "./UI/Base/FixedUiElement";\n\nexport default class Svg {\n\n\n' + 'import Img from "./UI/Base/Img";\nimport {FixedUiElement} from "./UI/Base/FixedUiElement";\n\n/* @deprecated */\nexport default class Svg {\n\n\n' const allNames: string[] = [] for (const path of dir) { if (path.endsWith("license_info.json")) { @@ -27,10 +26,14 @@ function genImages(dryrun = false) { .replace(/\r/g, "") .replace(/\\/g, "\\") .replace(/"/g, '\\"') + .replaceAll(" ", " ") - let hasNonAsciiChars = Array.from(svg).some((char) => char.charCodeAt(0) > 127) - if (hasNonAsciiChars) { - throw "The svg '" + path + "' has non-ascii characters" + let hasNonAsciiChars = Array.from(svg) + .filter((char) => char.charCodeAt(0) > 127) + .map((char) => char.charCodeAt(0)) + .join(", ") + if (hasNonAsciiChars.length > 0) { + throw "The svg '" + path + "' has non-ascii characters: " + hasNonAsciiChars } const name = path.substring(0, path.length - 4).replace(/[ -]/g, "_") @@ -45,6 +48,12 @@ function genImages(dryrun = false) { if (!dryrun) { allNames.push(`"${path}": Svg.${name}`) } + + const nameUC = name.toUpperCase().at(0) + name.substring(1) + const svelteCode = + '\n' + + svg.replace(/\\"/g, '"').replace(/(rgb\(0%,0%,0%\)|#000000|#000)/g, "{color}") + fs.writeFileSync("./src/assets/svg/" + nameUC + ".svelte", svelteCode, "utf8") } module += `public static All = {${allNames.join(",")}};` module += "}\n" diff --git a/scripts/generateLayerOverview.ts b/scripts/generateLayerOverview.ts index cceedfec9..dc7779fd6 100644 --- a/scripts/generateLayerOverview.ts +++ b/scripts/generateLayerOverview.ts @@ -12,19 +12,122 @@ import { ValidateThemeAndLayers, } from "../src/Models/ThemeConfig/Conversion/Validation" import { Translation } from "../src/UI/i18n/Translation" -import { TagRenderingConfigJson } from "../src/Models/ThemeConfig/Json/TagRenderingConfigJson" -import PointRenderingConfigJson from "../src/Models/ThemeConfig/Json/PointRenderingConfigJson" import { PrepareLayer } from "../src/Models/ThemeConfig/Conversion/PrepareLayer" import { PrepareTheme } from "../src/Models/ThemeConfig/Conversion/PrepareTheme" -import { DesugaringContext } from "../src/Models/ThemeConfig/Conversion/Conversion" +import { + Conversion, + DesugaringContext, + DesugaringStep, +} from "../src/Models/ThemeConfig/Conversion/Conversion" import { Utils } from "../src/Utils" import Script from "./Script" import { AllSharedLayers } from "../src/Customizations/AllSharedLayers" import { parse as parse_html } from "node-html-parser" import { ExtraFunctions } from "../src/Logic/ExtraFunctions" +import { QuestionableTagRenderingConfigJson } from "../src/Models/ThemeConfig/Json/QuestionableTagRenderingConfigJson" +import LayerConfig from "../src/Models/ThemeConfig/LayerConfig" +import PointRenderingConfig from "../src/Models/ThemeConfig/PointRenderingConfig" + +import { ConfigMeta } from "../src/UI/Studio/configMeta" +import { ConversionContext } from "../src/Models/ThemeConfig/Conversion/ConversionContext" + // This scripts scans 'src/assets/layers/*.json' for layer definition files and 'src/assets/themes/*.json' for theme definition files. // It spits out an overview of those to be used to load them +class ParseLayer extends Conversion< + string, + { + parsed: LayerConfig + raw: LayerConfigJson + } +> { + private readonly _prepareLayer: PrepareLayer + private readonly _doesImageExist: DoesImageExist + + constructor(prepareLayer: PrepareLayer, doesImageExist: DoesImageExist) { + super("Parsed a layer from file, validates it", [], "ParseLayer") + this._prepareLayer = prepareLayer + this._doesImageExist = doesImageExist + } + + convert( + path: string, + context: ConversionContext + ): { + parsed: LayerConfig + raw: LayerConfigJson + } { + let parsed + let fileContents + try { + fileContents = readFileSync(path, "utf8") + } catch (e) { + context.err("Could not read file " + path + " due to " + e) + return undefined + } + try { + parsed = JSON.parse(fileContents) + } catch (e) { + context.err("Could not parse file as JSON") + return undefined + } + if (parsed === undefined) { + context.err("yielded undefined") + return undefined + } + const fixed = this._prepareLayer.convert(parsed, context.inOperation("PrepareLayer")) + + if (!fixed.source) { + context.enter("source").err("No source is configured") + return undefined + } + + if ( + typeof fixed.source !== "string" && + fixed.source["osmTags"] && + fixed.source["osmTags"]["and"] === undefined + ) { + fixed.source["osmTags"] = { and: [fixed.source["osmTags"]] } + } + + const validator = new ValidateLayer(path, true, this._doesImageExist) + return validator.convert(fixed, context.inOperation("ValidateLayer")) + } +} + +class AddIconSummary extends DesugaringStep<{ raw: LayerConfigJson; parsed: LayerConfig }> { + static singleton = new AddIconSummary() + + constructor() { + super("Adds an icon summary for quick reference", ["_layerIcon"], "AddIconSummary") + } + + convert(json: { raw: LayerConfigJson; parsed: LayerConfig }, context: ConversionContext) { + // Add a summary of the icon + const fixed = json.raw + const layerConfig = json.parsed + const pointRendering: PointRenderingConfig = layerConfig.mapRendering.find((pr) => + pr.location.has("point") + ) + const defaultTags = layerConfig.GetBaseTags() + fixed["_layerIcon"] = Utils.NoNull( + (pointRendering?.marker ?? []).map((i) => { + const icon = i.icon?.GetRenderValue(defaultTags)?.txt + if (!icon) { + return undefined + } + const result = { icon } + const c = i.color?.GetRenderValue(defaultTags)?.txt + if (c) { + result["color"] = c + } + return result + }) + ) + return { raw: fixed, parsed: layerConfig } + } +} + class LayerOverviewUtils extends Script { public static readonly layerPath = "./src/assets/generated/layers/" public static readonly themePath = "./src/assets/generated/themes/" @@ -44,6 +147,14 @@ class LayerOverviewUtils extends Script { includeInlineLayers = true ): string[] { const publicLayerIds = [] + if (!Array.isArray(themeFile.layers)) { + throw ( + "Cannot iterate over 'layers' of " + + themeFile.id + + "; it is a " + + typeof themeFile.layers + ) + } for (const publicLayer of themeFile.layers) { if (typeof publicLayer === "string") { publicLayerIds.push(publicLayer) @@ -74,7 +185,14 @@ class LayerOverviewUtils extends Script { sourcefile = [sourcefile] } - return sourcefile.some((sourcefile) => statSync(sourcefile).mtime > targetModified) + for (const path of sourcefile) { + const hasChange = statSync(path).mtime > targetModified + if (hasChange) { + console.log("File ", targetfile, " should be updated as ", path, "has been changed") + return true + } + } + return false } writeSmallOverview( @@ -85,7 +203,13 @@ class LayerOverviewUtils extends Script { icon: string hideFromOverview: boolean mustHaveLanguage: boolean - layers: (LayerConfigJson | string | { builtin })[] + layers: ( + | LayerConfigJson + | string + | { + builtin + } + )[] }[] ) { const perId = new Map() @@ -135,6 +259,7 @@ class LayerOverviewUtils extends Script { if (!existsSync(LayerOverviewUtils.themePath)) { mkdirSync(LayerOverviewUtils.themePath) } + writeFileSync( `${LayerOverviewUtils.themePath}${theme.id}.json`, JSON.stringify(theme, null, " "), @@ -155,8 +280,8 @@ class LayerOverviewUtils extends Script { getSharedTagRenderings( doesImageExist: DoesImageExist, - bootstrapTagRenderings: Map = null - ): Map { + bootstrapTagRenderings: Map = null + ): Map { const prepareLayer = new PrepareLayer({ tagRenderings: bootstrapTagRenderings, sharedLayers: null, @@ -164,13 +289,13 @@ class LayerOverviewUtils extends Script { }) let path = "assets/layers/questions/questions.json" - const sharedQuestions = this.parseLayer(doesImageExist, prepareLayer, path) + const sharedQuestions = this.parseLayer(doesImageExist, prepareLayer, path).raw - const dict = new Map() + const dict = new Map() for (const tr of sharedQuestions.tagRenderings) { - const tagRendering = tr - dict.set(tagRendering.id, tagRendering) + const tagRendering = tr + dict.set(tagRendering["id"], tagRendering) } if (dict.size === bootstrapTagRenderings?.size) { @@ -228,6 +353,8 @@ class LayerOverviewUtils extends Script { } async main(args: string[]) { + console.log("Generating layer overview...") + const start = new Date() const forceReload = args.some((a) => a == "--force") const licensePaths = new Set() @@ -286,8 +413,8 @@ class LayerOverviewUtils extends Script { const protolayer = ( proto.layers.filter((l) => l["id"] === "mapcomplete-changes")[0] ) - const rendering = protolayer.mapRendering[0] - rendering.icon["mappings"] = iconsPerTheme + const rendering = protolayer.pointRendering[0] + rendering.marker[0].icon["mappings"] = iconsPerTheme writeFileSync( "./assets/themes/mapcomplete-changes/mapcomplete-changes.json", JSON.stringify(proto, null, " ") @@ -301,14 +428,20 @@ class LayerOverviewUtils extends Script { layers: ScriptUtils.getLayerFiles().map((f) => f.parsed), themes: ScriptUtils.getThemeFiles().map((f) => f.parsed), }, - "GenerateLayerOverview:" + ConversionContext.construct([], []) ) + const end = new Date() + const millisNeeded = end.getTime() - start.getTime() if (AllSharedLayers.getSharedLayersConfigs().size == 0) { - console.error("This was a bootstrapping-run. Run generate layeroverview again!") + console.error( + "This was a bootstrapping-run. Run generate layeroverview again!(" + + millisNeeded + + " ms)" + ) } else { const green = (s) => "\x1b[92m" + s + "\x1b[0m" - console.log(green("All done!")) + console.log(green("All done! (" + millisNeeded + " ms)")) } } @@ -316,33 +449,19 @@ class LayerOverviewUtils extends Script { doesImageExist: DoesImageExist, prepLayer: PrepareLayer, sharedLayerPath: string - ): LayerConfigJson { - let parsed - try { - parsed = JSON.parse(readFileSync(sharedLayerPath, "utf8")) - } catch (e) { - throw "Could not parse or read file " + sharedLayerPath - } - const context = "While building builtin layer " + sharedLayerPath - const fixed = prepLayer.convertStrict(parsed, context) - - if (!fixed.source) { - console.error(sharedLayerPath, "has no source configured:", fixed) - throw sharedLayerPath + " layer has no source configured" - } - - if ( - typeof fixed.source !== "string" && - fixed.source["osmTags"] && - fixed.source["osmTags"]["and"] === undefined - ) { - fixed.source["osmTags"] = { and: [fixed.source["osmTags"]] } - } - - const validator = new ValidateLayer(sharedLayerPath, true, doesImageExist) - validator.convertStrict(fixed, context) - - return fixed + ): { + raw: LayerConfigJson + parsed: LayerConfig + context: ConversionContext + } { + const parser = new ParseLayer(prepLayer, doesImageExist) + const context = ConversionContext.construct([sharedLayerPath], ["ParseLayer"]) + const parsed = parser.convertStrict(sharedLayerPath, context) + const result = AddIconSummary.singleton.convertStrict( + parsed, + context.inOperation("AddIconSummary") + ) + return { ...result, context } } private buildLayerIndex( @@ -363,6 +482,7 @@ class LayerOverviewUtils extends Script { const prepLayer = new PrepareLayer(state) const skippedLayers: string[] = [] const recompiledLayers: string[] = [] + let warningCount = 0 for (const sharedLayerPath of ScriptUtils.getLayerPaths()) { { const targetPath = @@ -372,15 +492,16 @@ class LayerOverviewUtils extends Script { const sharedLayer = JSON.parse(readFileSync(targetPath, "utf8")) sharedLayers.set(sharedLayer.id, sharedLayer) skippedLayers.push(sharedLayer.id) - console.log("Loaded " + sharedLayer.id) + ScriptUtils.erasableLog("Loaded " + sharedLayer.id) continue } } - const fixed = this.parseLayer(doesImageExist, prepLayer, sharedLayerPath) - + const parsed = this.parseLayer(doesImageExist, prepLayer, sharedLayerPath) + warningCount += parsed.context.getAll("warning").length + const fixed = parsed.raw if (sharedLayers.has(fixed.id)) { - throw "There are multiple layers with the id " + fixed.id + throw "There are multiple layers with the id " + fixed.id + ", " + sharedLayerPath } sharedLayers.set(fixed.id, fixed) @@ -394,7 +515,9 @@ class LayerOverviewUtils extends Script { recompiledLayers.join(", ") + " and skipped " + skippedLayers.length + - " layers" + " layers. Detected " + + warningCount + + " warnings" ) // We always need the calculated tags of 'usersettings', so we export them separately this.extractJavascriptCodeForLayer( @@ -475,7 +598,6 @@ class LayerOverviewUtils extends Script { } else { importPath = "" for (let i = 0; i < l.length - 3; i++) { - const _ = l[i] importPath += "../" } } @@ -580,24 +702,31 @@ class LayerOverviewUtils extends Script { readFileSync(LayerOverviewUtils.themePath + themeFile.id + ".json", "utf8") ) ) - console.log("Skipping", themeFile.id) + ScriptUtils.erasableLog("Skipping", themeFile.id) skippedThemes.push(themeFile.id) continue } - console.log(`Validating ${i}/${themeFiles.length} '${themeInfo.parsed.id}'`) recompiledThemes.push(themeFile.id) - new PrevalidateTheme().convertStrict(themeFile, themePath) + new PrevalidateTheme().convertStrict( + themeFile, + ConversionContext.construct([themePath], ["PrepareLayer"]) + ) try { - themeFile = new PrepareTheme(convertState).convertStrict(themeFile, themePath) - + themeFile = new PrepareTheme(convertState).convertStrict( + themeFile, + ConversionContext.construct([themePath], ["PrepareLayer"]) + ) new ValidateThemeAndLayers( new DoesImageExist(licensePaths, existsSync, knownTagRenderings), themePath, true, knownTagRenderings - ).convertStrict(themeFile, themePath) + ).convertStrict( + themeFile, + ConversionContext.construct([themePath], ["PrepareLayer"]) + ) if (themeFile.icon.endsWith(".svg")) { try { @@ -647,7 +776,7 @@ class LayerOverviewUtils extends Script { t.shortDescription ?? new Translation(t.description) .FirstSentence() - .OnEveryLanguage((s) => parse_html(s).innerText).translations, + .OnEveryLanguage((s) => parse_html(s).textContent).translations, mustHaveLanguage: t.mustHaveLanguage?.length > 0, } }) diff --git a/scripts/generateLicenseInfo.ts b/scripts/generateLicenseInfo.ts index 915db7cdc..22b994f39 100644 --- a/scripts/generateLicenseInfo.ts +++ b/scripts/generateLicenseInfo.ts @@ -64,6 +64,12 @@ export class GenerateLicenseInfo extends Script { license: "CC0", sources: [], }) + knownLicenses.set("carto", { + authors: ["OSM-Carto"], + path: undefined, + license: "CC0", + sources: [""], + }) knownLicenses.set("tv", { authors: ["Toerisme Vlaanderen"], path: undefined, @@ -172,10 +178,6 @@ export class GenerateLicenseInfo extends Script { if (author == "Q" || author == "q" || author == "") { throw "Quitting now!" } - let authors = author.split(";") - if (author.toLowerCase() == "none") { - authors = [] - } return { authors: author.split(";"), path: path, diff --git a/scripts/generateTranslations.ts b/scripts/generateTranslations.ts index 0e8a3036d..dfcc2f03d 100644 --- a/scripts/generateTranslations.ts +++ b/scripts/generateTranslations.ts @@ -2,6 +2,7 @@ import * as fs from "fs" import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs" import { Utils } from "../src/Utils" import ScriptUtils from "./ScriptUtils" +import Script from "./Script" const knownLanguages = ["en", "nl", "de", "fr", "es", "gl", "ca"] @@ -658,32 +659,64 @@ function loadTranslationFilesFrom(target: string): Map { /** * Load the translations from the weblate files back into the layers */ -function mergeLayerTranslations() { +function mergeLayerTranslations(englishOnly: boolean = false) { const layerFiles = ScriptUtils.getLayerFiles() for (const layerFile of layerFiles) { mergeLayerTranslation(layerFile.parsed, layerFile.path, loadTranslationFilesFrom("layers")) const endsWithNewline = readFileSync(layerFile.path, { encoding: "utf8" })?.endsWith("\n") ?? true + let config = layerFile.parsed + if (englishOnly) { + config = Utils.Clone(config) + removeNonEnglishTranslations(config) + } writeFileSync( layerFile.path, - JSON.stringify(layerFile.parsed, null, " ") + (endsWithNewline ? "\n" : "") + JSON.stringify(config, null, " ") + (endsWithNewline ? "\n" : "") ) // layers use 2 spaces } } +function removeNonEnglishTranslations(object: any) { + Utils.WalkObject( + object, + (leaf: any) => { + const en = leaf["en"] + if (!en) { + return + } + for (const key in leaf) { + if (key.startsWith("#")) { + continue + } + delete leaf[key] + } + leaf["en"] = en + }, + (possibleLeaf) => + possibleLeaf !== null && typeof possibleLeaf === "object" && isTranslation(possibleLeaf) + ) +} + /** * Load the translations into the theme files */ -function mergeThemeTranslations() { +function mergeThemeTranslations(englishOnly: boolean = false) { const themeFiles = ScriptUtils.getThemeFiles() for (const themeFile of themeFiles) { - const config = themeFile.parsed + let config = themeFile.parsed mergeLayerTranslation(config, themeFile.path, loadTranslationFilesFrom("themes")) const allTranslations = new TranslationPart() allTranslations.recursiveAdd(config, themeFile.path) const endsWithNewline = readFileSync(themeFile.path, { encoding: "utf8" })?.endsWith("\n") ?? true + + if (englishOnly) { + config = Utils.Clone(config) + removeNonEnglishTranslations(config) + } + writeFileSync( themeFile.path, JSON.stringify(config, null, " ") + (endsWithNewline ? "\n" : "") @@ -691,41 +724,70 @@ function mergeThemeTranslations() { } } -if (!existsSync("./langs/themes")) { - mkdirSync("./langs/themes") -} -const themeOverwritesWeblate = process.argv[2] === "--ignore-weblate" -if (!themeOverwritesWeblate) { - mergeLayerTranslations() - mergeThemeTranslations() -} else { - console.log("Ignore weblate") +class GenerateTranslations extends Script { + constructor() { + super("Syncs translations from/to the theme and layer files") + } + + /** + * OUtputs the 'used_languages.json'-file + */ + detectUsedLanguages() { + { + const l1 = generateTranslationsObjectFrom(ScriptUtils.getLayerFiles(), "layers") + const l2 = generateTranslationsObjectFrom( + ScriptUtils.getThemeFiles().filter( + (th) => th.parsed.mustHaveLanguage === undefined + ), + "themes" + ) + + const usedLanguages: string[] = Utils.Dedup(l1.concat(l2)).filter((v) => v !== "*") + usedLanguages.sort() + fs.writeFileSync( + "./src/assets/used_languages.json", + JSON.stringify({ languages: usedLanguages }) + ) + } + } + + async main(args: string[]): Promise { + if (!existsSync("./langs/themes")) { + mkdirSync("./langs/themes") + } + const themeOverwritesWeblate = args[0] === "--ignore-weblate" + const englishOnly = args[0] === "--english-only" + if (!themeOverwritesWeblate) { + mergeLayerTranslations() + mergeThemeTranslations() + compileTranslationsFromWeblate() + } else { + console.log("Ignore weblate") + } + + this.detectUsedLanguages() + genTranslations() + { + const allTranslationFiles = ScriptUtils.readDirRecSync("langs").filter((path) => + path.endsWith(".json") + ) + for (const path of allTranslationFiles) { + formatFile(path) + } + } + + // Some validation + TranslationPart.fromDirectory("./langs").validateStrict("./langs") + TranslationPart.fromDirectory("./langs/layers").validateStrict("layers") + TranslationPart.fromDirectory("./langs/themes").validateStrict("themes") + + if (englishOnly) { + mergeLayerTranslations(true) + mergeThemeTranslations(true) + } + + console.log("All done!") + } } -const l1 = generateTranslationsObjectFrom(ScriptUtils.getLayerFiles(), "layers") -const l2 = generateTranslationsObjectFrom( - ScriptUtils.getThemeFiles().filter((th) => th.parsed.mustHaveLanguage === undefined), - "themes" -) - -const usedLanguages: string[] = Utils.Dedup(l1.concat(l2)).filter((v) => v !== "*") -usedLanguages.sort() -fs.writeFileSync("./src/assets/used_languages.json", JSON.stringify({ languages: usedLanguages })) - -if (!themeOverwritesWeblate) { - // Generates the core translations - compileTranslationsFromWeblate() -} -genTranslations() -const allTranslationFiles = ScriptUtils.readDirRecSync("langs").filter((path) => - path.endsWith(".json") -) -for (const path of allTranslationFiles) { - formatFile(path) -} - -// Some validation -TranslationPart.fromDirectory("./langs").validateStrict("./langs") -TranslationPart.fromDirectory("./langs/layers").validateStrict("layers") -TranslationPart.fromDirectory("./langs/themes").validateStrict("themes") -console.log("All done!") +new GenerateTranslations().run() diff --git a/scripts/hetzner/deployHetzner.sh b/scripts/hetzner/deployHetzner.sh index af9443faf..17042bfce 100755 --- a/scripts/hetzner/deployHetzner.sh +++ b/scripts/hetzner/deployHetzner.sh @@ -9,14 +9,13 @@ # wget https://github.com/pietervdvn/latlon2country/raw/main/tiles.zip # unzip tiles.zip -MAPCOMPLETE_CONFIGURATION="config_hetzner" cp config.json config.json.bu && cp ./scripts/hetzner/config.json . && # Copy the config _before_ building, as the config might contain some needed URLs -npm run reset:layeroverview -npm run test +# npm run reset:layeroverview +# npm run test && npm run prepare-deploy && -mv config.json.bu config.json && zip dist.zip -r dist/* && +mv config.json.bu config.json && scp ./scripts/hetzner/config/* hetzner:/root/ && rsync -rzh --progress dist.zip hetzner:/root/ && echo "Upload completed, deploying config and booting" && diff --git a/scripts/lint.ts b/scripts/lint.ts index a144083df..09206e68c 100644 --- a/scripts/lint.ts +++ b/scripts/lint.ts @@ -7,12 +7,23 @@ import { import Translations from "../src/UI/i18n/Translations" import { Translation } from "../src/UI/i18n/Translation" import { LayerConfigJson } from "../src/Models/ThemeConfig/Json/LayerConfigJson" +import themeconfig from "../src/assets/schemas/layoutconfigmeta.json" +import layerconfig from "../src/assets/schemas/layerconfigmeta.json" + +import { Utils } from "../src/Utils" +import { ConfigMeta } from "../src/UI/Studio/configMeta" +import { ConversionContext } from "../src/Models/ThemeConfig/Conversion/ConversionContext" /* * This script reads all theme and layer files and reformats them inplace * Use with caution, make a commit beforehand! */ - +const themeAttributesOrder = Utils.Dedup( + (themeconfig).filter((c) => c.path.length === 1).map((c) => c.path[0]) +) +const layerAttributesOrder = Utils.Dedup( + (layerconfig).filter((c) => c.path.length === 1).map((c) => c.path[0]) +) const t: Translation = Translations.t.general.add.addNew t.OnEveryLanguage((txt, ln) => { console.log(ln, txt) @@ -30,6 +41,19 @@ const articles = { pt_BR : 'uma',//*/ } +function reorder(object: object, order: string[]) { + const allKeys = new Set(Object.keys(object)) + const copy = {} + for (const key of order) { + copy[key] = object[key] + allKeys.delete(key) + } + for (const key of allKeys) { + copy[key] = object[key] + } + return copy +} + function addArticleToPresets(layerConfig: { presets?: { title: any }[] }) { /* if(layerConfig.presets === undefined){ @@ -68,11 +92,12 @@ for (const layerFile of layerFiles) { const fixed = ( new UpdateLegacyLayer().convertStrict( layerFile.parsed, - "While linting " + layerFile.path + ConversionContext.construct([layerFile.path.split("/").at(-1)], ["update legacy"]) ) ) addArticleToPresets(fixed) - writeFileSync(layerFile.path, JSON.stringify(fixed, null, " ") + "\n") + const reordered = reorder(fixed, layerAttributesOrder) + writeFileSync(layerFile.path, JSON.stringify(reordered, null, " ") + "\n") } catch (e) { console.error("COULD NOT LINT LAYER" + layerFile.path + ":\n\t" + e) } @@ -83,7 +108,7 @@ for (const themeFile of themeFiles) { try { const fixed = new FixLegacyTheme().convertStrict( themeFile.parsed, - "While linting " + themeFile.path + ConversionContext.construct([themeFile.path.split("/").at(-1)], ["update legacy layer"]) ) for (const layer of fixed.layers) { if (layer["presets"] !== undefined) { @@ -91,7 +116,12 @@ for (const themeFile of themeFiles) { } } // extractInlineLayer(fixed) - writeFileSync(themeFile.path, JSON.stringify(fixed, null, " ")) + const endsWithNewline = themeFile.raw.at(-1) === "\n" + const ordered = reorder(fixed, themeAttributesOrder) + writeFileSync( + themeFile.path, + JSON.stringify(ordered, null, " ") + (endsWithNewline ? "\n" : "") + ) } catch (e) { console.error("COULD NOT LINT THEME" + themeFile.path + ":\n\t" + e) } diff --git a/scripts/removeTranslationString.ts b/scripts/removeTranslationString.ts index e18a80038..b903bb1cc 100644 --- a/scripts/removeTranslationString.ts +++ b/scripts/removeTranslationString.ts @@ -25,7 +25,7 @@ async function main(args: string[]) { // Path within the JSON which will be removed - not the path in the filesystem! const path = args[0].split(".") - console.log("Removing translation string ", path, "from the general translations") + console.log("Removing translation string ", path, "from the translations for " + directory) const files = ScriptUtils.readDirRecSync(directory, 1).filter((f) => f.endsWith(".json")) for (const file of files) { const json = JSON.parse(fs.readFileSync(file, { encoding: "utf-8" })) diff --git a/scripts/studioServer.ts b/scripts/studioServer.ts new file mode 100644 index 000000000..b1505e583 --- /dev/null +++ b/scripts/studioServer.ts @@ -0,0 +1,147 @@ +import * as fs from "node:fs" +import * as http from "node:http" +import * as path from "node:path" +import ScriptUtils from "./ScriptUtils" +import * as meta from "../package.json" +import { ServerResponse } from "http" + +const PORT = 1235 +const CORS = "http://localhost:1234,https://mapcomplete.org,https://dev.mapcomplete.org" + +const MIME_TYPES = { + default: "application/octet-stream", + html: "text/html; charset=UTF-8", + js: "application/javascript", + css: "text/css", + png: "image/png", + jpg: "image/jpg", + gif: "image/gif", + ico: "image/x-icon", + svg: "image/svg+xml", + json: "application/json", +} + +const STATIC_PATH = path.join(process.cwd(), "./assets") + +async function prepareFile(url: string): Promise { + const paths = [STATIC_PATH, url] + if (url.endsWith("/")) paths.push("index.html") + const filePath = path.join(...paths) + if (fs.existsSync(filePath)) { + return fs.readFileSync(filePath, "utf8") + } + while (url.startsWith("/")) { + url = url.slice(1) + } + const sliced = url.split("/").slice(1) + if (!sliced) { + return + } + const backupFile = path.join(STATIC_PATH, ...sliced) + console.log("Using backup path", backupFile) + if (fs.existsSync(backupFile)) { + return fs.readFileSync(backupFile, "utf8") + } + return null +} + +async function handlePost(req: http.IncomingMessage, res: ServerResponse) { + let body = "" + req.on("data", (chunk) => { + body = body + chunk + }) + + await new Promise((resolve) => req.on("end", resolve)) + + let parsed: any + try { + parsed = JSON.parse(body) + } catch (e) { + console.error("ERROR: probably did not receive the full JSON", e) + res.writeHead(400, { "Content-Type": MIME_TYPES.html }) + res.write("Invalid JSON:" + e + "", "utf8") + res.end() + return + } + + const paths = req.url.split("/") + console.log("Got a valid update to:", paths.join("/")) + for (let i = 1; i < paths.length; i++) { + const p = paths.slice(0, i) + const dir = STATIC_PATH + p.join("/") + if (!fs.existsSync(dir)) { + console.log("Creating new directory", dir) + fs.mkdirSync(dir) + } + } + const path = STATIC_PATH + paths.join("/") + fs.writeFileSync(path, JSON.stringify(parsed, null, " ")) + res.writeHead(200, { "Content-Type": MIME_TYPES.html }) + res.write("OK", "utf8") + res.end() + return +} + +http.createServer(async (req: http.IncomingMessage, res) => { + try { + console.log(req.method + " " + req.url, "from:", req.headers.origin) + res.setHeader( + "Access-Control-Allow-Headers", + "Origin, X-Requested-With, Content-Type, Accept" + ) + res.setHeader("Access-Control-Allow-Origin", req.headers.origin ?? "*") + if (req.method === "OPTIONS") { + res.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, UPDATE") + res.writeHead(204, { "Content-Type": MIME_TYPES.html }) + res.end() + return + } + if (req.method === "POST" || req.method === "UPDATE") { + await handlePost(req, res) + return + } + + const url = new URL(`http://127.0.0.1/` + req.url) + console.log("URL pathname is") + if (url.pathname.endsWith("overview")) { + console.log("Giving overview") + let userId = url.searchParams.get("userId") + const allFiles = ScriptUtils.readDirRecSync(STATIC_PATH) + .filter( + (p) => + p.endsWith(".json") && + !p.endsWith("license_info.json") && + (p.startsWith("layers") || + p.startsWith("themes") || + userId !== undefined || + p.startsWith(userId)) + ) + .map((p) => p.substring(STATIC_PATH.length + 1)) + res.writeHead(200, { "Content-Type": MIME_TYPES.json }) + res.write(JSON.stringify({ allFiles })) + res.end() + return + } + + const file = await prepareFile(req.url) + if (file === null) { + res.writeHead(404, { "Content-Type": MIME_TYPES.html }) + res.write("

    Not found...

    ") + res.end() + return + } + const statusCode = 200 + const mimeType = MIME_TYPES.json || MIME_TYPES.default + res.writeHead(statusCode, { "Content-Type": mimeType }) + res.write(file) + res.end() + } catch (e) { + console.error(e) + } +}).listen(PORT) + +console.log( + `Server started at http://127.0.0.1:${PORT}/, the time is ${new Date().toISOString()}, version from package.json is ${ + meta.version + }` +) diff --git a/scripts/thieves/readIdPresets.ts b/scripts/thieves/readIdPresets.ts index e6f93d7c4..901dd5a5e 100644 --- a/scripts/thieves/readIdPresets.ts +++ b/scripts/thieves/readIdPresets.ts @@ -3,10 +3,10 @@ */ import ScriptUtils from "../ScriptUtils" import { existsSync, readFileSync, writeFileSync } from "fs" -import known_languages from "../../assets/language_native.json" -import { LayerConfigJson } from "../../Models/ThemeConfig/Json/LayerConfigJson" -import { MappingConfigJson } from "../../Models/ThemeConfig/Json/QuestionableTagRenderingConfigJson" -import SmallLicense from "../../Models/smallLicense" +import known_languages from "../../src/assets/language_native.json" +import { LayerConfigJson } from "../../src/Models/ThemeConfig/Json/LayerConfigJson" +import { MappingConfigJson } from "../../src/Models/ThemeConfig/Json/QuestionableTagRenderingConfigJson" +import SmallLicense from "../../src/Models/smallLicense" interface IconThief { steal(iconName: string): boolean @@ -188,7 +188,7 @@ class IdThief { const mapping = { if: preset.parseTags(), - then: "circle:white;./assets/layers/id_presets/" + preset.icon + ".svg", + then: "./assets/layers/id_presets/" + preset.icon + ".svg", } mappings.push(mapping) } @@ -328,5 +328,5 @@ idPresets.tagRenderings = [ mappings: thief.readShopIcons(), }, ] - +console.log("Writing id presets to", id_presets_path) writeFileSync(id_presets_path, JSON.stringify(idPresets, null, " "), "utf8") diff --git a/src/Customizations/AllKnownLayouts.ts b/src/Customizations/AllKnownLayouts.ts index f01bfe24d..12c27223c 100644 --- a/src/Customizations/AllKnownLayouts.ts +++ b/src/Customizations/AllKnownLayouts.ts @@ -49,14 +49,4 @@ export class AllKnownLayoutsLazy { export class AllKnownLayouts { public static allKnownLayouts: AllKnownLayoutsLazy = new AllKnownLayoutsLazy() - - static AllPublicLayers() { - const layers = [].concat( - ...this.allKnownLayouts - .values() - .filter((layout) => !layout.hideFromOverview) - .map((layout) => layout.layers) - ) - return layers - } } diff --git a/src/Customizations/AllSharedLayers.ts b/src/Customizations/AllSharedLayers.ts index 43c18e981..e7f229a49 100644 --- a/src/Customizations/AllSharedLayers.ts +++ b/src/Customizations/AllSharedLayers.ts @@ -1,13 +1,13 @@ import LayerConfig from "../Models/ThemeConfig/LayerConfig" import { Utils } from "../Utils" -import known_themes from "../assets/generated/known_layers.json" +import known_layers from "../assets/generated/known_layers.json" import { LayerConfigJson } from "../Models/ThemeConfig/Json/LayerConfigJson" -import { AllKnownLayouts } from "./AllKnownLayouts" + export class AllSharedLayers { public static sharedLayers: Map = AllSharedLayers.getSharedLayers() public static getSharedLayersConfigs(): Map { const sharedLayers = new Map() - for (const layer of known_themes.layers) { + for (const layer of known_layers.layers) { // @ts-ignore sharedLayers.set(layer.id, layer) } @@ -16,7 +16,7 @@ export class AllSharedLayers { } private static getSharedLayers(): Map { const sharedLayers = new Map() - for (const layer of known_themes.layers) { + for (const layer of known_layers.layers) { try { // @ts-ignore const parsed = new LayerConfig(layer, "shared_layers") @@ -35,34 +35,4 @@ export class AllSharedLayers { return sharedLayers } - - public static AllPublicLayers(options?: { - includeInlineLayers: true | boolean - }): LayerConfig[] { - const allLayers: LayerConfig[] = [] - const seendIds = new Set() - AllSharedLayers.sharedLayers.forEach((layer, key) => { - seendIds.add(key) - allLayers.push(layer) - }) - if (options?.includeInlineLayers ?? true) { - const publicLayouts = Array.from(AllKnownLayouts.allKnownLayouts.values()).filter( - (l) => !l.hideFromOverview - ) - for (const layout of publicLayouts) { - if (layout.hideFromOverview) { - continue - } - for (const layer of layout.layers) { - if (seendIds.has(layer.id)) { - continue - } - seendIds.add(layer.id) - allLayers.push(layer) - } - } - } - - return allLayers - } } diff --git a/src/Logic/DetermineLayout.ts b/src/Logic/DetermineLayout.ts index c9abdbaaa..33903d91e 100644 --- a/src/Logic/DetermineLayout.ts +++ b/src/Logic/DetermineLayout.ts @@ -3,9 +3,6 @@ import { QueryParameters } from "./Web/QueryParameters" import { AllKnownLayouts } from "../Customizations/AllKnownLayouts" import { FixedUiElement } from "../UI/Base/FixedUiElement" import { Utils } from "../Utils" -import Combine from "../UI/Base/Combine" -import { SubtleButton } from "../UI/Base/SubtleButton" -import BaseUIElement from "../UI/BaseUIElement" import { UIEventSource } from "./UIEventSource" import { LocalStorageSource } from "./Web/LocalStorageSource" import LZString from "lz-string" @@ -16,7 +13,6 @@ import { PrepareTheme } from "../Models/ThemeConfig/Conversion/PrepareTheme" import licenses from "../assets/generated/license_info.json" import TagRenderingConfig from "../Models/ThemeConfig/TagRenderingConfig" import { FixImages } from "../Models/ThemeConfig/Conversion/FixImages" -import Svg from "../Svg" import questions from "../assets/generated/layers/questions.json" import { DoesImageExist, @@ -26,6 +22,7 @@ import { import { DesugaringContext } from "../Models/ThemeConfig/Conversion/Conversion" import { TagRenderingConfigJson } from "../Models/ThemeConfig/Json/TagRenderingConfigJson" import Hash from "./Web/Hash" +import { QuestionableTagRenderingConfigJson } from "../Models/ThemeConfig/Json/QuestionableTagRenderingConfigJson" export default class DetermineLayout { private static readonly _knownImages = new Set(Array.from(licenses).map((l) => l.path)) @@ -126,33 +123,8 @@ export default class DetermineLayout { return layoutToUse } - public static ShowErrorOnCustomTheme( - intro: string = "Error: could not parse the custom layout:", - error: BaseUIElement, - json?: any - ) { - new Combine([ - intro, - error.SetClass("alert"), - new SubtleButton(Svg.back_svg(), "Go back to the theme overview", { - url: window.location.protocol + "//" + window.location.host + "/index.html", - newTab: false, - }), - json !== undefined - ? new SubtleButton(Svg.download_svg(), "Download the JSON file").onClick(() => { - Utils.offerContentsAsDownloadableFile( - JSON.stringify(json, null, " "), - "theme_definition.json" - ) - }) - : undefined, - ]) - .SetClass("flex flex-col clickable") - .AttachTo("maindiv") - } - - private static getSharedTagRenderings(): Map { - const dict = new Map() + private static getSharedTagRenderings(): Map { + const dict = new Map() for (const tagRendering of questions.tagRenderings) { dict.set(tagRendering.id, tagRendering) @@ -163,7 +135,13 @@ export default class DetermineLayout { private static prepCustomTheme(json: any, sourceUrl?: string, forceId?: string): LayoutConfig { if (json.layers === undefined && json.tagRenderings !== undefined) { - const iconTr = json.mapRendering.map((mr) => mr.icon).find((icon) => icon !== undefined) + // We got fed a layer instead of a theme + const layerConfig = json + const iconTr: string | TagRenderingConfigJson = ( + layerConfig.pointRendering + .map((mr) => mr.marker.find((icon) => icon.icon !== undefined).icon) + .find((i) => i !== undefined) + ) const icon = new TagRenderingConfig(iconTr).render.txt json = { id: json.id, @@ -187,34 +165,25 @@ export default class DetermineLayout { sharedLayers: knownLayersDict, publicLayers: new Set(), } - json = new FixLegacyTheme().convertStrict(json, "While loading a dynamic theme") + json = new FixLegacyTheme().convertStrict(json) const raw = json - json = new FixImages(DetermineLayout._knownImages).convertStrict( - json, - "While fixing the images" - ) + json = new FixImages(DetermineLayout._knownImages).convertStrict(json) json.enableNoteImports = json.enableNoteImports ?? false - json = new PrepareTheme(convertState).convertStrict(json, "While preparing a dynamic theme") + json = new PrepareTheme(convertState).convertStrict(json) console.log("The layoutconfig is ", json) json.id = forceId ?? json.id { - let { errors } = new PrevalidateTheme().convert(json, "validation") - if (errors.length > 0) { - throw "Detected errors: " + errors.join("\n") - } + new PrevalidateTheme().convertStrict(json) } { - let { errors } = new ValidateThemeAndLayers( + new ValidateThemeAndLayers( new DoesImageExist(new Set(), (_) => true), "", false - ).convert(json, "validation") - if (errors.length > 0) { - throw "Detected errors: " + errors.join("\n") - } + ).convertStrict(json) } return new LayoutConfig(json, false, { definitionRaw: JSON.stringify(raw, null, " "), diff --git a/src/Logic/FeatureSource/Sources/LastClickFeatureSource.ts b/src/Logic/FeatureSource/Sources/LastClickFeatureSource.ts index e2612c407..ece8d156d 100644 --- a/src/Logic/FeatureSource/Sources/LastClickFeatureSource.ts +++ b/src/Logic/FeatureSource/Sources/LastClickFeatureSource.ts @@ -26,7 +26,7 @@ export class LastClickFeatureSource implements WritableFeatureSource { for (let i = 0; i < (layer.presets ?? []).length; i++) { const preset = layer.presets[i] const tags = new ImmutableStore(TagUtils.KVtoProperties(preset.tags)) - const { html } = layer.mapRendering[0].RenderIcon(tags, false, { + const { html } = layer.mapRendering[0].RenderIcon(tags, { noSize: true, includeBadges: false, }) diff --git a/src/Logic/GeoOperations.ts b/src/Logic/GeoOperations.ts index 1625f8e0c..e03cc13b1 100644 --- a/src/Logic/GeoOperations.ts +++ b/src/Logic/GeoOperations.ts @@ -261,16 +261,16 @@ export class GeoOperations { } /** - * Generates the closest point on a way from a given point. - * If the passed-in geojson object is a polygon, the outer ring will be used as linestring - * - * The properties object will contain three values: - // - `index`: closest point was found on nth line part, - // - `dist`: distance between pt and the closest point (in kilometer), - // `location`: distance along the line between start (of the line) and the closest point. - * @param way The road on which you want to find a point - * @param point Point defined as [lon, lat] - */ + * Generates the closest point on a way from a given point. + * If the passed-in geojson object is a polygon, the outer ring will be used as linestring + * + * The properties object will contain three values: + // - `index`: closest point was found on nth line part, + // - `dist`: distance between pt and the closest point (in kilometer), + // `location`: distance along the line between start (of the line) and the closest point. + * @param way The road on which you want to find a point + * @param point Point defined as [lon, lat] + */ public static nearestPoint( way: Feature, point: [number, number] @@ -449,6 +449,7 @@ export class GeoOperations { return perBbox } + public static toGpx( locations: | Feature @@ -1052,4 +1053,40 @@ export class GeoOperations { } throw "CalculateIntersection fallthrough: can not calculate an intersection between features" } + + public static SplitSelfIntersectingWays(features: Feature[]): Feature[] { + const result: Feature[] = [] + + for (const feature of features) { + if (feature.geometry.type === "LineString") { + let coors = feature.geometry.coordinates + for (let i = coors.length - 1; i >= 0; i--) { + // Go back, to nick of the back when needed + const ci = coors[i] + for (let j = i + 1; j < coors.length; j++) { + const cj = coors[j] + if ( + Math.abs(ci[0] - cj[0]) <= 0.000001 && + Math.abs(ci[1] - cj[1]) <= 0.0000001 + ) { + // Found a self-intersecting way! + console.debug("SPlitting way", feature.properties.id) + result.push({ + ...feature, + geometry: { ...feature.geometry, coordinates: coors.slice(i + 1) }, + }) + coors = coors.slice(0, i + 1) + break + } + } + } + result.push({ + ...feature, + geometry: { ...feature.geometry, coordinates: coors }, + }) + } + } + + return result + } } diff --git a/src/Logic/Osm/ChangesetHandler.ts b/src/Logic/Osm/ChangesetHandler.ts index 31ceab110..dca2b0a67 100644 --- a/src/Logic/Osm/ChangesetHandler.ts +++ b/src/Logic/Osm/ChangesetHandler.ts @@ -43,7 +43,7 @@ export class ChangesetHandler { this.userDetails = osmConnection.userDetails this.backend = osmConnection._oauth_config.url - if (dryRun) { + if (dryRun.data) { console.log("DRYRUN ENABLED") } } diff --git a/src/Logic/Osm/OsmConnection.ts b/src/Logic/Osm/OsmConnection.ts index ecf29dcf2..f33f2df04 100644 --- a/src/Logic/Osm/OsmConnection.ts +++ b/src/Logic/Osm/OsmConnection.ts @@ -6,6 +6,7 @@ import { Utils } from "../../Utils" import { LocalStorageSource } from "../Web/LocalStorageSource" import { AuthConfig } from "./AuthConfig" import Constants from "../../Models/Constants" +import OSMAuthInstance = OSMAuth.OSMAuthInstance export default class UserDetails { public loggedIn = false @@ -29,7 +30,7 @@ export default class UserDetails { export type OsmServiceState = "online" | "readonly" | "offline" | "unknown" | "unreachable" export class OsmConnection { - public auth + public auth: OSMAuthInstance public userDetails: UIEventSource public isLoggedIn: Store public gpxServiceIsOnline: UIEventSource = new UIEventSource( @@ -83,6 +84,7 @@ export class OsmConnection { if (options.fakeUser) { const ud = this.userDetails.data ud.csCount = 5678 + ud.uid = 42 ud.loggedIn = true ud.unreadMessages = 0 ud.name = "Fake user" @@ -116,19 +118,15 @@ export class OsmConnection { if (options.oauth_token?.data !== undefined) { console.log(options.oauth_token.data) const self = this - this.auth.bootstrapToken( - options.oauth_token.data, - (x) => { - console.log("Called back: ", x) - self.AttemptLogin() - }, - this.auth - ) + this.auth.bootstrapToken(options.oauth_token.data, (err, result) => { + console.log("Bootstrap token called back", err, result) + self.AttemptLogin() + }) options.oauth_token.setData(undefined) } if (this.auth.authenticated() && options.attemptLogin !== false) { - this.AttemptLogin() // Also updates the user badge + this.AttemptLogin() } else { console.log("Not authenticated") } @@ -161,6 +159,7 @@ export class OsmConnection { this.userDetails.ping() console.log("Logged out") this.loadingStatus.setData("not-attempted") + this.preferencesHandler.preferences.setData(undefined) } /** @@ -174,7 +173,10 @@ export class OsmConnection { public AttemptLogin() { this.UpdateCapabilities() - this.loadingStatus.setData("loading") + if (this.loadingStatus.data !== "logged-in") { + // Stay 'logged-in' if we are already logged in; this simply means we are checking for messages + this.loadingStatus.setData("loading") + } if (this.fakeUser) { this.loadingStatus.setData("logged-in") console.log("AttemptLogin called, but ignored as fakeUser is set") @@ -263,17 +265,37 @@ export class OsmConnection { /** * Interact with the API. * - * @param path: the path to query, without host and without '/api/0.6'. Example 'notes/1234/close' + * @param path the path to query, without host and without '/api/0.6'. Example 'notes/1234/close' + * @param method + * @param header + * @param content + * @param allowAnonymous if set, will use the anonymous-connection if the main connection is not authenticated */ public async interact( path: string, method: "GET" | "POST" | "PUT" | "DELETE", header?: Record, - content?: string - ): Promise { + content?: string, + allowAnonymous: boolean = false + ): Promise { + let connection: OSMAuthInstance = this.auth + if (allowAnonymous && !this.auth.authenticated()) { + const possibleResult = await Utils.downloadAdvanced( + `${this.Backend()}/api/0.6/${path}`, + header, + method, + content + ) + if (possibleResult["content"]) { + return possibleResult["content"] + } + console.error(possibleResult) + throw "Could not interact with OSM:" + possibleResult["error"] + } + return new Promise((ok, error) => { - this.auth.xhr( - { + connection.xhr( + { method, options: { header, @@ -295,9 +317,10 @@ export class OsmConnection { public async post( path: string, content?: string, - header?: Record + header?: Record, + allowAnonymous: boolean = false ): Promise { - return await this.interact(path, "POST", header, content) + return await this.interact(path, "POST", header, content, allowAnonymous) } public async put( @@ -308,8 +331,12 @@ export class OsmConnection { return await this.interact(path, "PUT", header, content) } - public async get(path: string, header?: Record): Promise { - return await this.interact(path, "GET", header) + public async get( + path: string, + header?: Record, + allowAnonymous: boolean = false + ): Promise { + return await this.interact(path, "GET", header, undefined, allowAnonymous) } public closeNote(id: number | string, text?: string): Promise { @@ -352,10 +379,16 @@ export class OsmConnection { } // Lat and lon must be strings for the API to accept it const content = `lat=${lat}&lon=${lon}&text=${encodeURIComponent(text)}` - const response = await this.post("notes.json", content, { - "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", - }) + const response = await this.post( + "notes.json", + content, + { + "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", + }, + true + ) const parsed = JSON.parse(response) + console.log("Got result:", parsed) const id = parsed.properties console.log("OPENED NOTE", id) return id @@ -489,7 +522,7 @@ export class OsmConnection { this.auth = new osmAuth({ client_id: this._oauth_config.oauth_client_id, url: this._oauth_config.url, - scope: "read_prefs write_prefs write_api write_gpx write_notes", + scope: "read_prefs write_prefs write_api write_gpx write_notes openid", redirect_uri: Utils.runningFromConsole ? "https://mapcomplete.org/land.html" : window.location.protocol + "//" + window.location.host + "/land.html", @@ -506,7 +539,6 @@ export class OsmConnection { this.isChecking = true Stores.Chronic(5 * 60 * 1000).addCallback((_) => { if (self.isLoggedIn.data) { - console.log("Checking for messages") self.AttemptLogin() } }) @@ -520,6 +552,29 @@ export class OsmConnection { }) } + private readonly _userInfoCache: Record = {} + public async getInformationAboutUser(id: number): Promise<{ + id: number + display_name: string + account_created: string + description: string + contributor_terms: { agreed: boolean } + roles: [] + changesets: { count: number } + traces: { count: number } + blocks: { received: { count: number; active: number } } + }> { + if (id === undefined) { + return undefined + } + if (this._userInfoCache[id]) { + return this._userInfoCache[id] + } + const info = await this.get("user/" + id + ".json", { accepts: "application/json" }, true) + const parsed = JSON.parse(info)["user"] + this._userInfoCache[id] = parsed + return parsed + } private async FetchCapabilities(): Promise<{ api: OsmServiceState; gpx: OsmServiceState }> { if (Utils.runningFromConsole) { return { api: "online", gpx: "online" } diff --git a/src/Logic/State/UserSettingsMetaTagging.ts b/src/Logic/State/UserSettingsMetaTagging.ts index 6e568c5c3..33a5ae85b 100644 --- a/src/Logic/State/UserSettingsMetaTagging.ts +++ b/src/Logic/State/UserSettingsMetaTagging.ts @@ -1,42 +1,14 @@ import { Utils } from "../../Utils" /** This code is autogenerated - do not edit. Edit ./assets/layers/usersettings/usersettings.json instead */ export class ThemeMetaTagging { - public static readonly themeName = "usersettings" + public static readonly themeName = "usersettings" - public metaTaggging_for_usersettings(feat: { properties: Record }) { - Utils.AddLazyProperty(feat.properties, "_mastodon_candidate_md", () => - feat.properties._description - .match(/\[[^\]]*\]\((.*(mastodon|en.osm.town).*)\).*/) - ?.at(1) - ) - Utils.AddLazyProperty( - feat.properties, - "_d", - () => feat.properties._description?.replace(/</g, "<")?.replace(/>/g, ">") ?? "" - ) - Utils.AddLazyProperty(feat.properties, "_mastodon_candidate_a", () => - ((feat) => { - const e = document.createElement("div") - e.innerHTML = feat.properties._d - return Array.from(e.getElementsByTagName("a")).filter( - (a) => a.href.match(/mastodon|en.osm.town/) !== null - )[0]?.href - })(feat) - ) - Utils.AddLazyProperty(feat.properties, "_mastodon_link", () => - ((feat) => { - const e = document.createElement("div") - e.innerHTML = feat.properties._d - return Array.from(e.getElementsByTagName("a")).filter( - (a) => a.getAttribute("rel")?.indexOf("me") >= 0 - )[0]?.href - })(feat) - ) - Utils.AddLazyProperty( - feat.properties, - "_mastodon_candidate", - () => feat.properties._mastodon_candidate_md ?? feat.properties._mastodon_candidate_a - ) - feat.properties["__current_backgroun"] = "initial_value" - } -} + public metaTaggging_for_usersettings(feat: {properties: Record}) { + Utils.AddLazyProperty(feat.properties, '_mastodon_candidate_md', () => feat.properties._description.match(/\[[^\]]*\]\((.*(mastodon|en.osm.town).*)\).*/)?.at(1) ) + Utils.AddLazyProperty(feat.properties, '_d', () => feat.properties._description?.replace(/</g,'<')?.replace(/>/g,'>') ?? '' ) + Utils.AddLazyProperty(feat.properties, '_mastodon_candidate_a', () => (feat => {const e = document.createElement('div');e.innerHTML = feat.properties._d;return Array.from(e.getElementsByTagName("a")).filter(a => a.href.match(/mastodon|en.osm.town/) !== null)[0]?.href }) (feat) ) + Utils.AddLazyProperty(feat.properties, '_mastodon_link', () => (feat => {const e = document.createElement('div');e.innerHTML = feat.properties._d;return Array.from(e.getElementsByTagName("a")).filter(a => a.getAttribute("rel")?.indexOf('me') >= 0)[0]?.href})(feat) ) + Utils.AddLazyProperty(feat.properties, '_mastodon_candidate', () => feat.properties._mastodon_candidate_md ?? feat.properties._mastodon_candidate_a ) + feat.properties['__current_backgroun'] = 'initial_value' + } +} \ No newline at end of file diff --git a/src/Logic/Tags/And.ts b/src/Logic/Tags/And.ts index 72d04414a..0a7b021f2 100644 --- a/src/Logic/Tags/And.ts +++ b/src/Logic/Tags/And.ts @@ -76,7 +76,7 @@ export class And extends TagsFilter { return this.and .map((t) => t.asHumanString(linkToWiki, shorten, properties)) .filter((x) => x !== "") - .join("&") + .join(" &") } isUsableAsAnswer(): boolean { diff --git a/src/Logic/Tags/Or.ts b/src/Logic/Tags/Or.ts index ad437cd8b..9fe456b55 100644 --- a/src/Logic/Tags/Or.ts +++ b/src/Logic/Tags/Or.ts @@ -50,7 +50,7 @@ export class Or extends TagsFilter { } asHumanString(linkToWiki: boolean, shorten: boolean, properties) { - return this.or.map((t) => t.asHumanString(linkToWiki, shorten, properties)).join("|") + return this.or.map((t) => t.asHumanString(linkToWiki, shorten, properties)).join(" |") } isUsableAsAnswer(): boolean { diff --git a/src/Logic/Tags/RegexTag.ts b/src/Logic/Tags/RegexTag.ts index 982b6fd7f..e6486113a 100644 --- a/src/Logic/Tags/RegexTag.ts +++ b/src/Logic/Tags/RegexTag.ts @@ -308,9 +308,6 @@ export class RegexTag extends TagsFilter { if (typeof this.value === "string") { return [{ k: this.key, v: this.value }] } - if (this.value.toString() != "/^..*$/" || this.value.toString() != ".+") { - console.warn("Regex value in tag; using wildcard:", this.key, this.value) - } return [{ k: this.key, v: undefined }] } console.error("Cannot export regex tag to asChange; ", this.key, this.value) diff --git a/src/Logic/Tags/Tag.ts b/src/Logic/Tags/Tag.ts index 198d97dd2..5142c5c62 100644 --- a/src/Logic/Tags/Tag.ts +++ b/src/Logic/Tags/Tag.ts @@ -79,6 +79,9 @@ export class Tag extends TagsFilter { currentProperties?: Record ) { let v = this.value + if (typeof v !== "string") { + v = JSON.stringify(v) + } if (shorten) { v = Utils.EllipsesAfter(v, 25) } diff --git a/src/Logic/Tags/TagUtils.ts b/src/Logic/Tags/TagUtils.ts index 1c37457fe..adc862922 100644 --- a/src/Logic/Tags/TagUtils.ts +++ b/src/Logic/Tags/TagUtils.ts @@ -9,17 +9,208 @@ import { Or } from "./Or" import { TagConfigJson } from "../../Models/ThemeConfig/Json/TagConfigJson" import key_counts from "../../assets/key_totals.json" +import { ConversionContext } from "../../Models/ThemeConfig/Conversion/ConversionContext" + type Tags = Record export type UploadableTag = Tag | SubstitutingTag | And export class TagUtils { + public static readonly comparators: ReadonlyArray<[string, (a: number, b: number) => boolean]> = + [ + ["<=", (a, b) => a <= b], + [">=", (a, b) => a >= b], + ["<", (a, b) => a < b], + [">", (a, b) => a > b], + ] + public static modeDocumentation: Record< + string, + { name: string; docs: string; uploadable?: boolean; overpassSupport: boolean } + > = { + "=": { + name: "strict equality", + uploadable: true, + overpassSupport: true, + docs: + "Strict equality is denoted by `key=value`. This key matches __only if__ the keypair is present exactly as stated.\n" + + "\n" + + "**Only normal tags (eventually in an `and`) can be used in places where they are uploaded**. Normal tags are used in " + + "the `mappings` of a [TagRendering] (unless `hideInAnswer` is specified), they are used in `addExtraTags` of [Freeform] " + + "and are used in the `tags`-list of a preset.\n" + + "\n" + + "If a different kind of tag specification is given, your theme will fail to parse.\n" + + "\n" + + "### If key is not present\n" + + "\n" + + "If you want to check if a key is not present, use `key=` (pronounce as *key is empty*). A tag collection will match this\n" + + "if `key` is missing or if `key` is a literal empty value.\n" + + "\n" + + "### Removing a key\n" + + "\n" + + "If a key should be deleted in the OpenStreetMap-database, specify `key=` as well. This can be used e.g. to remove a\n" + + "fixme or value from another mapping if another field is filled out.", + }, + "!=": { + name: "strict not equals", + overpassSupport: true, + docs: + "To check if a key does _not_ equal a certain value, use `key!=value`. This is converted behind the scenes\n" + + "to `key!~^value$`\n" + + "\n" + + "If `key` is not present or empty, this will match too.\n" + + "\n" + + "### If key is present\n" + + "\n" + + "This implies that, to check if a key is present, `key!=` can be used. This will only match if the key is present and not\n" + + "empty.", + }, + "~": { + name: "Value matches regex", + overpassSupport: true, + docs: + "A tag can also be tested against a regex with `key~regex`. Note that this regex __must match__ the entire value. If the\n" + + "value is allowed to appear anywhere as substring, use `key~.*regex.*`.\n" + + "The regex is put within braces as to prevent runaway values.\n" + + "\nUse `key~*` to indicate that any value is allowed. This is effectively the check that the attribute is present (defined _and_ not empty)." + + "\n" + + "Regexes will match the newline character with `.` too - the `s`-flag is enabled by default.", + }, + "~i~": { + name: "Value matches case-invariant regex", + overpassSupport: true, + docs: "A tag can also be tested against a regex with `key~i~regex`, where the case of the value will be ignored. The regex is still matched against the _entire_ value", + }, + "!~": { + name: "Value should _not_ match regex", + overpassSupport: true, + docs: + "A tag can also be tested against a regex with `key!~regex`. This filter will match if the value does *not* match the regex. " + + "\n If the\n" + + "value is allowed to appear anywhere as substring, use `key~.*regex.*`.\n" + + "The regex is put within braces as to prevent runaway values.\n", + }, + "!~i~": { + name: "Value does *not* match case-invariant regex", + overpassSupport: true, + docs: "A tag can also be tested against a regex with `key~i~regex`, where the case of the value will be ignored. The regex is still matched against the _entire_ value. This filter returns true if the value does *not* match", + }, + "~~": { + name: "Key and value should match given regex", + overpassSupport: true, + docs: "Both the `key` and `value` part of this specification are interpreted as regexes, both the key and value musth completely match their respective regexes", + }, + ":=": { + name: "Substitute `... {some_key} ...` and match `key`", + overpassSupport: false, + uploadable: true, + docs: + "**This is an advanced feature - use with caution**\n" + + "\n" + + "Some tags are automatically set or calculated - see [CalculatedTags](CalculatedTags.md) for an entire overview. If one\n" + + "wants to apply such a value as tag, use a substituting-tag such, for example`survey:date:={_date:now}`. Note that the\n" + + "separator between key and value here is `:=`. The text between `{` and `}` is interpreted as a key, and the respective\n" + + "value is substituted into the string.\n" + + "\n" + + "One can also append, e.g. `key:={some_key} fixed text {some_other_key}`.\n" + + "\n" + + "An assigning tag _cannot_ be used to query OpenStreetMap/Overpass.\n" + + "\n" + + "If using a key or variable which might not be defined, add a condition in the mapping to hide the option. This is\n" + + "because, if `some_other_key` is not defined, one might actually upload the literal text `key={some_other_key}` to OSM -\n" + + "which we do not want.\n" + + "\n" + + "To mitigate this, use:\n" + + "\n" + + "```json\n" + + "{\n" + + ' "mappings": [\n' + + " {\n" + + ' "if":"key:={some_other_key}",\n' + + ' "then": "...",\n' + + ' "hideInAnswer": "some_other_key="\n' + + " }\n" + + " ]\n" + + "}\n" + + "```\n" + + "\n" + + "One can use `key!:=prefix-{other_key}-postfix` as well, to match if `key` is _not_ the same\n" + + "as `prefix-{other_key}-postfix` (with `other_key` substituted by the value)", + }, + "!:=": { + name: "Substitute `{some_key}` should not match `key`", + overpassSupport: false, + docs: "See `:=`, except that this filter is inverted", + }, + } private static keyCounts: { keys: any; tags: any } = key_counts - private static comparators: [string, (a: number, b: number) => boolean][] = [ - ["<=", (a, b) => a <= b], - [">=", (a, b) => a >= b], - ["<", (a, b) => a < b], - [">", (a, b) => a > b], - ] + public static readonly numberAndDateComparisonDocs = + "If the value of a tag is a number (e.g. `key=42`), one can use a filter `key<=42`, `key>=35`, `key>40` or `key<50` to\n" + + "match this, e.g. in conditions for renderings. These tags cannot be used to generate an answer nor can they be used to\n" + + "request data upstream from overpass.\n" + + "\n" + + "Note that the value coming from OSM will first be stripped by removing all non-numeric characters. For\n" + + "example, `length=42 meter` will be interpreted as `length=42` and will thus match `length<=42` and `length>=42`. In\n" + + "special circumstances (e.g. `surface_area=42 m2` or `length=100 feet`), this will result in erronous\n" + + "values (`surface=422` or if a length in meters is compared to). However, this can be partially alleviated by using '\n" + + "Units' to rewrite to a default format.\n" + + "\n" + + "Dates can be compared with the same expression: `somekey<2022-06-22` will match if `somekey` is a date and is smaller\n" + + "then 22nd june '22." + + public static readonly logicalOperator = + "\n" + + "## Logical operators\n" + + "\n" + + "One can combine multiple tags by using `and` or `or`, e.g.:\n" + + "\n" + + "```json\n" + + "{\n" + + ' "osmTags": {\n' + + ' "or": [\n' + + ' "amenity=school",\n' + + ' "amenity=kindergarten"\n' + + " ]\n" + + " }\n" + + "}\n" + + "```\n" + + public static readonly intro = + "Tags format\n" + + "=============\n" + + "\n" + + "When creating the `json` file describing your layer or theme, you'll have to add a few tags to describe what you want.\n" + + "This document gives an overview of what every expression means and how it behaves in edge cases.\n" + + "\n" + + "If the schema-files note a type [`TagConfigJson`](https://github.com/pietervdvn/MapComplete/blob/develop/Models/ThemeConfig/Json/TagConfigJson.ts), you can use one of these values.\n" + + "\n" + + "In some cases, not every type of tags-filter can be used. For example, _rendering_ an option with a regex is\n" + + 'fine (`"if": "brand~[Bb]randname", "then":" The brand is Brandname"`); but this regex can not be used to write a value\n' + + "into the database. The theme loader will however refuse to work with such inconsistencies and notify you of this while\n" + + "you are building your theme.\n" + + "\n" + + "Example\n" + + "-------\n" + + "\n" + + "This example shows the most common options on how to specify tags:\n" + + "\n" + + "```json\n" + + "{\n" + + ' "and": [\n' + + ' "key=value",\n' + + " {\n" + + ' "or": [\n' + + ' "other_key=value",\n' + + ' "other_key=some_other_value"\n' + + " ]\n" + + " },\n" + + ' "key_which_should_be_missing=",\n' + + ' "key_which_should_have_a_value~*",\n' + + ' "key~.*some_regex_a*_b+_[a-z]?",\n' + + ' "height<1"\n' + + " ]\n" + + "}\n" + + "```\n" + + "\n" + + "\n" static KVtoProperties(tags: Tag[]): Record { const properties: Record = {} @@ -286,12 +477,18 @@ export class TagUtils { * regex.matchesProperties({maxspeed: "50 mph"}) // => true */ - public static Tag(json: TagConfigJson, context: string = ""): TagsFilter { + public static Tag(json: TagConfigJson, context: string | ConversionContext = ""): TagsFilter { try { - return this.ParseTagUnsafe(json, context) + let ctx = typeof context === "string" ? context : context.path.join(".") + return this.ParseTagUnsafe(json, ctx) } catch (e) { - console.error("Could not parse tag", json, "in context", context, "due to ", e) - throw e + if (typeof context === "string") { + console.error("Could not parse tag", json, "in context", context, "due to ", e) + throw e + } else { + context.err(e) + return undefined + } } } @@ -703,4 +900,19 @@ export class TagUtils { } return " (" + joined + ") " } + + public static generateDocs(): string { + return [ + TagUtils.intro, + ...Object.keys(TagUtils.modeDocumentation).map((mode) => { + const doc = TagUtils.modeDocumentation[mode] + return ["", "## `" + mode + "` " + doc.name, "", doc.docs, "", ""].join("\n") + }), + "## " + + TagUtils.comparators.map((comparator) => "`" + comparator[0] + "`").join(" ") + + " Logical comparators", + TagUtils.numberAndDateComparisonDocs, + TagUtils.logicalOperator, + ].join("\n") + } } diff --git a/src/Logic/UIEventSource.ts b/src/Logic/UIEventSource.ts index 0b85d50e6..7e16d96e6 100644 --- a/src/Logic/UIEventSource.ts +++ b/src/Logic/UIEventSource.ts @@ -435,7 +435,6 @@ class MappedStore extends Store { * const mapped = src.map(i => i * 2) * src.setData(3) * mapped.data // => 6 - * */ get data(): T { if (!this._callbacksAreRegistered) { @@ -515,7 +514,6 @@ class MappedStore extends Store { } private unregisterFromUpstream() { - console.debug("Unregistering callbacks for", this.tag) this._callbacksAreRegistered = false this._unregisterFromUpstream() this._unregisterFromExtraStores?.forEach((unr) => unr()) @@ -534,7 +532,7 @@ class MappedStore extends Store { private update(): void { const newData = this._f(this._upstream.data) this._upstreamPingCount = this._upstreamCallbackHandler?.pingCount - if (this._data == newData) { + if (this._data === newData) { return } this._data = newData @@ -670,7 +668,7 @@ export class UIEventSource extends Store implements Writable { ) } - static asBoolean(stringUIEventSource: UIEventSource) { + static asBoolean(stringUIEventSource: UIEventSource): UIEventSource { return stringUIEventSource.sync( (str) => str === "true", [], diff --git a/src/Logic/Web/TagInfo.ts b/src/Logic/Web/TagInfo.ts new file mode 100644 index 000000000..77250ae97 --- /dev/null +++ b/src/Logic/Web/TagInfo.ts @@ -0,0 +1,49 @@ +import exp from "constants" +import { Utils } from "../../Utils" + +export interface TagInfoStats { + /** + * The total number of entries in the data array, **not** the total number of objects known in OSM! + * + * Use `data.find(item => item.type==="all").count` for this + */ + total: number + data: { + type: "all" | "nodes" | "ways" | "relations" + count: number + count_fraction: number + }[] +} + +export default class TagInfo { + private readonly _backend: string + + public static readonly global = new TagInfo() + + constructor(backend = "https://taginfo.openstreetmap.org/") { + this._backend = backend + } + + public getStats(key: string, value?: string): Promise { + let url: string + if (value) { + url = `${this._backend}api/4/tag/stats?key=${key}&value=${value}` + } else { + url = `${this._backend}api/4/key/stats?key=${key}` + } + return Utils.downloadJsonCached(url, 1000 * 60 * 60) + } + + /** + * Creates the URL to the webpage containing more information + * @param k + * @param v + */ + webUrl(k: string, v: string) { + if (v) { + return `${this._backend}/tags/${k}=${v}#overview` + } else { + return `${this._backend}/keys/${k}#overview` + } + } +} diff --git a/src/Models/ThemeConfig/Conversion/AddContextToTranslations.ts b/src/Models/ThemeConfig/Conversion/AddContextToTranslations.ts index 937399ced..adbea661f 100644 --- a/src/Models/ThemeConfig/Conversion/AddContextToTranslations.ts +++ b/src/Models/ThemeConfig/Conversion/AddContextToTranslations.ts @@ -1,6 +1,7 @@ import { DesugaringStep } from "./Conversion" import { Utils } from "../../../Utils" import Translations from "../../../UI/i18n/Translations" +import { ConversionContext } from "./ConversionContext" export class AddContextToTranslations extends DesugaringStep { private readonly _prefix: string @@ -27,14 +28,14 @@ export class AddContextToTranslations extends DesugaringStep { * } * ] * } - * const rewritten = new AddContextToTranslations("prefix:").convert(theme, "context").result + * const rewritten = new AddContextToTranslations("prefix:").convertStrict(theme, ConversionContext.test()) * const expected = { * layers: [ * { * builtin: ["abc"], * override: { * title:{ - * _context: "prefix:context.layers.0.override.title" + * _context: "prefix:layers.0.override.title" * en: "Some title" * } * } @@ -57,14 +58,14 @@ export class AddContextToTranslations extends DesugaringStep { * } * ] * } - * const rewritten = new AddContextToTranslations("prefix:").convert(theme, "context").result + * const rewritten = new AddContextToTranslations("prefix:").convertStrict(theme, ConversionContext.test()) * const expected = { * layers: [ * { * tagRenderings:[ * {id: "some-tr", * question:{ - * _context: "prefix:context.layers.0.tagRenderings.some-tr.question" + * _context: "prefix:layers.0.tagRenderings.some-tr.question" * en:"Question?" * } * } @@ -85,7 +86,7 @@ export class AddContextToTranslations extends DesugaringStep { * } * ] * } - * const rewritten = new AddContextToTranslations("prefix:").convert(theme, "context").result + * const rewritten = new AddContextToTranslations("prefix:").convertStrict(theme, ConversionContext.test()) * const expected = { * layers: [ * { @@ -113,19 +114,16 @@ export class AddContextToTranslations extends DesugaringStep { * } * ] * } - * const rewritten = new AddContextToTranslations("prefix:").convert(theme, "context").result + * const rewritten = new AddContextToTranslations("prefix:").convertStrict(theme, ConversionContext.test()) * rewritten // => theme * */ - convert( - json: T, - context: string - ): { result: T; errors?: string[]; warnings?: string[]; information?: string[] } { + convert(json: T, context: ConversionContext): T { if (json["#dont-translate"] === "*") { - return { result: json } + return json } - const result = Utils.WalkJson( + return Utils.WalkJson( json, (leaf, path) => { if (leaf === undefined || leaf === null) { @@ -142,16 +140,15 @@ export class AddContextToTranslations extends DesugaringStep { } } - return { ...leaf, _context: this._prefix + context + "." + path.join(".") } + return { + ...leaf, + _context: this._prefix + context.path.concat(path).join("."), + } } else { return leaf } }, (obj) => obj === undefined || obj === null || Translations.isProbablyATranslation(obj) ) - - return { - result, - } } } diff --git a/src/Models/ThemeConfig/Conversion/Conversion.ts b/src/Models/ThemeConfig/Conversion/Conversion.ts index 8ef98a428..f2ebd427c 100644 --- a/src/Models/ThemeConfig/Conversion/Conversion.ts +++ b/src/Models/ThemeConfig/Conversion/Conversion.ts @@ -1,13 +1,21 @@ -import { TagRenderingConfigJson } from "../Json/TagRenderingConfigJson" import { LayerConfigJson } from "../Json/LayerConfigJson" import { Utils } from "../../../Utils" +import { QuestionableTagRenderingConfigJson } from "../Json/QuestionableTagRenderingConfigJson" +import { ConversionContext } from "./ConversionContext" export interface DesugaringContext { - tagRenderings: Map + tagRenderings: Map sharedLayers: Map publicLayers?: Set } +export type ConversionMsgLevel = "debug" | "information" | "warning" | "error" +export interface ConversionMessage { + context: ConversionContext + message: string + level: ConversionMsgLevel +} + export abstract class Conversion { public readonly modifiedAttributes: string[] public readonly name: string @@ -19,57 +27,32 @@ export abstract class Conversion { this.name = name } - public static strict(fixed: { - errors?: string[] - warnings?: string[] - information?: string[] - result?: T - }): T { - fixed.information?.forEach((i) => console.log(" ", i)) - const yellow = (s) => "\x1b[33m" + s + "\x1b[0m" - const red = (s) => "\x1b[31m" + s + "\x1b[0m" - fixed.warnings?.forEach((w) => console.warn(red(` `), yellow(w))) - - if (fixed?.errors !== undefined && fixed?.errors?.length > 0) { - fixed.errors?.forEach((e) => console.error(red(`ERR ` + e))) + public convertStrict(json: TIn, context?: ConversionContext): TOut { + context ??= ConversionContext.construct([], []) + context = context.inOperation(this.name) + const fixed = this.convert(json, context) + for (const msg of context.messages) { + if (msg.level === "debug") { + continue + } + ConversionContext.print(msg) + } + if (context.hasErrors()) { throw "Detected one or more errors, stopping now" } - - return fixed.result - } - - public convertStrict(json: TIn, context: string): TOut { - const fixed = this.convert(json, context) - return DesugaringStep.strict(fixed) - } - - public convertJoin( - json: TIn, - context: string, - errors: string[], - warnings?: string[], - information?: string[] - ): TOut { - const fixed = this.convert(json, context) - errors?.push(...(fixed.errors ?? [])) - warnings?.push(...(fixed.warnings ?? [])) - information?.push(...(fixed.information ?? [])) - return fixed.result + return fixed } public andThenF(f: (tout: TOut) => X): Conversion { return new Pipe(this, new Pure(f)) } - abstract convert( - json: TIn, - context: string - ): { result: TOut; errors?: string[]; warnings?: string[]; information?: string[] } + public abstract convert(json: TIn, context: ConversionContext): TOut } export abstract class DesugaringStep extends Conversion {} -class Pipe extends Conversion { +export class Pipe extends Conversion { private readonly _step0: Conversion private readonly _step1: Conversion @@ -79,33 +62,13 @@ class Pipe extends Conversion { this._step1 = step1 } - convert( - json: TIn, - context: string - ): { result: TOut; errors?: string[]; warnings?: string[]; information?: string[] } { - const r0 = this._step0.convert(json, context) - const { result, errors, information, warnings } = r0 - if (result === undefined && errors.length > 0) { - return { - ...r0, - result: undefined, - } - } - - const r = this._step1.convert(result, context) - Utils.PushList(errors, r.errors) - Utils.PushList(warnings, r.warnings) - Utils.PushList(information, r.information) - return { - result: r.result, - errors, - warnings, - information, - } + convert(json: TIn, context: ConversionContext): TOut { + const r0 = this._step0.convert(json, context.inOperation(this._step0.name)) + return this._step1.convert(r0, context.inOperation(this._step1.name)) } } -class Pure extends Conversion { +export class Pure extends Conversion { private readonly _f: (t: TIn) => TOut constructor(f: (t: TIn) => TOut) { @@ -113,51 +76,45 @@ class Pure extends Conversion { this._f = f } - convert( - json: TIn, - context: string - ): { result: TOut; errors?: string[]; warnings?: string[]; information?: string[] } { - return { result: this._f(json) } + convert(json: TIn, context: ConversionContext): TOut { + return this._f(json) } } export class Each extends Conversion { private readonly _step: Conversion + private readonly _msg: string - constructor(step: Conversion) { + constructor(step: Conversion, msg?: string) { super( "Applies the given step on every element of the list", [], "OnEach(" + step.name + ")" ) this._step = step + this._msg = msg } - convert( - values: X[], - context: string - ): { result: Y[]; errors?: string[]; warnings?: string[]; information?: string[] } { + convert(values: X[], context: ConversionContext): Y[] { if (values === undefined || values === null) { - return { result: undefined } + return values } - const information: string[] = [] - const warnings: string[] = [] - const errors: string[] = [] const step = this._step const result: Y[] = [] + const c = context.inOperation("each") for (let i = 0; i < values.length; i++) { - const r = step.convert(values[i], context + "[" + i + "]") - Utils.PushList(information, r.information) - Utils.PushList(warnings, r.warnings) - Utils.PushList(errors, r.errors) - result.push(r.result) - } - return { - information, - errors, - warnings, - result, + if (this._msg) { + console.log( + this._msg, + `: ${i + 1}/${values.length}`, + values[i]?.["id"] !== undefined ? values[i]?.["id"] : "" + ) + } + const context_ = c.enter(i - 1) + const r = step.convert(values[i], context_) + result.push(r) } + return result } } @@ -179,23 +136,17 @@ export class On extends DesugaringStep { this.key = key } - convert( - json: T, - context: string - ): { result: T; errors?: string[]; warnings?: string[]; information?: string[] } { - json = { ...json } - const step = this.step(json) + convert(json: T, context: ConversionContext): T { const key = this.key const value: P = json[key] if (value === undefined || value === null) { - return { result: json } - } - const r = step.convert(value, context + "." + key) - json[key] = r.result - return { - ...r, - result: json, + return json } + + json = { ...json } + const step = this.step(json) + json[key] = step.convert(value, context.enter(key).inOperation("on[" + key + "]")) + return json } } @@ -204,13 +155,8 @@ export class Pass extends Conversion { super(message ?? "Does nothing, often to swap out steps in testing", [], "Pass") } - convert( - json: T, - context: string - ): { result: T; errors?: string[]; warnings?: string[]; information?: string[] } { - return { - result: json, - } + convert(json: T, context: ConversionContext): T { + return json } } @@ -226,25 +172,13 @@ export class Concat extends Conversion { this._step = step } - convert( - values: X[], - context: string - ): { result: T[]; errors?: string[]; warnings?: string[]; information?: string[] } { + convert(values: X[], context: ConversionContext): T[] { if (values === undefined || values === null) { // Move on - nothing to see here! - return { - result: undefined, - } - } - const r = new Each(this._step).convert(values, context) - const vals: T[][] = r.result - - const flattened: T[] = [].concat(...vals) - - return { - ...r, - result: flattened, + return values } + const vals: T[][] = new Each(this._step).convert(values, context.inOperation("concat")) + return [].concat(...vals) } } @@ -260,64 +194,80 @@ export class FirstOf extends Conversion { this._conversion = conversion } - convert( - json: T, - context: string - ): { result: X; errors?: string[]; warnings?: string[]; information?: string[] } { - const reslt = this._conversion.convert(json, context) - return { - ...reslt, - result: reslt.result[0], + convert(json: T, context: ConversionContext): X { + const values = this._conversion.convert(json, context.inOperation("firstOf")) + if (values.length === 0) { + return undefined } + return values[0] } } +export class Cached extends Conversion { + private _step: Conversion + private readonly key: string + constructor(step: Conversion) { + super("Secretly caches the output for the given input", [], "cached") + this._step = step + this.key = "__super_secret_caching_key_" + step.name + } + + convert(json: TIn, context: ConversionContext): TOut { + if (json[this.key]) { + return json[this.key] + } + const converted = this._step.convert(json, context) + Object.defineProperty(json, this.key, { + value: converted, + enumerable: false, + }) + return converted + } +} export class Fuse extends DesugaringStep { private readonly steps: DesugaringStep[] - + protected debug = false constructor(doc: string, ...steps: DesugaringStep[]) { super( (doc ?? "") + "This fused pipeline of the following steps: " + steps.map((s) => s.name).join(", "), Utils.Dedup([].concat(...steps.map((step) => step.modifiedAttributes))), - "Fuse of " + steps.map((s) => s.name).join(", ") + "Fuse(" + steps.map((s) => s.name).join(", ") + ")" ) this.steps = Utils.NoNull(steps) } - convert( - json: T, - context: string - ): { result: T; errors: string[]; warnings: string[]; information: string[] } { - const errors = [] - const warnings = [] - const information = [] + public enableDebugging(): Fuse { + this.debug = true + return this + } + + convert(json: T, context: ConversionContext): T { + const timings = [] for (let i = 0; i < this.steps.length; i++) { + const start = new Date() const step = this.steps[i] try { - let r = step.convert(json, "While running step " + step.name + ": " + context) - if (r.result["tagRenderings"]?.some((tr) => tr === undefined)) { - throw step.name + " introduced an undefined tagRendering" - } - errors.push(...(r.errors ?? [])) - warnings.push(...(r.warnings ?? [])) - information.push(...(r.information ?? [])) - json = r.result - if (errors.length > 0) { + const r = step.convert(json, context.inOperation(step.name)) + if (r === undefined || r === null) { break } + json = r } catch (e) { console.error("Step " + step.name + " failed due to ", e, e.stack) throw e } + if (this.debug) { + const stop = new Date() + const timeNeededMs = stop.getTime() - start.getTime() + timings.push(timeNeededMs) + } } - return { - result: json, - errors, - warnings, - information, + if (this.debug) { + console.log("Time needed,", timings.join(", ")) } + return json } } @@ -333,14 +283,15 @@ export class SetDefault extends DesugaringStep { this._overrideEmptyString = overrideEmptyString } - convert(json: T, context: string): { result: T } { + convert(json: T, context: ConversionContext): T { + if (json === undefined) { + return undefined + } if (json[this.key] === undefined || (json[this.key] === "" && this._overrideEmptyString)) { json = { ...json } json[this.key] = this.value } - return { - result: json, - } + return json } } diff --git a/src/Models/ThemeConfig/Conversion/ConversionContext.ts b/src/Models/ThemeConfig/Conversion/ConversionContext.ts new file mode 100644 index 000000000..88fdcb771 --- /dev/null +++ b/src/Models/ThemeConfig/Conversion/ConversionContext.ts @@ -0,0 +1,116 @@ +import { ConversionMessage, ConversionMsgLevel } from "./Conversion" + +export class ConversionContext { + /** + * The path within the data structure where we are currently operating + */ + readonly path: ReadonlyArray + /** + * Some information about the current operation + */ + readonly operation: ReadonlyArray + readonly messages: ConversionMessage[] + + private _hasErrors: boolean = false + + private constructor( + messages: ConversionMessage[], + path: ReadonlyArray, + operation?: ReadonlyArray + ) { + this.path = path + this.operation = operation ?? [] + // Messages is shared by reference amonst all 'context'-objects for performance + this.messages = messages + if (this.path.some((p) => typeof p === "object" || p === "[object Object]")) { + throw "ConversionMessage: got an object as path entry:" + JSON.stringify(path) + } + } + + public static construct(path: (string | number)[], operation: string[]) { + return new ConversionContext([], [...path], [...operation]) + } + + public static test(msg?: string) { + return new ConversionContext([], msg ? [msg] : [], ["test"]) + } + + static print(msg: ConversionMessage) { + const noString = msg.context.path.filter( + (p) => typeof p !== "string" && typeof p !== "number" + ) + if (noString.length > 0) { + console.warn("Non-string value in path:", ...noString) + } + if (msg.level === "error") { + console.error( + ConversionContext.red("ERR "), + msg.context.path.join("."), + ConversionContext.red(msg.message), + msg.context.operation.join(".") + ) + } else if (msg.level === "warning") { + console.warn( + ConversionContext.red(" "), + msg.context.path.join("."), + ConversionContext.yellow(msg.message), + msg.context.operation.join(".") + ) + } else { + console.log(" ", msg.context.path.join("."), msg.message) + } + } + + private static yellow(s) { + return "\x1b[33m" + s + "\x1b[0m" + } + + private static red(s) { + return "\x1b[31m" + s + "\x1b[0m" + } + + public enter(key: string | number | (string | number)[]) { + if (!Array.isArray(key)) { + return new ConversionContext(this.messages, [...this.path, key], this.operation) + } + return new ConversionContext(this.messages, [...this.path, ...key], this.operation) + } + + public enters(...key: (string | number)[]) { + return this.enter(key) + } + + public inOperation(key: string) { + return new ConversionContext(this.messages, this.path, [...this.operation, key]) + } + + warn(message: string) { + this.messages.push({ context: this, level: "warning", message }) + } + + err(message: string) { + this._hasErrors = true + this.messages.push({ context: this, level: "error", message }) + } + + info(message: string) { + this.messages.push({ context: this, level: "information", message }) + } + + getAll(mode: ConversionMsgLevel): ConversionMessage[] { + return this.messages.filter((m) => m.level === mode) + } + + public hasErrors() { + if (this._hasErrors) { + return true + } + const foundErr = this.messages?.find((m) => m.level === "error") !== undefined + this._hasErrors = foundErr + return foundErr + } + + debug(message: string) { + this.messages.push({ context: this, level: "debug", message }) + } +} diff --git a/src/Models/ThemeConfig/Conversion/CreateNoteImportLayer.ts b/src/Models/ThemeConfig/Conversion/CreateNoteImportLayer.ts index 1fac78398..c88eb6541 100644 --- a/src/Models/ThemeConfig/Conversion/CreateNoteImportLayer.ts +++ b/src/Models/ThemeConfig/Conversion/CreateNoteImportLayer.ts @@ -2,8 +2,8 @@ import { Conversion } from "./Conversion" import LayerConfig from "../LayerConfig" import { LayerConfigJson } from "../Json/LayerConfigJson" import Translations from "../../../UI/i18n/Translations" -import PointRenderingConfigJson from "../Json/PointRenderingConfigJson" import { Translation, TypedTranslation } from "../../../UI/i18n/Translation" +import { ConversionContext } from "./ConversionContext" export default class CreateNoteImportLayer extends Conversion { /** @@ -24,7 +24,7 @@ export default class CreateNoteImportLayer extends Conversion r !== null && r["location"] !== undefined - ) - const firstRender = pointRenderings[0] - if (firstRender === undefined) { - throw `Layer ${layerJson.id} does not have a pointRendering: ` + context - } const title = layer.presets[0].title const importButton = {} @@ -86,7 +79,7 @@ export default class CreateNoteImportLayer extends Conversion { + private static readonly layoutMetaPaths = metapaths.filter((mp) => { + const typeHint = mp.hints.typehint + return ( + ExtractImages.mightBeTagRendering(mp) || + (typeHint !== undefined && + (typeHint === "image" || + typeHint === "icon" || + typeHint === "image[]" || + typeHint === "icon[]")) + ) + }) + private static readonly tagRenderingMetaPaths = tagrenderingmetapaths private _isOfficial: boolean private _sharedTagRenderings: Set - private static readonly layoutMetaPaths = metapaths.filter( - (mp) => - ExtractImages.mightBeTagRendering(mp) || - (mp.typeHint !== undefined && - (mp.typeHint === "image" || - mp.typeHint === "icon" || - mp.typeHint === "image[]" || - mp.typeHint === "icon[]")) - ) - private static readonly tagRenderingMetaPaths = tagrenderingmetapaths - constructor(isOfficial: boolean, sharedTagRenderings: Set) { super("Extract all images from a layoutConfig using the meta paths.", [], "ExctractImages") this._isOfficial = isOfficial @@ -31,20 +34,28 @@ export class ExtractImages extends Conversion< } public static mightBeTagRendering(metapath: { type?: string | string[] }): boolean { - if (!Array.isArray(metapath.type)) { + if (!metapath.type) { return false } - return ( - metapath.type?.some( - (t) => - t["$ref"] == "#/definitions/TagRenderingConfigJson" || - t["$ref"] == "#/definitions/QuestionableTagRenderingConfigJson" - ) ?? false + let type: any[] + if (!Array.isArray(metapath.type)) { + type = [metapath.type] + } else { + type = metapath.type + } + return type.some( + (t) => + t !== null && + (t["$ref"] == "#/definitions/TagRenderingConfigJson" || + t["$ref"] == "#/definitions/MinimalTagRenderingConfigJson" || + t["$ref"] == "#/definitions/QuestionableTagRenderingConfigJson" || + (t["properties"]?.render !== undefined && + t["properties"]?.mappings !== undefined)) ) } /** - * const images = new ExtractImages(true, new Map()).convert({ + * const images = new ExtractImages(true, new Set()).convert({ * "layers": [ * { * tagRenderings: [ @@ -72,29 +83,27 @@ export class ExtractImages extends Conversion< * ] * } * ] - * }, "test").result.map(i => i.path); + * }, ConversionContext.test()).map(i => i.path); * images.length // => 2 * images.findIndex(img => img == "./assets/layers/bike_parking/staple.svg") >= 0 // => true * images.findIndex(img => img == "./assets/layers/bike_parking/bollard.svg") >= 0 // => true * * // should not pickup rotation, should drop color - * const images = new ExtractImages(true, new Set()).convert({"layers": [{mapRendering: [{"location": ["point", "centroid"],"icon": "pin:black",rotation: 180,iconSize: "40,40,center"}]}] - * }, "test").result + * const images = new ExtractImages(true, new Set()).convert({"layers": [{"pointRendering": [{"location": ["point", "centroid"],marker: [{"icon": "pin:black"}],rotation: 180,iconSize: "40,40,center"}]}] + * }, ConversionContext.test()) * images.length // => 1 * images[0].path // => "pin" * */ convert( json: LayoutConfigJson, - context: string - ): { result: { path: string; context: string }[]; errors: string[]; warnings: string[] } { + context: ConversionContext + ): { path: string; context: string }[] { const allFoundImages: { path: string; context: string }[] = [] - const errors = [] - const warnings = [] for (const metapath of ExtractImages.layoutMetaPaths) { const mightBeTr = ExtractImages.mightBeTagRendering(metapath) const allRenderedValuesAreImages = - metapath.typeHint === "icon" || metapath.typeHint === "image" + metapath.hints.typehint === "icon" || metapath.hints.typehint === "image" const found = Utils.CollectPath(metapath.path, json) if (mightBeTr) { // We might have tagRenderingConfigs containing icons here @@ -107,7 +116,7 @@ export class ExtractImages extends Conversion< } if (foundImage == "") { - warnings.push(context + "." + path.join(".") + " Found an empty image") + context.warn(context + "." + path.join(".") + " Found an empty image") } if (this._sharedTagRenderings?.has(foundImage)) { @@ -124,24 +133,23 @@ export class ExtractImages extends Conversion< for (const trpath of ExtractImages.tagRenderingMetaPaths) { // Inspect all the rendered values const fromPath = Utils.CollectPath(trpath.path, foundImage) - const isRendered = trpath.typeHint === "rendered" + const isRendered = trpath.hints.typehint === "rendered" const isImage = - trpath.typeHint === "icon" || trpath.typeHint === "image" + trpath.hints.typehint === "icon" || + trpath.hints.typehint === "image" for (const img of fromPath) { if (allRenderedValuesAreImages && isRendered) { // What we found is an image if (img.leaf === "" || img.leaf["path"] == "") { - warnings.push( - context + - [...path, ...img.path].join(".") + - ": Found an empty image at " - ) + context + .enter(path) + .enter(img.path) + .warn("Found an emtpy image") } else if (typeof img.leaf !== "string") { - ;(this._isOfficial ? errors : warnings).push( - context + - "." + - img.path.join(".") + - ": found an image path that is not a string: " + + const c = context.enter(img.path) + const w = this._isOfficial ? c.err : c.warn + w( + "found an image path that is not a string: " + JSON.stringify(img.leaf) ) } else { @@ -172,9 +180,8 @@ export class ExtractImages extends Conversion< } else { for (const foundElement of found) { if (foundElement.leaf === "") { - warnings.push( - context + "." + foundElement.path.join(".") + " Found an empty image" - ) + context.enter(foundElement.path).warn("Found an empty image") + continue } if (typeof foundElement.leaf !== "string") { @@ -211,7 +218,7 @@ export class ExtractImages extends Conversion< } } - return { result: cleanedImages, errors, warnings } + return cleanedImages } } @@ -234,9 +241,9 @@ export class FixImages extends DesugaringStep { * "id": "https://raw.githubusercontent.com/seppesantens/MapComplete-Themes/main/VerkeerdeBordenDatabank/verkeerdeborden.json" * "layers": [ * { - * "mapRendering": [ + * "pointRendering": [ * { - * "icon": "./TS_bolt.svg", + * marker: [{"icon": "./TS_bolt.svg"}], * iconBadges: [{ * if: "id=yes", * then: { @@ -257,30 +264,26 @@ export class FixImages extends DesugaringStep { * } * ], * } - * const fixed = new FixImages(new Set()).convert( theme, "test").result - * fixed.layers[0]["mapRendering"][0].icon // => "https://raw.githubusercontent.com/seppesantens/MapComplete-Themes/main/VerkeerdeBordenDatabank/TS_bolt.svg" - * fixed.layers[0]["mapRendering"][0].iconBadges[0].then.mappings[0].then // => "https://raw.githubusercontent.com/seppesantens/MapComplete-Themes/main/VerkeerdeBordenDatabank/Something.svg" + * const fixed = new FixImages(new Set()).convert( theme, ConversionContext.test()) + * fixed.layers[0]["pointRendering"][0].marker[0].icon // => "https://raw.githubusercontent.com/seppesantens/MapComplete-Themes/main/VerkeerdeBordenDatabank/TS_bolt.svg" + * fixed.layers[0]["pointRendering"][0].iconBadges[0].then.mappings[0].then // => "https://raw.githubusercontent.com/seppesantens/MapComplete-Themes/main/VerkeerdeBordenDatabank/Something.svg" */ - convert( - json: LayoutConfigJson, - context: string - ): { result: LayoutConfigJson; warnings?: string[] } { + convert(json: LayoutConfigJson, context: ConversionContext): LayoutConfigJson { let url: URL try { url = new URL(json.id) } catch (e) { // Not a URL, we don't rewrite - return { result: json } + return json } - const warnings: string[] = [] const absolute = url.protocol + "//" + url.host let relative = url.protocol + "//" + url.host + url.pathname relative = relative.substring(0, relative.lastIndexOf("/")) const self = this if (relative.endsWith("assets/generated/themes")) { - warnings.push( + context.warn( "Detected 'assets/generated/themes' as relative URL. I'm assuming that you are loading your file for the MC-repository, so I'm rewriting all image links as if they were absolute instead of relative" ) relative = absolute @@ -292,7 +295,7 @@ export class FixImages extends DesugaringStep { } if (typeof leaf !== "string") { - warnings.push( + context.warn( "Found a non-string object while replacing images: " + JSON.stringify(leaf) ) return leaf @@ -310,11 +313,11 @@ export class FixImages extends DesugaringStep { json = Utils.Clone(json) for (const metapath of metapaths) { - if (metapath.typeHint !== "image" && metapath.typeHint !== "icon") { + if (metapath.hints.typehint !== "image" && metapath.hints.typehint !== "icon") { continue } const mightBeTr = ExtractImages.mightBeTagRendering(metapath) - Utils.WalkPath(metapath.path, json, (leaf, path) => { + Utils.WalkPath(metapath.path, json, (leaf) => { if (typeof leaf === "string") { return replaceString(leaf) } @@ -323,7 +326,7 @@ export class FixImages extends DesugaringStep { // We might have reached a tagRenderingConfig containing icons // lets walk every rendered value and fix the images in there for (const trpath of tagrenderingmetapaths) { - if (trpath.typeHint !== "rendered") { + if (trpath.hints.typehint !== "rendered") { continue } Utils.WalkPath(trpath.path, leaf, (rendered) => { @@ -336,9 +339,6 @@ export class FixImages extends DesugaringStep { }) } - return { - warnings, - result: json, - } + return json } } diff --git a/src/Models/ThemeConfig/Conversion/LegacyJsonConvert.ts b/src/Models/ThemeConfig/Conversion/LegacyJsonConvert.ts index 50a90dc83..df4dec459 100644 --- a/src/Models/ThemeConfig/Conversion/LegacyJsonConvert.ts +++ b/src/Models/ThemeConfig/Conversion/LegacyJsonConvert.ts @@ -4,7 +4,7 @@ import LineRenderingConfigJson from "../Json/LineRenderingConfigJson" import { LayerConfigJson } from "../Json/LayerConfigJson" import { DesugaringStep, Each, Fuse, On } from "./Conversion" import PointRenderingConfigJson from "../Json/PointRenderingConfigJson" -import { del } from "idb-keyval" +import { ConversionContext } from "./ConversionContext" export class UpdateLegacyLayer extends DesugaringStep< LayerConfigJson | string | { builtin; override } @@ -17,15 +17,12 @@ export class UpdateLegacyLayer extends DesugaringStep< ) } - convert( - json: LayerConfigJson, - context: string - ): { result: LayerConfigJson; errors: string[]; warnings: string[] } { - const warnings = [] + convert(json: LayerConfigJson, context: ConversionContext): LayerConfigJson { if (typeof json === "string" || json["builtin"] !== undefined) { // Reuse of an already existing layer; return as-is - return { result: json, errors: [], warnings: [] } + return json } + context = context.enter(json.id) let config = { ...json } if (config["overpassTags"]) { @@ -52,11 +49,18 @@ export class UpdateLegacyLayer extends DesugaringStep< delete preset["preciseInput"] } } + + if (typeof preset.snapToLayer === "string") { + preset.snapToLayer = [preset.snapToLayer] + } } if (config.tagRenderings !== undefined) { let i = 0 for (const tagRendering of config.tagRenderings) { + if (!tagRendering) { + continue + } i++ if ( typeof tagRendering === "string" || @@ -78,8 +82,12 @@ export class UpdateLegacyLayer extends DesugaringStep< } } - if (config.mapRendering === undefined) { - config.mapRendering = [] + if ( + config["mapRendering"] === undefined && + config.pointRendering === undefined && + config.lineRendering === undefined + ) { + config["mapRendering"] = [] // This is a legacy format, lets create a pointRendering let location: ("point" | "centroid")[] = ["point"] let wayHandling: number = config["wayHandling"] ?? 0 @@ -95,7 +103,7 @@ export class UpdateLegacyLayer extends DesugaringStep< location, rotation: config["rotation"], } - config.mapRendering.push(pointConfig) + config["mapRendering"].push(pointConfig) } if (wayHandling !== 1) { @@ -105,10 +113,10 @@ export class UpdateLegacyLayer extends DesugaringStep< dashArray: config["dashArray"], } if (Object.keys(lineRenderConfig).length > 0) { - config.mapRendering.push(lineRenderConfig) + config["mapRendering"].push(lineRenderConfig) } } - if (config.mapRendering.length === 0) { + if (config["mapRendering"].length === 0) { throw ( "Could not convert the legacy theme into a new theme: no renderings defined for layer " + config.id @@ -128,24 +136,55 @@ export class UpdateLegacyLayer extends DesugaringStep< delete config["wayHandling"] delete config["hideUnderlayingFeaturesMinPercentage"] - for (const mapRenderingElement of config.mapRendering ?? []) { + for (const mapRenderingElement of config["mapRendering"] ?? []) { if (mapRenderingElement["iconOverlays"] !== undefined) { mapRenderingElement["iconBadges"] = mapRenderingElement["iconOverlays"] } for (const overlay of mapRenderingElement["iconBadges"] ?? []) { if (overlay["badge"] !== true) { - warnings.push("Warning: non-overlay element for ", config.id) + context.enters("iconBadges", "badge").warn("Non-overlay element") } delete overlay["badge"] } } - for (const rendering of config.mapRendering ?? []) { - if (!rendering["iconSize"]) { + if (config["mapRendering"]) { + const pointRenderings: PointRenderingConfigJson[] = [] + const lineRenderings: LineRenderingConfigJson[] = [] + for (const mapRenderingElement of config["mapRendering"]) { + if (mapRenderingElement["location"]) { + // This is a pointRendering + pointRenderings.push(mapRenderingElement) + } else { + lineRenderings.push(mapRenderingElement) + } + } + config["pointRendering"] = pointRenderings + config["lineRendering"] = lineRenderings + delete config["mapRendering"] + } + + for (const rendering of config.pointRendering ?? []) { + const pr = rendering + if (pr["icon"]) { + try { + const icon = Utils.NoEmpty(pr["icon"].split(";")) + pr.marker = icon.map((i) => { + const [iconPath, color] = i.split(":") + return { icon: iconPath, color } + }) + delete pr["icon"] + } catch (e) { + console.error("Could not handle icon in", json.id) + pr.marker = [{ icon: pr["icon"] }] + delete pr["icon"] + } + } + + let iconSize = pr.iconSize + if (!iconSize) { continue } - const pr = rendering - let iconSize = pr.iconSize if (Object.keys(pr.iconSize).length === 1 && pr.iconSize["render"] !== undefined) { iconSize = pr.iconSize["render"] @@ -159,26 +198,36 @@ export class UpdateLegacyLayer extends DesugaringStep< } } - for (const rendering of config.mapRendering) { - for (const key in rendering) { - if (!rendering[key]) { - continue - } - if ( - typeof rendering[key]["render"] === "string" && - Object.keys(rendering[key]).length === 1 - ) { - console.log("Rewrite: ", rendering[key]) - rendering[key] = rendering[key]["render"] + if (config.pointRendering) + for (const rendering of config.pointRendering) { + for (const key in rendering) { + if (!rendering[key]) { + continue + } + if ( + typeof rendering[key]["render"] === "string" && + Object.keys(rendering[key]).length === 1 + ) { + rendering[key] = rendering[key]["render"] + } + } + } + if (config.lineRendering) + for (const rendering of config.lineRendering) { + for (const key in rendering) { + if (!rendering[key]) { + continue + } + if ( + typeof rendering[key]["render"] === "string" && + Object.keys(rendering[key]).length === 1 + ) { + rendering[key] = rendering[key]["render"] + } } } - } - return { - result: config, - errors: [], - warnings, - } + return config } } @@ -187,10 +236,7 @@ class UpdateLegacyTheme extends DesugaringStep { super("Small fixes in the theme config", ["roamingRenderings"], "UpdateLegacyTheme") } - convert( - json: LayoutConfigJson, - context: string - ): { result: LayoutConfigJson; errors: string[]; warnings: string[] } { + convert(json: LayoutConfigJson, context: ConversionContext): LayoutConfigJson { const oldThemeConfig = { ...json } if (oldThemeConfig.socialImage === "") { @@ -201,18 +247,16 @@ class UpdateLegacyTheme extends DesugaringStep { console.log("Removing old background in", json.id) } + if (typeof oldThemeConfig.credits === "string") { + oldThemeConfig.credits = [oldThemeConfig.credits] + } + if (oldThemeConfig["roamingRenderings"] !== undefined) { if (oldThemeConfig["roamingRenderings"].length == 0) { delete oldThemeConfig["roamingRenderings"] } else { - return { - result: null, - errors: [ - context + - ": The theme contains roamingRenderings. These are not supported anymore", - ], - warnings: [], - } + context.err("The theme contains roamingRenderings. These are not supported anymore") + return null } } @@ -220,13 +264,16 @@ class UpdateLegacyTheme extends DesugaringStep { delete oldThemeConfig["language"] delete oldThemeConfig["version"] + if (oldThemeConfig.startLat === 0) { + delete oldThemeConfig.startLat + } + if (oldThemeConfig.startLon === 0) { + delete oldThemeConfig.startLon + } + if (oldThemeConfig.startZoom <= 2) { + delete oldThemeConfig.startZoom + } if (oldThemeConfig["maintainer"] !== undefined) { - console.log( - "Maintainer: ", - oldThemeConfig["maintainer"], - "credits: ", - oldThemeConfig["credits"] - ) if (oldThemeConfig.credits === undefined) { oldThemeConfig["credits"] = oldThemeConfig["maintainer"] delete oldThemeConfig["maintainer"] @@ -237,11 +284,7 @@ class UpdateLegacyTheme extends DesugaringStep { } } - return { - errors: [], - warnings: [], - result: oldThemeConfig, - } + return oldThemeConfig } } diff --git a/src/Models/ThemeConfig/Conversion/PrepareLayer.ts b/src/Models/ThemeConfig/Conversion/PrepareLayer.ts index c022081e7..a72306dd9 100644 --- a/src/Models/ThemeConfig/Conversion/PrepareLayer.ts +++ b/src/Models/ThemeConfig/Conversion/PrepareLayer.ts @@ -10,7 +10,10 @@ import { SetDefault, } from "./Conversion" import { LayerConfigJson } from "../Json/LayerConfigJson" -import { TagRenderingConfigJson } from "../Json/TagRenderingConfigJson" +import { + MinimalTagRenderingConfigJson, + TagRenderingConfigJson, +} from "../Json/TagRenderingConfigJson" import { Utils } from "../../../Utils" import RewritableConfigJson from "../Json/RewritableConfigJson" import SpecialVisualizations from "../../../UI/SpecialVisualizations" @@ -21,11 +24,13 @@ import { AddContextToTranslations } from "./AddContextToTranslations" import FilterConfigJson from "../Json/FilterConfigJson" import predifined_filters from "../../../../assets/layers/filters/filters.json" import { TagConfigJson } from "../Json/TagConfigJson" -import PointRenderingConfigJson from "../Json/PointRenderingConfigJson" -import LineRenderingConfigJson from "../Json/LineRenderingConfigJson" +import PointRenderingConfigJson, { IconConfigJson } from "../Json/PointRenderingConfigJson" import ValidationUtils from "./ValidationUtils" import { RenderingSpecification } from "../../../UI/SpecialVisualization" import { QuestionableTagRenderingConfigJson } from "../Json/QuestionableTagRenderingConfigJson" +import { ConfigMeta } from "../../../UI/Studio/configMeta" +import LineRenderingConfigJson from "../Json/LineRenderingConfigJson" +import { ConversionContext } from "./ConversionContext" class ExpandFilter extends DesugaringStep { private static readonly predefinedFilters = ExpandFilter.load_filters() @@ -48,20 +53,16 @@ class ExpandFilter extends DesugaringStep { return filters } - convert( - json: LayerConfigJson, - context: string - ): { result: LayerConfigJson; errors?: string[]; warnings?: string[]; information?: string[] } { - if (json.filter === undefined || json.filter === null) { - return { result: json } // Nothing to change here + convert(json: LayerConfigJson, context: ConversionContext): LayerConfigJson { + if (json?.filter === undefined || json?.filter === null) { + return json // Nothing to change here } if (json.filter["sameAs"] !== undefined) { - return { result: json } // Nothing to change here + return json // Nothing to change here } const newFilters: FilterConfigJson[] = [] - const errors: string[] = [] for (const filter of <(FilterConfigJson | string)[]>json.filter) { if (typeof filter !== "string") { newFilters.push(filter) @@ -71,16 +72,13 @@ class ExpandFilter extends DesugaringStep { if (this._state.sharedLayers.size > 0) { const split = filter.split(".") if (split.length > 2) { - errors.push( - context + - ": invalid filter name: " + - filter + - ", expected `layername.filterid`" + context.err( + "invalid filter name: " + filter + ", expected `layername.filterid`" ) } const layer = this._state.sharedLayers.get(split[0]) if (layer === undefined) { - errors.push(context + ": layer '" + split[0] + "' not found") + context.err("Layer '" + split[0] + "' not found") } const expectedId = split[1] const expandedFilter = (<(FilterConfigJson | string)[]>layer.filter).find( @@ -100,32 +98,33 @@ class ExpandFilter extends DesugaringStep { Array.from(ExpandFilter.predefinedFilters.keys()), (t) => t ) - const err = - context + - ".filter: while searching for predifined filter " + - filter + - ": this filter is not found. Perhaps you meant one of: " + - suggestions - errors.push(err) + context + .enter(filter) + .err( + "While searching for predefined filter " + + filter + + ": this filter is not found. Perhaps you meant one of: " + + suggestions + ) } newFilters.push(found) } - return { - result: { - ...json, - filter: newFilters, - }, - errors, - } + return { ...json, filter: newFilters } } } class ExpandTagRendering extends Conversion< - string | TagRenderingConfigJson | { builtin: string | string[]; override: any }, + | string + | TagRenderingConfigJson + | { + builtin: string | string[] + override: any + }, TagRenderingConfigJson[] > { private readonly _state: DesugaringContext private readonly _tagRenderingsByLabel: Map + // Only used for self-reference private readonly _self: LayerConfigJson private readonly _options: { /* If true, will copy the 'osmSource'-tags into the condition */ @@ -136,7 +135,10 @@ class ExpandTagRendering extends Conversion< constructor( state: DesugaringContext, self: LayerConfigJson, - options?: { applyCondition?: true | boolean; noHardcodedStrings?: false | boolean } + options?: { + applyCondition?: true | boolean + noHardcodedStrings?: false | boolean + } ) { super( "Converts a tagRenderingSpec into the full tagRendering, e.g. by substituting the tagRendering by the shared-question", @@ -148,7 +150,7 @@ class ExpandTagRendering extends Conversion< this._options = options this._tagRenderingsByLabel = new Map() for (const trconfig of state.tagRenderings?.values() ?? []) { - for (const label of trconfig.labels ?? []) { + for (const label of trconfig["labels"] ?? []) { let withLabel = this._tagRenderingsByLabel.get(label) if (withLabel === undefined) { withLabel = [] @@ -159,18 +161,23 @@ class ExpandTagRendering extends Conversion< } } - convert( - json: string | TagRenderingConfigJson | { builtin: string | string[]; override: any }, - context: string - ): { result: TagRenderingConfigJson[]; errors: string[]; warnings: string[] } { - const errors = [] - const warnings = [] + public convert( + spec: string | any, + ctx: ConversionContext + ): QuestionableTagRenderingConfigJson[] { + const trs = this.convertOnce(spec, ctx) - return { - result: this.convertUntilStable(json, warnings, errors, context), - errors, - warnings, + const result = [] + for (const tr of trs) { + if (typeof tr === "string" || tr["builtin"] !== undefined) { + const stable = this.convert(tr, ctx.inOperation("recursive_resolve")) + result.push(...stable) + } else { + result.push(tr) + } } + + return result } private lookup(name: string): TagRenderingConfigJson[] | undefined { @@ -192,7 +199,7 @@ class ExpandTagRendering extends Conversion< for (let foundTr of indirect) { foundTr = Utils.Clone(foundTr) Utils.Merge(tagRenderingConfigJson["override"] ?? {}, foundTr) - foundTr.id = tagRenderingConfigJson.id ?? foundTr.id + foundTr["id"] = tagRenderingConfigJson["id"] ?? foundTr["id"] result.push(foundTr) } } else { @@ -220,7 +227,7 @@ class ExpandTagRendering extends Conversion< const spl = name.split(".") let layer = state.sharedLayers?.get(spl[0]) - if (spl[0] === this._self.id) { + if (spl[0] === this._self?.id) { layer = this._self } @@ -238,9 +245,9 @@ class ExpandTagRendering extends Conversion< matchingTrs = layerTrs } else if (id.startsWith("*")) { const id_ = id.substring(1) - matchingTrs = layerTrs.filter((tr) => tr.labels?.indexOf(id_) >= 0) + matchingTrs = layerTrs.filter((tr) => tr["labels"]?.indexOf(id_) >= 0) } else { - matchingTrs = layerTrs.filter((tr) => tr.id === id || tr.labels?.indexOf(id) >= 0) + matchingTrs = layerTrs.filter((tr) => tr["id"] === id || tr["labels"]?.indexOf(id) >= 0) } const contextWriter = new AddContextToTranslations("layers:") @@ -257,7 +264,13 @@ class ExpandTagRendering extends Conversion< } } - found = contextWriter.convertStrict(found, layer.id + ".tagRenderings." + found["id"]) + found = contextWriter.convertStrict( + found, + ConversionContext.construct( + [layer.id, "tagRenderings", found["id"]], + ["AddContextToTranslations"] + ) + ) matchingTrs[i] = found } @@ -267,12 +280,7 @@ class ExpandTagRendering extends Conversion< return undefined } - private convertOnce( - tr: string | any, - warnings: string[], - errors: string[], - ctx: string - ): TagRenderingConfigJson[] { + private convertOnce(tr: string | any, ctx: ConversionContext): TagRenderingConfigJson[] { const state = this._state if (typeof tr === "string") { @@ -281,19 +289,21 @@ class ExpandTagRendering extends Conversion< lookup = this.lookup(tr) } if (lookup === undefined) { - const isTagRendering = ctx.indexOf("On(mapRendering") < 0 - if (isTagRendering && this._state.sharedLayers?.size > 0) { - warnings.push( - `${ctx}: A literal rendering was detected: ${tr} - Did you perhaps forgot to add a layer name as 'layername.${tr}'? ` + + if ( + this._state.sharedLayers?.size > 0 && + ctx.path.at(-1) !== "icon" && + !ctx.path.find((p) => p === "pointRendering") + ) { + ctx.warn( + `A literal rendering was detected: ${tr} + Did you perhaps forgot to add a layer name as 'layername.${tr}'? ` + Array.from(state.sharedLayers.keys()).join(", ") ) } if (this._options?.noHardcodedStrings && this._state?.sharedLayers?.size > 0) { - errors.push( - ctx + - "Detected an invocation to a builtin tagRendering, but this tagrendering was not found: " + + ctx.err( + "Detected an invocation to a builtin tagRendering, but this tagrendering was not found: " + tr + " \n Did you perhaps forget to add the layer as prefix, such as `icons." + tr + @@ -302,7 +312,7 @@ class ExpandTagRendering extends Conversion< } return [ - { + { render: tr, id: tr.replace(/[^a-zA-Z0-9]/g, ""), }, @@ -330,10 +340,8 @@ class ExpandTagRendering extends Conversion< ) { continue } - errors.push( - "At " + - ctx + - ": an object calling a builtin can only have keys `builtin` or `override`, but a key with name `" + + ctx.err( + "An object calling a builtin can only have keys `builtin` or `override`, but a key with name `" + key + "` was found. This won't be picked up! The full object is: " + JSON.stringify(tr) @@ -348,7 +356,7 @@ class ExpandTagRendering extends Conversion< if (name.indexOf(".") > 0) { const [layerName] = name.split(".") let layer = state.sharedLayers.get(layerName) - if (layerName === this._self.id) { + if (layerName === this._self?.id) { layer = this._self } if (layer === undefined) { @@ -358,23 +366,20 @@ class ExpandTagRendering extends Conversion< (s) => s ) if (state.sharedLayers.size === 0) { - warnings.push( - ctx + - ": BOOTSTRAPPING. Rerun generate layeroverview. While reusing tagrendering: " + + ctx.warn( + "BOOTSTRAPPING. Rerun generate layeroverview. While reusing tagrendering: " + name + ": layer " + layerName + - " not found. Maybe you meant on of " + - candidates.slice(0, 3).join(", ") + " not found for now, but ignoring as this is a bootstrapping run. " ) } else { - errors.push( - ctx + - ": While reusing tagrendering: " + + ctx.err( + ": While reusing tagrendering: " + name + ": layer " + layerName + - " not found. Maybe you meant on of " + + " not found. Maybe you meant one of " + candidates.slice(0, 3).join(", ") ) } @@ -385,9 +390,8 @@ class ExpandTagRendering extends Conversion< ) } candidates = Utils.sortedByLevenshteinDistance(name, candidates, (i) => i) - errors.push( - ctx + - ": The tagRendering with identifier " + + ctx.err( + "The tagRendering with identifier " + name + " was not found.\n\tDid you mean one of " + candidates.join(", ") + @@ -409,32 +413,6 @@ class ExpandTagRendering extends Conversion< return [tr] } - - private convertUntilStable( - spec: string | any, - warnings: string[], - errors: string[], - ctx: string - ): TagRenderingConfigJson[] { - const trs = this.convertOnce(spec, warnings, errors, ctx) - - const result = [] - for (const tr of trs) { - if (typeof tr === "string" || tr["builtin"] !== undefined) { - const stable = this.convertUntilStable( - tr, - warnings, - errors, - ctx + "(RECURSIVE RESOLVE)" - ) - result.push(...stable) - } else { - result.push(tr) - } - } - - return result - } } class DetectInline extends DesugaringStep { @@ -448,15 +426,10 @@ class DetectInline extends DesugaringStep { convert( json: QuestionableTagRenderingConfigJson, - context: string - ): { - result: QuestionableTagRenderingConfigJson - errors?: string[] - warnings?: string[] - information?: string[] - } { + context: ConversionContext + ): QuestionableTagRenderingConfigJson { if (json.freeform === undefined) { - return { result: json } + return json } let spec: Record if (typeof json.render === "string") { @@ -464,32 +437,33 @@ class DetectInline extends DesugaringStep { } else { spec = >json.render } - const errors: string[] = [] for (const key in spec) { if (spec[key].indexOf("= 0) { // We have a link element, it probably contains something that needs to be substituted... // Let's play this safe and not inline it - return { result: json } + return json } const fullSpecification = SpecialVisualizations.constructSpecification(spec[key]) if (fullSpecification.length > 1) { // We found a special rendering! if (json.freeform.inline === true) { - errors.push( - "At " + - context + - ": 'inline' is set, but the rendering contains a special visualisation...\n " + + context.err( + "'inline' is set, but the rendering contains a special visualisation...\n " + spec[key] ) } json = JSON.parse(JSON.stringify(json)) json.freeform.inline = false - return { result: json, errors } + return json } } json = JSON.parse(JSON.stringify(json)) + if (typeof json.freeform === "string") { + context.err("'freeform' is a string, but should be an object") + return json + } json.freeform.inline ??= true - return { result: json, errors } + return json } } @@ -502,43 +476,42 @@ export class AddQuestionBox extends DesugaringStep { ) } - convert( - json: LayerConfigJson, - context: string - ): { result: LayerConfigJson; errors?: string[]; warnings?: string[]; information?: string[] } { + convert(json: LayerConfigJson, context: ConversionContext): LayerConfigJson { if ( json.tagRenderings === undefined || json.tagRenderings.some((tr) => tr["id"] === "leftover-questions") ) { - return { result: json } + return json } - json = JSON.parse(JSON.stringify(json)) - const allSpecials: Exclude[] = [] - .concat( - ...json.tagRenderings.map((tr) => - ValidationUtils.getSpecialVisualsationsWithArgs(tr) - ) + if (json.source === "special") { + return json + } + json = { ...json } + json.tagRenderings = [...json.tagRenderings] + const allSpecials: Exclude[] = ( + ValidationUtils.getAllSpecialVisualisations(json.tagRenderings).filter( + (spec) => typeof spec !== "string" ) - .filter((spec) => typeof spec !== "string") + ) const questionSpecials = allSpecials.filter((sp) => sp.func.funcName === "questions") const noLabels = questionSpecials.filter( (sp) => sp.args.length === 0 || sp.args[0].trim() === "" ) - const errors: string[] = [] - const warnings: string[] = [] if (noLabels.length > 1) { - errors.push( - "At " + - context + - ": multiple 'questions'-visualisations found which would show _all_ questions. Don't do this" + context.err( + "Multiple 'questions'-visualisations found which would show _all_ questions. Don't do this" ) } // ALl labels that are used in this layer const allLabels = new Set( - [].concat(...json.tagRenderings.map((tr) => (tr).labels ?? [])) + [].concat( + ...json.tagRenderings.map( + (tr) => (tr).labels ?? [] + ) + ) ) const seen = new Set() for (const questionSpecial of questionSpecials) { @@ -554,10 +527,8 @@ export class AddQuestionBox extends DesugaringStep { ?.map((a) => a.trim()) ?.filter((s) => s != "") if (blacklisted?.length > 0 && used?.length > 0) { - errors.push( - "At " + - context + - ": the {questions()}-special rendering only supports either a blacklist OR a whitelist, but not both." + + context.err( + "The {questions()}-special rendering only supports either a blacklist OR a whitelist, but not both." + "\n Whitelisted: " + used.join(", ") + "\n Blacklisted: " + @@ -566,10 +537,8 @@ export class AddQuestionBox extends DesugaringStep { } for (const usedLabel of used) { if (!allLabels.has(usedLabel)) { - errors.push( - "At " + - context + - ": this layers specifies a special question element for label `" + + context.err( + "This layers specifies a special question element for label `" + usedLabel + "`, but this label doesn't exist.\n" + " Available labels are " + @@ -584,7 +553,7 @@ export class AddQuestionBox extends DesugaringStep { /* At this point, we know which question labels are not yet handled and which already are handled, and we * know there is no previous catch-all questions */ - const question: TagRenderingConfigJson = { + const question: QuestionableTagRenderingConfigJson = { id: "leftover-questions", render: { "*": `{questions( ,${Array.from(seen).join(";")})}`, @@ -592,11 +561,7 @@ export class AddQuestionBox extends DesugaringStep { } json.tagRenderings.push(question) } - return { - result: json, - errors, - warnings, - } + return json } } @@ -612,24 +577,38 @@ export class AddEditingElements extends DesugaringStep { this._desugaring = desugaring } - convert( - json: LayerConfigJson, - context: string - ): { result: LayerConfigJson; errors?: string[]; warnings?: string[]; information?: string[] } { + convert(json: LayerConfigJson, context: ConversionContext): LayerConfigJson { if (this._desugaring.tagRenderings === null) { - return { result: json } + return json + } + if (json.source === "special") { + return json + } + if (!json.title && !json.tagRenderings) { + return json + } + json = { ...json } + json.tagRenderings = [...(json.tagRenderings ?? [])] + const specialVisualisations = ValidationUtils.getAllSpecialVisualisations( + json.tagRenderings + ) + const usedSpecialFunctions = new Set( + specialVisualisations.map((sv) => + typeof sv === "string" ? undefined : sv.func.funcName + ) + ) + if (!usedSpecialFunctions.has("minimap")) { + json.tagRenderings.push(this._desugaring.tagRenderings.get("minimap")) } - json = JSON.parse(JSON.stringify(json)) if ( - json.tagRenderings && this._desugaring.tagRenderings.has("just_created") && !json.tagRenderings.some((tr) => tr === "just_created" || tr["id"] === "just_created") ) { json.tagRenderings.unshift(this._desugaring.tagRenderings.get("just_created")) } - if (json.allowSplit && !ValidationUtils.hasSpecialVisualisation(json, "split_button")) { + if (json.allowSplit && !usedSpecialFunctions.has("split_button")) { json.tagRenderings.push({ id: "split-button", render: { "*": "{split_button()}" }, @@ -637,13 +616,13 @@ export class AddEditingElements extends DesugaringStep { delete json.allowSplit } - if (json.allowMove && !ValidationUtils.hasSpecialVisualisation(json, "move_button")) { + if (json.allowMove && !usedSpecialFunctions.has("move_button")) { json.tagRenderings.push({ id: "move-button", render: { "*": "{move_button()}" }, }) } - if (json.deletion && !ValidationUtils.hasSpecialVisualisation(json, "delete_button")) { + if (json.deletion && !usedSpecialFunctions.has("delete_button")) { json.tagRenderings.push({ id: "delete-button", render: { "*": "{delete_button()}" }, @@ -660,8 +639,8 @@ export class AddEditingElements extends DesugaringStep { json.tagRenderings.push(this._desugaring.tagRenderings.get("last_edit")) } - if (!ValidationUtils.hasSpecialVisualisation(json, "all_tags")) { - const trc: TagRenderingConfigJson = { + if (!usedSpecialFunctions.has("all_tags")) { + const trc: QuestionableTagRenderingConfigJson = { id: "all-tags", render: { "*": "{all_tags()}" }, @@ -676,7 +655,7 @@ export class AddEditingElements extends DesugaringStep { json.tagRenderings?.push(trc) } - return { result: json } + return json } } @@ -757,7 +736,7 @@ export class ExpandRewrite extends Conversion, T[ * }, * renderings: "The value of xyz is abc" * } - * new ExpandRewrite().convertStrict(spec, "test") // => ["The value of X is A", "The value of Y is B", "The value of Z is C"] + * new ExpandRewrite().convertStrict(spec, ConversionContext.test()) // => ["The value of X is A", "The value of Y is B", "The value of Z is C"] * * // should rewrite with translations * const spec = >{ @@ -779,19 +758,16 @@ export class ExpandRewrite extends Conversion, T[ * nl: "De waarde van Y is een andere waarde" * } * ] - * new ExpandRewrite().convertStrict(spec, "test") // => expected + * new ExpandRewrite().convertStrict(spec, ConversionContext.test()) // => expected */ - convert( - json: T | RewritableConfigJson, - context: string - ): { result: T[]; errors?: string[]; warnings?: string[]; information?: string[] } { + convert(json: T | RewritableConfigJson, context: ConversionContext): T[] { if (json === null || json === undefined) { - return { result: [] } + return [] } if (json["rewrite"] === undefined) { // not a rewrite - return { result: [json] } + return [json] } const rewrite = >json @@ -805,7 +781,9 @@ export class ExpandRewrite extends Conversion, T[ for (let j = i + 1; j < keysToRewrite.sourceString.length; j++) { const toRewrite = keysToRewrite.sourceString[j] if (toRewrite.indexOf(guard) >= 0) { - throw `${context} Error in rewrite: sourcestring[${i}] is a substring of sourcestring[${j}]: ${guard} will be substituted away before ${toRewrite} is reached.` + context.err( + `sourcestring[${i}] is a substring of sourcestring[${j}]: ${guard} will be substituted away before ${toRewrite} is reached.` + ) } } } @@ -816,7 +794,11 @@ export class ExpandRewrite extends Conversion, T[ for (let i = 0; i < rewrite.rewrite.into.length; i++) { const into = keysToRewrite.into[i] if (into.length !== rewrite.rewrite.sourceString.length) { - throw `${context}.into.${i} Error in rewrite: there are ${rewrite.rewrite.sourceString.length} keys to rewrite, but entry ${i} has only ${into.length} values` + context + .enters("into", i) + .err( + `Error in rewrite: there are ${rewrite.rewrite.sourceString.length} keys to rewrite, but entry ${i} has only ${into.length} values` + ) } } } @@ -831,7 +813,7 @@ export class ExpandRewrite extends Conversion, T[ ts.push(t) } - return { result: ts } + return ts } } @@ -851,39 +833,38 @@ export class RewriteSpecial extends DesugaringStep { * Does the heavy lifting and conversion * * // should not do anything if no 'special'-key is present - * RewriteSpecial.convertIfNeeded({"en": "xyz", "nl": "abc"}, [], "test") // => {"en": "xyz", "nl": "abc"} + * RewriteSpecial.convertIfNeeded({"en": "xyz", "nl": "abc"}, ConversionContext.test()) // => {"en": "xyz", "nl": "abc"} * * // should handle a simple special case - * RewriteSpecial.convertIfNeeded({"special": {"type":"image_carousel"}}, [], "test") // => {'*': "{image_carousel()}"} + * RewriteSpecial.convertIfNeeded({"special": {"type":"image_carousel"}}, ConversionContext.test()) // => {'*': "{image_carousel()}"} * * // should handle special case with a parameter - * RewriteSpecial.convertIfNeeded({"special": {"type":"image_carousel", "image_key": "some_image_key"}}, [], "test") // => {'*': "{image_carousel(some_image_key)}"} + * RewriteSpecial.convertIfNeeded({"special": {"type":"image_carousel", "image_key": "some_image_key"}}, ConversionContext.test()) // => {'*': "{image_carousel(some_image_key)}"} * * // should handle special case with a translated parameter * const spec = {"special": {"type":"image_upload", "label": {"en": "Add a picture to this object", "nl": "Voeg een afbeelding toe"}}} - * const r = RewriteSpecial.convertIfNeeded(spec, [], "test") + * const r = RewriteSpecial.convertIfNeeded(spec, ConversionContext.test()) * r // => {"en": "{image_upload(,Add a picture to this object)}", "nl": "{image_upload(,Voeg een afbeelding toe)}" } * * // should handle special case with a prefix and postfix * const spec = {"special": {"type":"image_upload" }, before: {"en": "PREFIX "}, after: {"en": " POSTFIX", nl: " Achtervoegsel"} } - * const r = RewriteSpecial.convertIfNeeded(spec, [], "test") + * const r = RewriteSpecial.convertIfNeeded(spec, ConversionContext.test()) * r // => {"en": "PREFIX {image_upload(,)} POSTFIX", "nl": "PREFIX {image_upload(,)} Achtervoegsel" } * * // should warn for unexpected keys - * const errors = [] - * RewriteSpecial.convertIfNeeded({"special": {type: "image_carousel"}, "en": "xyz"}, errors, "test") // => {'*': "{image_carousel()}"} - * errors // => ["At test: The only keys allowed next to a 'special'-block are 'before' and 'after'. Perhaps you meant to put 'en' into the special block?"] + * const context = ConversionContext.test() + * RewriteSpecial.convertIfNeeded({"special": {type: "image_carousel"}, "en": "xyz"}, context) // => {'*': "{image_carousel()}"} + * context.getAll("error")[0].message // => "The only keys allowed next to a 'special'-block are 'before' and 'after'. Perhaps you meant to put 'en' into the special block?" * * // should give an error on unknown visualisations - * const errors = [] - * RewriteSpecial.convertIfNeeded({"special": {type: "qsdf"}}, errors, "test") // => undefined - * errors.length // => 1 - * errors[0].indexOf("Special visualisation 'qsdf' not found") >= 0 // => true + * const context = ConversionContext.test() + * RewriteSpecial.convertIfNeeded({"special": {type: "qsdf"}}, context) // => undefined + * context.getAll("error")[0].message.indexOf("Special visualisation 'qsdf' not found") >= 0 // => true * * // should give an error is 'type' is missing - * const errors = [] - * RewriteSpecial.convertIfNeeded({"special": {}}, errors, "test") // => undefined - * errors // => ["A 'special'-block should define 'type' to indicate which visualisation should be used"] + * const context = ConversionContext.test() + * RewriteSpecial.convertIfNeeded({"special": {}}, context) // => undefined + * context.getAll("error")[0].message // => "A 'special'-block should define 'type' to indicate which visualisation should be used" * * * // an actual test @@ -901,14 +882,19 @@ export class RewriteSpecial extends DesugaringStep { * "en": "An entrance of {canonical(width)}" * } * }} - * const errors = [] - * RewriteSpecial.convertIfNeeded(special, errors, "test") // => {"en": "

    Entrances

    This building has {_entrances_count} entrances:{multi(_entrance_properties_with_width,An entrance of &LBRACEcanonical&LPARENSwidth&RPARENS&RBRACE)}{_entrances_count_without_width_count} entrances don't have width information yet"} - * errors // => [] + * const context = ConversionContext.test() + * RewriteSpecial.convertIfNeeded(special, context) // => {"en": "

    Entrances

    This building has {_entrances_count} entrances:{multi(_entrance_properties_with_width,An entrance of &LBRACEcanonical&LPARENSwidth&RPARENS&RBRACE)}{_entrances_count_without_width_count} entrances don't have width information yet"} + * context.getAll("error") // => [] */ private static convertIfNeeded( - input: (object & { special: { type: string } }) | any, - errors: string[], - context: string + input: + | (object & { + special: { + type: string + } + }) + | any, + context: ConversionContext ): any { const special = input["special"] if (special === undefined) { @@ -917,7 +903,7 @@ export class RewriteSpecial extends DesugaringStep { const type = special["type"] if (type === undefined) { - errors.push( + context.err( "A 'special'-block should define 'type' to indicate which visualisation should be used" ) return undefined @@ -930,37 +916,35 @@ export class RewriteSpecial extends DesugaringStep { SpecialVisualizations.specialVisualizations, (sp) => sp.funcName ) - errors.push( + context.err( `Special visualisation '${type}' not found. Did you perhaps mean ${options[0].funcName}, ${options[1].funcName} or ${options[2].funcName}?\n\tFor all known special visualisations, please see https://github.com/pietervdvn/MapComplete/blob/develop/Docs/SpecialRenderings.md` ) return undefined } - errors.push( - ...Array.from(Object.keys(input)) - .filter((k) => k !== "special" && k !== "before" && k !== "after") - .map((k) => { - return `At ${context}: The only keys allowed next to a 'special'-block are 'before' and 'after'. Perhaps you meant to put '${k}' into the special block?` - }) - ) + Array.from(Object.keys(input)) + .filter((k) => k !== "special" && k !== "before" && k !== "after") + .map((k) => { + return `The only keys allowed next to a 'special'-block are 'before' and 'after'. Perhaps you meant to put '${k}' into the special block?` + }) + .forEach((e) => context.err(e)) const argNamesList = vis.args.map((a) => a.name) const argNames = new Set(argNamesList) // Check for obsolete and misspelled arguments - errors.push( - ...Object.keys(special) - .filter((k) => !argNames.has(k)) - .filter((k) => k !== "type" && k !== "before" && k !== "after") - .map((wrongArg) => { - const byDistance = Utils.sortedByLevenshteinDistance( - wrongArg, - argNamesList, - (x) => x - ) - return `At ${context}: Unexpected argument in special block at ${context} with name '${wrongArg}'. Did you mean ${ - byDistance[0] - }?\n\tAll known arguments are ${argNamesList.join(", ")}` - }) - ) + Object.keys(special) + .filter((k) => !argNames.has(k)) + .filter((k) => k !== "type" && k !== "before" && k !== "after") + .map((wrongArg) => { + const byDistance = Utils.sortedByLevenshteinDistance( + wrongArg, + argNamesList, + (x) => x + ) + return `Unexpected argument in special block at ${context} with name '${wrongArg}'. Did you mean ${ + byDistance[0] + }?\n\tAll known arguments are ${argNamesList.join(", ")}` + }) + .forEach((e) => context.err(e)) // Check that all obligated arguments are present. They are obligated if they don't have a preset value for (const arg of vis.args) { @@ -969,10 +953,8 @@ export class RewriteSpecial extends DesugaringStep { } const param = special[arg.name] if (param === undefined) { - errors.push( - `At ${context}: Obligated parameter '${ - arg.name - }' in special rendering of type ${ + context.err( + `Obligated parameter '${arg.name}' in special rendering of type ${ vis.funcName } not found.\n The full special rendering specification is: '${JSON.stringify( input @@ -1051,7 +1033,7 @@ export class RewriteSpecial extends DesugaringStep { * } * ] * } - * const result = new RewriteSpecial().convert(tr,"test").result + * const result = new RewriteSpecial().convertStrict(tr,ConversionContext.test()) * const expected = {render: {'*': "{image_carousel(image)}"}, mappings: [{if: "other_image_key", then: {'*': "{image_carousel(other_image_key)}"}} ]} * result // => expected * @@ -1059,7 +1041,7 @@ export class RewriteSpecial extends DesugaringStep { * const tr = { * render: {special: {type: "image_carousel", image_key: "image"}, before: {en: "Some introduction"} }, * } - * const result = new RewriteSpecial().convert(tr,"test").result + * const result = new RewriteSpecial().convertStrict(tr,ConversionContext.test()) * const expected = {render: {'en': "Some introduction{image_carousel(image)}"}} * result // => expected * @@ -1067,105 +1049,83 @@ export class RewriteSpecial extends DesugaringStep { * const tr = { * render: {special: {type: "image_carousel", image_key: "image"}, after: {en: "Some footer"} }, * } - * const result = new RewriteSpecial().convert(tr,"test").result + * const result = new RewriteSpecial().convertStrict(tr,ConversionContext.test()) * const expected = {render: {'en': "{image_carousel(image)}Some footer"}} * result // => expected */ - convert( - json: TagRenderingConfigJson, - context: string - ): { - result: TagRenderingConfigJson - errors?: string[] - warnings?: string[] - information?: string[] - } { - const errors = [] + convert(json: TagRenderingConfigJson, context: ConversionContext): TagRenderingConfigJson { json = Utils.Clone(json) - const paths: { path: string[]; type?: any; typeHint?: string }[] = tagrenderingconfigmeta + const paths: ConfigMeta[] = tagrenderingconfigmeta for (const path of paths) { - if (path.typeHint !== "rendered") { + if (path.hints.typehint !== "rendered") { continue } Utils.WalkPath(path.path, json, (leaf, travelled) => - RewriteSpecial.convertIfNeeded(leaf, errors, context + ":" + travelled.join(".")) + RewriteSpecial.convertIfNeeded(leaf, context.enter(travelled)) ) } - return { - result: json, - errors, - } + return json } } -class ExpandIconBadges extends DesugaringStep { - private _state: DesugaringContext - private _layer: LayerConfigJson +class ExpandIconBadges extends DesugaringStep { private _expand: ExpandTagRendering constructor(state: DesugaringContext, layer: LayerConfigJson) { super("Expands shorthand properties on iconBadges", ["iconBadges"], "ExpandIconBadges") - this._state = state - this._layer = layer this._expand = new ExpandTagRendering(state, layer) } - convert( - json: PointRenderingConfigJson | LineRenderingConfigJson, - context: string - ): { - result: PointRenderingConfigJson | LineRenderingConfigJson - errors?: string[] - warnings?: string[] - information?: string[] - } { + convert(json: PointRenderingConfigJson, context: ConversionContext): PointRenderingConfigJson { if (!json["iconBadges"]) { - return { result: json } + return json } - const badgesJson = (json).iconBadges + const badgesJson = json.iconBadges - const iconBadges: { if: TagConfigJson; then: string | TagRenderingConfigJson }[] = [] + const iconBadges: { + if: TagConfigJson + then: string | MinimalTagRenderingConfigJson + }[] = [] - const errs: string[] = [] - const warns: string[] = [] for (let i = 0; i < badgesJson.length; i++) { - const iconBadge: { if: TagConfigJson; then: string | TagRenderingConfigJson } = - badgesJson[i] - const { errors, result, warnings } = this._expand.convert( - iconBadge.then, - context + ".iconBadges[" + i + "]" + const iconBadge: { + if: TagConfigJson + then: string | MinimalTagRenderingConfigJson + } = badgesJson[i] + const expanded = this._expand.convert( + iconBadge.then, + context.enters("iconBadges", i) ) - errs.push(...errors) - warns.push(...warnings) - if (result === undefined) { + if (expanded === undefined) { iconBadges.push(iconBadge) continue } iconBadges.push( - ...result.map((resolved) => ({ + ...expanded.map((resolved) => ({ if: iconBadge.if, - then: resolved, + then: resolved, })) ) } - return { - result: { ...json, iconBadges }, - errors: errs, - warnings: warns, - } + return { ...json, iconBadges } } } -class PreparePointRendering extends Fuse { +class PreparePointRendering extends Fuse { constructor(state: DesugaringContext, layer: LayerConfigJson) { super( "Prepares point renderings by expanding 'icon' and 'iconBadges'", new On( - "icon", - new FirstOf(new ExpandTagRendering(state, layer, { applyCondition: false })) + "marker", + new Each( + new On( + "icon", + new FirstOf(new ExpandTagRendering(state, layer, { applyCondition: false })) + ) + ) ), new ExpandIconBadges(state, layer) ) @@ -1181,15 +1141,7 @@ class SetFullNodeDatabase extends DesugaringStep { ) } - convert( - json: LayerConfigJson, - context: string - ): { - result: LayerConfigJson - errors?: string[] - warnings?: string[] - information?: string[] - } { + convert(json: LayerConfigJson, context: ConversionContext): LayerConfigJson { const needsSpecial = json.tagRenderings?.some((tr) => { if (typeof tr === "string") { @@ -1199,49 +1151,45 @@ class SetFullNodeDatabase extends DesugaringStep { return specs?.some((sp) => sp.needsNodeDatabase) }) ?? false if (!needsSpecial) { - return { result: json } - } - return { - result: { ...json, fullNodeDatabase: true }, - information: ["Layer " + json.id + " needs the fullNodeDatabase"], + return json } + context.info("Layer " + json.id + " needs the fullNodeDatabase") + return { ...json, fullNodeDatabase: true } } } -export class AddMiniMap extends DesugaringStep { +class ExpandMarkerRenderings extends DesugaringStep { + private readonly _layer: LayerConfigJson private readonly _state: DesugaringContext - constructor(state: DesugaringContext) { + constructor(state: DesugaringContext, layer: LayerConfigJson) { super( - "Adds a default 'minimap'-element to the tagrenderings if none of the elements define such a minimap", - ["tagRenderings"], - "AddMiniMap" + "Expands tagRenderings in the icons, if needed", + ["icon", "color"], + "ExpandMarkerRenderings" ) + this._layer = layer this._state = state } - convert(layerConfig: LayerConfigJson, context: string): { result: LayerConfigJson } { - if (!layerConfig.tagRenderings || layerConfig.source === "special") { - return { result: layerConfig } + convert(json: IconConfigJson, context: ConversionContext): IconConfigJson { + const expander = new ExpandTagRendering(this._state, this._layer) + const result: IconConfigJson = { icon: undefined, color: undefined } + if (json.icon && json.icon["builtin"]) { + result.icon = ( + expander.convert(json.icon, context.enter("icon"))[0] + ) + } else { + result.icon = json.icon } - const state = this._state - const hasMinimap = ValidationUtils.hasSpecialVisualisation(layerConfig, "minimap") - if (!hasMinimap) { - layerConfig = { ...layerConfig } - layerConfig.tagRenderings = [...layerConfig.tagRenderings] - const minimap = state.tagRenderings.get("minimap") - if (minimap === undefined) { - if (state.tagRenderings.size > 0) { - throw "The 'minimap'-builtin tagrendering is not defined. As such, it cannot be added automatically" - } - } else { - layerConfig.tagRenderings.push(minimap) - } - } - - return { - result: layerConfig, + if (json.color && json.color["builtin"]) { + result.color = ( + expander.convert(json.color, context.enter("color"))[0] + ) + } else { + result.color = json.color } + return result } } @@ -1254,12 +1202,19 @@ export class PrepareLayer extends Fuse { new On("tagRenderings", (layer) => new Concat(new ExpandTagRendering(state, layer))), new On("tagRenderings", new Each(new DetectInline())), new AddQuestionBox(), - new AddMiniMap(state), new AddEditingElements(state), new SetFullNodeDatabase(), - new On("mapRendering", new Concat(new ExpandRewrite()).andThenF(Utils.Flatten)), - new On<(PointRenderingConfigJson | LineRenderingConfigJson)[], LayerConfigJson>( - "mapRendering", + new On< + (LineRenderingConfigJson | RewritableConfigJson)[], + LayerConfigJson + >("lineRendering", new Each(new ExpandRewrite()).andThenF(Utils.Flatten)), + new On( + "pointRendering", + (layer) => + new Each(new On("marker", new Each(new ExpandMarkerRenderings(state, layer)))) + ), + new On( + "pointRendering", (layer) => new Each(new PreparePointRendering(state, layer)) ), new SetDefault("titleIcons", ["icons.defaults"]), diff --git a/src/Models/ThemeConfig/Conversion/PrepareTheme.ts b/src/Models/ThemeConfig/Conversion/PrepareTheme.ts index 33246cd55..2b995f757 100644 --- a/src/Models/ThemeConfig/Conversion/PrepareTheme.ts +++ b/src/Models/ThemeConfig/Conversion/PrepareTheme.ts @@ -20,6 +20,7 @@ import { TagRenderingConfigJson } from "../Json/TagRenderingConfigJson" import DependencyCalculator from "../DependencyCalculator" import { AddContextToTranslations } from "./AddContextToTranslations" import ValidationUtils from "./ValidationUtils" +import { ConversionContext } from "./ConversionContext" class SubstituteLayer extends Conversion { private readonly _state: DesugaringContext @@ -33,12 +34,7 @@ class SubstituteLayer extends Conversion a[1] - b[1]) const ids = withDistance.map((n) => n[0]) // Known builtin layers are "+.join(",")+"\n For more information, see " - errors.push(`${context}: The layer with name ${name} was not found as a builtin layer. Perhaps you meant ${ids[0]}, ${ids[1]} or ${ids[2]}? + context.err(`The layer with name ${name} was not found as a builtin layer. Perhaps you meant ${ids[0]}, ${ids[1]} or ${ids[2]}? For an overview of all available layers, refer to https://github.com/pietervdvn/MapComplete/blob/develop/Docs/BuiltinLayers.md`) } @@ -58,119 +54,101 @@ class SubstituteLayer extends Conversion 0 + ) { + context.err( + `When overriding a layer, an override is not allowed to override into tagRenderings. Use "+tagRenderings" or "tagRenderings+" instead to prepend or append some questions.` + ) + } + try { + Utils.Merge(json["override"], found) + layers.push(found) + } catch (e) { + context.err( + `Could not apply an override due to: ${e}.\nThe override is: ${JSON.stringify( + json["override"] + )}` + ) } - const layers = [] - for (const name of names) { - const found = Utils.Clone(state.sharedLayers.get(name)) - if (found === undefined) { - reportNotFound(name) - continue - } - if ( - json["override"]["tagRenderings"] !== undefined && - (found["tagRenderings"] ?? []).length > 0 - ) { - errors.push( - `At ${context}: when overriding a layer, an override is not allowed to override into tagRenderings. Use "+tagRenderings" or "tagRenderings+" instead to prepend or append some questions.` - ) - } - try { - Utils.Merge(json["override"], found) - layers.push(found) - } catch (e) { - errors.push( - `At ${context}: could not apply an override due to: ${e}.\nThe override is: ${JSON.stringify( - json["override"] - )}` - ) - } - - if (json["hideTagRenderingsWithLabels"]) { - const hideLabels: Set = new Set(json["hideTagRenderingsWithLabels"]) - // These labels caused at least one deletion - const usedLabels: Set = new Set() - const filtered = [] - for (const tr of found.tagRenderings) { - const labels = tr["labels"] - if (labels !== undefined) { - const forbiddenLabel = labels.findIndex((l) => hideLabels.has(l)) - if (forbiddenLabel >= 0) { - usedLabels.add(labels[forbiddenLabel]) - information.push( - context + - ": Dropping tagRendering " + - tr["id"] + - " as it has a forbidden label: " + - labels[forbiddenLabel] - ) - continue - } - } - - if (hideLabels.has(tr["id"])) { - usedLabels.add(tr["id"]) - information.push( - context + - ": Dropping tagRendering " + + if (json["hideTagRenderingsWithLabels"]) { + const hideLabels: Set = new Set(json["hideTagRenderingsWithLabels"]) + // These labels caused at least one deletion + const usedLabels: Set = new Set() + const filtered = [] + for (const tr of found.tagRenderings) { + const labels = tr["labels"] + if (labels !== undefined) { + const forbiddenLabel = labels.findIndex((l) => hideLabels.has(l)) + if (forbiddenLabel >= 0) { + usedLabels.add(labels[forbiddenLabel]) + context.info( + "Dropping tagRendering " + tr["id"] + - " as its id is a forbidden label" + " as it has a forbidden label: " + + labels[forbiddenLabel] ) continue } - - if (hideLabels.has(tr["group"])) { - usedLabels.add(tr["group"]) - information.push( - context + - ": Dropping tagRendering " + - tr["id"] + - " as its group `" + - tr["group"] + - "` is a forbidden label" - ) - continue - } - - filtered.push(tr) } - const unused = Array.from(hideLabels).filter((l) => !usedLabels.has(l)) - if (unused.length > 0) { - errors.push( - "This theme specifies that certain tagrenderings have to be removed based on forbidden layers. One or more of these layers did not match any tagRenderings and caused no deletions: " + - unused.join(", ") + - "\n This means that this label can be removed or that the original tagRendering that should be deleted does not have this label anymore" + + if (hideLabels.has(tr["id"])) { + usedLabels.add(tr["id"]) + context.info( + "Dropping tagRendering " + tr["id"] + " as its id is a forbidden label" ) + continue } - found.tagRenderings = filtered - } - } - return { - result: layers, - errors, - information, - } - } - return { - result: [json], - errors, + if (hideLabels.has(tr["group"])) { + usedLabels.add(tr["group"]) + context.info( + "Dropping tagRendering " + + tr["id"] + + " as its group `" + + tr["group"] + + "` is a forbidden label" + ) + continue + } + + filtered.push(tr) + } + const unused = Array.from(hideLabels).filter((l) => !usedLabels.has(l)) + if (unused.length > 0) { + context.err( + "This theme specifies that certain tagrenderings have to be removed based on forbidden layers. One or more of these layers did not match any tagRenderings and caused no deletions: " + + unused.join(", ") + + "\n This means that this label can be removed or that the original tagRendering that should be deleted does not have this label anymore" + ) + } + found.tagRenderings = filtered + } } + return layers } } @@ -186,24 +164,25 @@ class AddDefaultLayers extends DesugaringStep { this._state = state } - convert( - json: LayoutConfigJson, - context: string - ): { result: LayoutConfigJson; errors: string[]; warnings: string[] } { - const errors = [] - const warnings = [] + convert(json: LayoutConfigJson, context: ConversionContext): LayoutConfigJson { const state = this._state - json.layers = [...json.layers] + json.layers = [...(json.layers ?? [])] const alreadyLoaded = new Set(json.layers.map((l) => l["id"])) for (const layerName of Constants.added_by_default) { const v = state.sharedLayers.get(layerName) if (v === undefined) { - errors.push("Default layer " + layerName + " not found") + context.err( + "Default layer " + + layerName + + " not found. " + + state.sharedLayers.size + + " layers are available" + ) continue } if (alreadyLoaded.has(v.id)) { - warnings.push( + context.warn( "Layout " + context + " already has a layer with name " + @@ -215,11 +194,7 @@ class AddDefaultLayers extends DesugaringStep { json.layers.push(v) } - return { - result: json, - errors, - warnings, - } + return json } } @@ -232,21 +207,13 @@ class AddImportLayers extends DesugaringStep { ) } - convert( - json: LayoutConfigJson, - context: string - ): { result: LayoutConfigJson; errors?: string[]; warnings?: string[] } { + convert(json: LayoutConfigJson, context: ConversionContext): LayoutConfigJson { if (!(json.enableNoteImports ?? true)) { - return { - warnings: [ - "Not creating a note import layers for theme " + - json.id + - " as they are disabled", - ], - result: json, - } + context.info( + "Not creating a note import layers for theme " + json.id + " as they are disabled" + ) + return json } - const errors = [] json = { ...json } const allLayers: LayerConfigJson[] = json.layers @@ -278,20 +245,17 @@ class AddImportLayers extends DesugaringStep { try { const importLayerResult = creator.convert( layer, - context + ".(noteimportlayer)[" + i1 + "]" + context.inOperation(this.name).enter(i1) ) - if (importLayerResult.result !== undefined) { - json.layers.push(importLayerResult.result) + if (importLayerResult !== undefined) { + json.layers.push(importLayerResult) } } catch (e) { - errors.push("Could not generate an import-layer for " + layer.id + " due to " + e) + context.err("Could not generate an import-layer for " + layer.id + " due to " + e) } } - return { - errors, - result: json, - } + return json } } @@ -304,17 +268,9 @@ class AddContextToTranslationsInLayout extends DesugaringStep ) } - convert( - json: LayoutConfigJson, - context: string - ): { - result: LayoutConfigJson - errors?: string[] - warnings?: string[] - information?: string[] - } { + convert(json: LayoutConfigJson, context: ConversionContext): LayoutConfigJson { const conversion = new AddContextToTranslations("themes:") - return conversion.convert(json, json.id) + return conversion.convert(json, context) } } @@ -327,13 +283,10 @@ class ApplyOverrideAll extends DesugaringStep { ) } - convert( - json: LayoutConfigJson, - context: string - ): { result: LayoutConfigJson; errors: string[]; warnings: string[] } { + convert(json: LayoutConfigJson, context: ConversionContext): LayoutConfigJson { const overrideAll = json.overrideAll if (overrideAll === undefined) { - return { result: json, warnings: [], errors: [] } + return json } json = { ...json } @@ -346,8 +299,7 @@ class ApplyOverrideAll extends DesugaringStep { newLayers.push(layer) } json.layers = newLayers - - return { result: json, warnings: [], errors: [] } + return json } } @@ -458,18 +410,14 @@ class AddDependencyLayersToTheme extends DesugaringStep { return dependenciesToAdd } - convert( - theme: LayoutConfigJson, - context: string - ): { result: LayoutConfigJson; information: string[] } { + convert(theme: LayoutConfigJson, context: ConversionContext): LayoutConfigJson { const state = this._state const allKnownLayers: Map = state.sharedLayers const knownTagRenderings: Map = state.tagRenderings - const information = [] const layers: LayerConfigJson[] = theme.layers // Layers should be expanded at this point knownTagRenderings.forEach((value, key) => { - value.id = key + value["id"] = key }) const dependencies = AddDependencyLayersToTheme.CalculateDependencies( @@ -481,23 +429,16 @@ class AddDependencyLayersToTheme extends DesugaringStep { } if (dependencies.length > 0) { for (const dependency of dependencies) { - information.push( - context + - ": added " + - dependency.config.id + - " to the theme. " + - dependency.reason + context.info( + "Added " + dependency.config.id + " to the theme. " + dependency.reason ) } } layers.unshift(...dependencies.map((l) => l.config)) return { - result: { - ...theme, - layers: layers, - }, - information, + ...theme, + layers: layers, } } } @@ -510,17 +451,9 @@ class PreparePersonalTheme extends DesugaringStep { this._state = state } - convert( - json: LayoutConfigJson, - context: string - ): { - result: LayoutConfigJson - errors?: string[] - warnings?: string[] - information?: string[] - } { + convert(json: LayoutConfigJson, context: ConversionContext): LayoutConfigJson { if (json.id !== "personal") { - return { result: json } + return json } // The only thing this _really_ does, is adding the layer-ids into 'layers' @@ -529,10 +462,8 @@ class PreparePersonalTheme extends DesugaringStep { json.layers = Array.from(this._state.sharedLayers.keys()) .filter((l) => this._state.sharedLayers.get(l).source !== null) .filter((l) => this._state.publicLayers.has(l)) - return { - result: json, - information: ["The personal theme has " + json.layers.length + " public layers"], - } + context.info("The personal theme has " + json.layers.length + " public layers") + return json } } @@ -545,19 +476,24 @@ class WarnForUnsubstitutedLayersInTheme extends DesugaringStep ) } - convert( - json: LayoutConfigJson, - context: string - ): { - result: LayoutConfigJson - errors?: string[] - warnings?: string[] - information?: string[] - } { + convert(json: LayoutConfigJson, context: ConversionContext): LayoutConfigJson { if (json.hideFromOverview === true) { - return { result: json } + return json + } + if ((json.layers ?? []).length === 0) { + context + .enter("layers") + .err( + "No layers are defined. You must define at least one layer to have a valid theme" + ) + return json + } + if (!Array.isArray(json.layers)) { + context + .enter("layers") + .err("Can not iterate over layers in theme, it is a " + JSON.stringify(json.layers)) + return json } - const warnings = [] for (const layer of json.layers) { if (typeof layer === "string") { continue @@ -570,18 +506,15 @@ class WarnForUnsubstitutedLayersInTheme extends DesugaringStep continue } - const wrn = + context.warn( "The theme " + - json.id + - " has an inline layer: " + - layer["id"] + - ". This is discouraged." - warnings.push(wrn) - } - return { - result: json, - warnings, + json.id + + " has an inline layer: " + + layer["id"] + + ". This is discouraged." + ) } + return json } } @@ -616,29 +549,25 @@ export class PrepareTheme extends Fuse { this.state = state } - convert( - json: LayoutConfigJson, - context: string - ): { result: LayoutConfigJson; errors: string[]; warnings: string[]; information: string[] } { + convert(json: LayoutConfigJson, context: ConversionContext): LayoutConfigJson { const result = super.convert(json, context) - if (this.state.publicLayers.size === 0) { + if ((this.state.publicLayers?.size ?? 0) === 0) { // THis is a bootstrapping run, no need to already set this flag return result } - const needsNodeDatabase = result.result.layers?.some((l: LayerConfigJson) => - l.tagRenderings?.some((tr: TagRenderingConfigJson) => - ValidationUtils.getSpecialVisualisations(tr)?.some( + const needsNodeDatabase = result.layers?.some((l: LayerConfigJson) => + l.tagRenderings?.some((tr) => + ValidationUtils.getSpecialVisualisations(tr)?.some( (special) => special.needsNodeDatabase ) ) ) if (needsNodeDatabase) { - result.information.push( - context + - ": setting 'enableNodeDatabase' as this theme uses a special visualisation which needs to keep track of _all_ nodes" + context.info( + "Setting 'enableNodeDatabase' as this theme uses a special visualisation which needs to keep track of _all_ nodes" ) - result.result.enableNodeDatabase = true + result.enableNodeDatabase = true } return result diff --git a/src/Models/ThemeConfig/Conversion/Validation.ts b/src/Models/ThemeConfig/Conversion/Validation.ts index 33e35f3ee..b6b47c1a8 100644 --- a/src/Models/ThemeConfig/Conversion/Validation.ts +++ b/src/Models/ThemeConfig/Conversion/Validation.ts @@ -1,4 +1,4 @@ -import { DesugaringStep, Each, Fuse, On } from "./Conversion" +import { Conversion, DesugaringStep, Each, Fuse, On, Pipe, Pure } from "./Conversion" import { LayerConfigJson } from "../Json/LayerConfigJson" import LayerConfig from "../LayerConfig" import { Utils } from "../../../Utils" @@ -20,6 +20,8 @@ import TagRenderingConfig from "../TagRenderingConfig" import { parse as parse_html } from "node-html-parser" import PresetConfig from "../PresetConfig" import { TagsFilter } from "../../../Logic/Tags/TagsFilter" +import { Translatable } from "../Json/Translatable" +import { ConversionContext } from "./ConversionContext" class ValidateLanguageCompleteness extends DesugaringStep { private readonly _languages: string[] @@ -33,12 +35,7 @@ class ValidateLanguageCompleteness extends DesugaringStep { this._languages = languages ?? ["en"] } - convert( - obj: any, - context: string - ): { result: LayerConfig; errors: string[]; warnings: string[] } { - const errors = [] - const warnings: string[] = [] + convert(obj: any, context: ConversionContext): LayerConfig { const translations = Translation.ExtractAllTranslationsFrom(obj) for (const neededLanguage of this._languages) { translations @@ -48,23 +45,20 @@ class ValidateLanguageCompleteness extends DesugaringStep { t.tr.translations["*"] === undefined ) .forEach((missing) => { - errors.push( - context + - "A theme should be translation-complete for " + - neededLanguage + - ", but it lacks a translation for " + - missing.context + - ".\n\tThe known translation is " + - missing.tr.textFor("en") - ) + context + .enter(missing.context.split(".")) + .err( + `The theme ${obj.id} should be translation-complete for ` + + neededLanguage + + ", but it lacks a translation for " + + missing.context + + ".\n\tThe known translation is " + + missing.tr.textFor("en") + ) }) } - return { - result: obj, - errors, - warnings, - } + return obj } } @@ -84,62 +78,51 @@ export class DoesImageExist extends DesugaringStep { this.doesPathExist = checkExistsSync } - convert( - image: string, - context: string - ): { result: string; errors?: string[]; warnings?: string[]; information?: string[] } { + convert(image: string, context: ConversionContext): string { if (this._ignore?.has(image)) { - return { result: image } + return image } - const errors = [] - const warnings = [] - const information = [] if (image.indexOf("{") >= 0) { - information.push("Ignoring image with { in the path: " + image) - return { result: image } + context.debug("Ignoring image with { in the path: " + image) + return image } if (image === "assets/SocialImage.png") { - return { result: image } + return image } if (image.match(/[a-z]*/)) { if (Svg.All[image + ".svg"] !== undefined) { // This is a builtin img, e.g. 'checkmark' or 'crosshair' - return { result: image } + return image } } if (image.startsWith("<") && image.endsWith(">")) { // This is probably HTML, you're on your own here - return { result: image } + return image } if (!this._knownImagePaths.has(image)) { if (this.doesPathExist === undefined) { - errors.push( + context.err( `Image with path ${image} not found or not attributed; it is used in ${context}` ) } else if (!this.doesPathExist(image)) { - errors.push( + context.err( `Image with path ${image} does not exist; it is used in ${context}.\n Check for typo's and missing directories in the path.` ) } else { - errors.push( + context.err( `Image with path ${image} is not attributed (but it exists); execute 'npm run query:licenses' to add the license information and/or run 'npm run generate:licenses' to compile all the license info` ) } } - return { - result: image, - errors, - warnings, - information, - } + return image } } -class ValidateTheme extends DesugaringStep { +export class ValidateTheme extends DesugaringStep { /** * The paths where this layer is originally saved. Triggers some extra checks * @private @@ -165,28 +148,20 @@ class ValidateTheme extends DesugaringStep { } } - convert( - json: LayoutConfigJson, - context: string - ): { result: LayoutConfigJson; errors: string[]; warnings: string[]; information: string[] } { - const errors: string[] = [] - const warnings: string[] = [] - const information: string[] = [] - + convert(json: LayoutConfigJson, context: ConversionContext): LayoutConfigJson { const theme = new LayoutConfig(json, this._isBuiltin) - { // Legacy format checks if (this._isBuiltin) { if (json["units"] !== undefined) { - errors.push( + context.err( "The theme " + json.id + " has units defined - these should be defined on the layer instead. (Hint: use overrideAll: { '+units': ... }) " ) } if (json["roamingRenderings"] !== undefined) { - errors.push( + context.err( "Theme " + json.id + " contains an old 'roamingRenderings'. Use an 'overrideAll' instead" @@ -194,34 +169,31 @@ class ValidateTheme extends DesugaringStep { } } } + if (!json.title) { + context.enter("title").err(`The theme ${json.id} does not have a title defined.`) + } if (this._isBuiltin && this._extractImages !== undefined) { // Check images: are they local, are the licenses there, is the theme icon square, ... - const images = this._extractImages.convertStrict(json, "validation") + const images = this._extractImages.convert(json, context.inOperation("ValidateTheme")) const remoteImages = images.filter((img) => img.path.indexOf("http") == 0) for (const remoteImage of remoteImages) { - errors.push( + context.err( "Found a remote image: " + - remoteImage + + remoteImage.path + " in theme " + json.id + ", please download it." ) } for (const image of images) { - this._validateImage.convertJoin( - image.path, - context === undefined ? "" : ` in the theme ${context} at ${image.context}`, - errors, - warnings, - information - ) + this._validateImage.convert(image.path, context.enters(image.context)) } } try { if (this._isBuiltin) { if (theme.id !== theme.id.toLowerCase()) { - errors.push("Theme ids should be in lowercase, but it is " + theme.id) + context.err("Theme ids should be in lowercase, but it is " + theme.id) } const filename = this._path.substring( @@ -229,7 +201,7 @@ class ValidateTheme extends DesugaringStep { this._path.length - 5 ) if (theme.id !== filename) { - errors.push( + context.err( "Theme ids should be the same as the name.json, but we got id: " + theme.id + " and filename " + @@ -239,54 +211,55 @@ class ValidateTheme extends DesugaringStep { ")" ) } - this._validateImage.convertJoin( - theme.icon, - context + ".icon", - errors, - warnings, - information - ) + this._validateImage.convert(theme.icon, context.enter("icon")) } const dups = Utils.Duplicates(json.layers.map((layer) => layer["id"])) if (dups.length > 0) { - errors.push( + context.err( `The theme ${json.id} defines multiple layers with id ${dups.join(", ")}` ) } if (json["mustHaveLanguage"] !== undefined) { - const checked = new ValidateLanguageCompleteness( - ...json["mustHaveLanguage"] - ).convert(theme, theme.id) - - errors.push(...checked.errors) + new ValidateLanguageCompleteness(...json["mustHaveLanguage"]).convert( + theme, + context + ) } if (!json.hideFromOverview && theme.id !== "personal" && this._isBuiltin) { // The first key in the the title-field must be english, otherwise the title in the loading page will be the different language const targetLanguage = theme.title.SupportedLanguages()[0] if (targetLanguage !== "en") { - warnings.push( + context.err( `TargetLanguage is not 'en' for public theme ${theme.id}, it is ${targetLanguage}. Move 'en' up in the title of the theme and set it as the first key` ) } // Official, public themes must have a full english translation - const checked = new ValidateLanguageCompleteness("en").convert(theme, theme.id) - errors.push(...checked.errors) + new ValidateLanguageCompleteness("en").convert(theme, context) } } catch (e) { - errors.push(e) + context.err(e) } if (theme.id !== "personal") { - new DetectDuplicatePresets().convertJoin(theme, context, errors, warnings, information) + new DetectDuplicatePresets().convert(theme, context) } - return { - result: json, - errors, - warnings, - information, + if (!theme.title) { + context.enter("title").err("A theme must have a title") } + + if (!theme.description) { + context.enter("description").err("A theme must have a description") + } + + if (theme.overpassUrl && typeof theme.overpassUrl === "string") { + context + .enter("overpassUrl") + .err("The overpassURL is a string, use a list of strings instead. Wrap it with [ ]") + } + + return json } } @@ -300,7 +273,15 @@ export class ValidateThemeAndLayers extends Fuse { super( "Validates a theme and the contained layers", new ValidateTheme(doesImageExist, path, isBuiltin, sharedTagRenderings), - new On("layers", new Each(new ValidateLayer(undefined, isBuiltin, doesImageExist))) + new On( + "layers", + new Each( + new Pipe( + new ValidateLayer(undefined, isBuiltin, doesImageExist, false, true), + new Pure((x) => x?.raw) + ) + ) + ) ) } } @@ -314,16 +295,12 @@ class OverrideShadowingCheck extends DesugaringStep { ) } - convert( - json: LayoutConfigJson, - _: string - ): { result: LayoutConfigJson; errors?: string[]; warnings?: string[] } { + convert(json: LayoutConfigJson, context: ConversionContext): LayoutConfigJson { const overrideAll = json.overrideAll if (overrideAll === undefined) { - return { result: json } + return json } - const errors = [] const withOverride = json.layers.filter((l) => l["override"] !== undefined) for (const layer of withOverride) { @@ -342,12 +319,12 @@ class OverrideShadowingCheck extends DesugaringStep { " has a shadowed property: " + key + " is overriden by overrideAll of the theme" - errors.push(w) + context.err(w) } } } - return { result: json, errors } + return json } } @@ -356,28 +333,14 @@ class MiscThemeChecks extends DesugaringStep { super("Miscelleanous checks on the theme", [], "MiscThemesChecks") } - convert( - json: LayoutConfigJson, - context: string - ): { - result: LayoutConfigJson - errors?: string[] - warnings?: string[] - information?: string[] - } { - const warnings = [] - const errors = [] + convert(json: LayoutConfigJson, context: ConversionContext): LayoutConfigJson { if (json.id !== "personal" && (json.layers === undefined || json.layers.length === 0)) { - errors.push("The theme " + json.id + " has no 'layers' defined (" + context + ")") + context.err("The theme " + json.id + " has no 'layers' defined") } if (json.socialImage === "") { - warnings.push("Social image for theme " + json.id + " is the emtpy string") - } - return { - result: json, - warnings, - errors, + context.warn("Social image for theme " + json.id + " is the emtpy string") } + return json } } @@ -394,54 +357,139 @@ export class PrevalidateTheme extends Fuse { export class DetectConflictingAddExtraTags extends DesugaringStep { constructor() { super( - "The `if`-part in a mapping might set some keys. Those key are not allowed to be set in the `addExtraTags`, as this might result in conflicting values", + "The `if`-part in a mapping might set some keys. Those keys are not allowed to be set in the `addExtraTags`, as this might result in conflicting values", [], "DetectConflictingAddExtraTags" ) } - convert( - json: TagRenderingConfigJson, - context: string - ): { - result: TagRenderingConfigJson - errors?: string[] - warnings?: string[] - information?: string[] - } { + convert(json: TagRenderingConfigJson, context: ConversionContext): TagRenderingConfigJson { if (!(json.mappings?.length > 0)) { - return { result: json } + return json } - const tagRendering = new TagRenderingConfig(json) + try { + const tagRendering = new TagRenderingConfig(json) - const errors = [] - for (let i = 0; i < tagRendering.mappings.length; i++) { - const mapping = tagRendering.mappings[i] - if (!mapping.addExtraTags) { + for (let i = 0; i < tagRendering.mappings.length; i++) { + const mapping = tagRendering.mappings[i] + if (!mapping.addExtraTags) { + continue + } + const keysInMapping = new Set(mapping.if.usedKeys()) + + const keysInAddExtraTags = mapping.addExtraTags.map((t) => t.key) + + const duplicateKeys = keysInAddExtraTags.filter((k) => keysInMapping.has(k)) + if (duplicateKeys.length > 0) { + context + .enters("mappings", i) + .err( + "AddExtraTags overrides a key that is set in the `if`-clause of this mapping. Selecting this answer might thus first set one value (needed to match as answer) and then override it with a different value, resulting in an unsaveable question. The offending `addExtraTags` is " + + duplicateKeys.join(", ") + ) + } + } + + return json + } catch (e) { + context.err(e) + return undefined + } + } +} + +export class DetectNonErasedKeysInMappings extends DesugaringStep { + constructor() { + super( + "A tagRendering might set a freeform key (e.g. `name` and have an option that _should_ erase this name, e.g. `noname=yes`). Under normal circumstances, every mapping/freeform should affect all touched keys", + [], + "DetectNonErasedKeysInMappings" + ) + } + + convert( + json: QuestionableTagRenderingConfigJson, + context: ConversionContext + ): QuestionableTagRenderingConfigJson { + if (json.multiAnswer) { + // No need to check this here, this has its own validation + return json + } + if (!json.question) { + // No need to check the writable tags, as this cannot write + return json + } + function addAll(keys: { forEach: (f: (s: string) => void) => void }, addTo: Set) { + keys?.forEach((k) => addTo.add(k)) + } + + const freeformKeys: Set = new Set() + if (json.freeform) { + freeformKeys.add(json.freeform.key) + for (const tag of json.freeform.addExtraTags ?? []) { + const tagParsed = TagUtils.Tag(tag) + addAll(tagParsed.usedKeys(), freeformKeys) + } + } + + const mappingKeys: Set[] = [] + for (const mapping of json.mappings ?? []) { + if (mapping.hideInAnswer === true) { + mappingKeys.push(undefined) continue } - const keysInMapping = new Set(mapping.if.usedKeys()) + const thisMappingKeys: Set = new Set() + addAll(TagUtils.Tag(mapping.if).usedKeys(), thisMappingKeys) + for (const tag of mapping.addExtraTags ?? []) { + addAll(TagUtils.Tag(tag).usedKeys(), thisMappingKeys) + } + mappingKeys.push(thisMappingKeys) + } - const keysInAddExtraTags = mapping.addExtraTags.map((t) => t.key) + const neededKeys = new Set() - const duplicateKeys = keysInAddExtraTags.filter((k) => keysInMapping.has(k)) - if (duplicateKeys.length > 0) { - errors.push( - "At " + - context + - ".mappings[" + - i + - "]: AddExtraTags overrides a key that is set in the `if`-clause of this mapping. Selecting this answer might thus first set one value (needed to match as answer) and then override it with a different value, resulting in an unsaveable question. The offending `addExtraTags` is " + - duplicateKeys.join(", ") - ) + addAll(freeformKeys, neededKeys) + for (const mappingKey of mappingKeys) { + addAll(mappingKey, neededKeys) + } + + neededKeys.delete("fixme") // fixme gets a free pass + + if (json.freeform) { + for (const neededKey of neededKeys) { + if (!freeformKeys.has(neededKey)) { + context + .enters("freeform") + .warn( + "The freeform block does not modify the key `" + + neededKey + + "` which is set in a mapping. Use `addExtraTags` to overwrite it" + ) + } } } - return { - result: json, - errors, + for (let i = 0; i < json.mappings?.length; i++) { + const mapping = json.mappings[i] + if (mapping.hideInAnswer === true) { + continue + } + const keys = mappingKeys[i] + for (const neededKey of neededKeys) { + if (!keys.has(neededKey)) { + context + .enters("mappings", i) + .warn( + "This mapping does not modify the key `" + + neededKey + + "` which is set in a mapping or by the freeform block. Use `addExtraTags` to overwrite it" + ) + } + } } + + return json } } @@ -485,9 +533,10 @@ export class DetectShadowedMappings extends DesugaringStep 1 - * r.errors[0].indexOf("The mapping key=value is fully matched by a previous mapping (namely 0)") >= 0 // => true + * const context = ConversionContext.test() + * const r = new DetectShadowedMappings().convert(tr, context); + * context.getAll("error").length // => 1 + * context.getAll("error")[0].message.indexOf("The mapping key=value is fully matched by a previous mapping (namely 0)") >= 0 // => true * * const tr = {mappings: [ * { @@ -500,18 +549,14 @@ export class DetectShadowedMappings extends DesugaringStep 1 - * r.errors[0].indexOf("The mapping key=value&x=y is fully matched by a previous mapping (namely 0)") >= 0 // => true + * const context = ConversionContext.test() + * const r = new DetectShadowedMappings().convert(tr, context); + * context.getAll("error").length // => 1 + * context.getAll("error")[0].message.indexOf("The mapping key=value &x=y is fully matched by a previous mapping (namely 0)") >= 0 // => true */ - convert( - json: TagRenderingConfigJson, - context: string - ): { result: TagRenderingConfigJson; errors?: string[]; warnings?: string[] } { - const errors = [] - const warnings = [] + convert(json: TagRenderingConfigJson, context: ConversionContext): TagRenderingConfigJson { if (json.mappings === undefined || json.mappings.length === 0) { - return { result: json } + return json } const defaultProperties = {} for (const calculatedTagName of this._calculatedTagNames) { @@ -519,8 +564,8 @@ export class DetectShadowedMappings extends DesugaringStep { - const ctx = `${context}.mappings[${i}]` - const ifTags = TagUtils.Tag(m.if, ctx) + const c = context.enters("mappings", i) + const ifTags = TagUtils.Tag(m.if, c.enter("if")) const hideInAnswer = m["hideInAnswer"] if (hideInAnswer !== undefined && hideInAnswer !== false && hideInAnswer !== true) { let conditionTags = TagUtils.Tag(hideInAnswer) @@ -530,7 +575,7 @@ export class DetectShadowedMappings extends DesugaringStep())).convert({ * "mappings": [ * { @@ -609,60 +651,44 @@ export class DetectMappingsWithImages extends DesugaringStep" * } * }] - * }, "test"); - * r.errors.length > 0 // => true - * r.errors.some(msg => msg.indexOf("./assets/layers/bike_parking/staple.svg") >= 0) // => true + * }, context); + * context.hasErrors() // => true + * context.getAll("error").some(msg => msg.message.indexOf("./assets/layers/bike_parking/staple.svg") >= 0) // => true */ - convert( - json: TagRenderingConfigJson, - context: string - ): { - result: TagRenderingConfigJson - errors?: string[] - warnings?: string[] - information?: string[] - } { - const errors: string[] = [] - const warnings: string[] = [] - const information: string[] = [] + convert(json: TagRenderingConfigJson, context: ConversionContext): TagRenderingConfigJson { if (json.mappings === undefined || json.mappings.length === 0) { - return { result: json } + return json } const ignoreToken = "ignore-image-in-then" for (let i = 0; i < json.mappings.length; i++) { const mapping = json.mappings[i] const ignore = mapping["#"]?.indexOf(ignoreToken) >= 0 const images = Utils.Dedup(Translations.T(mapping.then)?.ExtractImages() ?? []) - const ctx = `${context}.mappings[${i}]` + const ctx = context.enters("mappings", i) if (images.length > 0) { if (!ignore) { - errors.push( - `${ctx}: A mapping has an image in the 'then'-clause. Remove the image there and use \`"icon": \` instead. The images found are ${images.join( + ctx.err( + `A mapping has an image in the 'then'-clause. Remove the image there and use \`"icon": \` instead. The images found are ${images.join( ", " )}. (This check can be turned of by adding "#": "${ignoreToken}" in the mapping, but this is discouraged` ) } else { - information.push( - `${ctx}: Ignored image ${images.join( + ctx.info( + `Ignored image ${images.join( ", " )} in 'then'-clause of a mapping as this check has been disabled` ) for (const image of images) { - this._doesImageExist.convertJoin(image, ctx, errors, warnings, information) + this._doesImageExist.convert(image, ctx) } } } else if (ignore) { - warnings.push(`${ctx}: unused '${ignoreToken}' - please remove this`) + ctx.warn(`Unused '${ignoreToken}' - please remove this`) } } - return { - errors, - warnings, - information, - result: json, - } + return json } } @@ -701,20 +727,12 @@ class ValidatePossibleLinks extends DesugaringStep, - context: string - ): { - result: string | Record - errors?: string[] - warnings?: string[] - information?: string[] - } { - const errors = [] + context: ConversionContext + ): string | Record { if (typeof json === "string") { if (this.isTabnabbingProne(json)) { - errors.push( - "At " + - context + - ": the string " + + context.err( + "The string " + json + " has a link targeting `_blank`, but it doesn't have `rel='noopener'` set. This gives rise to reverse tabnapping" ) @@ -722,369 +740,657 @@ class ValidatePossibleLinks extends DesugaringStep { + public static readonly allowUndefined: CheckTranslation = new CheckTranslation(true) + public static readonly noUndefined: CheckTranslation = new CheckTranslation() + private readonly _allowUndefined: boolean + + constructor(allowUndefined: boolean = false) { + super( + "Checks that a translation is valid and internally consistent", + ["*"], + "CheckTranslation" + ) + this._allowUndefined = allowUndefined + } + + convert(json: Translatable, context: ConversionContext): Translatable { + if (json === undefined || json === null) { + if (!this._allowUndefined) { + context.err("Expected a translation, but got " + json) + } + return json } + if (typeof json === "string") { + return json + } + const keys = Object.keys(json) + if (keys.length === 0) { + context.err("No actual values are given in this translation, it is completely empty") + return json + } + const en = json["en"] + if (!en && json["*"] === undefined) { + const msg = "Received a translation without english version" + context.warn(msg) + } + + for (const key of keys) { + const lng = json[key] + if (lng === "") { + context.enter(lng).err("Got an empty string in translation for language " + lng) + } + + // TODO validate that all subparts are here + } + + return json } } class MiscTagRenderingChecks extends DesugaringStep { - private _options: { noQuestionHintCheck: boolean } - - constructor(options: { noQuestionHintCheck: boolean }) { + constructor() { super("Miscellaneous checks on the tagrendering", ["special"], "MiscTagRenderingChecks") - this._options = options } convert( json: TagRenderingConfigJson | QuestionableTagRenderingConfigJson, - context: string - ): { - result: TagRenderingConfigJson - errors?: string[] - warnings?: string[] - information?: string[] - } { - const warnings = [] - const errors = [] + context: ConversionContext + ): TagRenderingConfigJson { if (json["special"] !== undefined) { - errors.push( - "At " + - context + - ': detected `special` on the top level. Did you mean `{"render":{ "special": ... }}`' + context.err( + 'Detected `special` on the top level. Did you mean `{"render":{ "special": ... }}`' ) } + + { + for (const key of ["question", "questionHint", "render"]) { + CheckTranslation.allowUndefined.convert(json[key], context.enter(key)) + } + for (let i = 0; i < json.mappings?.length ?? 0; i++) { + const mapping = json.mappings[i] + CheckTranslation.noUndefined.convert( + mapping.then, + context.enters("mappings", i, "then") + ) + if (!mapping.if) { + context.enters("mappings", i).err("No `if` is defined") + } + const en = mapping?.then?.["en"] + if (en && this.detectYesOrNo(en)) { + console.log("Found a match with yes or no: ", { en }) + context + .enters("mappings", i, "then") + .warn( + "A mapping should not start with 'yes' or 'no'. If the attribute is known, it will only show 'yes' or 'no' without the question, resulting in a weird phrasing in the information box" + ) + } + } + } if (json["group"]) { - errors.push( - "At " + - context + - ': groups are deprecated, use `"label": ["' + - json["group"] + - '"]` instead' + context.err('Groups are deprecated, use `"label": ["' + json["group"] + '"]` instead') + } + + if (json["question"] && json.freeform?.key === undefined && json.mappings === undefined) { + context.err( + "A question is defined, but no mappings nor freeform (key) are. Add at least one of them" + ) + } + if (json["question"] && !json.freeform && (json.mappings?.length ?? 0) == 1) { + context.err("A question is defined, but there is only one option to choose from.") + } + if (json["questionHint"] && !json["question"]) { + context + .enter("questionHint") + .err( + "A questionHint is defined, but no question is given. As such, the questionHint will never be shown" + ) + } + + if (json.freeform) { + if (json.render === undefined) { + context + .enter("render") + .err( + "This tagRendering allows to set a value to key " + + json.freeform.key + + ", but does not define a `render`. Please, add a value here which contains `{" + + json.freeform.key + + "}`" + ) + } else { + const render = new Translation(json.render) + for (const ln in render.translations) { + if (ln.startsWith("_")) { + continue + } + const txt: string = render.translations[ln] + if (txt === "") { + context.enter("render").err(" Rendering for language " + ln + " is empty") + } + if ( + txt.indexOf("{" + json.freeform.key + "}") >= 0 || + txt.indexOf("&LBRACE" + json.freeform.key + "&RBRACE") >= 0 + ) { + continue + } + if (txt.indexOf("{" + json.freeform.key + ":") >= 0) { + continue + } + + if ( + json.freeform["type"] === "opening_hours" && + txt.indexOf("{opening_hours_table(") >= 0 + ) { + continue + } + const keyFirstArg = ["canonical", "fediverse_link", "translated"] + if ( + keyFirstArg.some( + (funcName) => txt.indexOf(`{${funcName}(${json.freeform.key}`) >= 0 + ) + ) { + continue + } + if ( + json.freeform["type"] === "wikidata" && + txt.indexOf("{wikipedia(" + json.freeform.key) >= 0 + ) { + continue + } + if (json.freeform.key === "wikidata" && txt.indexOf("{wikipedia()") >= 0) { + continue + } + if ( + json.freeform["type"] === "wikidata" && + txt.indexOf(`{wikidata_label(${json.freeform.key})`) >= 0 + ) { + continue + } + context + .enter("render") + .err( + `The rendering for language ${ln} does not contain \`{${json.freeform.key}}\`. This is a bug, as this rendering should show exactly this freeform key!` + ) + } + } + } + if (json.render && json["question"] && json.freeform === undefined) { + context.err( + `Detected a tagrendering which takes input without freeform key in ${context}; the question is ${new Translation( + json["question"] + ).textFor("en")}` ) } const freeformType = json["freeform"]?.["type"] if (freeformType) { if (Validators.availableTypes.indexOf(freeformType) < 0) { - throw ( - "At " + - context + - ".freeform.type is an unknown type: " + - freeformType + - "; try one of " + - Validators.availableTypes.join(", ") - ) + context + .enters("freeform", "type") + .err( + "Unknown type: " + + freeformType + + "; try one of " + + Validators.availableTypes.join(", ") + ) } } - return { - result: json, - errors, - warnings, - } + + return json + } + + /** + * const obj = new MiscTagRenderingChecks() + * obj.detectYesOrNo("Yes, this place has") // => true + * obj.detectYesOrNo("Yes") // => true + * obj.detectYesOrNo("No, this place does not have...") // => true + * obj.detectYesOrNo("This place does not have...") // => false + */ + private detectYesOrNo(en: string): boolean { + return en.toLowerCase().match(/^(yes|no)([,:;.?]|$)/) !== null } } export class ValidateTagRenderings extends Fuse { - constructor( - layerConfig?: LayerConfigJson, - doesImageExist?: DoesImageExist, - options?: { noQuestionHintCheck: boolean } - ) { + constructor(layerConfig?: LayerConfigJson, doesImageExist?: DoesImageExist) { super( "Various validation on tagRenderingConfigs", new DetectShadowedMappings(layerConfig), new DetectConflictingAddExtraTags(), + new DetectNonErasedKeysInMappings(), new DetectMappingsWithImages(doesImageExist), new On("render", new ValidatePossibleLinks()), new On("question", new ValidatePossibleLinks()), new On("questionHint", new ValidatePossibleLinks()), new On("mappings", new Each(new On("then", new ValidatePossibleLinks()))), - new MiscTagRenderingChecks(options) + new MiscTagRenderingChecks() ) } } -export class ValidateLayer extends DesugaringStep { - /** - * The paths where this layer is originally saved. Triggers some extra checks - * @private - */ - private readonly _path?: string +export class PrevalidateLayer extends DesugaringStep { private readonly _isBuiltin: boolean private readonly _doesImageExist: DoesImageExist + /** + * The paths where this layer is originally saved. Triggers some extra checks + */ + private readonly _path: string + private readonly _studioValidations: boolean - constructor(path: string, isBuiltin: boolean, doesImageExist: DoesImageExist) { - super("Doesn't change anything, but emits warnings and errors", [], "ValidateLayer") + constructor(path: string, isBuiltin, doesImageExist, studioValidations) { + super("Runs various checks against common mistakes for a layer", [], "PrevalidateLayer") this._path = path this._isBuiltin = isBuiltin this._doesImageExist = doesImageExist + this._studioValidations = studioValidations } - convert( - json: LayerConfigJson, - context: string - ): { result: LayerConfigJson; errors: string[]; warnings?: string[]; information?: string[] } { - const errors = [] - const warnings = [] - const information = [] - context = "While validating a layer: " + context - if (typeof json === "string") { - errors.push(context + ": This layer hasn't been expanded: " + json) - return { - result: null, - errors, + convert(json: LayerConfigJson, context: ConversionContext): LayerConfigJson { + if (json.id === undefined) { + context.enter("id").err(`Not a valid layer: id is undefined`) + } else { + if (json.id?.toLowerCase() !== json.id) { + context.enter("id").err(`The id of a layer should be lowercase: ${json.id}`) + } + if (json.id?.match(/[a-z0-9-_]/) == null) { + context.enter("id").err(`The id of a layer should match [a-z0-9-_]*: ${json.id}`) } } - const layerConfig = new LayerConfig(json, "validation", true) - for (const [attribute, code, isStrict] of layerConfig.calculatedTags ?? []) { - try { - new Function("feat", "return " + code + ";") - } catch (e) { - throw `Invalid function definition: the custom javascript is invalid:${e} (at ${context}). The offending javascript code is:\n ${code}` + if (json.source === undefined) { + context + .enter("source") + .err( + "No source section is defined; please define one as data is not loaded otherwise" + ) + } else { + if (json.source === "special" || json.source === "special:library") { + } else if (json.source && json.source["osmTags"] === undefined) { + context + .enters("source", "osmTags") + .err( + "No osmTags defined in the source section - these should always be present, even for geojson layer" + ) + } else { + const osmTags = TagUtils.Tag(json.source["osmTags"], context + "source.osmTags") + if (osmTags.isNegative()) { + context + .enters("source", "osmTags") + .err( + "The source states tags which give a very wide selection: it only uses negative expressions, which will result in too much and unexpected data. Add at least one required tag. The tags are:\n\t" + + osmTags.asHumanString(false, false, {}) + ) + } } + + if (json.source["geoJsonSource"] !== undefined) { + context + .enters("source", "geoJsonSource") + .err("Use 'geoJson' instead of 'geoJsonSource'") + } + + if (json.source["geojson"] !== undefined) { + context + .enters("source", "geojson") + .err("Use 'geoJson' instead of 'geojson' (the J is a capital letter)") + } + } + + if ( + json.syncSelection !== undefined && + LayerConfig.syncSelectionAllowed.indexOf(json.syncSelection) < 0 + ) { + context + .enter("syncSelection") + .err( + "Invalid sync-selection: must be one of " + + LayerConfig.syncSelectionAllowed.map((v) => `'${v}'`).join(", ") + + " but got '" + + json.syncSelection + + "'" + ) } if (json.source === "special") { if (!Constants.priviliged_layers.find((x) => x == json.id)) { - errors.push( - context + - ": layer " + + context.err( + "Layer " + json.id + " uses 'special' as source.osmTags. However, this layer is not a priviliged layer" ) } } + if (context.hasErrors()) { + return undefined + } + if (json.tagRenderings !== undefined && json.tagRenderings.length > 0) { + new On("tagRendering", new Each(new ValidateTagRenderings(json))) if (json.title === undefined && json.source !== "special:library") { - errors.push( - context + - ": this layer does not have a title defined but it does have tagRenderings. Not having a title will disable the popups, resulting in an unclickable element. Please add a title. If not having a popup is intended and the tagrenderings need to be kept (e.g. in a library layer), set `title: null` to disable this error." + context.err( + "This layer does not have a title defined but it does have tagRenderings. Not having a title will disable the popups, resulting in an unclickable element. Please add a title. If not having a popup is intended and the tagrenderings need to be kept (e.g. in a library layer), set `title: null` to disable this error." ) } if (json.title === null) { - information.push( - context + - ": title is `null`. This results in an element that cannot be clicked - even though tagRenderings is set." + context.info( + "Title is `null`. This results in an element that cannot be clicked - even though tagRenderings is set." ) } + + { + // Check for multiple, identical builtin questions - usability for studio users + const duplicates = Utils.Duplicates( + json.tagRenderings.filter((tr) => typeof tr === "string") + ) + for (let i = 0; i < json.tagRenderings.length; i++) { + const tagRendering = json.tagRenderings[i] + if (typeof tagRendering === "string" && duplicates.indexOf(tagRendering) > 0) { + context + .enters("tagRenderings", i) + .err(`This builtin question is used multiple times (${tagRendering})`) + } + } + } } if (json["builtin"] !== undefined) { - errors.push(context + ": This layer hasn't been expanded: " + json) - return { - result: null, - errors, - } + context.err("This layer hasn't been expanded: " + json) + return null } if (json.minzoom > Constants.minZoomLevelToAddNewPoint) { - ;(json.presets?.length > 0 ? errors : warnings).push( - `At ${context}: minzoom is ${json.minzoom}, this should be at most ${Constants.minZoomLevelToAddNewPoint} as a preset is set. Why? Selecting the pin for a new item will zoom in to level before adding the point. Having a greater minzoom will hide the points, resulting in possible duplicates` - ) + const c = context.enter("minzoom") + const msg = `Minzoom is ${json.minzoom}, this should be at most ${Constants.minZoomLevelToAddNewPoint} as a preset is set. Why? Selecting the pin for a new item will zoom in to level before adding the point. Having a greater minzoom will hide the points, resulting in possible duplicates` + if (json.presets?.length > 0) { + c.err(msg) + } else { + c.warn(msg) + } } { // duplicate ids in tagrenderings check - const duplicates = Utils.Dedup( + const duplicates = Utils.NoNull( Utils.Duplicates(Utils.NoNull((json.tagRenderings ?? []).map((tr) => tr["id"]))) ) if (duplicates.length > 0) { - console.log(json.tagRenderings) - errors.push( - "At " + - context + - ": some tagrenderings have a duplicate id: " + - duplicates.join(", ") - ) + // It is tempting to add an index to this warning; however, due to labels the indices here might be different from the index in the tagRendering list + context + .enter("tagRenderings") + .err("Some tagrenderings have a duplicate id: " + duplicates.join(", ")) } } if (json.deletion !== undefined && json.deletion instanceof DeleteConfig) { if (json.deletion.softDeletionTags === undefined) { - warnings.push("No soft-deletion tags in deletion block for layer " + json.id) + context + .enter("deletion") + .warn("No soft-deletion tags in deletion block for layer " + json.id) } } try { - if (this._isBuiltin) { - // Some checks for legacy elements + } catch (e) { + context.err("Could not validate layer due to: " + e + e.stack) + } - if (json["overpassTags"] !== undefined) { - errors.push( - "Layer " + - json.id + - 'still uses the old \'overpassTags\'-format. Please use "source": {"osmTags": }\' instead of "overpassTags": (note: this isn\'t your fault, the custom theme generator still spits out the old format)' - ) - } - const forbiddenTopLevel = [ - "icon", - "wayHandling", - "roamingRenderings", - "roamingRendering", - "label", - "width", - "color", - "colour", - "iconOverlays", - ] - for (const forbiddenKey of forbiddenTopLevel) { - if (json[forbiddenKey] !== undefined) - errors.push( - context + - ": layer " + - json.id + - " still has a forbidden key " + - forbiddenKey - ) - } - if (json["hideUnderlayingFeaturesMinPercentage"] !== undefined) { - errors.push( - context + - ": layer " + - json.id + - " contains an old 'hideUnderlayingFeaturesMinPercentage'" - ) - } + if (this._studioValidations) { + if (!json.description) { + context.enter("description").err("A description is required") + } + if (!json.name) { + context.enter("name").err("A name is required") + } + } - if ( - json.isShown !== undefined && - (json.isShown["render"] !== undefined || json.isShown["mappings"] !== undefined) - ) { - warnings.push(context + " has a tagRendering as `isShown`") - } + if (this._isBuiltin) { + // Some checks for legacy elements + + if (json["overpassTags"] !== undefined) { + context.err( + "Layer " + + json.id + + 'still uses the old \'overpassTags\'-format. Please use "source": {"osmTags": }\' instead of "overpassTags": (note: this isn\'t your fault, the custom theme generator still spits out the old format)' + ) } - if (this._isBuiltin) { - // Check location of layer file - const expected: string = `assets/layers/${json.id}/${json.id}.json` - if (this._path != undefined && this._path.indexOf(expected) < 0) { - errors.push( - "Layer is in an incorrect place. The path is " + - this._path + - ", but expected " + - expected - ) - } + const forbiddenTopLevel = [ + "icon", + "wayHandling", + "roamingRenderings", + "roamingRendering", + "label", + "width", + "color", + "colour", + "iconOverlays", + ] + for (const forbiddenKey of forbiddenTopLevel) { + if (json[forbiddenKey] !== undefined) + context.err("Layer " + json.id + " still has a forbidden key " + forbiddenKey) } - if (this._isBuiltin) { - // Check for correct IDs - if (json.tagRenderings?.some((tr) => tr["id"] === "")) { - const emptyIndexes: number[] = [] - for (let i = 0; i < json.tagRenderings.length; i++) { - const tagRendering = json.tagRenderings[i] - if (tagRendering["id"] === "") { - emptyIndexes.push(i) - } + if (json["hideUnderlayingFeaturesMinPercentage"] !== undefined) { + context.err( + "Layer " + json.id + " contains an old 'hideUnderlayingFeaturesMinPercentage'" + ) + } + + if ( + json.isShown !== undefined && + (json.isShown["render"] !== undefined || json.isShown["mappings"] !== undefined) + ) { + context.warn("Has a tagRendering as `isShown`") + } + } + if (this._isBuiltin) { + // Check location of layer file + const expected: string = `assets/layers/${json.id}/${json.id}.json` + if (this._path != undefined && this._path.indexOf(expected) < 0) { + context.err( + "Layer is in an incorrect place. The path is " + + this._path + + ", but expected " + + expected + ) + } + } + if (this._isBuiltin) { + // Check for correct IDs + if (json.tagRenderings?.some((tr) => tr["id"] === "")) { + const emptyIndexes: number[] = [] + for (let i = 0; i < json.tagRenderings.length; i++) { + const tagRendering = json.tagRenderings[i] + if (tagRendering["id"] === "") { + emptyIndexes.push(i) } - errors.push( - `Some tagrendering-ids are empty or have an emtpy string; this is not allowed (at ${context}.tagRenderings.[${emptyIndexes.join( + } + context + .enter(["tagRenderings", ...emptyIndexes]) + .err( + `Some tagrendering-ids are empty or have an emtpy string; this is not allowed (at ${emptyIndexes.join( "," )}])` ) - } + } - const duplicateIds = Utils.Duplicates( - (json.tagRenderings ?? []) - ?.map((f) => f["id"]) - .filter((id) => id !== "questions") + const duplicateIds = Utils.Duplicates( + (json.tagRenderings ?? [])?.map((f) => f["id"]).filter((id) => id !== "questions") + ) + if (duplicateIds.length > 0 && !Utils.runningFromConsole) { + context + .enter("tagRenderings") + .err(`Some tagRenderings have a duplicate id: ${duplicateIds}`) + } + + if (json.description === undefined) { + if (typeof json.source === null) { + context.err("A priviliged layer must have a description") + } else { + context.warn("A builtin layer should have a description") + } + } + } + + if (json.filter) { + new On("filter", new Each(new ValidateFilter())).convert(json, context) + } + + if (json.tagRenderings !== undefined) { + new On( + "tagRenderings", + new Each(new ValidateTagRenderings(json, this._doesImageExist)) + ).convert(json, context) + } + + if (json.pointRendering !== null && json.pointRendering !== undefined) { + if (!Array.isArray(json.pointRendering)) { + throw ( + "pointRendering in " + + json.id + + " is not iterable, it is: " + + typeof json.pointRendering ) - if (duplicateIds.length > 0 && !Utils.runningFromConsole) { - errors.push( - `Some tagRenderings have a duplicate id: ${duplicateIds} (at ${context}.tagRenderings)` - ) + } + for (let i = 0; i < json.pointRendering.length; i++) { + const pointRendering = json.pointRendering[i] + if (pointRendering.marker === undefined) { + continue } - - if (json.description === undefined) { - if (typeof json.source === null) { - errors.push(context + ": A priviliged layer must have a description") - } else { - warnings.push(context + ": A builtin layer should have a description") + for (const icon of pointRendering?.marker) { + const indexM = pointRendering?.marker.indexOf(icon) + if (!icon.icon) { + continue + } + if (icon.icon["condition"]) { + context + .enters("pointRendering", i, "marker", indexM, "icon", "condition") + .err( + "Don't set a condition in a marker as this will result in an invisible but clickable element. Use extra filters in the source instead." + ) } } } + } - if (json.filter) { - const r = new On("filter", new Each(new ValidateFilter())).convert(json, context) - warnings.push(...(r.warnings ?? [])) - errors.push(...(r.errors ?? [])) - information.push(...(r.information ?? [])) + if (json.presets !== undefined) { + if (typeof json.source === "string") { + context.enter("presets").err("A special layer cannot have presets") } - - if (json.tagRenderings !== undefined) { - const r = new On( - "tagRenderings", - new Each( - new ValidateTagRenderings(json, this._doesImageExist, { - noQuestionHintCheck: json["#"]?.indexOf("no-question-hint-check") >= 0, - }) - ) - ).convert(json, context) - warnings.push(...(r.warnings ?? [])) - errors.push(...(r.errors ?? [])) - information.push(...(r.information ?? [])) - } - - { - const hasCondition = json.mapRendering?.filter( - (mr) => mr["icon"] !== undefined && mr["icon"]["condition"] !== undefined - ) - if (hasCondition?.length > 0) { - errors.push( - "At " + - context + - ":\n One or more icons in the mapRenderings have a condition set. Don't do this, as this will result in an invisible but clickable element. Use extra filters in the source instead. The offending mapRenderings are:\n" + - JSON.stringify(hasCondition, null, " ") - ) + // Check that a preset will be picked up by the layer itself + const baseTags = TagUtils.Tag(json.source["osmTags"]) + for (let i = 0; i < json.presets.length; i++) { + const preset = json.presets[i] + if (!preset) { + context.enters("presets", i).err("This preset is undefined") + continue } - } - - if (json.presets !== undefined) { - if (typeof json.source === "string") { - throw "A special layer cannot have presets" + if (!preset.tags) { + context.enters("presets", i, "tags").err("No tags defined for this preset") + continue } - // Check that a preset will be picked up by the layer itself - const baseTags = TagUtils.Tag(json.source["osmTags"]) - for (let i = 0; i < json.presets.length; i++) { - const preset = json.presets[i] - const tags: { k: string; v: string }[] = new And( - preset.tags.map((t) => TagUtils.Tag(t)) - ).asChange({ id: "node/-1" }) - const properties = {} - for (const tag of tags) { - properties[tag.k] = tag.v - } - const doMatch = baseTags.matchesProperties(properties) - if (!doMatch) { - errors.push( - context + - ".presets[" + - i + - "]: This preset does not match the required tags of this layer. This implies that a newly added point will not show up.\n A newly created point will have properties: " + - JSON.stringify(properties) + + if (!preset.tags) { + context.enters("presets", i, "title").err("No title defined for this preset") + } + + const tags = new And(preset.tags.map((t) => TagUtils.Tag(t))) + const properties = {} + for (const tag of tags.asChange({ id: "node/-1" })) { + properties[tag.k] = tag.v + } + const doMatch = baseTags.matchesProperties(properties) + if (!doMatch) { + context + .enters("presets", i, "tags") + .err( + "This preset does not match the required tags of this layer. This implies that a newly added point will not show up.\n A newly created point will have properties: " + + tags.asHumanString(false, false, {}) + "\n The required tags are: " + baseTags.asHumanString(false, false, {}) ) - } } } - } catch (e) { - errors.push(e) + } + return json + } +} + +export class ValidateLayer extends Conversion< + LayerConfigJson, + { parsed: LayerConfig; raw: LayerConfigJson } +> { + private readonly _skipDefaultLayers: boolean + private readonly _prevalidation: PrevalidateLayer + + constructor( + path: string, + isBuiltin: boolean, + doesImageExist: DoesImageExist, + studioValidations: boolean = false, + skipDefaultLayers: boolean = false + ) { + super("Doesn't change anything, but emits warnings and errors", [], "ValidateLayer") + this._prevalidation = new PrevalidateLayer( + path, + isBuiltin, + doesImageExist, + studioValidations + ) + this._skipDefaultLayers = skipDefaultLayers + } + + convert( + json: LayerConfigJson, + context: ConversionContext + ): { parsed: LayerConfig; raw: LayerConfigJson } { + context = context.inOperation(this.name) + if (typeof json === "string") { + context.err( + `Not a valid layer: the layerConfig is a string. 'npm run generate:layeroverview' might be needed` + ) + return undefined } - return { - result: json, - errors, - warnings, - information, + if (this._skipDefaultLayers && Constants.added_by_default.indexOf(json.id) >= 0) { + return { parsed: undefined, raw: json } } + + this._prevalidation.convert(json, context.inOperation(this._prevalidation.name)) + + if (context.hasErrors()) { + return undefined + } + + let layerConfig: LayerConfig + try { + layerConfig = new LayerConfig(json, "validation", true) + } catch (e) { + context.err("Could not parse layer due to:" + e) + return undefined + } + for (let i = 0; i < (layerConfig.calculatedTags ?? []).length; i++) { + const [_, code, __] = layerConfig.calculatedTags[i] + try { + new Function("feat", "return " + code + ";") + } catch (e) { + context + .enters("calculatedTags", i) + .err( + `Invalid function definition: the custom javascript is invalid:${e}. The offending javascript code is:\n ${code}` + ) + } + } + + return { raw: json, parsed: layerConfig } } } @@ -1093,33 +1399,27 @@ export class ValidateFilter extends DesugaringStep { super("Detect common errors in the filters", [], "ValidateFilter") } - convert( - filter: FilterConfigJson, - context: string - ): { - result: FilterConfigJson - errors?: string[] - warnings?: string[] - information?: string[] - } { + convert(filter: FilterConfigJson, context: ConversionContext): FilterConfigJson { if (typeof filter === "string") { // Calling another filter, we skip - return { result: filter } + return filter } - const errors = [] for (const option of filter.options) { for (let i = 0; i < option.fields?.length ?? 0; i++) { const field = option.fields[i] const type = field.type ?? "string" if (Validators.availableTypes.find((t) => t === type) === undefined) { - const err = `Invalid filter: ${type} is not a valid textfield type (at ${context}.fields[${i}])\n\tTry one of ${Array.from( - Validators.availableTypes - ).join(",")}` - errors.push(err) + context + .enters("fields", i) + .err( + `Invalid filter: ${type} is not a valid textfield type.\n\tTry one of ${Array.from( + Validators.availableTypes + ).join(",")}` + ) } } } - return { result: filter, errors } + return filter } } @@ -1137,17 +1437,8 @@ export class DetectDuplicateFilters extends DesugaringStep<{ convert( json: { layers: LayerConfigJson[]; themes: LayoutConfigJson[] }, - __: string - ): { - result: { layers: LayerConfigJson[]; themes: LayoutConfigJson[] } - errors?: string[] - warnings?: string[] - information?: string[] - } { - const errors: string[] = [] - const warnings: string[] = [] - const information: string[] = [] - + context: ConversionContext + ): { layers: LayerConfigJson[]; themes: LayoutConfigJson[] } { const { layers, themes } = json const perOsmTag = new Map< string, @@ -1191,15 +1482,10 @@ export class DetectDuplicateFilters extends DesugaringStep<{ } msg += `\n - ${id}${layer.id}.${filter.id}` } - warnings.push(msg) + context.warn(msg) }) - return { - result: json, - errors, - warnings, - information, - } + return json } /** @@ -1258,18 +1544,10 @@ export class DetectDuplicatePresets extends DesugaringStep { "DetectDuplicatePresets" ) } - convert( - json: LayoutConfig, - context: string - ): { - result: LayoutConfig - errors?: string[] - warnings?: string[] - information?: string[] - } { + + convert(json: LayoutConfig, context: ConversionContext): LayoutConfig { const presets: PresetConfig[] = [].concat(...json.layers.map((l) => l.presets)) - const errors = [] const enNames = presets.map((p) => p.title.textFor("en")) if (new Set(enNames).size != enNames.length) { const dups = Utils.Duplicates(enNames) @@ -1277,8 +1555,8 @@ export class DetectDuplicatePresets extends DesugaringStep { l.presets.some((p) => dups.indexOf(p.title.textFor("en")) >= 0) ) const layerIds = layersWithDup.map((l) => l.id) - errors.push( - `At ${context}: this themes has multiple presets which are named:${dups}, namely layers ${layerIds.join( + context.err( + `This themes has multiple presets which are named:${dups}, namely layers ${layerIds.join( ", " )} this is confusing for contributors and is probably the result of reusing the same layer multiple times. Use \`{"override": {"=presets": []}}\` to remove some presets` ) @@ -1298,8 +1576,8 @@ export class DetectDuplicatePresets extends DesugaringStep { presetB.preciseInput.snapToLayers ) ) { - errors.push( - `At ${context}: this themes has multiple presets with the same tags: ${presetATags.asHumanString( + context.err( + `This themes has multiple presets with the same tags: ${presetATags.asHumanString( false, false, {} @@ -1311,6 +1589,6 @@ export class DetectDuplicatePresets extends DesugaringStep { } } - return { errors, result: json } + return json } } diff --git a/src/Models/ThemeConfig/Conversion/ValidationUtils.ts b/src/Models/ThemeConfig/Conversion/ValidationUtils.ts index 26e3d0589..93c507aea 100644 --- a/src/Models/ThemeConfig/Conversion/ValidationUtils.ts +++ b/src/Models/ThemeConfig/Conversion/ValidationUtils.ts @@ -2,25 +2,17 @@ import { TagRenderingConfigJson } from "../Json/TagRenderingConfigJson" import { Utils } from "../../../Utils" import SpecialVisualizations from "../../../UI/SpecialVisualizations" import { RenderingSpecification, SpecialVisualization } from "../../../UI/SpecialVisualization" -import { LayerConfigJson } from "../Json/LayerConfigJson" +import { QuestionableTagRenderingConfigJson } from "../Json/QuestionableTagRenderingConfigJson" export default class ValidationUtils { - public static hasSpecialVisualisation( - layer: LayerConfigJson, - specialVisualisation: string - ): boolean { - return ( - layer.tagRenderings?.some((tagRendering) => { - if (tagRendering === undefined) { - return false - } - - const spec = ValidationUtils.getSpecialVisualisations( - tagRendering - ) - return spec.some((vis) => vis.funcName === specialVisualisation) - }) ?? false - ) + public static getAllSpecialVisualisations( + renderingConfigs: (TagRenderingConfigJson | QuestionableTagRenderingConfigJson)[] + ): RenderingSpecification[] { + const visualisations: RenderingSpecification[] = [] + for (const renderConfig of renderingConfigs) { + visualisations.push(...ValidationUtils.getSpecialVisualisationsWithArgs(renderConfig)) + } + return visualisations } /** @@ -30,14 +22,21 @@ export default class ValidationUtils { public static getSpecialVisualisations( renderingConfig: TagRenderingConfigJson ): SpecialVisualization[] { - return ValidationUtils.getSpecialVisualsationsWithArgs(renderingConfig).map( + return ValidationUtils.getSpecialVisualisationsWithArgs(renderingConfig).map( (spec) => spec["func"] ) } - public static getSpecialVisualsationsWithArgs( + public static getSpecialVisualisationsWithArgs( renderingConfig: TagRenderingConfigJson ): RenderingSpecification[] { + if (!renderingConfig) { + return [] + } + const cacheName = "__specialVisualisationsWithArgs_cache" + if (renderingConfig[cacheName]) { + return renderingConfig[cacheName] + } const translations: any[] = Utils.NoNull([ renderingConfig.render, ...(renderingConfig.mappings ?? []).map((m) => m.then), @@ -59,6 +58,15 @@ export default class ValidationUtils { all.push(...specials) } } + + // _Very_ dirty hack + Object.defineProperty(renderingConfig, cacheName, { + value: all, + enumerable: false, + configurable: true, + writable: true, + }) + return all } } diff --git a/src/Models/ThemeConfig/DeleteConfig.ts b/src/Models/ThemeConfig/DeleteConfig.ts index 0c7bfae69..81c5f07bd 100644 --- a/src/Models/ThemeConfig/DeleteConfig.ts +++ b/src/Models/ThemeConfig/DeleteConfig.ts @@ -115,6 +115,7 @@ export default class DeleteConfig { const config: QuestionableTagRenderingConfigJson = { question: t.whyDelete.translations, mappings, + id: "why-delete", } return new TagRenderingConfig(config) } diff --git a/src/Models/ThemeConfig/DependencyCalculator.ts b/src/Models/ThemeConfig/DependencyCalculator.ts index 7d0ae9c3f..dbeeb6a71 100644 --- a/src/Models/ThemeConfig/DependencyCalculator.ts +++ b/src/Models/ThemeConfig/DependencyCalculator.ts @@ -3,6 +3,7 @@ import { ExtraFuncParams, ExtraFunctions } from "../../Logic/ExtraFunctions" import LayerConfig from "./LayerConfig" import { SpecialVisualization } from "../../UI/SpecialVisualization" import SpecialVisualizations from "../../UI/SpecialVisualizations" +import { Exception } from "sass" export default class DependencyCalculator { public static GetTagRenderingDependencies(tr: TagRenderingConfig): string[] { @@ -39,6 +40,12 @@ export default class DependencyCalculator { for (let i = 0; layer.presets !== undefined && i < layer.presets.length; i++) { const preset = layer.presets[i] + const snapTo = preset.preciseInput?.snapToLayers + if (snapTo && !Array.isArray(snapTo)) { + throw new Error( + `snapToLayers is not an array; it is ${snapTo}(used in preset ${i} for: ${layer.id})` + ) + } preset.preciseInput?.snapToLayers?.forEach((id) => { deps.push({ neededLayer: id, diff --git a/src/Models/ThemeConfig/Json/DeleteConfigJson.ts b/src/Models/ThemeConfig/Json/DeleteConfigJson.ts index 653a040d0..f5828fe17 100644 --- a/src/Models/ThemeConfig/Json/DeleteConfigJson.ts +++ b/src/Models/ThemeConfig/Json/DeleteConfigJson.ts @@ -1,6 +1,15 @@ import { TagConfigJson } from "./TagConfigJson" export interface DeleteConfigJson { + /*** + * By default, the contributor needs 20 previous changesets to delete points edited by others. + * For some small features (e.g. bicycle racks) this is too much and this requirement can be lowered or dropped, which can be done here. + * + * type: nat + * question: How many changesets must a contributor have before being allowed to delete a point? + */ + neededChangesets?: number + /*** * By default, three reasons to delete a point are shown: * @@ -18,12 +27,17 @@ export interface DeleteConfigJson { */ extraDeleteReasons?: { /** - * The text that will be shown to the user - translatable + * The text that will be shown to the user as option for why this point does not exist anymore. + * Note that the most common reasons (test point, does not exist anymore, cannot be found) are already offered by default + * + * question: For what extra reason might this feature be removed in real-life? */ explanation: string | any /** * The text that will be uploaded into the changeset or will be used in the fixme in case of a soft deletion * Should be a few words, in english + * + * question: What should be added to the changeset as delete reason? */ changesetMessage: string }[] @@ -39,10 +53,14 @@ export interface DeleteConfigJson { /** * The tags that will be given to the object. * This must remove tags so that the 'source/osmTags' won't match anymore + * + * question: What tags should be applied to the object? */ if: TagConfigJson /** * The human explanation for the options + * + * question: What text should be shown to the contributor for this reason? */ then: string | any }[] @@ -53,6 +71,7 @@ export interface DeleteConfigJson { * It is important that the feature will be retagged in such a way that it won't be picked up by the layer anymore! * * Example (note that "amenity=" erases the 'amenity'-key alltogether): + * * ``` * { * "and": ["disussed:amenity=public_bookcase", "amenity="] @@ -60,22 +79,26 @@ export interface DeleteConfigJson { * ``` * * or (notice the use of the ':='-tag to copy the old value of 'shop=*' into 'disused:shop='): + * * ``` * { * "and": ["disused:shop:={shop}", "shop="] * } * ``` + * + * question: If a hard delete is not possible, what tags should be applied to mark this feature as deleted? + * type: tag */ softDeletionTags?: TagConfigJson - /*** - * By default, the contributor needs 20 previous changesets to delete points edited by others. - * For some small features (e.g. bicycle racks) this is too much and this requirement can be lowered or dropped, which can be done here. - */ - neededChangesets?: number /** * Set this flag if the default delete reasons should be omitted from the dialog. * This requires at least one extraDeleteReason or nonDeleteMapping + * + * question: Should the default delete reasons be hidden? + * iftrue: Hide the default delete reasons + * iffalse: Show the default delete reasons + * ifunset: Show the default delete reasons (default behaviour) */ omitDefaultDeleteReasons?: false | boolean } diff --git a/src/Models/ThemeConfig/Json/ExtraLinkConfigJson.ts b/src/Models/ThemeConfig/Json/ExtraLinkConfigJson.ts index 71a9dd294..68c32643d 100644 --- a/src/Models/ThemeConfig/Json/ExtraLinkConfigJson.ts +++ b/src/Models/ThemeConfig/Json/ExtraLinkConfigJson.ts @@ -1,7 +1,37 @@ +import { Translatable } from "./Translatable" + export default interface ExtraLinkConfigJson { + /** + * question: What icon should be shown in the link button? + * ifunset: do not show an icon + * type: icon + */ icon?: string - text?: string | any + /** + * question: What text should be shown in the link icon? + * + * Note that {lat},{lon},{zoom}, {language} and {theme} will be replaced + * + * ifunset: do not show a text + */ + text?: Translatable + /** + * question: if clicked, what webpage should open? + * Note that {lat},{lon},{zoom}, {language} and {theme} will be replaced + * + * type: url + */ href: string + /** + * question: Should the link open in a new tab? + * iftrue: Open in a new tab + * iffalse: do not open in a new tab + * ifunset: do not open in a new tab + */ newTab?: false | boolean + /** + * question: When should the extra button be shown? + * suggestions: return [{if: "value=iframe", then: "When shown in an iframe"}, {if: "value=no-iframe", then: "When shown as stand-alone webpage"}, {if: "value=welcome-message", then: "When the welcome messages are enabled"}, {if: "value=iframe", then: "When the welcome messages are disabled"}] + */ requirements?: ("iframe" | "no-iframe" | "welcome-message" | "no-welcome-message")[] } diff --git a/src/Models/ThemeConfig/Json/LayerConfigJson.ts b/src/Models/ThemeConfig/Json/LayerConfigJson.ts index 8e93636b0..a80752a9b 100644 --- a/src/Models/ThemeConfig/Json/LayerConfigJson.ts +++ b/src/Models/ThemeConfig/Json/LayerConfigJson.ts @@ -8,32 +8,51 @@ import PointRenderingConfigJson from "./PointRenderingConfigJson" import LineRenderingConfigJson from "./LineRenderingConfigJson" import { QuestionableTagRenderingConfigJson } from "./QuestionableTagRenderingConfigJson" import RewritableConfigJson from "./RewritableConfigJson" +import { Translatable } from "./Translatable" /** * Configuration for a single layer */ export interface LayerConfigJson { /** - * The id of this layer. + * question: What is the identifier of this layer? + * * This should be a simple, lowercase, human readable string that is used to identify the layer. + * A good ID is: + * - a noun + * - written in singular + * - describes the object + * - in english + * - only has lowercase letters, numbers or underscores. Do not use a space or a dash + * + * type: id + * group: Basic */ id: string /** - * The name of this layer - * Used in the layer control panel and the 'Personal theme'. + * Used in the layer control panel to toggle a layer on and of. * - * If not given, will be hidden (and thus not toggable) in the layer control + * ifunset: This will hide the layer in the layer control, making it not filterable and not toggleable + * + * group: Basic + * question: What is the name of this layer? */ - name?: string | Record + name?: Translatable /** - * A description for this layer. - * Shown in the layer selections and in the personel theme + * A description for the features shown in this layer. + * This often resembles the introduction of the wiki.osm.org-page for this feature. + * + * group: Basic + * question: How would you describe the features that are shown on this layer? */ - description?: string | Record + description?: Translatable /** + * Question: Where should the data be fetched from? + * title: Data Source + * * This determines where the data for the layer is fetched: from OSM or from an external geojson dataset. * * If no 'geojson' is defined, data will be fetched from overpass and the OSM-API. @@ -41,56 +60,84 @@ export interface LayerConfigJson { * Every source _must_ define which tags _must_ be present in order to be picked up. * * Note: a source must always be defined. 'special' is only allowed if this is a builtin-layer + * + * types: Load data with specific tags from OpenStreetMap ; Load data from an external geojson source ; + * typesdefault: 0 + * group: Basic */ source: | "special" | "special:library" - | ( - | { - /** - * Every source must set which tags have to be present in order to load the given layer. - */ - osmTags: TagConfigJson - /** - * The maximum amount of seconds that a tile is allowed to linger in the cache - */ - maxCacheAge?: number - } - | { - /** - * The actual source of the data to load, if loaded via geojson. - * - * # A single geojson-file - * source: {geoJson: "https://my.source.net/some-geo-data.geojson"} - * fetches a geojson from a third party source - * - * # A tiled geojson source - * source: {geoJson: "https://my.source.net/some-tile-geojson-{layer}-{z}-{x}-{y}.geojson", geoJsonZoomLevel: 14} - * to use a tiled geojson source. The web server must offer multiple geojsons. {z}, {x} and {y} are substituted by the location; {layer} is substituted with the id of the loaded layer - * - * Some API's use a BBOX instead of a tile, this can be used by specifying {y_min}, {y_max}, {x_min} and {x_max} - */ - geoJson: string - /** - * To load a tiled geojson layer, set the zoomlevel of the tiles - */ - geoJsonZoomLevel?: number - /** - * Indicates that the upstream geojson data is OSM-derived. - * Useful for e.g. merging or for scripts generating this cache - */ - isOsmCache?: boolean - /** - * Some API's use a mercator-projection (EPSG:900913) instead of WGS84. Set the flag `mercatorCrs: true` in the source for this - */ - mercatorCrs?: boolean - /** - * Some API's have an id-field, but give it a different name. - * Setting this key will rename this field into 'id' - */ - idKey?: string - } - ) + | { + /** + * question: Which tags must be present on the feature to show it in this layer? + * Every source must set which tags have to be present in order to load the given layer. + */ + osmTags: TagConfigJson + /** + * question: How long (in seconds) is the data allowed to remain cached until it must be refreshed? + * The maximum amount of seconds that a tile is allowed to linger in the cache + * + * type: nat + * default: 30 days + * group: expert + */ + maxCacheAge?: number + } + | { + /** + * The actual source of the data to load, if loaded via geojson. + * + * # A single geojson-file + * source: {geoJson: "https://my.source.net/some-geo-data.geojson"} + * fetches a geojson from a third party source + * + * # A tiled geojson source + * source: {geoJson: "https://my.source.net/some-tile-geojson-{layer}-{z}-{x}-{y}.geojson", geoJsonZoomLevel: 14} + * to use a tiled geojson source. The web server must offer multiple geojsons. {z}, {x} and {y} are substituted by the location; {layer} is substituted with the id of the loaded layer + * + * Some API's use a BBOX instead of a tile, this can be used by specifying {y_min}, {y_max}, {x_min} and {x_max} + * + * question: What is the URL of the geojson? + * type: url + */ + geoJson: string + /** + * To load a tiled geojson layer, set the zoomlevel of the tiles + * + * question: If using a tiled geojson, what is the zoomlevel of the tiles? + * ifunset: This is not a tiled geojson + */ + geoJsonZoomLevel?: number + /** + * Indicates that the upstream geojson data is OSM-derived. + * Useful for e.g. merging or for scripts generating this cache. + * This also indicates that making changes on this data is possible + * + * question: Is this geojson a cache of OpenStreetMap data? + * ifunset: This is not an OpenStreetMap cache + * iftrue: this is based on OpenStreetMap and can thus be edited + * group: expert + */ + isOsmCache?: boolean + /** + * Some API's use a mercator-projection (EPSG:900913) instead of WGS84. Set the flag `mercatorCrs: true` in the source for this + * + * question: Does this geojson use EPSG:900913 instead of WGS84 as projection? + * iftrue: This geojson uses EPSG:900913 instead of WGS84 + * ifunset: This geojson uses WGS84 just like most geojson (default) + */ + mercatorCrs?: boolean + /** + * Some API's have an id-field, but give it a different name. + * Setting this key will rename this field into 'id' + * + * ifunset: An id with key `id` will be assigned automatically if no attribute `id` is set + * inline: This geojson uses {value} as attribute to set the id + * question: What is the name of the attribute containing the ID of the object? + */ + idKey?: string + } /** * @@ -98,7 +145,7 @@ export interface LayerConfigJson { * There are a few extra functions available. Refer to Docs/CalculatedTags.md for more information * The functions will be run in order, e.g. * [ - * "_max_overlap_m2=Math.max(...feat.overlapsWith("someOtherLayer").map(o => o.overlap)) + Not found... * "_max_overlap_m2=Math.max(...feat.overlapsWith("someOtherLayer").map(o => o.overlap)) * "_max_overlap_ratio=Number(feat._max_overlap_m2)/feat.area * ] * @@ -111,52 +158,81 @@ export interface LayerConfigJson { * "_some_key:=some_javascript_expression" * ] * + * See the full documentation on [https://github.com/pietervdvn/MapComplete/blob/master/Docs/CalculatedTags.md] + * + * group: expert + * question: What extra attributes should be calculated with javascript? + * */ calculatedTags?: string[] - /** - * If set, this layer will not query overpass; but it'll still match the tags above which are by chance returned by other layers. - * Works well together with 'passAllFeatures', to add decoration - */ - doNotDownload?: boolean - /** * If set, only features matching this extra tag will be shown. - * This is useful to hide certain features from view. + * This is useful to hide certain features from view based on a calculated tag or if the features are provided by a different layer. * - * The default value is 'yes' + * question: What other tags should features match for being shown? + * group: advanced + * ifunset: all features which match the 'source'-specification are shown. */ isShown?: TagConfigJson /** - * Advanced option - might be set by the theme compiler + * The minimum needed zoomlevel required to start loading and displaying the data. + * This can be used to only show common features (e.g. a bicycle parking) only when the map is zoomed in very much (17). + * This prevents cluttering the map with thousands of parkings if one is looking to an entire city. * - * If true, this data will _always_ be loaded, even if the theme is disabled - */ - forceLoad?: false | boolean - - /** - * The minimum needed zoomlevel required before loading the data * Default: 0 + * group: Basic + * type: nat + * question: At what zoom level should features of the layer be shown? + * ifunset: Always load this layer, even if the entire world is in view. */ minzoom?: number /** * Indicates if this layer is shown by default; - * can be used to hide a layer from start, or to load the layer but only to show it where appropriate (e.g. for snapping to it) + * can be used to hide a layer from start, or to load the layer but only to show it when appropriate (e.g. for advanced users) + * + * question: Should this layer be enabled when opening the map for the first time? + * iftrue: the layer is enabled when opening the map + * iffalse: the layer is hidden until the contributor enables it. (If the filter-popup is disabled, this might never get enabled nor loaded) + * default: true + * group: advanced */ shownByDefault?: true | boolean /** * The zoom level at which point the data is hidden again * Default: 100 (thus: always visible + * + * group: expert */ minzoomVisible?: number /** + * question: What title should be shown on the infobox? * The title shown in a popup for elements of this layer. + * + * group: title + * types: use a fixed translation ; Use a dynamic tagRendering ; hidden + * typesdefault: 1 + * type: translation + * inline: {translated{value}} */ - title?: string | TagRenderingConfigJson + title?: TagRenderingConfigJson | Translatable + + /** + * + * Question: Should the information for this layer be shown in the sidebar or in a splash screen? + * + * If set, open the selectedElementView in a floatOver instead of on the right. + * + * iftrue: show the infobox in the splashscreen floating over the entire UI + * iffalse: show the infobox in a sidebar on the right + * group: advanced + * default: sidebar + */ + popupInFloatover?: boolean /** * Small icons shown next to the title. @@ -165,31 +241,59 @@ export interface LayerConfigJson { * Note that "defaults" will insert all the default titleIcons (which are added automatically) * * Type: icon[] + * group: infobox */ titleIcons?: (string | TagRenderingConfigJson)[] | ["defaults"] /** - * Visualisation of the items on the map + * Creates points to render on the map. + * This can render points for point-objects, lineobjects or areaobjects; use 'location' to indicate where it should be rendered + * group: pointrendering */ - mapRendering: - | null - | ( - | PointRenderingConfigJson - | LineRenderingConfigJson - | RewritableConfigJson< - | LineRenderingConfigJson - | PointRenderingConfigJson - | LineRenderingConfigJson[] - | PointRenderingConfigJson[] - > - )[] + pointRendering: PointRenderingConfigJson[] + /** + * Creates lines and areas to render on the map + * group: linerendering + */ + lineRendering?: LineRenderingConfigJson[] /** * If set, this layer will pass all the features it receives onto the next layer. - * This is ideal for decoration, e.g. directionss on cameras + * This is ideal for decoration, e.g. directions on cameras + * iftrue: Make the features from this layer also available to the other layer; might result in this object being rendered by multiple layers + * iffalse: normal behaviour: don't pass features allong + * question: should this layer pass features to the next layers? + * group: expert */ passAllFeatures?: boolean + /** + * If set, this layer will not query overpass; but it'll still match the tags above which are by chance returned by other layers. + * Works well together with 'passAllFeatures', to add decoration + * The opposite of `forceLoad` + * + * iftrue: Do not attempt to query the data for this layer from overpass/the OSM API + * iffalse: download the data as usual + * group: expert + * question: Should this layer be downloaded or is the data provided by a different layer (which has 'passAllFeatures'-set)? + * default: false + */ + doNotDownload?: boolean + + /** + * Advanced option - might be set by the theme compiler + * + * If true, this data will _always_ be loaded, even if the theme is disabled by a filter or hidden. + * The opposite of `doNotDownload` + * + * question: Should this layer be forcibly loaded? + * ifftrue: always download this layer, even if it is disabled + * iffalse: only download data for this layer when needed (default) + * default: false + * group: expert + */ + forceLoad?: false | boolean + /** * Presets for this layer. * A preset shows up when clicking the map on a without data (or when right-clicking/long-pressing); @@ -202,6 +306,8 @@ export interface LayerConfigJson { * * Note: the icon of the preset is determined automatically based on the tags and the icon above. Don't worry about that! * NB: if no presets are defined, the popup to add new points doesn't show up at all + * + * group: presets */ presets?: { /** @@ -211,42 +317,69 @@ export interface LayerConfigJson { * This text will be inserted into `Add {category} here`, becoming `Add a hydrant here`. * * Do _not_ indicate 'new': 'add a new shop here' is incorrect, as the shop might have existed forever, it could just be unmapped! + * + * question: What is the word to describe this object? + * inline: Add {translated(value)::font-bold} here */ - title: string | Record + title: Translatable /** - * The tags to add. It determines the icon too + * A single tag (encoded as key=value) out of all the tags to add onto the newly created point. + * Note that the icon in the UI will be chosen automatically based on the tags provided here. + * + * question: What tag should be added to the new object? + * type: simple_tag + * typeHelper: uploadableOnly */ tags: string[] /** + * An extra explanation of what the feature is, if it is not immediately clear from the title alone. + * * The _first sentence_ of the description is shown on the button of the `add` menu. * The full description is shown in the confirmation dialog. * * (The first sentence is until the first '.'-character in the description) + * + * question: How would you describe this feature? + * ifunset: No extra description is given. This can be used to further explain the preset */ - description?: string | Record + description?: Translatable /** - * Example images, which show real-life pictures of what such a feature might look like + * The URL of an example image which shows a real-life example of what such a feature might look like. * * Type: image + * question: What is the URL of an image showing such a feature? */ exampleImages?: string[] /** - * If specified, these layers will be shown to and the new point will be snapped towards it + * question: Should the created point be snapped to a line layer? + * + * If specified, these layers will be shown in the precise location picker and the new point will be snapped towards it. + * For example, this can be used to snap against `walls_and_buildings` (e.g. to attach a defibrillator, an entrance, an artwork, ... to the wall) + * or to snap an obstacle (such as a bollard) to the `cycleways_and_roads`. + * + * suggestions: return Array.from(layers.keys()).map(key => ({if: "value="+key, then: key+" - "+layers.get(key).description})) */ - snapToLayer?: string | string[] + snapToLayer?: string[] + /** + * question: What is the maximum distance in the location-input that a point can be moved to be snapped to a way? + * + * inline: a point is snapped if the location input is at most {value}m away from an object + * * If specified, a new point will only be snapped if it is within this range. + * If further away, it'll be placed in the center of the location input * Distance in meter * - * Default: 10 + * ifunset: Do not snap to a layer */ maxSnapDistance?: number }[] /** - * All the tag renderings. + * question: Edit this tagRendering + * * A tag rendering is a block that either shows the known value or asks a question. * * Refer to the class `TagRenderingConfigJson` to see the possibilities. @@ -264,6 +397,10 @@ export interface LayerConfigJson { * At last, one can define a group of renderings where parts of all strings will be replaced by multiple other strings. * This is mainly create questions for a 'left' and a 'right' side of the road. * These will be grouped and questions will be asked together + * + * type: tagrendering[] + * group: tagrenderings + * */ tagRenderings?: ( | string @@ -285,6 +422,8 @@ export interface LayerConfigJson { /** * All the extra questions for filtering. * If a string is given, mapComplete will search in 'filters.json' for the appropriate filter or will try to parse it as `layername.filterid` and us that one + * + * group: filters */ filter?: (FilterConfigJson | string)[] | { sameAs: string } @@ -301,72 +440,88 @@ export interface LayerConfigJson { * - undefined: use the mapcomplete default to show deletion or not. Currently, this is the same as 'false' but this will change in the future * - or: a hash with options (see below) * - * The delete dialog - * ================= + * ### The delete dialog * * * - #### Hard deletion if enough experience + * #### Hard deletion if enough experience - A feature can only be deleted from OpenStreetMap by mapcomplete if: + * A feature can only be deleted from OpenStreetMap by mapcomplete if: - - It is a node - - No ways or relations use the node - - The logged-in user has enough experience OR the user is the only one to have edited the point previously - - The logged-in user has no unread messages (or has a ton of experience) - - The user did not select one of the 'non-delete-options' (see below) - - In all other cases, a 'soft deletion' is used. - - #### Soft deletion - - A 'soft deletion' is when the point isn't deleted from OSM but retagged so that it'll won't how up in the mapcomplete theme anymore. - This makes it look like it was deleted, without doing damage. A fixme will be added to the point. - - Note that a soft deletion is _only_ possible if these tags are provided by the theme creator, as they'll be different for every theme - - #### No-delete options - - In some cases, the contributor might want to delete something for the wrong reason (e.g. someone who wants to have a path removed "because the path is on their private property"). - However, the path exists in reality and should thus be on OSM - otherwise the next contributor will pass by and notice "hey, there is a path missing here! Let me redraw it in OSM!) - - The correct approach is to retag the feature in such a way that it is semantically correct *and* that it doesn't show up on the theme anymore. - A no-delete option is offered as 'reason to delete it', but secretly retags. - - */ - deletion?: boolean | DeleteConfigJson + * - It is a node + * - No ways or relations use the node + * - The logged-in user has enough experience OR the user is the only one to have edited the point previously + * - The logged-in user has no unread messages (or has a ton of experience) + * - The user did not select one of the 'non-delete-options' (see below) + * + * In all other cases, a 'soft deletion' is used. + * + * #### Soft deletion + * + * A 'soft deletion' is when the point isn't deleted fromOSM but retagged so that it'll won't how up in the mapcomplete theme anymore. + * This makes it look like it was deleted, without doing damage. A fixme will be added to the point. + * + * Note that a soft deletion is _only_ possible if these tags are provided by the theme creator, as they'll be different for every theme + * + * ##### No-delete options + * + * In some cases, the contributor might want to delete something for the wrong reason (e.g. someone who wants to have a path removed "because the path is on their private property"). + * However, the path exists in reality and should thus be on OSM - otherwise the next contributor will pass by and notice "hey, there is a path missing here! Let me redraw it in OSM!) + * + * The correct approach is to retag the feature in such a way that it is semantically correct *and* that it doesn't show up on the theme anymore. + * A no-delete option is offered as 'reason to delete it', but secretly retags. + * + * group: editing + * types: Use an advanced delete configuration ; boolean + * iftrue: Allow deletion + * iffalse: Do not allow deletion + * ifunset: Do not allow deletion + * + **/ + deletion?: DeleteConfigJson | boolean /** - * Indicates if a point can be moved and configures the modalities. + * Indicates if a point can be moved and why. * * A feature can be moved by MapComplete if: * * - It is a point * - The point is _not_ part of a way or a a relation. * - * Off by default. Can be enabled by setting this flag or by configuring. + * types: use an advanced move configuration ; boolean + * group: editing + * question: Is deleting a point allowed? + * iftrue: Allow contributors to move a point (for accuracy or a relocation) + * iffalse: Don't allow contributors to move points + * ifunset: Don't allow contributors to move points (default) */ - allowMove?: boolean | MoveConfigJson + allowMove?: MoveConfigJson | boolean /** * If set, a 'split this way' button is shown on objects rendered as LineStrings, e.g. highways. * * If the way is part of a relation, MapComplete will attempt to update this relation as well + * question: Should the contributor be able to split ways using this layer? + * iftrue: enable the 'split-roads'-component + * iffalse: don't enable the split-roads componenet + * ifunset: don't enable the split-roads component + * group: editing */ allowSplit?: boolean /** * @see UnitConfigJson + * + * group: editing */ units?: UnitConfigJson[] /** * If set, synchronizes whether or not this layer is enabled. * - * no: Do not sync at all, always revert to default - * local: keep selection on local storage - * theme-only: sync via OSM, but this layer will only be toggled in this theme - * global: all layers with this ID will be synced accross all themes + * group: advanced + * question: Should enabling/disabling the layer be saved (locally or in the cloud)? + * suggestions: return [{if: "value=no", then: "Don't save, always revert to the default"}, {if: "value=local", then: "Save selection in local storage"}, {if: "value=theme-only", then: "Save the state in the OSM-usersettings, but apply on this theme only (default)"}, {if: "value=global", then: "Save in OSM-usersettings and toggle on _all_ themes using this layer"}] */ syncSelection?: "no" | "local" | "theme-only" | "global" @@ -374,16 +529,15 @@ export interface LayerConfigJson { * Used for comments and/or to disable some checks * * no-question-hint-check: disables a check in MiscTagRenderingChecks which complains about 'div', 'span' or 'class=subtle'-HTML elements in the tagRendering + * + * group: hidden */ "#"?: string | "no-question-hint-check" - /** - * If set, open the selectedElementView in a floatOver instead of on the right - */ - popupInFloatover?: boolean - /** * _Set automatically by MapComplete, please ignore_ + * + * group: hidden */ fullNodeDatabase?: boolean } diff --git a/src/Models/ThemeConfig/Json/LayoutConfigJson.ts b/src/Models/ThemeConfig/Json/LayoutConfigJson.ts index 71ece3df2..a3ad24add 100644 --- a/src/Models/ThemeConfig/Json/LayoutConfigJson.ts +++ b/src/Models/ThemeConfig/Json/LayoutConfigJson.ts @@ -2,6 +2,7 @@ import { LayerConfigJson } from "./LayerConfigJson" import ExtraLinkConfigJson from "./ExtraLinkConfigJson" import { RasterLayerProperties } from "../../RasterLayerProperties" +import { Translatable } from "./Translatable" /** * Defines the entire theme. @@ -17,21 +18,32 @@ import { RasterLayerProperties } from "../../RasterLayerProperties" */ export interface LayoutConfigJson { /** - * The id of this layout. + * question: What is the id of this layout? + * + * The id is a unique string to identify the theme + * + * It should be + * - in english + * - describe the theme in a single word (or a few words) + * - all lowercase and with only [a-z] or underscores (_) * * This is used as hashtag in the changeset message, which will read something like "Adding data with #mapcomplete for theme #" - * Make sure it is something decent and descriptive, it should be a simple, lowercase string. * * On official themes, it'll become the name of the page, e.g. * 'cyclestreets' which become 'cyclestreets.html' + * + * type: id + * group: basic */ id: string /** - * Who helped to create this theme and should be attributed? + * question: What is the title of this theme? + * + * The human-readable title, as shown in the welcome message and the index page + * group: basic */ - credits?: string - + title: Translatable /** * Only used in 'generateLayerOverview': if present, every translation will be checked to make sure it is fully translated. * @@ -40,120 +52,111 @@ export interface LayoutConfigJson { mustHaveLanguage?: string[] /** - * The title, as shown in the welcome message and the more-screen. + * question: How would you describe this theme? + * The description, as shown in the welcome message and the more-screen + * group: basic + * */ - title: string | Record + description: Translatable /** * A short description, showed as social description and in the 'more theme'-buttons. * Note that if this one is not defined, the first sentence of 'description' is used + * group: hidden */ - shortDescription?: string | Record - - /** - * The description, as shown in the welcome message and the more-screen - */ - description: string | Record + shortDescription?: Translatable /** * A part of the description, shown under the login-button. + * group: hidden */ - descriptionTail?: string | Record + descriptionTail?: Translatable /** - * The icon representing this theme. + * question: What icon should be used to represent this theme? + * * Used as logo in the more-screen and (for official themes) as favicon, webmanifest logo, ... + * * Either a URL or a base64 encoded value (which should include 'data:image/svg+xml;base64) * * Type: icon + * group: basic + * */ icon: string /** - * Link to a 'social image' which is included as og:image-tag on official themes. - * Useful to share the theme on social media. - * See https://www.h3xed.com/web-and-internet/how-to-use-og-image-meta-tag-facebook-reddit for more information$ + * question: What image should be used as social image preview? + * This is included as og:image-tag on official themes. * + * See https://www.h3xed.com/web-and-internet/how-to-use-og-image-meta-tag-facebook-reddit for more information + * ifunset: use the default social image of mapcomplete (or generate one based on the icon) * Type: image + * group: basic */ socialImage?: string /** + * question: should an extra help button be shown in certain circumstances? + * Adds an additional button on the top-left of the application. + * This can link to an arbitrary location. + * + * For example {icon: "./assets/svg/pop-out.svg", href: 'https://mapcomplete.org/{theme}.html?lat={lat}&lon={lon}&z={zoom}, requirements: ["iframe","no-welcome-message]}, + * + * group: advanced + * ifunset: show a link to open MapComplete full screen if used in an iframe + */ + extraLink?: ExtraLinkConfigJson + + /** + * question: At what zoomlevel should this theme open? * Default location and zoom to start. * Note that this is barely used. Once the user has visited mapcomplete at least once, the previous location of the user will be used + * ifunset: Use the default startzoom (0) + * type: float + * group: start_location */ - startZoom: number - startLat: number - startLon: number - + startZoom?: number /** - * When a query is run, the data within bounds of the visible map is loaded. - * However, users tend to pan and zoom a lot. It is pretty annoying if every single pan means a reloading of the data. - * For this, the bounds are widened in order to make a small pan still within bounds of the loaded data. - * - * IF widenfactor is 1, this feature is disabled. A recommended value is between 1 and 3 + * question: At what start latitude should this theme open? + * Default location and zoom to start. + * Note that this is barely used. Once the user has visited mapcomplete at least once, the previous location of the user will be used + * ifunset: Use 0 as start latitude + * type: float + * group: start_location */ - widenFactor?: number + startLat?: number /** - * At low zoom levels, overpass is used to query features. - * At high zoom level, the OSM api is used to fetch one or more BBOX aligning with a slippy tile. - * The overpassMaxZoom controls the flipoverpoint: if the zoom is this or lower, overpass is used. + * question: At what start longitude should this theme open? + * Default location and zoom to start. + * Note that this is barely used. Once the user has visited mapcomplete at least once, the previous location of the user will be used + * ifunset: Use 0 as start longitude + * type: float + * group: start_location */ - overpassMaxZoom?: 17 | number - - /** - * When the OSM-api is used to fetch features, it does so in a tiled fashion. - * These tiles are using a ceratin zoom level, that can be controlled here - * Default: overpassMaxZoom + 1 - */ - osmApiTileSize?: number - - /** - * An override applied on all layers of the theme. - * - * E.g.: if there are two layers defined: - * ``` - * "layers":[ - * {"title": ..., "tagRenderings": [...], "osmSource":{"tags": ...}}, - * {"title", ..., "tagRenderings", [...], "osmSource":{"tags" ...}} - * ] - * ``` - * - * and overrideAll is specified: - * ``` - * "overrideAll": { - * "osmSource":{"geoJsonSource":"xyz"} - * } - * then the result will be that all the layers will have these properties applied and result in: - * "layers":[ - * {"title": ..., "tagRenderings": [...], "osmSource":{"tags": ..., "geoJsonSource":"xyz"}}, - * {"title", ..., "tagRenderings", [...], "osmSource":{"tags" ..., "geoJsonSource":"xyz"}} - * ] - * ``` - * - * If the overrideAll contains a list where the keys starts with a plus, the values will be appended (instead of discarding the old list), for example - * - * "overrideAll": { - * "+tagRenderings": [ { ... some tagrendering ... }] - * } - * - * In the above scenario, `sometagrendering` will be added at the beginning of the tagrenderings of every layer - */ - overrideAll?: Partial - + startLon?: number /** * The id of the default background. BY default: vanilla OSM */ defaultBackgroundId?: string /** - * Define some (overlay) slippy map tilesources + * + * Who helped to create this theme and should be attributed? */ - tileLayerSources?: (RasterLayerProperties & { defaultState?: true | boolean })[] + credits?: string | string[] /** - * The layers to display. - * + * If set to true, this layout will not be shown in the overview with more themes + */ + hideFromOverview?: boolean + + /** + * question: What layers should this map show? + * type: layer[] + * types: hidden | layer | hidden + * group: layers + * suggestions: return Array.from(layers.keys()).map(key => ({if: "value="+key, then: key+" - "+layers.get(key).description})) * Every layer contains a description of which feature to display - the overpassTags which are queried. * Instead of running one query for every layer, the query is fused. * @@ -205,15 +208,48 @@ export interface LayoutConfigJson { hideTagRenderingsWithLabels?: string[] } )[] + /** + * An override applied on all layers of the theme. + * + * E.g.: if there are two layers defined: + * ``` + * "layers":[ + * {"title": ..., "tagRenderings": [...], "osmSource":{"tags": ...}}, + * {"title", ..., "tagRenderings", [...], "osmSource":{"tags" ...}} + * ] + * ``` + * + * and overrideAll is specified: + * ``` + * "overrideAll": { + * "osmSource":{"geoJsonSource":"xyz"} + * } + * then the result will be that all the layers will have these properties applied and result in: + * "layers":[ + * {"title": ..., "tagRenderings": [...], "osmSource":{"tags": ..., "geoJsonSource":"xyz"}}, + * {"title", ..., "tagRenderings", [...], "osmSource":{"tags" ..., "geoJsonSource":"xyz"}} + * ] + * ``` + * + * If the overrideAll contains a list where the keys starts with a plus, the values will be appended (instead of discarding the old list), for example + * + * "overrideAll": { + * "+tagRenderings": [ { ... some tagrendering ... }] + * } + * + * In the above scenario, `sometagrendering` will be added at the beginning of the tagrenderings of every layer + */ + overrideAll?: Partial + /** + * Define some (overlay) slippy map tilesources + */ + tileLayerSources?: (RasterLayerProperties & { defaultState?: true | boolean })[] /** * The URL of a custom CSS stylesheet to modify the layout + * group: advanced */ customCss?: string - /** - * If set to true, this layout will not be shown in the overview with more themes - */ - hideFromOverview?: boolean /** * If set to true, the basemap will not scroll outside of the area visible on initial zoom. @@ -223,87 +259,180 @@ export interface LayoutConfigJson { lockLocation?: [[number, number], [number, number]] | number[][] /** - * Adds an additional button on the top-left of the application. - * This can link to an arbitrary location. + * question: Should a user be able to login with OpenStreetMap? * - * Note that {lat},{lon},{zoom}, {language} and {theme} will be replaced + * If not logged in, will not show the login buttons and hide all the editable elements. + * As such, MapComplete will become read-only and a purely visualisation tool. * - * Default: {icon: "./assets/svg/pop-out.svg", href: 'https://mapcomplete.org/{theme}.html?lat={lat}&lon={lon}&z={zoom}, requirements: ["iframe","no-welcome-message]}, - * - */ - extraLink?: ExtraLinkConfigJson - - /** - * If set to false, disables logging in. - * The userbadge will be hidden, all login-buttons will be hidden and editing will be disabled + * ifunset: Enable the possiblity to login with OpenStreetMap (default) + * iffalse: Do not enable to login with OpenStreetMap, have a read-only view of MapComplete. + * iftrue: Enable the possiblity to login with OpenStreetMap + * group: feature_switches */ enableUserBadge?: true | boolean /** - * If false, hides the tab 'share'-tab in the welcomeMessage + * question: Should the tab with options to share the current screen be enabled? + * + * On can get the iFrame embed code here + * + * ifunset: Enable the sharescreen (default) + * iffalse: Do not enable the share screen + * iftrue: Enable the share screen + * group: feature_switches */ enableShareScreen?: true | boolean + /** - * Hides the tab with more themes in the welcomeMessage + * question: Should the user be able to switch to different themes? + * + * Typically enabled in iframes and/or on commisioned themes + * + * iftrue: enable to go back to the index page showing all themes + * iffalse: do not enable to go back to the index page showing all themes; hide the 'more themes' buttons + * ifunset: mapcomplete default: enable to go back to the index page showing all themes + * group: feature_switches */ enableMoreQuests?: true | boolean + /** - * If false, the layer selection/filter view will be hidden + * question: Should the user be able to enable/disable layers and to filter the layers? + * * The corresponding URL-parameter is 'fs-filters' instead of 'fs-layers' + * iftrue: enable the filters/layers pane + * iffalse: do not enable to filter or to disable layers; hide the 'filter' tab from the overview and the button at the bottom-left + * ifunset: mapcomplete default: enable to filter or to enable/disable layers + * group: feature_switches */ enableLayers?: true | boolean + /** - * If set to false, hides the search bar + * question: Should the user be able to search for locations? + * + * ifunset: MapComplete default: allow to search + * iftrue: Allow to search + * iffalse: Do not allow to search; hide the search-bar + * group: feature_switches */ enableSearch?: true | boolean + /** - * If set to false, the ability to add new points or nodes will be disabled. - * Editing already existing features will still be possible + * question: Should the user be able to add new points? + * + * Adding new points is only possible if the loaded layers have presets set. + * Some layers do not have presets. If the theme only has layers without presets, then adding new points will not be possible. + * + * ifunset: MapComplete default: allow to create new points + * iftrue: Allow to create new points + * iffalse: Do not allow to create new points, even if the layers in this theme support creating new points + * group: feature_switches */ enableAddNewPoints?: true | boolean + /** - * If set to false, the 'geolocation'-button will be hidden. + * question: Should the user be able to use their GPS to geolocate themselfes on the map? + * ifunset: MapComplete default: allow to use the GPS + * iftrue: Allow to use the GPS + * iffalse: Do not allow to use the GPS, hide the geolocation-buttons + * group: feature_switches */ enableGeolocation?: true | boolean + /** * Enable switching the backgroundlayer. * If false, the quickswitch-buttons are removed (bottom left) and the dropdown in the layer selection is removed as well + * + * question: Should the user be able to switch the background layer? + * + * iftrue: Allow to switch the background layer + * iffalse: Do not allow to switch the background layer + * ifunset: MapComplete default: Allow to switch the background layer + * group: feature_switches */ enableBackgroundLayerSelection?: true | boolean + /** - * If set to true, will show _all_ unanswered questions in a popup instead of just the next one + * question: Should the questions about a feature be presented one by one or all at once? + * iftrue: Show all unanswered questions at the same time + * iffalse: Show unanswered questions one by one + * ifunset: MapComplete default: Use the preference of the user to show questions at the same time or one by one + * group: feature_switches */ enableShowAllQuestions?: false | boolean + /** - * If set to true, download button for the data will be shown (offers downloading as geojson and csv) + * question: Should the 'download as CSV'- and 'download as Geojson'-buttons be enabled? + * iftrue: Enable the option to download the map as CSV and GeoJson + * iffalse: Enable the option to download the map as CSV and GeoJson + * ifunset: MapComplete default: Enable the option to download the map as CSV and GeoJson + * group: feature_switches */ enableDownload?: true | boolean /** - * If set to true, exporting a pdf is enabled + * question: Should the 'download as PDF'-button be enabled? + * iftrue: Enable the option to download the map as PDF + * iffalse: Enable the option to download the map as PDF + * ifunset: MapComplete default: Enable the option to download the map as PDF + * group: feature_switches */ enablePdfDownload?: true | boolean /** + * question: Should the 'notes' from OpenStreetMap be loaded and parsed for import helper notes? * If true, notes will be loaded and parsed. If a note is an import (as created by the import_helper.html-tool from mapcomplete), * these notes will be shown if a relevant layer is present. * - * Default is true for official layers and false for unofficial (sideloaded) layers + * ifunset: MapComplete default: do not load import notes for sideloaded themes but do load them for official themes + * iftrue: Load notes and show import notes + * iffalse: Do not load import notes + * group: advanced */ enableNoteImports?: true | boolean /** - * Set one or more overpass URLs to use for this theme.. + * question: What overpass-api instance should be used for this layout? + * + * ifunset: Use the default, builtin collection of overpass instances + * group: advanced */ - overpassUrl?: string | string[] + overpassUrl?: string[] /** - * Set a different timeout for overpass queries - in seconds. Default: 30s + * question: After how much seconds should the overpass-query stop? + * If a query takes too long, the overpass-server will abort. + * Once can set the amount of time before overpass gives up here. + * ifunset: use the default amount of 30 seconds as timeout + * type: pnat + * group: advanced */ overpassTimeout?: number + /** + * When a query is run, the data within bounds of the visible map is loaded. + * However, users tend to pan and zoom a lot. It is pretty annoying if every single pan means a reloading of the data. + * For this, the bounds are widened in order to make a small pan still within bounds of the loaded data. + * + * IF widenfactor is 1, this feature is disabled. A recommended value is between 1 and 3 + */ + widenFactor?: number + /** + * At low zoom levels, overpass is used to query features. + * At high zoom level, the OSM api is used to fetch one or more BBOX aligning with a slippy tile. + * The overpassMaxZoom controls the flipoverpoint: if the zoom is this or lower, overpass is used. + */ + overpassMaxZoom?: 17 | number + + /** + * When the OSM-api is used to fetch features, it does so in a tiled fashion. + * These tiles are using a ceratin zoom level, that can be controlled here + * Default: overpassMaxZoom + 1 + */ + osmApiTileSize?: number + /** * Enables tracking of all nodes when data is loaded. * This is useful for the 'ImportWay' and 'ConflateWay'-buttons who need this database. * - * Note: this flag will be automatically set. + * Note: this flag will be automatically set and can thus be ignored. + * group: hidden */ enableNodeDatabase?: boolean } diff --git a/src/Models/ThemeConfig/Json/LineRenderingConfigJson.ts b/src/Models/ThemeConfig/Json/LineRenderingConfigJson.ts index e234bdd11..ffc5d1ea8 100644 --- a/src/Models/ThemeConfig/Json/LineRenderingConfigJson.ts +++ b/src/Models/ThemeConfig/Json/LineRenderingConfigJson.ts @@ -1,4 +1,4 @@ -import { TagRenderingConfigJson } from "./TagRenderingConfigJson" +import { MinimalTagRenderingConfigJson } from "./TagRenderingConfigJson" /** * The LineRenderingConfig gives all details onto how to render a single line of a feature. @@ -10,40 +10,68 @@ import { TagRenderingConfigJson } from "./TagRenderingConfigJson" */ export default interface LineRenderingConfigJson { /** - * The color for way-elements and SVG-elements. + * question: What color should lines be drawn in? + * + * For an area, this will be the colour of the outside line. * If the value starts with "--", the style of the body element will be queried for the corresponding variable instead + * + * types: dynamic value ; string + * title: Line Colour + * inline: The line colour always is {value} + * type: color + * */ - color?: string | TagRenderingConfigJson + color?: MinimalTagRenderingConfigJson | string /** + * question: How wide should the line be? * The stroke-width for way-elements + * + * types: dynamic value ; string + * title: Line width + * inline: The line width is {value} pixels + * type: pnat + * ifunset: Use the default-linewidth of 7 pixels */ - width?: string | number | TagRenderingConfigJson + width?: MinimalTagRenderingConfigJson | number | string /** - * A dasharray, e.g. "5 6" - * The dasharray defines 'pixels of line, pixels of gap, pixels of line, pixels of gap', - * Default value: "" (empty string == full line) + * question: Should a dasharray be used to render the lines? + * The dasharray defines 'pixels of line, pixels of gap, pixels of line, pixels of gap, ...'. For example, `5 6` will be 5 pixels of line followed by a 6 pixel gap. + * Cannot be a dynamic property due to a mapbox limitation + * ifunset: Ways are rendered with a full line */ - dashArray?: string | TagRenderingConfigJson + dashArray?: string /** - * The form at the end of a line - */ - lineCap?: "round" | "square" | "butt" | string | TagRenderingConfigJson + * question: What form should the line-ending have? + * suggestions: return [{if:"value=round",then:"Round endings"}, {if: "value=square", then: "square endings"}, {if: "value=butt", then: "no ending (square ending at the end, without padding)"}] + * types: dynamic value ; string + * title: Line Cap + * ifunset: Use the default value (round ending) + **/ + lineCap?: "round" | "square" | "butt" | string | MinimalTagRenderingConfigJson /** - * The color to fill a polygon with. - * If undefined, this will be slightly more opaque version of the stroke line. - * Use '#00000000' to make the fill invisible + * question: What colour should be used as fill colour for polygons? + * ifunset: The polygon fill colour will be a more transparent version of the stroke colour + * suggestions: return [{if: "value=#00000000", then: "Use a transparent fill (only render the outline)"}] + * inline: The fill colour is {value} + * types: dynamic value ; string + * type: color */ - fillColor?: string | TagRenderingConfigJson + fillColor?: string | MinimalTagRenderingConfigJson /** + * question: Should the lines be moved (offsetted) with a number of pixels against the geographical lines? * The number of pixels this line should be moved. - * Use a positive numbe to move to the right, a negative to move to the left (left/right as defined by the drawing direction of the line). + * Use a positive number to move to the right in the drawing direction or a negative to move to the left (left/right as defined by the drawing direction of the line). * * IMPORTANT: MapComplete will already normalize 'key:both:property' and 'key:both' into the corresponding 'key:left' and 'key:right' tagging (same for 'sidewalk=left/right/both' which is rewritten to 'sidewalk:left' and 'sidewalk:right') * This simplifies programming. Refer to the CalculatedTags.md-documentation for more details + * ifunset: don't offset lines on the map + * inline: Pixel offset by {value} pixels + * types: dynamic value ; number + * type: int */ - offset?: number | TagRenderingConfigJson + offset?: number | MinimalTagRenderingConfigJson } diff --git a/src/Models/ThemeConfig/Json/MoveConfigJson.ts b/src/Models/ThemeConfig/Json/MoveConfigJson.ts index a3ecacdf1..7f6e6af32 100644 --- a/src/Models/ThemeConfig/Json/MoveConfigJson.ts +++ b/src/Models/ThemeConfig/Json/MoveConfigJson.ts @@ -1,12 +1,21 @@ export default interface MoveConfigJson { /** - * One default reason to move a point is to improve accuracy. - * Set to false to disable this reason + * + * question: Should moving this type of point to improve the accuracy be allowed? + * iftrue: This point can be moved to improve the accuracy + * ifunset: (default) This point can be moved to improve the accuracy + * iffalse: This point cannot be moved to improve the accuracy */ enableImproveAccuracy?: true | boolean /** - * One default reason to move a point is because it has relocated - * Set to false to disable this reason + * + * question: Should moving this type of point due to a relocation be allowed? + * + * This will erase the attributes `addr:street`, `addr:housenumber`, `addr:city` and `addr:postcode` + * + * iftrue: This type of point can be moved due to a relocation (and will remove address information when this is done) + * ifunset: (default) This type of point can be moved due to a relocation (and will remove address information when this is done) + * iffalse: This type of point cannot be moved due to a relocation */ enableRelocation?: true | boolean } diff --git a/src/Models/ThemeConfig/Json/PointRenderingConfigJson.ts b/src/Models/ThemeConfig/Json/PointRenderingConfigJson.ts index b0858bd86..d4b69157f 100644 --- a/src/Models/ThemeConfig/Json/PointRenderingConfigJson.ts +++ b/src/Models/ThemeConfig/Json/PointRenderingConfigJson.ts @@ -1,6 +1,21 @@ -import { TagRenderingConfigJson } from "./TagRenderingConfigJson" +import { MinimalTagRenderingConfigJson, TagRenderingConfigJson } from "./TagRenderingConfigJson" import { TagConfigJson } from "./TagConfigJson" +export interface IconConfigJson { + /** + * question: What icon should be used? + * type: icon + * suggestions: return ["pin","square","circle","checkmark","clock","close","crosshair","help","home","invalid","location","location_empty","location_locked","note","resolved","ring","scissors","teardrop","teardrop_with_hole_green","triangle"].map(i => ({if: "value="+i, then: i, icon: i})) + */ + icon: string | MinimalTagRenderingConfigJson | { builtin: string; override: any } + /** + * question: What colour should the icon be? + * This will only work for the default icons such as `pin`,`circle`,... + * type: color + */ + color?: string | MinimalTagRenderingConfigJson | { builtin: string; override: any } +} + /** * The PointRenderingConfig gives all details onto how to render a single point of a feature. * @@ -11,34 +26,31 @@ import { TagConfigJson } from "./TagConfigJson" */ export default interface PointRenderingConfigJson { /** - * All the locations that this point should be rendered at. - * Possible values are: - * - `point`: only renders points at their location - * - `centroid`: show a symbol at the centerpoint of a (multi)Linestring and (multi)polygon. Points will _not_ be rendered with this - * - `projected_centerpoint`: Only on (multi)linestrings: calculate the centerpoint and snap it to the way - * - `start` and `end`: only on linestrings: add a point to the first/last coordinate of the LineString + * question: At what location should this icon be shown? + * multianswer: true + * suggestions: return [{if: "value=point",then: "Show an icon for point (node) objects"},{if: "value=centroid",then: "Show an icon for line or polygon (way) objects at their centroid location"}, {if: "value=start",then: "Show an icon for line (way) objects at the start"},{if: "value=end",then: "Show an icon for line (way) object at the end"},{if: "value=projected_centerpoint",then: "Show an icon for line (way) object near the centroid location, but moved onto the line"}] */ location: ("point" | "centroid" | "start" | "end" | "projected_centerpoint" | string)[] /** - * The icon for an element. - * Note that this also doubles as the icon for this layer (rendered with the overpass-tags) ánd the icon in the presets. + * The marker for an element. + * Note that this also defines the icon for this layer (rendered with the overpass-tags) and the icon in the presets. * * The result of the icon is rendered as follows: - * the resulting string is interpreted as a _list_ of items, separated by ";". The bottommost layer is the first layer. - * 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 SVG's 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;` - - * Type: icon + * - The first icon is rendered on the map + * - The second entry is overlayed on top of it + * - ... + * + * As a result, on could use a generic icon (`pin`, `circle`, `square`) with a color, then overlay it with a specific icon. */ - icon?: string | TagRenderingConfigJson + marker?: IconConfigJson[] /** * A list of extra badges to show next to the icon as small badge * They will be added as a 25% height icon at the bottom right of the icon, with all the badges in a flex layout. * * Note: strings are interpreted as icons, so layering and substituting is supported. You can use `circle:white;./my_icon.svg` to add a background circle + * group: hidden */ iconBadges?: { if: TagConfigJson @@ -46,12 +58,13 @@ export default interface PointRenderingConfigJson { * Badge to show * Type: icon */ - then: string | TagRenderingConfigJson + then: string | MinimalTagRenderingConfigJson }[] /** - * A string containing "width,height" or "width,height,anchorpoint" where anchorpoint is any of 'center', 'top', 'bottom', 'left', 'right', 'bottomleft','topright', ... - * Default is '40,40,center' + * question: What size should the marker be on the map? + * A string containing "," in pixels + * ifunset: Use the default size (40,40 px) */ iconSize?: string | TagRenderingConfigJson @@ -59,53 +72,91 @@ export default interface PointRenderingConfigJson { * question: What is the anchorpoint of the icon? * * This matches the geographical point with a location on the icon. - * For example, a feature attached to the ground can use 'bottom' as zooming in will give the appearance of being anchored to a fixed location. * + * ifunset: Use MapComplete-default (center) + * suggestions: return [{if: "value=center", then: "Place the center of the icon on the geographical location"},{if: "value=top", then: "Place the top of the icon on the geographical location"},{if: "value=bottom", then: "Place the bottom of the icon on the geographical location"},{if: "value=left", then: "Place the left of the icon on the geographical location"},{if: "value=right", then: "Place the right of the icon on the geographical location"}] */ anchor?: "center" | "top" | "bottom" | "left" | "right" | string | TagRenderingConfigJson /** - * The rotation of an icon, useful for e.g. directions. - * 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)`` + * question: What rotation should be applied on the icon? + * This is mostly useful for items that face a specific direction, such as surveillance cameras + * This is interpreted as css property for 'rotate', thus has to end with 'deg', e.g. `90deg`, `{direction}deg`, `calc(90deg - {camera:direction}deg)`` + * ifunset: Do not rotate */ rotation?: string | TagRenderingConfigJson /** - * A HTML-fragment that is shown below the icon, for example: - *
    {name}
    + * question: What label should be shown beneath the marker? + * For example: `<div style="background: white">{name}</div>` * * If the icon is undefined, then the label is shown in the center of the feature. - * Note that, if the wayhandling hides the icon then no label is shown as well. + * types: Dynamic value based on the attributes ; string + * inline: Always show label {value} beneath the marker + * ifunset: Do not show a label beneath the marker */ label?: string | TagRenderingConfigJson /** - * A snippet of css code which is applied onto the container of the entire marker + * question: What CSS should be applied to the label? + * You can set the css-properties here, e.g. `background: red; font-size: 12px; ` + * inline: Apply CSS-style {value} to the label + * types: Dynamic value ; string + * ifunset: Do not apply extra CSS-labels to the label + * group: expert */ - css?: string | TagRenderingConfigJson + labelCss?: TagRenderingConfigJson | string /** - * A snippet of css-classes which are applied onto the container of the entire marker. They can be space-separated - */ - cssClasses?: string | TagRenderingConfigJson - - /** - * Css that is applied onto the label - */ - labelCss?: string | TagRenderingConfigJson - - /** - * Css classes that are applied onto the label; can be space-separated + * question: Which CSS-classes should be applied to the label? + * + * The classes should be separated by a space (` `) + * You can use most Tailwind-css classes, see https://tailwindcss.com/ for more information + * For example: `center bg-gray-500 mx-2 my-1 rounded-full` + * inline: Apply CSS-classes {value} to the label + * types: Dynamic value ; string + * ifunset: Do not apply extra CSS-classes to the label + * suggestions: return [{if: "value=bg-white rounded px-2", then: "Draw on a white background"}] */ labelCssClasses?: string | TagRenderingConfigJson /** - * If the map is pitched, the marker will stay parallel to the screen. - * Set to 'map' if you want to put it flattened on the map + * question: What CSS should be applied to the entire marker? + * You can set the css-properties here, e.g. `background: red; font-size: 12px; ` + * This will be applied to the _container_ containing both the marker and the label + * inline: Apply CSS-style {value} to the _entire marker_ + * types: Dynamic value ; string + * ifunset: Do not apply extra CSS element to the entire marker + * group: expert + */ + css?: string | TagRenderingConfigJson + + /** + * question: Which CSS-classes should be applied to the entire marker? + * This will be applied to the _container_ containing both the marker and the label + * + * The classes should be separated by a space (` `) + * You can use most Tailwind-css classes, see https://tailwindcss.com/ for more information + * For example: `center bg-gray-500 mx-2 my-1 rounded-full` + * inline: Apply CSS-classes {value} to the entire container + * ifunset: Do not apply extra CSS-classes to the label + * types: Dynamic value ; string + * ifunset: Do not apply extra CSS-classes to the entire marker + * group: expert + */ + cssClasses?: string | TagRenderingConfigJson + + /** + * question: If the map is pitched, should the icon stay parallel to the screen or to the groundplane? + * suggestions: return [{if: "value=canvas", then: "The icon will stay upward and not be transformed as if it sticks to the screen"}, {if: "value=map", then: "The icon will be transformed as if it were painted onto the ground. (Automatically sets rotationAlignment)"}] + * group: expert */ pitchAlignment?: "canvas" | "map" | TagRenderingConfigJson /** - * If the map is rotated, the icon will still point to the north if no rotation was applied + * question: Should the icon be rotated if the map is rotated? + * ifunset: Do not rotate or tilt icons. Always keep the icons straight + * suggestions: return [{if: "value=canvas", then: "Never rotate the icon"}, {if: "value=map", then: "If the map is rotated, rotate the icon as well. This gives the impression of an icon that floats perpendicular above the ground."}] + * group: expert */ rotationAlignment?: "map" | "canvas" | TagRenderingConfigJson } diff --git a/src/Models/ThemeConfig/Json/QuestionableTagRenderingConfigJson.ts b/src/Models/ThemeConfig/Json/QuestionableTagRenderingConfigJson.ts index c44df3235..85eb7c2c3 100644 --- a/src/Models/ThemeConfig/Json/QuestionableTagRenderingConfigJson.ts +++ b/src/Models/ThemeConfig/Json/QuestionableTagRenderingConfigJson.ts @@ -1,18 +1,27 @@ import { TagConfigJson } from "./TagConfigJson" import { TagRenderingConfigJson } from "./TagRenderingConfigJson" +import type { Translatable } from "./Translatable" export interface MappingConfigJson { /** - * @inheritDoc + * question: What tags should be matched to show this option? + * + * If in 'question'-mode and the contributor selects this option, these tags will be applied to the object */ if: TagConfigJson + /** - * Shown if the 'if is fulfilled + * Question: What corresponding text should be shown? + * Shown if the `if` is fulfilled * Type: rendered */ then: string | Record /** - * An extra icon supporting the choice + * question: What icon should be shown next to this mapping? + * + * This icon will only be shown if the value is known, it is not displayed in the options (but might be in the future) + * + * ifunset: Show no icon * Type: icon */ icon?: @@ -30,6 +39,11 @@ export interface MappingConfigJson { } /** + * question: Under what circumstances should this mapping be hidden from the possibilities a contributor can pick? + * iftrue: Never show this mapping as option to pick + * ifunset: Always show this mapping as option to pick + * type: tag + * * In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation). * * In the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user. @@ -90,18 +104,26 @@ export interface MappingConfigJson { * } */ hideInAnswer?: boolean | TagConfigJson + /** + * question: What tags should be applied if this mapping is _not_ chosen? + * * Only applicable if 'multiAnswer' is set. * This is for situations such as: * `accepts:coins=no` where one can select all the possible payment methods. However, we want to make explicit that some options _were not_ selected. * This can be done with `ifnot` * Note that we can not explicitly render this negative case to the user, we cannot show `does _not_ accept coins`. * If this is important to your usecase, consider using multiple radiobutton-fields without `multiAnswer` + * + * ifunset: Do not apply a tag if a different mapping is chosen. */ ifnot?: TagConfigJson /** - * If chosen as answer, these tags will be applied as well onto the object. + * question: What extra tags should be added to the object if this object is chosen? + * type: simple_tag + * + * If chosen as answer, these tags will be applied onto the object, together with the tags from the `if` * Not compatible with multiAnswer. * * This can be used e.g. to erase other keys which indicate the 'not' value: @@ -109,7 +131,7 @@ export interface MappingConfigJson { * { * "if": "crossing:marking=rainbow", * "then": "This is a rainbow crossing", - * "addExtraTags": "not:crossing:marking=" + * "addExtraTags": ["not:crossing:marking="] * } * ``` * @@ -117,21 +139,25 @@ export interface MappingConfigJson { addExtraTags?: string[] /** + * question: If there are many options, what search terms match too? * If there are many options, the mappings-radiobuttons will be replaced by an element with a searchfunction * * Searchterms (per language) allow to easily find an option if there are many options + * group: hidden */ searchTerms?: Record /** * If the searchable selector is picked, mappings with this item will have priority and show up even if the others are hidden * Use this sparingly + * group: hidden */ priorityIf?: TagConfigJson /** * Used for comments or to disable a validation * + * group: hidden * ignore-image-in-then: normally, a `then`-clause is not allowed to have an `img`-html-element as icons are preferred. In some cases (most notably title-icons), this is allowed */ "#"?: string | "ignore-image-in-then" @@ -142,71 +168,119 @@ export interface MappingConfigJson { * If the desired tags are missing and a question is defined, a question will be shown instead. */ export interface QuestionableTagRenderingConfigJson extends TagRenderingConfigJson { - /** - * If it turns out that this tagRendering doesn't match _any_ value, then we show this question. - * If undefined, the question is never asked and this tagrendering is read-only + /* + * The id of the tagrendering, should be an unique string. + * Used to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise. + * + * question: What is the id of this tagRendering? */ - question?: string | Record + id: string /** - * A hint which is shown in subtle text under the question. - * This can give some extra information on what the answer should ook like + * Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes + * + * question: What are common options? */ - questionHint?: string | Record + mappings?: MappingConfigJson[] + + /** + * If true, use checkboxes instead of radio buttons when asking the question + * + * question: Should a contributor be allowed to select multiple mappings? + * + * iftrue: allow to select multiple mappings + * iffalse: only allow to select a single mapping + * ifunset: only allow to select a single mapping + */ + multiAnswer?: boolean /** * Allow freeform text input from the user */ freeform?: { /** - * @inheritDoc + * question: What is the name of the attribute that should be written to? + * This is the OpenStreetMap-key that that value will be written to + * ifunset: do not offer a freeform textfield as answer option + * */ - key: string + key?: string /** + * question: What is the input type? * The type of the text-field, e.g. 'string', 'nat', 'float', 'date',... * See Docs/SpecialInputElements.md and UI/Input/ValidatedTextField.ts for supported values - */ + * ifunset: use an unconstrained string as input (default) + * suggestions: return validators.AllValidators.filter(type => !type.isMeta).map((type) => ({if: "value="+type.name, then: ""+type.name+" "+type.explanation.split("\n")[0]})) + **/ type?: string /** + * question: What placeholder text should be shown in the input-element if there is no input? * A (translated) text that is shown (as gray text) within the textfield + * type: translation + * group: expert */ - placeholder?: string | any + placeholder?: Translatable /** * Extra parameters to initialize the input helper arguments. * For semantics, see the 'SpecialInputElements.md' + * group: expert */ helperArgs?: (string | number | boolean | any)[] /** * If a value is added with the textfield, these extra tag is addded. * Useful to add a 'fixme=freeform textfield used - to be checked' + * group: expert **/ addExtraTags?: string[] /** - * When set, influences the way a question is asked. + * question: Show the freeform as box within the question? * Instead of showing a full-width text field, the text field will be shown within the rendering of the question. * * This combines badly with special input elements, as it'll distort the layout. - * Note that this will be set automatically if no special elements are present. + * ifunset: show the freeform input field full-width + * iftrue: show the freeform input field as a small field within the question + * group: expert */ inline?: boolean /** - * default value to enter if no previous tagging is present. - * Normally undefined (aka do not enter anything) + * question: What value should be entered in the text field if no value is set? + * This can help people to quickly enter the most common option + * ifunset: do not prefill the textfield + * group: expert */ default?: string + /** + * question: What values of the freeform key should be interpreted as 'unknown'? + * For example, if a feature has `shop=yes`, the question 'what type of shop is this?' should still asked + * ifunset: The question will be considered answered if any value is set for the key + * group: expert + */ + invalidValues?: TagConfigJson } /** - * If true, use checkboxes instead of radio buttons when asking the question + * question: What question should be shown to the contributor? + * + * A question is presented ot the user if no mapping matches and the 'freeform' key is not set as well. + * + * ifunset: This tagrendering will be shown if it is known, but cannot be edited by the contributor, effectively resutling in a read-only rendering */ - multiAnswer?: boolean + question?: Translatable /** - * Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes + * question: Should some extra information be shown to the contributor, alongside the question? + * This hint is shown in subtle text under the question. + * This can give some extra information on what the answer should ook like + * ifunset: No extra hint is given */ - mappings?: MappingConfigJson[] + questionHint?: Translatable + + /** + * A list of labels. These are strings that are used for various purposes, e.g. to only include a subset of the tagRenderings when reusing a layer + */ + labels?: string[] } diff --git a/src/Models/ThemeConfig/Json/TagConfigJson.ts b/src/Models/ThemeConfig/Json/TagConfigJson.ts index b3390edc9..50aede10f 100644 --- a/src/Models/ThemeConfig/Json/TagConfigJson.ts +++ b/src/Models/ThemeConfig/Json/TagConfigJson.ts @@ -1,20 +1,14 @@ /** * The main representation of Tags. * See https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation + * + * type: tag */ -export type TagConfigJson = string | AndTagConfigJson | OrTagConfigJson - -/** - * Chain many tags, to match, all of these should be true - * See https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation - */ -export type OrTagConfigJson = { - or: TagConfigJson[] -} -/** - * Chain many tags, to match, a single of these should be true - * See https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation - */ -export type AndTagConfigJson = { - and: TagConfigJson[] -} +export type TagConfigJson = + | string + | { + and: TagConfigJson[] + } + | { + or: TagConfigJson[] + } diff --git a/src/Models/ThemeConfig/Json/TagRenderingConfigJson.ts b/src/Models/ThemeConfig/Json/TagRenderingConfigJson.ts index 6db2a8a7e..b116a755b 100644 --- a/src/Models/ThemeConfig/Json/TagRenderingConfigJson.ts +++ b/src/Models/ThemeConfig/Json/TagRenderingConfigJson.ts @@ -1,4 +1,42 @@ import { TagConfigJson } from "./TagConfigJson" +import { Translatable } from "./Translatable" + +/** + * Mostly used for lineRendering and pointRendering + */ +export interface MinimalTagRenderingConfigJson { + /** + * question: What value should be rendered? + * + * This piece of text will be shown in the infobox. + * Note that "&LBRACEkey&RBRACE"-parts are substituted by the corresponding values of the element. + * + * This value will be used if there is no mapping which matches (or there are no matches) + * Note that this is a HTML-interpreted value, so you can add links as e.g. '<a href='{website}'>{website}</a>' or include images such as `This is of type A <br><img src='typeA-icon.svg' />` + */ + render?: string + /** + * Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes + */ + mappings?: { + /** + * question: When should this single mapping match? + * + * If this condition is met, then the text under `then` will be shown. + * If no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM. + * + * For example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'} + * + * This can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'} + */ if: TagConfigJson + /** + * question: What text should be shown? + * + * If the condition `if` is met, the text `then` will be rendered. + * If not known yet, the user will be presented with `then` as an option + */ then: string + }[] +} /** * A TagRenderingConfigJson is a single piece of code which converts one ore more tags into a HTML-snippet. @@ -6,45 +44,30 @@ import { TagConfigJson } from "./TagConfigJson" */ export interface TagRenderingConfigJson { /** - * The id of the tagrendering, should be an unique string. - * Used to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise. + * question: What text should be rendered? * - * Use 'questions' to trigger the question box of this group (if a group is defined) - */ - id?: string - - /** - * A list of labels. These are strings that are used for various purposes, e.g. to filter them away - */ - labels?: string[] - - /** - * A list of css-classes to apply to the entire tagRendering if the answer is known (not applied on the question). - * This is only for advanced users - */ - classes?: string | string[] - - /** - * A human-readable text explaining what this tagRendering does - */ - description?: string | Record - - /** - * 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. + * This piece of text will be shown in the infobox. + * In this text, values within braces (such as {braced(key)}) are replaced by the corresponding `value` in the object. + * For example, if the object contains tags `amenity=school; name=Windy Hill School`, the render string `This school is named {name}` will be shown to the user as `This school is named Windy Hill School` * - * 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
    ` + * This text will be shown if: + * - there is no mapping which matches (or there are no matches) + * - no question, no mappings and no 'freeform' is set + * + * Note that this is a HTML-interpreted value, so you can add links as e.g. '<a href='{website}'>{website}</a>' or include images such as `This is of type A <br><img src='typeA-icon.svg' />` * type: rendered + * ifunset: no text is rendered if no predefined options match */ render?: - | string - | Record + | Translatable | { special: Record> & { type: string } } /** + * question: what icon should be shown next to the 'render' value? * An icon shown next to the rendering; typically shown pretty small * This is only shown next to the "render" value * Type: icon + * ifunset: do not show an icon next to the "render"-value */ icon?: | string @@ -62,6 +85,11 @@ export interface TagRenderingConfigJson { } /** + * + * question: When should this item be shown? + * type: tag + * ifunset: No specific condition set; always show this tagRendering or ask the question if unkown + * * Only show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`. * * This is useful to ask a follow-up question. @@ -102,7 +130,9 @@ export interface TagRenderingConfigJson { * */ condition?: TagConfigJson - /** + /** question: When should this item be shown (including special conditions)? + * type: tag + * * If set, this tag will be evaluated agains the _usersettings/application state_ table. * Enable 'show debug info' in user settings to see available options. * Note that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_ @@ -110,14 +140,17 @@ export interface TagRenderingConfigJson { metacondition?: TagConfigJson /** + * question: Should a freeform text field be shown? * Allow freeform text input from the user + * ifunset: Do not add a freeform text field */ freeform?: { /** - * If this key is present, then 'render' is used to display the value. + * What attribute should be filled out + * If this key is present in the feature, then 'render' is used to display the value. * If this is undefined, the rendering is _always_ shown */ - key: string + key?: string } /** @@ -125,6 +158,8 @@ export interface TagRenderingConfigJson { */ mappings?: { /** + * question: When should this single mapping match? + * * If this condition is met, then the text under `then` will be shown. * If no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM. * @@ -134,13 +169,20 @@ export interface TagRenderingConfigJson { */ if: TagConfigJson /** + * question: What text should be shown? + * * If the condition `if` is met, the text `then` will be rendered. * If not known yet, the user will be presented with `then` as an option * Type: rendered */ - then: string | Record + then: Translatable /** - * An icon supporting this mapping; typically shown pretty small + * question: What icon should be added to this mapping? + * ifunset: Do not show an extra icon next to the render value + * + * An icon supporting this mapping; typically shown pretty small. + * This can be used to show a 'phone'-icon next to the phone number + * inline: {icon} * Type: icon */ icon?: @@ -158,4 +200,21 @@ export interface TagRenderingConfigJson { class?: "small" | "medium" | "large" | string } }[] + + /** + * A human-readable text explaining what this tagRendering does. + * Mostly used for the shared tagrenderings + */ + description?: Translatable + + /** + * question: What css-classes should be applied to showing this attribute? + * + * A list of css-classes to apply to the entire tagRendering. + * These classes are applied in 'answer'-mode, not in question mode + * This is only for advanced users. + * + * Values are split on ` ` (space) + */ + classes?: string } diff --git a/src/Models/ThemeConfig/Json/Translatable.ts b/src/Models/ThemeConfig/Json/Translatable.ts new file mode 100644 index 000000000..e3d264374 --- /dev/null +++ b/src/Models/ThemeConfig/Json/Translatable.ts @@ -0,0 +1 @@ +export type Translatable = string | Record diff --git a/src/Models/ThemeConfig/LayerConfig.ts b/src/Models/ThemeConfig/LayerConfig.ts index 13e0b84ef..00ea2c6fb 100644 --- a/src/Models/ThemeConfig/LayerConfig.ts +++ b/src/Models/ThemeConfig/LayerConfig.ts @@ -12,8 +12,6 @@ import MoveConfig from "./MoveConfig" import PointRenderingConfig from "./PointRenderingConfig" import WithContextLoader from "./WithContextLoader" import LineRenderingConfig from "./LineRenderingConfig" -import PointRenderingConfigJson from "./Json/PointRenderingConfigJson" -import LineRenderingConfigJson from "./Json/LineRenderingConfigJson" import { TagRenderingConfigJson } from "./Json/TagRenderingConfigJson" import BaseUIElement from "../../UI/BaseUIElement" import Combine from "../../UI/Base/Combine" @@ -31,6 +29,7 @@ import Svg from "../../Svg" import { ImmutableStore } from "../../Logic/UIEventSource" import { OsmTags } from "../OsmFeature" import Constants from "../Constants" +import { QuestionableTagRenderingConfigJson } from "./Json/QuestionableTagRenderingConfigJson" export default class LayerConfig extends WithContextLoader { public static readonly syncSelectionAllowed = ["no", "local", "theme-only", "global"] as const @@ -77,65 +76,16 @@ export default class LayerConfig extends WithContextLoader { super(json, context) this.id = json.id - if (typeof json === "string") { - throw `Not a valid layer: the layerConfig is a string. 'npm run generate:layeroverview' might be needed (at ${context})` - } - - if (json.id === undefined) { - throw `Not a valid layer: id is undefined: ${JSON.stringify(json)} (At ${context})` - } - - if (json.source === undefined) { - throw "Layer " + this.id + " does not define a source section (" + context + ")" - } - if (json.source === "special" || json.source === "special:library") { this.source = null - } else if (json.source["osmTags"] === undefined) { - throw ( - "Layer " + - this.id + - " does not define a osmTags in the source section - these should always be present, even for geojson layers (" + - context + - ")" - ) } - if (json.id.toLowerCase() !== json.id) { - throw `${context}: The id of a layer should be lowercase: ${json.id}` - } - if (json.id.match(/[a-z0-9-_]/) == null) { - throw `${context}: The id of a layer should match [a-z0-9-_]*: ${json.id}` - } - - if ( - json.syncSelection !== undefined && - LayerConfig.syncSelectionAllowed.indexOf(json.syncSelection) < 0 - ) { - throw ( - context + - " Invalid sync-selection: must be one of " + - LayerConfig.syncSelectionAllowed.map((v) => `'${v}'`).join(", ") + - " but got '" + - json.syncSelection + - "'" - ) - } this.syncSelection = json.syncSelection ?? "no" if (typeof json.source !== "string") { this.maxAgeOfCache = json.source["maxCacheAge"] ?? 24 * 60 * 60 * 30 - const osmTags = TagUtils.Tag(json.source["osmTags"], context + "source.osmTags") - if (osmTags.isNegative()) { - throw ( - context + - "The source states tags which give a very wide selection: it only uses negative expressions, which will result in too much and unexpected data. Add at least one required tag. The tags are:\n\t" + - osmTags.asHumanString(false, false, {}) - ) - } - this.source = new SourceConfig( { - osmTags: osmTags, + osmTags: TagUtils.Tag(json.source["osmTags"], context + "source.osmTags"), geojsonSource: json.source["geoJson"], geojsonSourceLevel: json.source["geoJsonZoomLevel"], overpassScript: json.source["overpassScript"], @@ -147,14 +97,6 @@ export default class LayerConfig extends WithContextLoader { ) } - if (json.source["geoJsonSource"] !== undefined) { - throw context + "Use 'geoJson' instead of 'geoJsonSource'" - } - - if (json.source["geojson"] !== undefined) { - throw context + "Use 'geoJson' instead of 'geojson' (the J is a capital letter)" - } - this.allowSplit = json.allowSplit ?? false this.name = Translations.T(json.name, translationContext + ".name") if (json.units !== undefined && !Array.isArray(json.units)) { @@ -229,16 +171,14 @@ export default class LayerConfig extends WithContextLoader { maxSnapDistance: undefined, } if (pr["preciseInput"] !== undefined) { - throw "Layer " + this.id + " still uses the old 'preciseInput'-field" + throw ( + "Layer " + + this.id + + " still uses the old 'preciseInput'-field. For snapping to layers, use 'snapToLayer' instead" + ) } if (pr.snapToLayer !== undefined) { - let snapToLayers: string[] - if (typeof pr.snapToLayer === "string") { - snapToLayers = [pr.snapToLayer] - } else { - snapToLayers = pr.snapToLayer - } - + let snapToLayers = pr.snapToLayer preciseInput = { snapToLayers, maxSnapDistance: pr.maxSnapDistance ?? 10, @@ -247,7 +187,9 @@ export default class LayerConfig extends WithContextLoader { throw ( "Layer " + this.id + - " defines a maxSnapDistance, but does not include a `snapToLayer`" + " defines a maxSnapDistance, but does not include a `snapToLayer` (at " + + context + + ")" ) } @@ -264,34 +206,27 @@ export default class LayerConfig extends WithContextLoader { return config }) - if (json.mapRendering === undefined) { - throw "MapRendering is undefined in " + context + if (json.pointRendering === undefined && json.lineRendering === undefined) { + throw "Both pointRendering and lineRendering are undefined in " + context } - if (json.mapRendering === null) { - this.mapRendering = [] - this.lineRendering = [] + if (json.lineRendering) { + this.lineRendering = Utils.NoNull(json.lineRendering).map( + (r, i) => new LineRenderingConfig(r, `${context}[${i}]`) + ) } else { - this.mapRendering = Utils.NoNull(json.mapRendering) - .filter((r) => r["location"] !== undefined) - .map( - (r, i) => - new PointRenderingConfig( - r, - context + ".mapRendering[" + i + "]" - ) - ) + this.lineRendering = [] + } - this.lineRendering = Utils.NoNull(json.mapRendering) - .filter((r) => r["location"] === undefined) - .map( - (r, i) => - new LineRenderingConfig( - r, - context + ".mapRendering[" + i + "]" - ) - ) + if (json.pointRendering) { + this.mapRendering = Utils.NoNull(json.pointRendering).map( + (r, i) => new PointRenderingConfig(r, `${context}[${i}]`) + ) + } else { + this.mapRendering = [] + } + { const hasCenterRendering = this.mapRendering.some( (r) => r.location.has("centroid") || @@ -300,16 +235,24 @@ export default class LayerConfig extends WithContextLoader { r.location.has("end") ) - if (this.lineRendering.length === 0 && this.mapRendering.length === 0) { + if ( + json.pointRendering !== null && + json.lineRendering !== null && + this.lineRendering.length === 0 && + this.mapRendering.length === 0 + ) { throw ( "The layer " + this.id + - " does not have any maprenderings defined and will thus not show up on the map at all. If this is intentional, set maprenderings to 'null' instead of '[]'" + ` does not have any maprenderings defined and will thus not show up on the map at all: +\t ${this.lineRendering?.length} linerenderings and ${this.mapRendering?.length} pointRenderings. +\t If this is intentional, set \`pointRendering\` and \`lineRendering\` to 'null' instead of '[]'` ) } else if ( !hasCenterRendering && this.lineRendering.length === 0 && Constants.priviliged_layers.indexOf(this.id) < 0 && + this.source !== null /*library layer*/ && !this.source?.geojsonSource?.startsWith( "https://api.openstreetmap.org/api/0.6/notes.json" ) @@ -340,7 +283,7 @@ export default class LayerConfig extends WithContextLoader { this.tagRenderings = (Utils.NoNull(json.tagRenderings) ?? []).map( (tr, i) => new TagRenderingConfig( - tr, + tr, this.id + ".tagRenderings[" + i + "]" ) ) @@ -411,7 +354,7 @@ export default class LayerConfig extends WithContextLoader { if (mapRendering === undefined) { return undefined } - return mapRendering.GetBaseIcon(this.GetBaseTags(), { noFullWidth: true }) + return mapRendering.GetBaseIcon(this.GetBaseTags()) } public GetBaseTags(): Record { @@ -520,7 +463,7 @@ export default class LayerConfig extends WithContextLoader { neededTags = this.source.osmTags["and"] } - let tableRows = Utils.NoNull( + const tableRows = Utils.NoNull( this.tagRenderings .map((tr) => tr.FreeformValues()) .map((values) => { @@ -563,23 +506,12 @@ export default class LayerConfig extends WithContextLoader { let iconImg: BaseUIElement = new FixedUiElement("") - if (Utils.runningFromConsole) { - const icon = this.mapRendering - .filter((mr) => mr.location.has("point")) - .map((mr) => mr.icon?.render?.txt) - .find((i) => i !== undefined) - // This is for the documentation in a markdown-file, so we have to use raw HTML - if (icon !== undefined) { - iconImg = new FixedUiElement( - ` ` - ) - } - } else { + if (!Utils.runningFromConsole) { iconImg = this.mapRendering .filter((mr) => mr.location.has("point")) .map( (mr) => - mr.RenderIcon(new ImmutableStore({ id: "node/-1" }), false, { + mr.RenderIcon(new ImmutableStore({ id: "node/-1" }), { includeBadges: false, }).html ) diff --git a/src/Models/ThemeConfig/LayoutConfig.ts b/src/Models/ThemeConfig/LayoutConfig.ts index a50409d08..ce538d6b2 100644 --- a/src/Models/ThemeConfig/LayoutConfig.ts +++ b/src/Models/ThemeConfig/LayoutConfig.ts @@ -10,6 +10,8 @@ import LanguageUtils from "../../Utils/LanguageUtils" import { RasterLayerProperties } from "../RasterLayerProperties" +import { ConversionContext } from "./Conversion/ConversionContext" + /** * Minimal information about a theme **/ @@ -28,6 +30,10 @@ export default class LayoutConfig implements LayoutInformation { public static readonly defaultSocialImage = "assets/SocialImage.png" public readonly id: string public readonly credits?: string + /** + * The languages this theme supports. + * Defaults to all languages the title has + */ public readonly language: string[] public readonly title: Translation public readonly shortDescription: Translation @@ -80,6 +86,9 @@ export default class LayoutConfig implements LayoutInformation { definitionRaw?: string } ) { + if (json === undefined) { + throw "Cannot construct a layout config, the parameter 'json' is undefined" + } this.official = official this.id = json.id this.definedAtUrl = options?.definedAtUrl @@ -93,17 +102,14 @@ export default class LayoutConfig implements LayoutInformation { } } const context = this.id - this.credits = json.credits + this.credits = Array.isArray(json.credits) ? json.credits.join("; ") : json.credits if (!json.title) { throw `The theme ${json.id} does not have a title defined.` } this.language = json.mustHaveLanguage ?? Object.keys(json.title) this.usedImages = Array.from( new ExtractImages(official, undefined) - .convertStrict( - json, - "while extracting the images of " + json.id + " " + context ?? "" - ) + .convertStrict(json, ConversionContext.construct([json.id], ["ExtractImages"])) .map((i) => i.path) ).sort() { @@ -115,7 +121,7 @@ export default class LayoutConfig implements LayoutInformation { )} which is a ${typeof json.title})` } if (this.language.length == 0) { - throw `No languages defined. Define at least one language. (${context}.languages)` + throw `No languages defined. Define at least one language. You can do this by adding a title` } if (json.title === undefined) { throw "Title not defined in " + this.id @@ -203,14 +209,7 @@ export default class LayoutConfig implements LayoutInformation { this.enableExportButton = json.enableDownload ?? true this.enablePdfDownload = json.enablePdfDownload ?? true this.customCss = json.customCss - this.overpassUrl = Constants.defaultOverpassUrls - if (json.overpassUrl !== undefined) { - if (typeof json.overpassUrl === "string") { - this.overpassUrl = [json.overpassUrl] - } else { - this.overpassUrl = json.overpassUrl - } - } + this.overpassUrl = json.overpassUrl ?? Constants.defaultOverpassUrls this.overpassTimeout = json.overpassTimeout ?? 30 this.overpassMaxZoom = json.overpassMaxZoom ?? 16 this.osmApiTileSize = json.osmApiTileSize ?? this.overpassMaxZoom + 1 diff --git a/src/Models/ThemeConfig/PointRenderingConfig.ts b/src/Models/ThemeConfig/PointRenderingConfig.ts index d936b3f75..b43bbe5af 100644 --- a/src/Models/ThemeConfig/PointRenderingConfig.ts +++ b/src/Models/ThemeConfig/PointRenderingConfig.ts @@ -5,12 +5,33 @@ import { TagUtils } from "../../Logic/Tags/TagUtils" import { Utils } from "../../Utils" import Svg from "../../Svg" import WithContextLoader from "./WithContextLoader" -import { Store } from "../../Logic/UIEventSource" +import { ImmutableStore, Store } from "../../Logic/UIEventSource" import BaseUIElement from "../../UI/BaseUIElement" import { FixedUiElement } from "../../UI/Base/FixedUiElement" import Img from "../../UI/Base/Img" import Combine from "../../UI/Base/Combine" import { VariableUiElement } from "../../UI/Base/VariableUIElement" +import { TagRenderingConfigJson } from "./Json/TagRenderingConfigJson" +import SvelteUIElement from "../../UI/Base/SvelteUIElement" +import DynamicMarker from "../../UI/Map/DynamicMarker.svelte" + +export class IconConfig extends WithContextLoader { + public readonly icon: TagRenderingConfig + public readonly color: TagRenderingConfig + + public static readonly defaultIcon = new IconConfig({ icon: "pin", color: "#ff9939" }) + constructor( + config: { + icon: string | TagRenderingConfigJson + color?: string | TagRenderingConfigJson + }, + context?: string + ) { + super(config, context) + this.icon = this.tr("icon") + this.color = this.tr("color") + } +} export default class PointRenderingConfig extends WithContextLoader { static readonly allowed_location_codes: ReadonlySet = new Set([ @@ -24,7 +45,7 @@ export default class PointRenderingConfig extends WithContextLoader { "point" | "centroid" | "start" | "end" | "projected_centerpoint" | string > - public readonly icon?: TagRenderingConfig + public readonly marker: IconConfig[] public readonly iconBadges: { if: TagsFilter; then: TagRenderingConfig }[] public readonly iconSize: TagRenderingConfig public readonly anchor: TagRenderingConfig @@ -42,7 +63,7 @@ export default class PointRenderingConfig extends WithContextLoader { super(json, context) if (json === undefined || json === null) { - throw "Invalid PointRenderingConfig: undefined or null" + throw `At ${context}: Invalid PointRenderingConfig: undefined or null` } if (typeof json.location === "string") { @@ -60,8 +81,8 @@ export default class PointRenderingConfig extends WithContextLoader { } }) - if (json.icon === undefined && json.label === undefined) { - throw `At ${context}: A point rendering should define at least an icon or a label` + if (json.marker === undefined && json.label === undefined) { + throw `At ${context}: A point rendering should define at least an marker or a label` } if (this.location.size == 0) { @@ -71,7 +92,7 @@ export default class PointRenderingConfig extends WithContextLoader { ".location)" ) } - this.icon = this.tr("icon", undefined) + this.marker = (json.marker ?? []).map((m) => new IconConfig(m)) if (json.css !== undefined) { this.cssDef = this.tr("css", undefined) } @@ -85,13 +106,6 @@ export default class PointRenderingConfig extends WithContextLoader { } }) - const iconPath = this.icon?.GetRenderValue({ id: "node/-1" })?.txt - if (iconPath !== undefined && iconPath.startsWith(Utils.assets_path)) { - const iconKey = iconPath.substr(Utils.assets_path.length) - if (Svg.All[iconKey] === undefined) { - throw context + ": builtin SVG asset not found: " + iconPath - } - } if (typeof json.iconSize === "string") { const s = json.iconSize if (["bottom", "top", "center"].some((e) => s.endsWith(e))) { @@ -102,14 +116,15 @@ export default class PointRenderingConfig extends WithContextLoader { ) } } - this.iconSize = this.tr("iconSize", "40,40") - this.anchor = this.tr("anchor", "center") - this.label = this.tr("label", undefined) - this.rotation = this.tr("rotation", "0") - this.pitchAlignment = this.tr("pitchAlignment", "canvas") + this.iconSize = this.tr("iconSize", "40,40", context + ".iconsize") + this.anchor = this.tr("anchor", "center", context + ".anchor") + this.label = this.tr("label", undefined, context + ".label") + this.rotation = this.tr("rotation", "0", context + ".rotation") + this.pitchAlignment = this.tr("pitchAlignment", "canvas", context + ".pitchAlignment") this.rotationAlignment = this.tr( "rotationAlignment", - json.pitchAlignment === "map" ? "map" : "canvas" + json.pitchAlignment === "map" ? "map" : "canvas", + context + ".rotationAlignment" ) } @@ -175,49 +190,11 @@ export default class PointRenderingConfig extends WithContextLoader { } } - public GetBaseIcon( - tags?: Record, - options?: { - noFullWidth?: boolean - } - ): BaseUIElement { - tags = tags ?? { id: "node/-1" } - let defaultPin: BaseUIElement = undefined - if (this.label === undefined) { - defaultPin = Svg.teardrop_with_hole_green_svg() - } - if (this.icon === undefined) { - return defaultPin - } - const rotation = Utils.SubstituteKeys( - this.rotation?.GetRenderValue(tags)?.txt ?? "0deg", - tags - ) - const htmlDefs = Utils.SubstituteKeys(this.icon?.GetRenderValue(tags)?.txt, tags) - if (htmlDefs === undefined) { - // This layer doesn't want to show an icon right now - return undefined - } - if (htmlDefs.startsWith("<") && htmlDefs.endsWith(">")) { - // This is probably already prepared HTML - return new FixedUiElement(Utils.SubstituteKeys(htmlDefs, tags)) - } - return PointRenderingConfig.FromHtmlMulti(htmlDefs, rotation, false, defaultPin, options) + public GetBaseIcon(tags?: Record): BaseUIElement { + return new SvelteUIElement(DynamicMarker, { config: this, tags: new ImmutableStore(tags) }) } - - public GetSimpleIcon(tags: Store>): BaseUIElement { - const self = this - if (this.icon === undefined) { - return undefined - } - return new VariableUiElement(tags.map((tags) => self.GetBaseIcon(tags))).SetClass( - "w-full h-full block" - ) - } - public RenderIcon( tags: Store>, - clickable: boolean, options?: { noSize?: false | boolean includeBadges?: true | boolean @@ -234,7 +211,7 @@ export default class PointRenderingConfig extends WithContextLoader { return n } - function render(tr: TagRenderingConfig, deflt?: string) { + function render(tr: TagRenderingConfig, deflt?: string): string { if (tags === undefined) { return deflt } @@ -266,7 +243,9 @@ export default class PointRenderingConfig extends WithContextLoader { anchorH = -iconH / 2 } - const icon = this.GetSimpleIcon(tags) + const icon = new SvelteUIElement(DynamicMarker, { config: this, tags }).SetClass( + "w-full h-full" + ) let badges = undefined if (options?.includeBadges ?? true) { badges = this.GetBadges(tags) diff --git a/src/Models/ThemeConfig/TagRenderingConfig.ts b/src/Models/ThemeConfig/TagRenderingConfig.ts index efa1dd528..3040fcf44 100644 --- a/src/Models/ThemeConfig/TagRenderingConfig.ts +++ b/src/Models/ThemeConfig/TagRenderingConfig.ts @@ -18,6 +18,7 @@ import { FixedUiElement } from "../../UI/Base/FixedUiElement" import { Paragraph } from "../../UI/Base/Paragraph" import Svg from "../../Svg" import Validators, { ValidatorType } from "../../UI/InputElement/Validators" +import { TagRenderingConfigJson } from "./Json/TagRenderingConfigJson" export interface Icon {} @@ -52,6 +53,7 @@ export default class TagRenderingConfig { public readonly question?: TypedTranslation public readonly questionhint?: TypedTranslation public readonly condition?: TagsFilter + public readonly invalidValues?: TagsFilter /** * Evaluated against the current 'usersettings'-state */ @@ -76,7 +78,11 @@ export default class TagRenderingConfig { public readonly labels: string[] public readonly classes: string[] - constructor(json: string | QuestionableTagRenderingConfigJson, context?: string) { + constructor( + config: string | TagRenderingConfigJson | QuestionableTagRenderingConfigJson, + context?: string + ) { + let json = config if (json === undefined) { throw "Initing a TagRenderingConfig with undefined in " + context } @@ -117,15 +123,20 @@ export default class TagRenderingConfig { this.labels = json.labels ?? [] if (typeof json.classes === "string") { - this.classes = json.classes.split(" ") + this.classes = (json.classes).split(" ") } else { this.classes = json.classes ?? [] } + this.classes = [].concat(...this.classes.map((cl) => cl.split(" "))) + this.render = Translations.T(json.render, translationKey + ".render") this.question = Translations.T(json.question, translationKey + ".question") this.questionhint = Translations.T(json.questionHint, translationKey + ".questionHint") this.description = Translations.T(json.description, translationKey + ".description") this.condition = TagUtils.Tag(json.condition ?? { and: [] }, `${context}.condition`) + this.invalidValues = json["invalidValues"] + ? TagUtils.Tag(json["invalidValues"], `${context}.invalidValues`) + : undefined if (typeof json.icon === "string") { this.renderIcon = json.icon this.renderIconClass = "small" @@ -148,7 +159,9 @@ export default class TagRenderingConfig { json.freeform.type && Validators.availableTypes.indexOf(json.freeform.type) < 0 ) { - throw `At ${context}: invalid type, perhaps you meant ${Utils.sortedByLevenshteinDistance( + throw `At ${context}: invalid type ${ + json.freeform.type + }, perhaps you meant ${Utils.sortedByLevenshteinDistance( json.freeform.key, Validators.availableTypes, (s) => s @@ -227,69 +240,6 @@ export default class TagRenderingConfig { ) } - if (this.question && this.freeform?.key === undefined && this.mappings === undefined) { - throw `${context}: A question is defined, but no mappings nor freeform (key) are. The question is ${this.question.txt} at ${context}` - } - - if (this.freeform) { - if (this.render === undefined) { - throw `${context}: Detected a freeform key without rendering... Key: ${this.freeform.key} in ${context}` - } - for (const ln in this.render.translations) { - if (ln.startsWith("_")) { - continue - } - const txt: string = this.render.translations[ln] - if (txt === "") { - throw context + " Rendering for language " + ln + " is empty" - } - if ( - txt.indexOf("{" + this.freeform.key + "}") >= 0 || - txt.indexOf("&LBRACE" + this.freeform.key + "&RBRACE") - ) { - continue - } - if (txt.indexOf("{" + this.freeform.key + ":") >= 0) { - continue - } - - if ( - this.freeform.type === "opening_hours" && - txt.indexOf("{opening_hours_table(") >= 0 - ) { - continue - } - const keyFirstArg = ["canonical", "fediverse_link"] - if ( - keyFirstArg.some( - (funcName) => txt.indexOf(`{${funcName}(${this.freeform.key}`) >= 0 - ) - ) { - continue - } - if ( - this.freeform.type === "wikidata" && - txt.indexOf("{wikipedia(" + this.freeform.key) >= 0 - ) { - continue - } - if (this.freeform.key === "wikidata" && txt.indexOf("{wikipedia()") >= 0) { - continue - } - if ( - this.freeform.type === "wikidata" && - txt.indexOf(`{wikidata_label(${this.freeform.key})`) >= 0 - ) { - continue - } - throw `${context}: The rendering for language ${ln} does not contain the freeform key {${this.freeform.key}}. This is a bug, as this rendering should show exactly this freeform key!\nThe rendering is ${txt} ` - } - } - - if (this.render && this.question && this.freeform === undefined) { - throw `${context}: Detected a tagrendering which takes input without freeform key in ${context}; the question is ${this.question.txt}` - } - if (!json.multiAnswer && this.mappings !== undefined && this.question !== undefined) { let keys = [] for (let i = 0; i < this.mappings.length; i++) { @@ -361,7 +311,7 @@ export default class TagRenderingConfig { ) { const ctx = `${translationKey}.mappings.${i}` if (mapping.if === undefined) { - throw `${ctx}: Invalid mapping: "if" is not defined in ${JSON.stringify(mapping)}` + throw `Invalid mapping: "if" is not defined` } if (mapping.then === undefined) { if (mapping["render"] !== undefined) { @@ -460,9 +410,12 @@ export default class TagRenderingConfig { */ public IsKnown(tags: Record): boolean { if (this.condition && !this.condition.matchesProperties(tags)) { - // Filtered away by the condition, so it is kindof known + // Filtered away by the condition, so it is kind of known return true } + if (this.invalidValues && this.invalidValues.matchesProperties(tags)) { + return false + } if (this.multiAnswer) { for (const m of this.mappings ?? []) { if (TagUtils.MatchesMultiAnswer(m.if, tags)) { @@ -473,6 +426,9 @@ export default class TagRenderingConfig { const free = this.freeform?.key if (free !== undefined) { const value = tags[free] + if (typeof value === "object") { + return Object.keys(value).length > 0 + } return value !== undefined && value !== "" } return false @@ -670,7 +626,9 @@ export default class TagRenderingConfig { multiSelectedMapping: boolean[] | undefined, currentProperties: Record ): UploadableTag { - freeformValue = freeformValue?.trim() + if (typeof freeformValue === "string") { + freeformValue = freeformValue?.trim() + } const validator = Validators.get(this.freeform?.type) if (validator && freeformValue) { freeformValue = validator.reformat(freeformValue, () => currentProperties["_country"]) diff --git a/src/Models/ThemeConfig/WithContextLoader.ts b/src/Models/ThemeConfig/WithContextLoader.ts index 7b8349413..c00f67edc 100644 --- a/src/Models/ThemeConfig/WithContextLoader.ts +++ b/src/Models/ThemeConfig/WithContextLoader.ts @@ -1,5 +1,7 @@ import TagRenderingConfig from "./TagRenderingConfig" import { TagRenderingConfigJson } from "./Json/TagRenderingConfigJson" +import { Translatable } from "./Json/Translatable" +import { QuestionableTagRenderingConfigJson } from "./Json/QuestionableTagRenderingConfigJson" export default class WithContextLoader { protected readonly _context: string @@ -15,7 +17,7 @@ export default class WithContextLoader { * The found value is interpreted as a tagrendering and fetched/parsed * */ public tr(key: string, deflt?: string, translationContext?: string) { - const v = this._json[key] + let v: Translatable | TagRenderingConfigJson = this._json[key] if (v === undefined || v === null) { if (deflt === undefined) { return undefined @@ -31,7 +33,10 @@ export default class WithContextLoader { }: use the content directly instead of {${key}: ${JSON.stringify(v)}}` } - return new TagRenderingConfig(v, `${translationContext ?? this._context}.${key}`) + return new TagRenderingConfig( + v, + `${translationContext ?? this._context}.${key}` + ) } /** @@ -61,7 +66,10 @@ export default class WithContextLoader { const renderings: TagRenderingConfig[] = [] for (let i = 0; i < tagRenderings.length; i++) { const preparedConfig = tagRenderings[i] - const tr = new TagRenderingConfig(preparedConfig, `${context}.tagrendering[${i}]`) + const tr = new TagRenderingConfig( + preparedConfig, + `${context}.tagrendering[${i}]` + ) if (options.readOnlyMode && tr.question !== undefined) { throw ( "A question is defined for " + diff --git a/src/Models/ThemeViewState.ts b/src/Models/ThemeViewState.ts index dfb57958a..4be559d7a 100644 --- a/src/Models/ThemeViewState.ts +++ b/src/Models/ThemeViewState.ts @@ -345,11 +345,25 @@ export default class ThemeViewState implements SpecialVisualizationState { this.drawSpecialLayers() this.initHotkeys() this.miscSetup() + this.focusOnMap() if (!Utils.runningFromConsole) { console.log("State setup completed", this) } } + /* By focussing on the map, the keyboard panning and zoom with '+' and '+' works */ + public focusOnMap() { + if (this.map.data) { + this.map.data.getCanvas().focus() + return + } + this.map.addCallbackAndRunD((map) => { + map.on("load", () => { + map.getCanvas().focus() + }) + return true + }) + } public showNormalDataOn(map: Store): ReadonlyMap { const filteringFeatureSource = new Map() this.perLayer.forEach((fs, layerName) => { @@ -417,6 +431,7 @@ export default class ThemeViewState implements SpecialVisualizationState { () => { this.selectedElement.setData(undefined) this.guistate.closeAll() + this.focusOnMap() } ) @@ -626,8 +641,16 @@ export default class ThemeViewState implements SpecialVisualizationState { // We did _unselect_ an item - we always remove the lastclick-object this.lastClickObject.features.setData([]) this.selectedLayer.setData(undefined) + this.focusOnMap() } }) + this.guistate.allToggles.forEach((toggle) => { + toggle.toggle.addCallbackD((isOpened) => { + if (!isOpened) { + this.focusOnMap() + } + }) + }) new ThemeViewStateHashActor(this) new MetaTagging(this) new TitleHandler(this.selectedElement, this.selectedLayer, this.featureProperties, this) diff --git a/src/UI/Base/FloatOver.svelte b/src/UI/Base/FloatOver.svelte index d48a5eae9..bbb2a504e 100644 --- a/src/UI/Base/FloatOver.svelte +++ b/src/UI/Base/FloatOver.svelte @@ -10,7 +10,7 @@
    { dispatch("close") }} diff --git a/src/UI/Base/Hotkeys.ts b/src/UI/Base/Hotkeys.ts index c81b920a3..379e97f68 100644 --- a/src/UI/Base/Hotkeys.ts +++ b/src/UI/Base/Hotkeys.ts @@ -93,7 +93,7 @@ export default class Hotkeys { }) } else if (key["nomod"] !== undefined) { document.addEventListener(type, function (event) { - if (Hotkeys.textElementSelected(event)) { + if (Hotkeys.textElementSelected(event) && keycode !== "Escape") { // A text element is selected, we don't do anything special return } diff --git a/src/UI/Base/LoginToggle.svelte b/src/UI/Base/LoginToggle.svelte index 93df7e84b..11d5eb0a3 100644 --- a/src/UI/Base/LoginToggle.svelte +++ b/src/UI/Base/LoginToggle.svelte @@ -15,8 +15,8 @@ * If set, 'loading' will act as if we are already logged in. */ export let ignoreLoading: boolean = false - let loadingStatus = state.osmConnection.loadingStatus - let badge = state.featureSwitches?.featureSwitchUserbadge ?? new ImmutableStore(true) + let loadingStatus = state?.osmConnection?.loadingStatus ?? new ImmutableStore("logged-in") + let badge = state?.featureSwitches?.featureSwitchUserbadge ?? new ImmutableStore(true) const t = Translations.t.general const offlineModes: Partial> = { offline: t.loginFailedOfflineMode, @@ -24,7 +24,7 @@ unknown: t.loginFailedUnreachableMode, readonly: t.loginFailedReadonlyMode, } - const apiState = state.osmConnection.apiIsOnline + const apiState = state?.osmConnection?.apiIsOnline ?? new ImmutableStore("online") {#if $badge} diff --git a/src/UI/Base/NextButton.svelte b/src/UI/Base/NextButton.svelte index 6b4a64dd8..687417b53 100644 --- a/src/UI/Base/NextButton.svelte +++ b/src/UI/Base/NextButton.svelte @@ -20,6 +20,6 @@
    - + = 0? "h-4 w-4 shrink-0": "h-12 w-12 shrink-0" }/>
    diff --git a/src/UI/Base/TabbedGroup.svelte b/src/UI/Base/TabbedGroup.svelte index 167a861c9..429909adc 100644 --- a/src/UI/Base/TabbedGroup.svelte +++ b/src/UI/Base/TabbedGroup.svelte @@ -3,23 +3,24 @@ * Thin wrapper around 'TabGroup' which binds the state */ - import { Tab, TabGroup, TabList, TabPanel, TabPanels } from "@rgossiaux/svelte-headlessui" - import { ImmutableStore, Store, UIEventSource } from "../../Logic/UIEventSource" - import { twJoin } from "tailwind-merge" + import { Tab, TabGroup, TabList, TabPanel, TabPanels } from "@rgossiaux/svelte-headlessui"; + import { ImmutableStore, Store, UIEventSource } from "../../Logic/UIEventSource"; + import { twJoin } from "tailwind-merge"; /** * If a condition is given for a certain tab, it will only be shown if this condition is true. * E.g. * condition3 = new ImmutableStore(false) will always hide tab3 (the fourth tab) */ - let tr = new ImmutableStore(true) + const tr = new ImmutableStore(true) export let condition0: Store = tr export let condition1: Store = tr export let condition2: Store = tr export let condition3: Store = tr export let condition4: Store = tr - - export let tab: UIEventSource + export let condition5: Store = tr + export let condition6: Store = tr + export let tab: UIEventSource = new UIEventSource(0) let tabElements: HTMLElement[] = [] $: tabElements[$tab]?.click() $: { @@ -41,41 +42,55 @@ >
    - twJoin("tab", selected && "primary", !$condition0 && "hidden")} - > -
    - Tab 0 -
    -
    - twJoin("tab", selected && "primary", !$condition1 && "hidden")} - > -
    - -
    -
    - twJoin("tab", selected && "primary", !$condition2 && "hidden")} - > -
    - -
    -
    - twJoin("tab", selected && "primary", !$condition3 && "hidden")} - > -
    - -
    -
    - twJoin("tab", selected && "primary", !$condition4 && "hidden")} - > -
    - -
    -
    + {#if $$slots.title0} + twJoin("tab", selected && "primary", !$condition0 && "hidden")}> +
    + Tab 0 +
    +
    + {/if} + {#if $$slots.title1} + twJoin("tab", selected && "primary", !$condition1 && "hidden")}> +
    + +
    +
    + {/if} + {#if $$slots.title2} + twJoin("tab", selected && "primary", !$condition2 && "hidden")}> +
    + +
    +
    + {/if} + {#if $$slots.title3} + twJoin("tab", selected && "primary", !$condition3 && "hidden")}> +
    + +
    +
    + {/if} + {#if $$slots.title4} + twJoin("tab", selected && "primary", !$condition4 && "hidden")}> +
    + +
    +
    + {/if} + {#if $$slots.title5} + twJoin("tab", selected && "primary", !$condition5 && "hidden")}> +
    + +
    +
    + {/if} + {#if $$slots.title6} + twJoin("tab", selected && "primary", !$condition6 && "hidden")}> +
    + +
    +
    + {/if}
    @@ -106,6 +121,16 @@
    + + +
    + + + + +
    + +
    diff --git a/src/UI/Base/VariableUIElement.ts b/src/UI/Base/VariableUIElement.ts index 69d8a8330..4da0011bb 100644 --- a/src/UI/Base/VariableUIElement.ts +++ b/src/UI/Base/VariableUIElement.ts @@ -42,7 +42,7 @@ export class VariableUiElement extends BaseUIElement { el.removeChild(el.lastChild) } - if (contents === undefined) { + if (contents === undefined || contents === null) { return } if (typeof contents === "string") { @@ -54,11 +54,13 @@ export class VariableUiElement extends BaseUIElement { el.appendChild(c) } } - } else { + } else if (contents.ConstructElement) { const c = contents.ConstructElement() if (c !== undefined && c !== null) { el.appendChild(c) } + } else { + console.error("Could not construct a variable UI element for", contents) } }) return el diff --git a/src/UI/BigComponents/SelectedElementView.svelte b/src/UI/BigComponents/SelectedElementView.svelte index 924d6f7f3..efa54cf29 100644 --- a/src/UI/BigComponents/SelectedElementView.svelte +++ b/src/UI/BigComponents/SelectedElementView.svelte @@ -28,7 +28,7 @@ {:else} -
    +
    {#each layer.tagRenderings as config (config.id)} {#if (config.condition?.matchesProperties($tags) ?? true) && config.metacondition?.matchesProperties({ ...$tags, ..._metatags } ?? true)} {#if config.IsKnown($tags)} diff --git a/src/UI/DownloadFlow/DownloadHelper.ts b/src/UI/DownloadFlow/DownloadHelper.ts index 035f5cf13..80906a1b1 100644 --- a/src/UI/DownloadFlow/DownloadHelper.ts +++ b/src/UI/DownloadFlow/DownloadHelper.ts @@ -5,6 +5,7 @@ import LayerConfig from "../../Models/ThemeConfig/LayerConfig" import { Utils } from "../../Utils" import SimpleMetaTagger from "../../Logic/SimpleMetaTagger" import geojson2svg from "geojson2svg" +import { GeoOperations } from "../../Logic/GeoOperations" /** * Exposes the download-functionality @@ -82,6 +83,7 @@ export default class DownloadHelper { height?: 1000 | number mapExtent?: BBox unit?: "px" | "mm" | string + noSelfIntersectingLines?: boolean }) { const perLayer = this._state.perLayer options = options ?? {} @@ -103,7 +105,7 @@ export default class DownloadHelper { const elements: string[] = [] for (const layer of Array.from(perLayer.keys())) { - const features = perLayer.get(layer).features.data + let features = perLayer.get(layer).features.data if (features.length === 0) { continue } @@ -128,7 +130,9 @@ export default class DownloadHelper { }, ], }) - + if (options.noSelfIntersectingLines) { + features = GeoOperations.SplitSelfIntersectingWays(features) + } for (const feature of features) { const stroke = rendering?.color?.GetRenderValue(feature.properties)?.txt ?? "#ff0000" diff --git a/src/UI/DownloadFlow/DownloadPanel.svelte b/src/UI/DownloadFlow/DownloadPanel.svelte index 234f7dccf..05688a5e6 100644 --- a/src/UI/DownloadFlow/DownloadPanel.svelte +++ b/src/UI/DownloadFlow/DownloadPanel.svelte @@ -19,7 +19,7 @@ let metaIsIncluded = false const name = state.layout.id - function offerSvg(): string { + function offerSvg(noSelfIntersectingLines: boolean): string { const maindiv = document.getElementById("maindiv") const layers = state.layout.layers.filter((l) => l.source !== null) return downloadHelper.asSvg({ @@ -27,6 +27,7 @@ mapExtent: state.mapProperties.bounds.data, width: maindiv.offsetWidth, height: maindiv.offsetHeight, + noSelfIntersectingLines: true }) } @@ -71,9 +72,19 @@ mimetype="image/svg+xml" mainText={t.downloadAsSvg} helperText={t.downloadAsSvgHelper} - construct={offerSvg} + construct={() => offerSvg(false)} /> + offerSvg(true)} + /> + + import {UIEventSource} from "../../../Logic/UIEventSource"; + + /** + * Simply shows the image + */ + export let value: UIEventSource + + + diff --git a/src/UI/InputElement/Helpers/SimpleTagInput.svelte b/src/UI/InputElement/Helpers/SimpleTagInput.svelte new file mode 100644 index 000000000..9af4a549d --- /dev/null +++ b/src/UI/InputElement/Helpers/SimpleTagInput.svelte @@ -0,0 +1,31 @@ + + + + +{#if $dropdownFocussed} +
    + {documentation.name} + +
    +{/if} diff --git a/src/UI/InputElement/Helpers/TagInput.svelte b/src/UI/InputElement/Helpers/TagInput.svelte new file mode 100644 index 000000000..7144268b8 --- /dev/null +++ b/src/UI/InputElement/Helpers/TagInput.svelte @@ -0,0 +1,22 @@ + + + + diff --git a/src/UI/InputElement/Helpers/TranslationInput.svelte b/src/UI/InputElement/Helpers/TranslationInput.svelte new file mode 100644 index 000000000..821eea801 --- /dev/null +++ b/src/UI/InputElement/Helpers/TranslationInput.svelte @@ -0,0 +1,65 @@ + +
    + + {prefix} + + + dispatch("submit")} /> + + {postfix} + +
    diff --git a/src/UI/InputElement/InputHelper.svelte b/src/UI/InputElement/InputHelper.svelte index d33528228..0d5906698 100644 --- a/src/UI/InputElement/InputHelper.svelte +++ b/src/UI/InputElement/InputHelper.svelte @@ -4,30 +4,50 @@ * Note that all values are stringified */ - import { UIEventSource } from "../../Logic/UIEventSource" - import type { ValidatorType } from "./Validators" - import InputHelpers from "./InputHelpers" - import ToSvelte from "../Base/ToSvelte.svelte" - import type { Feature } from "geojson" - import BaseUIElement from "../BaseUIElement" - import { VariableUiElement } from "../Base/VariableUIElement" + import { UIEventSource } from "../../Logic/UIEventSource"; + import type { ValidatorType } from "./Validators"; + import InputHelpers from "./InputHelpers"; + import ToSvelte from "../Base/ToSvelte.svelte"; + import type { Feature } from "geojson"; + import { createEventDispatcher } from "svelte"; + import ImageHelper from "./Helpers/ImageHelper.svelte"; + import TranslationInput from "./Helpers/TranslationInput.svelte"; + import TagInput from "./Helpers/TagInput.svelte"; + import SimpleTagInput from "./Helpers/SimpleTagInput.svelte"; + import DirectionInput from "./Helpers/DirectionInput.svelte"; + import DateInput from "./Helpers/DateInput.svelte"; + import ColorInput from "./Helpers/ColorInput.svelte"; + import OpeningHoursInput from "./Helpers/OpeningHoursInput.svelte"; - export let type: ValidatorType - export let value: UIEventSource + export let type: ValidatorType; + export let value: UIEventSource; - export let feature: Feature - export let args: (string | number | boolean)[] = undefined + export let feature: Feature; + export let args: (string | number | boolean)[] = undefined; + + let properties = { feature, args: args ?? [] }; + let dispatch = createEventDispatcher<{ + selected + }>(); - let properties = { feature, args: args ?? [] } - let construct = new UIEventSource<(value, extraProperties) => BaseUIElement>(undefined) - $: { - construct.setData(InputHelpers.AvailableInputHelpers[type]) - } -{#if construct !== undefined} - - new VariableUiElement(construct.mapD((construct) => construct(value, properties)))} - /> +{#if type === "translation" } + +{:else if type === "direction"} + +{:else if type === "date"} + +{:else if type === "color"} + +{:else if type === "image"} + +{:else if type === "tag"} + +{:else if type === "simple_tag"} + +{:else if type === "opening_hours"} + +{:else if type === "wikidata"} + InputHelpers.constructWikidataHelper(value, properties)} /> {/if} diff --git a/src/UI/InputElement/InputHelpers.ts b/src/UI/InputElement/InputHelpers.ts index a00ab6d6e..e749e55cd 100644 --- a/src/UI/InputElement/InputHelpers.ts +++ b/src/UI/InputElement/InputHelpers.ts @@ -1,10 +1,7 @@ import { ValidatorType } from "./Validators" import { UIEventSource } from "../../Logic/UIEventSource" -import SvelteUIElement from "../Base/SvelteUIElement" -import DirectionInput from "./Helpers/DirectionInput.svelte" + import { MapProperties } from "../../Models/MapProperties" -import DateInput from "./Helpers/DateInput.svelte" -import ColorInput from "./Helpers/ColorInput.svelte" import BaseUIElement from "../BaseUIElement" import WikidataSearchBox from "../Wikipedia/WikidataSearchBox" import Wikidata from "../../Logic/Web/Wikidata" @@ -13,6 +10,10 @@ import Locale from "../i18n/Locale" import { Feature } from "geojson" import { GeoOperations } from "../../Logic/GeoOperations" import OpeningHoursInput from "./Helpers/OpeningHoursInput.svelte" +import SvelteUIElement from "../Base/SvelteUIElement" +import DirectionInput from "./Helpers/DirectionInput.svelte" +import DateInput from "./Helpers/DateInput.svelte" +import ColorInput from "./Helpers/ColorInput.svelte" export interface InputHelperProperties { /** @@ -35,35 +36,16 @@ export interface InputHelperProperties { } export default class InputHelpers { - public static readonly AvailableInputHelpers: Readonly< - Partial< - Record< - ValidatorType, - ( - value: UIEventSource, - extraProperties?: InputHelperProperties - ) => BaseUIElement - > - > - > = { - direction: (value, properties) => - new SvelteUIElement(DirectionInput, { - value, - mapProperties: InputHelpers.constructMapProperties(properties), - }), - date: (value) => new SvelteUIElement(DateInput, { value }), - color: (value) => new SvelteUIElement(ColorInput, { value }), - opening_hours: (value) => new SvelteUIElement(OpeningHoursInput, { value }), - wikidata: InputHelpers.constructWikidataHelper, - } as const + public static hideInputField: string[] = ["translation", "simple_tag", "tag"] + // noinspection JSUnusedLocalSymbols /** * Constructs a mapProperties-object for the given properties. * Assumes that the first helper-args contains the desired zoom-level * @param properties * @private */ - private static constructMapProperties( + public static constructMapProperties( properties: InputHelperProperties ): Partial { let location = properties?.mapProperties?.location @@ -87,7 +69,8 @@ export default class InputHelpers { } return mapProperties } - private static constructWikidataHelper( + + public static constructWikidataHelper( value: UIEventSource, props: InputHelperProperties ) { diff --git a/src/UI/InputElement/ValidatedInput.svelte b/src/UI/InputElement/ValidatedInput.svelte index ffdf92a51..2c3430102 100644 --- a/src/UI/InputElement/ValidatedInput.svelte +++ b/src/UI/InputElement/ValidatedInput.svelte @@ -1,117 +1,145 @@ -{#if validator.textArea} +{#if validator?.textArea} +
    sendSubmit()}> + +
    {:else} - - - {#if !$isValid} - - {/if} +
    sendSubmit()}> + + {#if !$isValid} + + {/if} - {#if unit !== undefined} - - {/if} - + {#if unit !== undefined} + + {/if} + {/if} diff --git a/src/UI/InputElement/Validator.ts b/src/UI/InputElement/Validator.ts index 5368701d4..ab48ad4ff 100644 --- a/src/UI/InputElement/Validator.ts +++ b/src/UI/InputElement/Validator.ts @@ -27,6 +27,8 @@ export abstract class Validator { | "search" public readonly textArea: boolean + public readonly isMeta?: boolean + constructor( name: string, explanation: string | BaseUIElement, @@ -69,7 +71,7 @@ export abstract class Validator { return Translations.t.validation[this.name].description } - public isValid(_: string, __?: () => string): boolean { + public isValid(key: string, getCountry?: () => string): boolean { return true } diff --git a/src/UI/InputElement/Validators.ts b/src/UI/InputElement/Validators.ts index 1adb26821..62be469a4 100644 --- a/src/UI/InputElement/Validators.ts +++ b/src/UI/InputElement/Validators.ts @@ -18,7 +18,14 @@ import ColorValidator from "./Validators/ColorValidator" import BaseUIElement from "../BaseUIElement" import Combine from "../Base/Combine" import Title from "../Base/Title" +import SimpleTagValidator from "./Validators/SimpleTagValidator" +import ImageUrlValidator from "./Validators/ImageUrlValidator" +import TagKeyValidator from "./Validators/TagKeyValidator" +import TranslationValidator from "./Validators/TranslationValidator" import FediverseValidator from "./Validators/FediverseValidator" +import IconValidator from "./Validators/IconValidator" +import TagValidator from "./Validators/TagValidator" +import IdValidator from "./Validators/IdValidator" export type ValidatorType = (typeof Validators.availableTypes)[number] @@ -40,7 +47,15 @@ export default class Validators { "phone", "opening_hours", "color", + "image", + "simple_tag", + "key", + "translation", + "icon", "fediverse", + "tag", + "fediverse", + "id", ] as const public static readonly AllValidators: ReadonlyArray = [ @@ -60,18 +75,18 @@ export default class Validators { new PhoneValidator(), new OpeningHoursValidator(), new ColorValidator(), + new ImageUrlValidator(), + new SimpleTagValidator(), + new TagValidator(), + new TagKeyValidator(), + new TranslationValidator(), + new IconValidator(), new FediverseValidator(), + new IdValidator(), ] private static _byType = Validators._byTypeConstructor() - private static _byTypeConstructor(): Map { - const map = new Map() - for (const validator of Validators.AllValidators) { - map.set(validator.name, validator) - } - return map - } public static HelpText(): BaseUIElement { const explanations: BaseUIElement[] = Validators.AllValidators.map((type) => new Combine([new Title(type.name, 3), type.explanation]).SetClass("flex flex-col") @@ -83,6 +98,14 @@ export default class Validators { ]).SetClass("flex flex-col") } + private static _byTypeConstructor(): Map { + const map = new Map() + for (const validator of Validators.AllValidators) { + map.set(validator.name, validator) + } + return map + } + static get(type: ValidatorType): Validator { return Validators._byType.get(type) } diff --git a/src/UI/InputElement/Validators/IconValidator.ts b/src/UI/InputElement/Validators/IconValidator.ts new file mode 100644 index 000000000..da6959fa8 --- /dev/null +++ b/src/UI/InputElement/Validators/IconValidator.ts @@ -0,0 +1,51 @@ +import { Validator } from "../Validator" +import { Translation } from "../../i18n/Translation" +import licenses from "../../../assets/generated/license_info.json" +import { Utils } from "../../../Utils" + +export default class IconValidator extends Validator { + private static allLicenses = new Set(licenses.map((l) => l.path)) + private static allLicensesArr = Array.from(IconValidator.allLicenses) + public static readonly isMeta = true + constructor() { + super("icon", "Makes sure that a valid .svg-path is added") + } + + reformat(s: string, _?: () => string): string { + return s.trim() + } + + getFeedback(s: string, getCountry, sloppy?: boolean): Translation | undefined { + s = this.reformat(s) + if (!s.startsWith("http")) { + if (!IconValidator.allLicenses.has(s)) { + const close = sloppy + ? [] + : Utils.sortedByLevenshteinDistance( + s.substring(s.lastIndexOf("/")), + IconValidator.allLicensesArr, + (s) => s.substring(s.lastIndexOf("/")) + ).slice(0, 5) + return new Translation( + [ + `Unkown builtin icon ${s}, perhaps you meant one of:
      `, + ...close.map( + (item) => + `
    • ${item}
    • ` + ), + "
    ", + ].join("") + ) + } + } + + if (!s.endsWith(".svg")) { + return new Translation("An icon should end with `.svg`") + } + return undefined + } + + isValid(key: string, getCountry?: () => string): boolean { + return this.getFeedback(key, getCountry, true) === undefined + } +} diff --git a/src/UI/InputElement/Validators/IdValidator.ts b/src/UI/InputElement/Validators/IdValidator.ts new file mode 100644 index 000000000..04ffdfcdf --- /dev/null +++ b/src/UI/InputElement/Validators/IdValidator.ts @@ -0,0 +1,29 @@ +import { Translation } from "../../i18n/Translation" +import { Validator } from "../Validator" +import Translations from "../../i18n/Translations" + +export default class IdValidator extends Validator { + constructor() { + super( + "id", + "Checks for valid identifiers for layers, will automatically replace spaces and uppercase" + ) + } + isValid(key: string, getCountry?: () => string): boolean { + return this.getFeedback(key, getCountry) === undefined + } + + reformat(s: string, _?: () => string): string { + return s.replaceAll(" ", "_").toLowerCase() + } + + getFeedback(s: string, _?: () => string): Translation | undefined { + if (s.length < 3) { + return Translations.t.validation.id.shouldBeLonger + } + if (!s.match(/^[a-zA-Z0-9_ ]+$/)) { + return Translations.t.validation.id.invalidCharacter + } + return undefined + } +} diff --git a/src/UI/InputElement/Validators/ImageUrlValidator.ts b/src/UI/InputElement/Validators/ImageUrlValidator.ts new file mode 100644 index 000000000..5d9e11507 --- /dev/null +++ b/src/UI/InputElement/Validators/ImageUrlValidator.ts @@ -0,0 +1,40 @@ +import UrlValidator from "./UrlValidator" +import { Translation } from "../../i18n/Translation" + +export default class ImageUrlValidator extends UrlValidator { + private static readonly allowedExtensions = ["jpg", "jpeg", "svg", "png"] + public readonly isMeta = true + + constructor() { + super( + "image", + "Same as the URL-parameter, except that it checks that the URL ends with `.jpg`, `.png` or some other typical image format" + ) + } + + private static hasValidExternsion(str: string): boolean { + str = str.toLowerCase() + return ImageUrlValidator.allowedExtensions.some((ext) => str.endsWith(ext)) + } + + getFeedback(s: string, _?: () => string): Translation | undefined { + const superF = super.getFeedback(s, _) + if (superF) { + return superF + } + if (!ImageUrlValidator.hasValidExternsion(s)) { + return new Translation( + "This URL does not end with one of the allowed extensions. These are: " + + ImageUrlValidator.allowedExtensions.join(", ") + ) + } + return undefined + } + + isValid(str: string): boolean { + if (!super.isValid(str)) { + return false + } + return ImageUrlValidator.hasValidExternsion(str) + } +} diff --git a/src/UI/InputElement/Validators/SimpleTagValidator.ts b/src/UI/InputElement/Validators/SimpleTagValidator.ts new file mode 100644 index 000000000..f39ca9d1d --- /dev/null +++ b/src/UI/InputElement/Validators/SimpleTagValidator.ts @@ -0,0 +1,53 @@ +import { Validator } from "../Validator" +import { Translation } from "../../i18n/Translation" +import Translations from "../../i18n/Translations" +import TagKeyValidator from "./TagKeyValidator" + +/** + * Checks that the input conforms `key=value`, where `key` and `value` don't have too much weird characters + */ +export default class SimpleTagValidator extends Validator { + private static readonly KeyValidator = new TagKeyValidator() + + public readonly isMeta = true + constructor() { + super( + "simple_tag", + "A simple tag of the format `key=value` where `key` conforms to a normal key `" + ) + } + + getFeedback(tag: string, _): Translation | undefined { + const parts = tag.split("=") + if (parts.length < 2) { + return Translations.T("A tag should contain a = to separate the 'key' and 'value'") + } + if (parts.length > 2) { + return Translations.T( + "A tag should contain precisely one `=` to separate the 'key' and 'value', but " + + (parts.length - 1) + + " equal signs were found" + ) + } + + const [key, value] = parts + const keyFeedback = SimpleTagValidator.KeyValidator.getFeedback(key, _) + if (keyFeedback) { + return keyFeedback + } + + if (value.length > 255) { + return Translations.T("A `value should be at most 255 characters") + } + + if (value.length == 0) { + return Translations.T("A `value should not be empty") + } + + return undefined + } + + isValid(tag: string, _): boolean { + return this.getFeedback(tag, _) === undefined + } +} diff --git a/src/UI/InputElement/Validators/TagKeyValidator.ts b/src/UI/InputElement/Validators/TagKeyValidator.ts new file mode 100644 index 000000000..510735739 --- /dev/null +++ b/src/UI/InputElement/Validators/TagKeyValidator.ts @@ -0,0 +1,32 @@ +import { Validator } from "../Validator" +import { Translation } from "../../i18n/Translation" +import Translations from "../../i18n/Translations" + +export default class TagKeyValidator extends Validator { + + public readonly isMeta = true + constructor() { + super("key", "Validates a key, mostly that no weird characters are used") + } + + getFeedback(key: string, _?: () => string): Translation | undefined { + if (key.length > 255) { + return Translations.T("A `key` should be at most 255 characters") + } + + if (key.length == 0) { + return Translations.T("A `key` should not be empty") + } + const keyRegex = /[a-zA-Z0-9:_]+/ + if (!key.match(keyRegex)) { + return Translations.T( + "A `key` should only have the characters `a-zA-Z0-9`, `:` or `_`" + ) + } + return undefined + } + + isValid(key: string, getCountry?: () => string): boolean { + return this.getFeedback(key, getCountry) === undefined + } +} diff --git a/src/UI/InputElement/Validators/TagValidator.ts b/src/UI/InputElement/Validators/TagValidator.ts new file mode 100644 index 000000000..aa4afef4f --- /dev/null +++ b/src/UI/InputElement/Validators/TagValidator.ts @@ -0,0 +1,24 @@ +import { Validator } from "../Validator" +import { Translation } from "../../i18n/Translation" +import Translations from "../../i18n/Translations" +import TagKeyValidator from "./TagKeyValidator" +import SimpleTagValidator from "./SimpleTagValidator" + +/** + * Checks that the input conforms a JSON-encoded tag expression or a simpleTag`key=value`, + */ +export default class TagValidator extends Validator { + + public readonly isMeta = true + constructor() { + super("tag", "A simple tag of the format `key=value` OR a tagExpression") + } + + getFeedback(tag: string, _): Translation | undefined { + return undefined + } + + isValid(tag: string, _): boolean { + return this.getFeedback(tag, _) === undefined + } +} diff --git a/src/UI/InputElement/Validators/TranslationValidator.ts b/src/UI/InputElement/Validators/TranslationValidator.ts new file mode 100644 index 000000000..79b8e0cfc --- /dev/null +++ b/src/UI/InputElement/Validators/TranslationValidator.ts @@ -0,0 +1,18 @@ +import { Validator } from "../Validator" + +export default class TranslationValidator extends Validator { + + public readonly isMeta = true + constructor() { + super("translation", "Makes sure the the string is of format `Record` ") + } + + isValid(value: string, getCountry?: () => string): boolean { + try { + JSON.parse(value) + return true + } catch (e) { + return false + } + } +} diff --git a/src/UI/InputElement/Validators/UrlValidator.ts b/src/UI/InputElement/Validators/UrlValidator.ts index 85c8fefe6..bd28cf02f 100644 --- a/src/UI/InputElement/Validators/UrlValidator.ts +++ b/src/UI/InputElement/Validators/UrlValidator.ts @@ -1,10 +1,10 @@ import { Validator } from "../Validator" export default class UrlValidator extends Validator { - constructor() { + constructor(name?: string, explanation?: string) { super( - "url", - "The validatedTextField will format URLs to always be valid and have a https://-header (even though the 'https'-part will be hidden from the user. Furthermore, some tracking parameters will be removed", + name ??"url", + explanation?? "The validatedTextField will format URLs to always be valid and have a https://-header (even though the 'https'-part will be hidden from the user. Furthermore, some tracking parameters will be removed", "url" ) } diff --git a/src/UI/Map/DynamicIcon.svelte b/src/UI/Map/DynamicIcon.svelte new file mode 100644 index 000000000..52bbefba3 --- /dev/null +++ b/src/UI/Map/DynamicIcon.svelte @@ -0,0 +1,41 @@ + + + diff --git a/src/UI/Map/DynamicMarker.svelte b/src/UI/Map/DynamicMarker.svelte new file mode 100644 index 000000000..77259967e --- /dev/null +++ b/src/UI/Map/DynamicMarker.svelte @@ -0,0 +1,21 @@ + +{#if config !== undefined} +
    + {#each icons as icon} + + {/each} +
    +{/if} diff --git a/src/UI/Map/Icon.svelte b/src/UI/Map/Icon.svelte new file mode 100644 index 000000000..237dedfb3 --- /dev/null +++ b/src/UI/Map/Icon.svelte @@ -0,0 +1,80 @@ + + +{#if icon} +
    + {#if icon === "pin"} + + {:else if icon === "square"} + + {:else if icon === "circle"} + + {:else if icon === "checkmark"} + + {:else if icon === "clock"} + + {:else if icon === "close"} + + {:else if icon === "crosshair"} + + {:else if icon === "help"} + + {:else if icon === "home"} + + {:else if icon === "invalid"} + + {:else if icon === "location"} + + {:else if icon === "location_empty"} + + {:else if icon === "location_locked"} + + {:else if icon === "note"} + + {:else if icon === "resolved"} + + {:else if icon === "ring"} + + {:else if icon === "scissors"} + + {:else if icon === "teardrop"} + + {:else if icon === "teardrop_with_hole_green"} + + {:else if icon === "triangle"} + + {:else} + + {/if} +
    +{/if} diff --git a/src/UI/Map/Marker.svelte b/src/UI/Map/Marker.svelte new file mode 100644 index 000000000..656f2b6de --- /dev/null +++ b/src/UI/Map/Marker.svelte @@ -0,0 +1,17 @@ + +{#if icons !== undefined && icons.length > 0} +
    + {#each icons as icon} + + {/each} +
    +{/if} diff --git a/src/UI/Map/ShowDataLayer.ts b/src/UI/Map/ShowDataLayer.ts index 782fe80bc..ebaea526a 100644 --- a/src/UI/Map/ShowDataLayer.ts +++ b/src/UI/Map/ShowDataLayer.ts @@ -143,7 +143,7 @@ class PointRenderingLayer { } else { store = new ImmutableStore(feature.properties) } - const { html, iconAnchor } = this._config.RenderIcon(store, true) + const { html, iconAnchor } = this._config.RenderIcon(store) html.SetClass("marker") if (this._onClick !== undefined) { html.SetClass("cursor-pointer") @@ -424,7 +424,7 @@ class LineRenderingLayer { export default class ShowDataLayer { private static rangeLayer = new LayerConfig( - range_layer, + range_layer, "ShowDataLayer.ts:range.json" ) private readonly _options: ShowDataLayerOptions & { diff --git a/src/UI/Popup/AddNewPoint/AddNewPoint.svelte b/src/UI/Popup/AddNewPoint/AddNewPoint.svelte index 594792ab5..b78f8be4d 100644 --- a/src/UI/Popup/AddNewPoint/AddNewPoint.svelte +++ b/src/UI/Popup/AddNewPoint/AddNewPoint.svelte @@ -3,109 +3,109 @@ * This component ties together all the steps that are needed to create a new point. * There are many subcomponents which help with that */ - import type { SpecialVisualizationState } from "../../SpecialVisualization" - import PresetList from "./PresetList.svelte" - import type PresetConfig from "../../../Models/ThemeConfig/PresetConfig" - import LayerConfig from "../../../Models/ThemeConfig/LayerConfig" - import Tr from "../../Base/Tr.svelte" - import SubtleButton from "../../Base/SubtleButton.svelte" - import FromHtml from "../../Base/FromHtml.svelte" - import Translations from "../../i18n/Translations.js" - import TagHint from "../TagHint.svelte" - import { And } from "../../../Logic/Tags/And.js" - import LoginToggle from "../../Base/LoginToggle.svelte" - import Constants from "../../../Models/Constants.js" - import FilteredLayer from "../../../Models/FilteredLayer" - import { Store, UIEventSource } from "../../../Logic/UIEventSource" - import { EyeIcon, EyeOffIcon } from "@rgossiaux/svelte-heroicons/solid" - import LoginButton from "../../Base/LoginButton.svelte" - import NewPointLocationInput from "../../BigComponents/NewPointLocationInput.svelte" - import CreateNewNodeAction from "../../../Logic/Osm/Actions/CreateNewNodeAction" - import { OsmWay } from "../../../Logic/Osm/OsmObject" - import { Tag } from "../../../Logic/Tags/Tag" - import type { WayId } from "../../../Models/OsmFeature" - import Loading from "../../Base/Loading.svelte" - import type { GlobalFilter } from "../../../Models/GlobalFilter" - import { onDestroy } from "svelte" - import NextButton from "../../Base/NextButton.svelte" - import BackButton from "../../Base/BackButton.svelte" - import ToSvelte from "../../Base/ToSvelte.svelte" - import Svg from "../../../Svg" - import OpenBackgroundSelectorButton from "../../BigComponents/OpenBackgroundSelectorButton.svelte" - import { twJoin } from "tailwind-merge" + import type { SpecialVisualizationState } from "../../SpecialVisualization"; + import PresetList from "./PresetList.svelte"; + import type PresetConfig from "../../../Models/ThemeConfig/PresetConfig"; + import LayerConfig from "../../../Models/ThemeConfig/LayerConfig"; + import Tr from "../../Base/Tr.svelte"; + import SubtleButton from "../../Base/SubtleButton.svelte"; + import FromHtml from "../../Base/FromHtml.svelte"; + import Translations from "../../i18n/Translations.js"; + import TagHint from "../TagHint.svelte"; + import { And } from "../../../Logic/Tags/And.js"; + import LoginToggle from "../../Base/LoginToggle.svelte"; + import Constants from "../../../Models/Constants.js"; + import FilteredLayer from "../../../Models/FilteredLayer"; + import { Store, UIEventSource } from "../../../Logic/UIEventSource"; + import { EyeIcon, EyeOffIcon } from "@rgossiaux/svelte-heroicons/solid"; + import LoginButton from "../../Base/LoginButton.svelte"; + import NewPointLocationInput from "../../BigComponents/NewPointLocationInput.svelte"; + import CreateNewNodeAction from "../../../Logic/Osm/Actions/CreateNewNodeAction"; + import { OsmWay } from "../../../Logic/Osm/OsmObject"; + import { Tag } from "../../../Logic/Tags/Tag"; + import type { WayId } from "../../../Models/OsmFeature"; + import Loading from "../../Base/Loading.svelte"; + import type { GlobalFilter } from "../../../Models/GlobalFilter"; + import { onDestroy } from "svelte"; + import NextButton from "../../Base/NextButton.svelte"; + import BackButton from "../../Base/BackButton.svelte"; + import ToSvelte from "../../Base/ToSvelte.svelte"; + import Svg from "../../../Svg"; + import OpenBackgroundSelectorButton from "../../BigComponents/OpenBackgroundSelectorButton.svelte"; + import { twJoin } from "tailwind-merge"; - export let coordinate: { lon: number; lat: number } - export let state: SpecialVisualizationState + export let coordinate: { lon: number; lat: number }; + export let state: SpecialVisualizationState; let selectedPreset: { preset: PresetConfig layer: LayerConfig icon: string tags: Record - } = undefined - let checkedOfGlobalFilters: number = 0 - let confirmedCategory = false + } = undefined; + let checkedOfGlobalFilters: number = 0; + let confirmedCategory = false; $: if (selectedPreset === undefined) { - confirmedCategory = false - creating = false - checkedOfGlobalFilters = 0 + confirmedCategory = false; + creating = false; + checkedOfGlobalFilters = 0; } - let flayer: FilteredLayer = undefined - let layerIsDisplayed: UIEventSource | undefined = undefined - let layerHasFilters: Store | undefined = undefined - let globalFilter: UIEventSource = state.layerState.globalFilters - let _globalFilter: GlobalFilter[] = [] + let flayer: FilteredLayer = undefined; + let layerIsDisplayed: UIEventSource | undefined = undefined; + let layerHasFilters: Store | undefined = undefined; + let globalFilter: UIEventSource = state.layerState.globalFilters; + let _globalFilter: GlobalFilter[] = []; onDestroy( globalFilter.addCallbackAndRun((globalFilter) => { - console.log("Global filters are", globalFilter) - _globalFilter = globalFilter ?? [] + console.log("Global filters are", globalFilter); + _globalFilter = globalFilter ?? []; }) - ) + ); $: { - flayer = state.layerState.filteredLayers.get(selectedPreset?.layer?.id) - layerIsDisplayed = flayer?.isDisplayed - layerHasFilters = flayer?.hasFilter + flayer = state.layerState.filteredLayers.get(selectedPreset?.layer?.id); + layerIsDisplayed = flayer?.isDisplayed; + layerHasFilters = flayer?.hasFilter; } - const t = Translations.t.general.add + const t = Translations.t.general.add; - const zoom = state.mapProperties.zoom + const zoom = state.mapProperties.zoom; - const isLoading = state.dataIsLoading - let preciseCoordinate: UIEventSource<{ lon: number; lat: number }> = new UIEventSource(undefined) - let snappedToObject: UIEventSource = new UIEventSource(undefined) + const isLoading = state.dataIsLoading; + let preciseCoordinate: UIEventSource<{ lon: number; lat: number }> = new UIEventSource(undefined); + let snappedToObject: UIEventSource = new UIEventSource(undefined); // Small helper variable: if the map is tapped, we should let the 'Next'-button grab some attention as users have to click _that_ to continue, not the map - let preciseInputIsTapped = false + let preciseInputIsTapped = false; - let creating = false + let creating = false; /** * Call when the user should restart the flow by clicking on the map, e.g. because they disabled filters. * Will delete the lastclick-location */ function abort() { - state.selectedElement.setData(undefined) + state.selectedElement.setData(undefined); // When aborted, we force the contributors to place the pin _again_ // This is because there might be a nearby object that was disabled; this forces them to re-evaluate the map - state.lastClickObject.features.setData([]) - preciseInputIsTapped = false + state.lastClickObject.features.setData([]); + preciseInputIsTapped = false; } async function confirm() { - creating = true - const location: { lon: number; lat: number } = preciseCoordinate.data - const snapTo: WayId | undefined = snappedToObject.data + creating = true; + const location: { lon: number; lat: number } = preciseCoordinate.data; + const snapTo: WayId | undefined = snappedToObject.data; const tags: Tag[] = selectedPreset.preset.tags.concat( ..._globalFilter.map((f) => f?.onNewPoint?.tags ?? []) - ) - console.log("Creating new point at", location, "snapped to", snapTo, "with tags", tags) + ); + console.log("Creating new point at", location, "snapped to", snapTo, "with tags", tags); - let snapToWay: undefined | OsmWay = undefined + let snapToWay: undefined | OsmWay = undefined; if (snapTo !== undefined && snapTo !== null) { - const downloaded = await state.osmObjectDownloader.DownloadObjectAsync(snapTo, 0) + const downloaded = await state.osmObjectDownloader.DownloadObjectAsync(snapTo, 0); if (downloaded !== "deleted") { - snapToWay = downloaded + snapToWay = downloaded; } } @@ -113,44 +113,44 @@ theme: state.layout?.id ?? "unkown", changeType: "create", snapOnto: snapToWay, - reusePointWithinMeters: 1, - }) - await state.changes.applyAction(newElementAction) - state.newFeatures.features.ping() + reusePointWithinMeters: 1 + }); + await state.changes.applyAction(newElementAction); + state.newFeatures.features.ping(); // The 'changes' should have created a new point, which added this into the 'featureProperties' - const newId = newElementAction.newElementId - console.log("Applied pending changes, fetching store for", newId) - const tagsStore = state.featureProperties.getStore(newId) + const newId = newElementAction.newElementId; + console.log("Applied pending changes, fetching store for", newId); + const tagsStore = state.featureProperties.getStore(newId); if (!tagsStore) { - console.error("Bug: no tagsStore found for", newId) + console.error("Bug: no tagsStore found for", newId); } { // Set some metainfo - const properties = tagsStore.data + const properties = tagsStore.data; if (snapTo) { // metatags (starting with underscore) are not uploaded, so we can safely mark this - delete properties["_referencing_ways"] - properties["_referencing_ways"] = `["${snapTo}"]` + delete properties["_referencing_ways"]; + properties["_referencing_ways"] = `["${snapTo}"]`; } - properties["_backend"] = state.osmConnection.Backend() - properties["_last_edit:timestamp"] = new Date().toISOString() - const userdetails = state.osmConnection.userDetails.data - properties["_last_edit:contributor"] = userdetails.name - properties["_last_edit:uid"] = "" + userdetails.uid - tagsStore.ping() + properties["_backend"] = state.osmConnection.Backend(); + properties["_last_edit:timestamp"] = new Date().toISOString(); + const userdetails = state.osmConnection.userDetails.data; + properties["_last_edit:contributor"] = userdetails.name; + properties["_last_edit:uid"] = "" + userdetails.uid; + tagsStore.ping(); } - const feature = state.indexedFeatures.featuresById.data.get(newId) - console.log("Selecting feature", feature, "and opening their popup") - abort() - state.selectedLayer.setData(selectedPreset.layer) - state.selectedElement.setData(feature) - tagsStore.ping() + const feature = state.indexedFeatures.featuresById.data.get(newId); + console.log("Selecting feature", feature, "and opening their popup"); + abort(); + state.selectedLayer.setData(selectedPreset.layer); + state.selectedElement.setData(feature); + tagsStore.ping(); } function confirmSync() { confirm() .then((_) => console.debug("New point successfully handled")) - .catch((e) => console.error("Handling the new point went wrong due to", e)) + .catch((e) => console.error("Handling the new point went wrong due to", e)); } @@ -162,206 +162,212 @@ - {#if $zoom < Constants.minZoomLevelToAddNewPoint} -
    - -
    - {:else if $isLoading} -
    - - - -
    - {:else if selectedPreset === undefined} - - { +
    + + {#if $zoom < Constants.minZoomLevelToAddNewPoint} +
    + +
    + {:else if $isLoading} +
    + + + +
    + {:else if selectedPreset === undefined} + + { selectedPreset = event.detail }} - /> - {:else if !$layerIsDisplayed} - -
    - - -
    + {:else if !$layerIsDisplayed} + +
    + + +
    -
    - + > + + + - -
    - {:else if $layerHasFilters} - -
    - - -
    -
    - +
    + {:else if $layerHasFilters} + +
    + + +
    +
    + - + -
    - {:else if !confirmedCategory} - -

    - -

    + > + + + +
    + {:else if !confirmedCategory} + +

    + +

    - + - {#if selectedPreset.preset.description} - - {/if} + {#if selectedPreset.preset.description} + + {/if} - {#if selectedPreset.preset.exampleImages} -

    - {#if selectedPreset.preset.exampleImages.length === 1} - - {:else} - - {/if} -

    - + {#if selectedPreset.preset.exampleImages} +

    + {#if selectedPreset.preset.exampleImages.length === 1} + + {:else} + + {/if} +

    + {#each selectedPreset.preset.exampleImages as src} {/each} - {/if} - t.presetInfo.Subs({ tags })} - {state} - tags={new And(selectedPreset.preset.tags)} - /> - -
    - (selectedPreset = undefined)} clss="w-full"> - - - - (confirmedCategory = true)} clss="primary w-full"> -
    - - -
    -
    - -
    -
    -
    - {:else if _globalFilter?.length > 0 && _globalFilter?.length > checkedOfGlobalFilters} - - { - checkedOfGlobalFilters = checkedOfGlobalFilters + 1 - }} - > - t.presetInfo.Subs({ tags })} + {state} + tags={new And(selectedPreset.preset.tags)} /> - - - { - globalFilter.setData([]) - abort() - }} - > - - - - {:else if !creating} -
    -
    - { - preciseInputIsTapped = true - }} - value={preciseCoordinate} - snappedTo={snappedToObject} - {state} - {coordinate} - targetLayer={selectedPreset.layer} - snapToLayers={selectedPreset.preset.preciseInput.snapToLayers} - /> -
    -
    - -
    - +
    + (selectedPreset = undefined)} clss="w-full"> + + + + (confirmedCategory = true)} clss="primary w-full"> +
    + + +
    +
    +
    + {:else if _globalFilter?.length > 0 && _globalFilter?.length > checkedOfGlobalFilters} + + { + checkedOfGlobalFilters = checkedOfGlobalFilters + 1 + }} + > + + + + { + globalFilter.setData([]) + abort() + }} + > + + + + {:else if !creating} +
    +
    +
    + { + preciseInputIsTapped = true + }} + value={preciseCoordinate} + snappedTo={snappedToObject} + {state} + {coordinate} + targetLayer={selectedPreset.layer} + snapToLayers={selectedPreset.preset.preciseInput.snapToLayers} + /> +
    -
    - -
    -
    -
    - (selectedPreset = undefined)} clss="w-full"> - - +
    + + +
    + +
    +
    +
    - -
    - +
    + +
    -
    -
    - {:else} - Creating point... - {/if} +
    + (selectedPreset = undefined)} clss="w-full"> + + + + +
    + +
    +
    +
    +
    + {:else} + Creating point... + {/if} +
    diff --git a/src/UI/Popup/AddNewPoint/PresetList.svelte b/src/UI/Popup/AddNewPoint/PresetList.svelte index 13ebf12d0..d476198f0 100644 --- a/src/UI/Popup/AddNewPoint/PresetList.svelte +++ b/src/UI/Popup/AddNewPoint/PresetList.svelte @@ -11,6 +11,9 @@ import LayerConfig from "../../../Models/ThemeConfig/LayerConfig" import FromHtml from "../../Base/FromHtml.svelte" import NextButton from "../../Base/NextButton.svelte" + import { UIElement } from "../../UIElement"; + import ToSvelte from "../../Base/ToSvelte.svelte"; + import BaseUIElement from "../../BaseUIElement"; /** * This component lists all the presets and allows the user to select one @@ -21,7 +24,7 @@ preset: PresetConfig layer: LayerConfig text: Translation - icon: string + icon: BaseUIElement tags: Record }[] = [] @@ -49,10 +52,9 @@ for (const preset of layer.presets) { const tags = TagUtils.KVtoProperties(preset.tags ?? []) - const icon: string = layer.mapRendering[0] - .RenderIcon(new ImmutableStore(tags), false) - .html.SetClass("w-12 h-12 block relative") - .ConstructElement().innerHTML + const icon: BaseUIElement = layer.mapRendering[0] + .RenderIcon(new ImmutableStore(tags)) + .html.SetClass("w-12 h-12 block relative mr-4") const description = preset.description?.FirstSentence() @@ -84,7 +86,7 @@ {#each presets as preset} dispatch("select", preset)}> - + preset.icon} />
    diff --git a/src/UI/Popup/AllTagsPanel.svelte b/src/UI/Popup/AllTagsPanel.svelte index 4f197f2ce..16a0fe8bf 100644 --- a/src/UI/Popup/AllTagsPanel.svelte +++ b/src/UI/Popup/AllTagsPanel.svelte @@ -8,10 +8,11 @@ import Toggle from "../Input/Toggle" import Lazy from "../Base/Lazy" import BaseUIElement from "../BaseUIElement" + import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig"; //Svelte props export let tags: UIEventSource - export let state: any + export let state: {layoutToUse: LayoutConfig} = undefined const calculatedTags = [].concat( ...(state?.layoutToUse?.layers?.map((l) => l.calculatedTags?.map((c) => c[0]) ?? []) ?? []) diff --git a/src/UI/Popup/LoginButton.ts b/src/UI/Popup/LoginButton.ts index 7e7f585cc..d47f22b13 100644 --- a/src/UI/Popup/LoginButton.ts +++ b/src/UI/Popup/LoginButton.ts @@ -88,7 +88,7 @@ export class LoginToggle extends VariableUiElement { ) }, [state.featureSwitchUserbadge, state.osmConnection?.apiIsOnline] - ) ?? new ImmutableStore(el) // + ) ?? new ImmutableStore(el) ) } } diff --git a/src/UI/Popup/TagHint.svelte b/src/UI/Popup/TagHint.svelte index 0a42c472b..84e23fed3 100644 --- a/src/UI/Popup/TagHint.svelte +++ b/src/UI/Popup/TagHint.svelte @@ -18,12 +18,12 @@ * If given, this function will be called to embed the given tags hint into this translation */ export let embedIn: ((string: string) => Translation) | undefined = undefined - const userDetails = state.osmConnection.userDetails + const userDetails = state?.osmConnection?.userDetails let tagsExplanation = "" $: tagsExplanation = tags?.asHumanString(true, false, currentProperties) -{#if $userDetails.loggedIn} +{#if !userDetails || $userDetails.loggedIn}
    {#if tags === undefined} diff --git a/src/UI/Popup/TagRendering/FreeformInput.svelte b/src/UI/Popup/TagRendering/FreeformInput.svelte index 3d7b344a3..d9d6ec39d 100644 --- a/src/UI/Popup/TagRendering/FreeformInput.svelte +++ b/src/UI/Popup/TagRendering/FreeformInput.svelte @@ -8,6 +8,7 @@ import InputHelper from "../../InputElement/InputHelper.svelte" import type { Feature } from "geojson" import { Unit } from "../../../Models/Unit" + import InputHelpers from "../../InputElement/InputHelpers"; export let value: UIEventSource export let config: TagRenderingConfig @@ -24,9 +25,8 @@ inline = config.freeform?.inline } - export let feedback: UIEventSource = new UIEventSource(undefined) - - let dispatch = createEventDispatcher<{ selected }>() + const dispatch = createEventDispatcher<{selected}>() + export let feedback: UIEventSource onDestroy( value.addCallbackD(() => { dispatch("selected") @@ -45,23 +45,25 @@ {feedback} {getCountry} {unit} - on:selected={() => dispatch("selected")} + on:selected + on:submit type={config.freeform.type} {placeholder} {value} /> - {:else} + {:else if InputHelpers.hideInputField.indexOf(config.freeform.type) < 0} dispatch("selected")} + on:selected + on:submit type={config.freeform.type} {placeholder} {value} /> {/if} - +
    diff --git a/src/UI/Popup/TagRendering/Questionbox.svelte b/src/UI/Popup/TagRendering/Questionbox.svelte index 2f06de0c4..f8be57489 100644 --- a/src/UI/Popup/TagRendering/Questionbox.svelte +++ b/src/UI/Popup/TagRendering/Questionbox.svelte @@ -95,7 +95,7 @@ } -
    +
    {#if _questionsToAsk.length === 0} {#if skipped + answered > 0}
    diff --git a/src/UI/Popup/TagRendering/SpecialTranslation.svelte b/src/UI/Popup/TagRendering/SpecialTranslation.svelte index 0e4997a37..094e385e2 100644 --- a/src/UI/Popup/TagRendering/SpecialTranslation.svelte +++ b/src/UI/Popup/TagRendering/SpecialTranslation.svelte @@ -1,51 +1,48 @@ -
    - {#if config.question && $editingEnabled} +
    + {#if config.question && (!editingEnabled || $editingEnabled)} {#if editMode}
    + {#if config.questionhint} +
    + +
    + {/if} + {#if config.mappings?.length >= 8}
    @@ -225,6 +228,7 @@ {unit} feature={selectedElement} value={freeformInput} + on:submit={onSave} /> {:else if mappings !== undefined && !config.multiAnswer} @@ -245,6 +249,7 @@ bind:group={selectedMapping} name={"mappings-radio-" + config.id} value={i} + on:keypress={e => {if(e.key === "Enter") onSave()}} /> {/each} @@ -264,6 +269,7 @@ feature={selectedElement} value={freeformInput} on:selected={() => (selectedMapping = config.mappings?.length)} + on:submit={onSave} /> {/if} @@ -303,6 +309,7 @@ feature={selectedElement} value={freeformInput} on:selected={() => (checkedMappings[config.mappings.length] = true)} + on:submit={onSave} /> {/if} @@ -311,7 +318,7 @@ - state.osmConnection.AttemptLogin()}> + state?.osmConnection?.AttemptLogin()}> diff --git a/src/UI/QueryParameterDocumentation.ts b/src/UI/QueryParameterDocumentation.ts index 450d581e5..0bb2e115b 100644 --- a/src/UI/QueryParameterDocumentation.ts +++ b/src/UI/QueryParameterDocumentation.ts @@ -44,7 +44,13 @@ export default class QueryParameterDocumentation { source: { osmTags: "id~*", }, - mapRendering: null, + lineRendering: [ + { + color: "#000000", + width: 5, + }, + ], + pointRendering: null, }, ], }) diff --git a/src/UI/Reviews/ReviewForm.svelte b/src/UI/Reviews/ReviewForm.svelte index f048dbc74..ecb5afa0a 100644 --- a/src/UI/Reviews/ReviewForm.svelte +++ b/src/UI/Reviews/ReviewForm.svelte @@ -46,7 +46,7 @@ opinion: opinion.data, metadata: { nickname, is_affiliated: isAffiliated.data }, } - if (state.featureSwitchIsTesting.data) { + if (state.featureSwitchIsTesting?.data ?? true) { console.log("Testing - not actually saving review", review) await Utils.waitFor(1000) } else { diff --git a/src/UI/SpecialVisualizations.ts b/src/UI/SpecialVisualizations.ts index 9cc631d58..f6980cacf 100644 --- a/src/UI/SpecialVisualizations.ts +++ b/src/UI/SpecialVisualizations.ts @@ -75,6 +75,7 @@ import AllReviews from "./Reviews/AllReviews.svelte" import StarsBarIcon from "./Reviews/StarsBarIcon.svelte" import ReviewForm from "./Reviews/ReviewForm.svelte" import Questionbox from "./Popup/TagRendering/Questionbox.svelte" +import { TagUtils } from "../Logic/Tags/TagUtils" class NearbyImageVis implements SpecialVisualization { // Class must be in SpecialVisualisations due to weird cyclical import that breaks the tests @@ -247,6 +248,11 @@ export default class SpecialVisualizations { * // Return empty list on empty input * SpecialVisualizations.constructSpecification("") // => [] * + * // Simple case + * const oh = SpecialVisualizations.constructSpecification("The opening hours with value {opening_hours} can be seen in the following table:
    {opening_hours_table()}") + * oh[0] // => "The opening hours with value {opening_hours} can be seen in the following table:
    " + * oh[1].func.funcName // => "opening_hours_table" + * * // Advanced cases with commas, braces and newlines should be handled without problem * const templates = SpecialVisualizations.constructSpecification("{send_email(&LBRACEemail&RBRACE,Broken bicycle pump,Hello&COMMA\n\nWith this email&COMMA I'd like to inform you that the bicycle pump located at https://mapcomplete.org/cyclofix?lat=&LBRACE_lat&RBRACE&lon=&LBRACE_lon&RBRACE&z=18#&LBRACEid&RBRACE is broken.\n\n Kind regards,Report this bicycle pump as broken)}") * const templ = > templates[0] @@ -308,20 +314,6 @@ export default class SpecialVisualizations { } } - // Let's to a small sanity check to help the theme designers: - if (template.search(/{[^}]+\([^}]*\)}/) >= 0) { - // Hmm, we might have found an invalid rendering name - - let suggestion = "" - if (SpecialVisualizations.specialVisualizations?.length > 0) { - suggestion = - "did you mean one of: " + - SpecialVisualizations.specialVisualizations - .map((sp) => sp.funcName + "()") - .join(", ") - } - } - // IF we end up here, no changes have to be made - except to remove any resting {} return [template] } @@ -438,7 +430,7 @@ export default class SpecialVisualizations { return new SvelteUIElement(AddNewPoint, { state, coordinate: { lon, lat }, - }) + }).SetClass("w-full h-full") }, }, { @@ -752,7 +744,7 @@ export default class SpecialVisualizations { const reviews = FeatureReviews.construct( feature, tags, - state.userRelatedState.mangroveIdentity, + state.userRelatedState?.mangroveIdentity, { nameKey: nameKey, fallbackName, @@ -784,7 +776,7 @@ export default class SpecialVisualizations { const reviews = FeatureReviews.construct( feature, tags, - state.userRelatedState.mangroveIdentity, + state.userRelatedState?.mangroveIdentity, { nameKey: nameKey, fallbackName, @@ -991,7 +983,10 @@ export default class SpecialVisualizations { constr: (state, tagsSource) => new VariableUiElement( tagsSource.map((tags) => { - const layer = state.layout.getMatchingLayer(tags) + if (state.layout === undefined) { + return "" + } + const layer = state.layout?.getMatchingLayer(tags) const title = layer?.title?.GetRenderValue(tags) if (title === undefined) { return undefined @@ -1318,6 +1313,38 @@ export default class SpecialVisualizations { ) }, }, + { + funcName: "translated", + docs: "If the given key can be interpreted as a JSON, only show the key containing the current language (or 'en'). This specialRendering is meant to be used by MapComplete studio and is not useful in map themes", + needsUrls: [], + args: [ + { + name: "key", + doc: "The attribute to interpret as json", + defaultValue: "value", + }, + ], + constr( + state: SpecialVisualizationState, + tagSource: UIEventSource>, + argument: string[], + feature: Feature, + layer: LayerConfig + ): BaseUIElement { + return new VariableUiElement( + tagSource.map((tags) => { + const v = tags[argument[0] ?? "value"] + try { + const tr = typeof v === "string" ? JSON.parse(v) : v + return new Translation(tr).SetClass("font-bold") + } catch (e) { + console.error("Cannot create a translation for", v, "due to", e) + return JSON.stringify(v) + } + }) + ) + }, + }, { funcName: "fediverse_link", docs: "Converts a fediverse username or link into a clickable link", @@ -1356,6 +1383,70 @@ export default class SpecialVisualizations { ) }, }, + { + funcName: "braced", + docs: "Show a literal text within braces", + needsUrls: [], + args: [ + { + name: "text", + required: true, + doc: "The value to show", + }, + ], + constr( + state: SpecialVisualizationState, + tagSource: UIEventSource>, + args: string[], + feature: Feature, + layer: LayerConfig + ): BaseUIElement { + return new FixedUiElement("{" + args[0] + "}") + }, + }, + { + funcName: "tags", + docs: "Shows a (json of) tags in a human-readable way + links to the wiki", + needsUrls: [], + args: [ + { + name: "key", + defaultValue: "value", + doc: "The key to look for the tags", + }, + ], + constr( + state: SpecialVisualizationState, + tagSource: UIEventSource>, + argument: string[], + feature: Feature, + layer: LayerConfig + ): BaseUIElement { + const key = argument[0] ?? "value" + return new VariableUiElement( + tagSource.map((tags) => { + let value = tags[key] + if (!value) { + return new FixedUiElement("No tags found").SetClass("font-bold") + } + if (typeof value === "string" && value.startsWith("{")) { + value = JSON.parse(value) + } + try { + const parsed = TagUtils.Tag(value) + return parsed.asHumanString(true, false, {}) + } catch (e) { + return new FixedUiElement( + "Could not parse this tag: " + + JSON.stringify(value) + + " due to " + + e + ).SetClass("alert") + } + }) + ) + }, + }, ] specialVisualizations.push(new AutoApplyButton(specialVisualizations)) diff --git a/src/UI/Studio/ArrayMultiAnswer.svelte b/src/UI/Studio/ArrayMultiAnswer.svelte new file mode 100644 index 000000000..7be4707e2 --- /dev/null +++ b/src/UI/Studio/ArrayMultiAnswer.svelte @@ -0,0 +1,44 @@ + + +
    + +
    diff --git a/src/UI/Studio/ChooseLayerToEdit.svelte b/src/UI/Studio/ChooseLayerToEdit.svelte new file mode 100644 index 000000000..4992bf63a --- /dev/null +++ b/src/UI/Studio/ChooseLayerToEdit.svelte @@ -0,0 +1,18 @@ + + +{#if layerIds.length > 0} + +
    + {#each Array.from(layerIds) as layer} + + {/each} +
    +{/if} diff --git a/src/UI/Studio/EditItemButton.svelte b/src/UI/Studio/EditItemButton.svelte new file mode 100644 index 000000000..bc06185e5 --- /dev/null +++ b/src/UI/Studio/EditItemButton.svelte @@ -0,0 +1,36 @@ + + + dispatch("layerSelected", info)}> +
    + +
    + {info.id} + {#if info.owner && info.owner !== $selfId} + (made by {$displayName ?? info.owner}) + {/if} +
    diff --git a/src/UI/Studio/EditLayer.svelte b/src/UI/Studio/EditLayer.svelte new file mode 100644 index 000000000..01e3105ff --- /dev/null +++ b/src/UI/Studio/EditLayer.svelte @@ -0,0 +1,178 @@ + +
    + +
    + + {#if $title === undefined} +

    Creating a new layer

    + {:else} +

    Editing layer {$title}

    + {/if} + {#if $currentlyMissing.length > 0} +
    + {:else if $hasErrors > 0} +
    {$hasErrors} errors detected
    + {:else} + + Try it out + + + {/if} +
    + + {#if $currentlyMissing.length > 0} + + {#each requiredFields as required} + + {/each} + {:else} +
    + +
    General properties + +
    +
    + + +
    + + +
    Information panel (questions and answers) + +
    +
    + + + +
    + +
    + Creating a new point + +
    + +
    + +
    + +
    Rendering on the map + +
    +
    + + +
    + +
    Advanced functionality + +
    +
    + + +
    +
    Configuration file
    +
    +
    + Below, you'll find the raw configuration file in `.json`-format. + This is mostly for debugging purposes +
    +
    + ")} /> +
    + + +
    + The testobject (which is used to render the questions in the 'information panel' item has the following + tags: +
    + + +
    +
    +
    + {#if $highlightedItem !== undefined} + highlightedItem.setData(undefined)}> +
    + +
    +
    + {/if} + + {/if} +
    diff --git a/src/UI/Studio/EditLayerState.ts b/src/UI/Studio/EditLayerState.ts new file mode 100644 index 000000000..bf5bd09e1 --- /dev/null +++ b/src/UI/Studio/EditLayerState.ts @@ -0,0 +1,366 @@ +import { ConfigMeta } from "./configMeta" +import { Store, UIEventSource } from "../../Logic/UIEventSource" +import { LayerConfigJson } from "../../Models/ThemeConfig/Json/LayerConfigJson" +import { + Conversion, + ConversionMessage, + DesugaringContext, + Pipe, +} from "../../Models/ThemeConfig/Conversion/Conversion" +import { PrepareLayer } from "../../Models/ThemeConfig/Conversion/PrepareLayer" +import { ValidateLayer, ValidateTheme } from "../../Models/ThemeConfig/Conversion/Validation" +import { AllSharedLayers } from "../../Customizations/AllSharedLayers" +import { QuestionableTagRenderingConfigJson } from "../../Models/ThemeConfig/Json/QuestionableTagRenderingConfigJson" +import { TagUtils } from "../../Logic/Tags/TagUtils" +import StudioServer from "./StudioServer" +import { Utils } from "../../Utils" +import { OsmConnection } from "../../Logic/Osm/OsmConnection" +import { OsmTags } from "../../Models/OsmFeature" +import { Feature, Point } from "geojson" +import LayerConfig from "../../Models/ThemeConfig/LayerConfig" +import { LayoutConfigJson } from "../../Models/ThemeConfig/Json/LayoutConfigJson" +import { PrepareTheme } from "../../Models/ThemeConfig/Conversion/PrepareTheme" +import { ConversionContext } from "../../Models/ThemeConfig/Conversion/ConversionContext" +import { LocalStorageSource } from "../../Logic/Web/LocalStorageSource" + +export interface HighlightedTagRendering { + path: ReadonlyArray + schema: ConfigMeta +} + +export abstract class EditJsonState { + public readonly schema: ConfigMeta[] + public readonly category: "layers" | "themes" + public readonly server: StudioServer + public readonly showIntro: UIEventSource<"no" | "intro" | "tagrenderings"> = ( + LocalStorageSource.Get("studio-show-intro", "intro") + ) + + public readonly expertMode: UIEventSource + + public readonly configuration: UIEventSource> = new UIEventSource>({}) + public readonly messages: Store + + /** + * The EditLayerUI shows a 'schemaBasedInput' for this path to pop advanced questions out + */ + public readonly highlightedItem: UIEventSource = new UIEventSource( + undefined + ) + private sendingUpdates = false + private readonly _stores = new Map>() + + constructor( + schema: ConfigMeta[], + server: StudioServer, + category: "layers" | "themes", + options?: { + expertMode?: UIEventSource + } + ) { + this.schema = schema + this.server = server + this.category = category + this.expertMode = options?.expertMode ?? new UIEventSource(false) + + this.messages = this.setupErrorsForLayers() + + const layerId = this.getId() + this.highlightedItem.addCallbackD((hl) => console.log("Highlighted item is", hl)) + this.configuration + .mapD((config) => { + if (!this.sendingUpdates) { + console.log("Not sending updates yet! Trigger 'startSendingUpdates' first") + return undefined + } + return JSON.stringify(config, null, " ") + }) + .stabilized(100) + .addCallbackD(async (config) => { + const id = layerId.data + if (id === undefined) { + console.warn("No id found in layer, not updating") + return + } + await this.server.update(id, config, this.category) + }) + } + + public startSavingUpdates(enabled = true) { + this.sendingUpdates = enabled + if (enabled) { + this.configuration.ping() + } + } + + public getCurrentValueFor(path: ReadonlyArray): any | undefined { + // Walk the path down to see if we find something + let entry = this.configuration.data + for (let i = 0; i < path.length; i++) { + if (entry === undefined) { + // We reached a dead end - no old vlaue + return undefined + } + const breadcrumb = path[i] + entry = entry[breadcrumb] + } + return entry + } + + public getStoreFor(path: ReadonlyArray): UIEventSource { + const key = path.join(".") + + const store = new UIEventSource(this.getCurrentValueFor(path)) + store.addCallback((v) => { + this.setValueAt(path, v) + }) + this._stores.set(key, store) + this.configuration.addCallbackD((config) => { + store.setData(this.getCurrentValueFor(path)) + }) + return store + } + + public register( + path: ReadonlyArray, + value: Store, + noInitialSync: boolean = true + ): () => void { + const unsync = value.addCallback((v) => { + this.setValueAt(path, v) + }) + if (!noInitialSync) { + this.setValueAt(path, value.data) + } + return unsync + } + + public getSchemaStartingWith(path: string[]) { + return this.schema.filter( + (sch) => + !path.some((part, i) => !(sch.path.length > path.length && sch.path[i] === part)) + ) + } + + public getTranslationAt(path: string[]): ConfigMeta { + const origConfig = this.getSchema(path)[0] + return { + path, + type: "translation", + hints: { + typehint: "translation", + }, + required: origConfig.required ?? false, + description: origConfig.description ?? "A translatable object", + } + } + + public getSchema(path: string[]): ConfigMeta[] { + const schemas = this.schema.filter( + (sch) => + sch !== undefined && + !path.some((part, i) => !(sch.path.length == path.length && sch.path[i] === part)) + ) + if (schemas.length == 0) { + console.warn("No schemas found for path", path.join(".")) + } + return schemas + } + + public setValueAt(path: ReadonlyArray, v: any) { + let entry = this.configuration.data + const isUndefined = + v === undefined || + v === null || + v === "" || + (typeof v === "object" && Object.keys(v).length === 0) + + for (let i = 0; i < path.length - 1; i++) { + const breadcrumb = path[i] + if (entry[breadcrumb] === undefined) { + if (isUndefined) { + // we have a dead end _and_ we do not need to set a value - we do an early return + return + } + entry[breadcrumb] = typeof path[i + 1] === "number" ? [] : {} + } + entry = entry[breadcrumb] + } + + const lastBreadcrumb = path.at(-1) + if (isUndefined) { + if (entry && entry[lastBreadcrumb]) { + delete entry[lastBreadcrumb] + this.configuration.ping() + } + } else if (entry[lastBreadcrumb] !== v) { + entry[lastBreadcrumb] = v + this.configuration.ping() + } + } + + public messagesFor(path: ReadonlyArray): Store { + return this.messages.map((msgs) => { + if (!msgs) { + return [] + } + return msgs.filter((msg) => { + const pth = msg.context.path + for (let i = 0; i < Math.min(pth.length, path.length); i++) { + if (pth[i] !== path[i]) { + return false + } + } + return true + }) + }) + } + + protected abstract buildValidation(state: DesugaringContext): Conversion + + protected abstract getId(): Store + + private setupErrorsForLayers(): Store { + const layers = AllSharedLayers.getSharedLayersConfigs() + const questions = layers.get("questions") + const sharedQuestions = new Map() + for (const question of questions.tagRenderings) { + sharedQuestions.set(question["id"], question) + } + let state: DesugaringContext = { + tagRenderings: sharedQuestions, + sharedLayers: layers, + } + const prepare = this.buildValidation(state) + return this.configuration.mapD((config) => { + const context = ConversionContext.construct([], ["prepare"]) + try { + prepare.convert(config, context) + } catch (e) { + console.error(e) + context.err(e) + } + return context.messages + }) + } +} + +export default class EditLayerState extends EditJsonState { + // Needed for the special visualisations + public readonly osmConnection: OsmConnection + public readonly imageUploadManager = { + getCountsFor() { + return 0 + }, + } + public readonly layout: { getMatchingLayer: (key: any) => LayerConfig } + public readonly featureSwitches: { + featureSwitchIsDebugging: UIEventSource + } + + /** + * Used to preview and interact with the questions + */ + public readonly testTags = new UIEventSource({ id: "node/-12345" }) + public readonly exampleFeature: Feature = { + type: "Feature", + properties: this.testTags.data, + geometry: { + type: "Point", + coordinates: [3.21, 51.2], + }, + } + + constructor( + schema: ConfigMeta[], + server: StudioServer, + osmConnection: OsmConnection, + options: { expertMode: UIEventSource } + ) { + super(schema, server, "layers", options) + this.osmConnection = osmConnection + this.layout = { + getMatchingLayer: (_) => { + try { + return new LayerConfig(this.configuration.data, "dynamic") + } catch (e) { + return undefined + } + }, + } + this.featureSwitches = { + featureSwitchIsDebugging: new UIEventSource(true), + } + + this.addMissingTagRenderingIds() + + this.configuration.addCallbackAndRunD((layer) => { + if (layer.tagRenderings) { + // A bit of cleanup + const lBefore = layer.tagRenderings.length + const cleaned = Utils.NoNull(layer.tagRenderings) + if (cleaned.length != lBefore) { + layer.tagRenderings = cleaned + this.configuration.ping() + } + } + }) + } + + protected buildValidation(state: DesugaringContext) { + return new Pipe( + new PrepareLayer(state), + new ValidateLayer("dynamic", false, undefined, true) + ) + } + + protected getId(): Store { + return this.configuration.mapD((config) => config.id) + } + + private addMissingTagRenderingIds() { + this.configuration.addCallbackD((config) => { + const trs = Utils.NoNull(config.tagRenderings ?? []) + for (let i = 0; i < trs.length; i++) { + const tr = trs[i] + if (typeof tr === "string") { + continue + } + if (!tr["id"] && !tr["override"]) { + const qtr = tr + let id = "" + i + "_" + Utils.randomString(5) + if (qtr?.freeform?.key) { + id = qtr?.freeform?.key + } else if (qtr.mappings?.[0]?.if) { + id = + qtr.freeform?.key ?? + TagUtils.Tag(qtr.mappings[0].if).usedKeys()?.[0] ?? + "" + i + } + qtr["id"] = id + } + } + }) + } +} + +export class EditThemeState extends EditJsonState { + constructor( + schema: ConfigMeta[], + server: StudioServer, + options: { expertMode: UIEventSource } + ) { + super(schema, server, "themes", options) + } + + protected buildValidation(state: DesugaringContext): Conversion { + return new Pipe( + new PrepareTheme(state), + new ValidateTheme(undefined, "", false, new Set(state.tagRenderings.keys())) + ) + } + + protected getId(): Store { + return this.configuration.mapD((config) => config.id) + } +} diff --git a/src/UI/Studio/EditTheme.svelte b/src/UI/Studio/EditTheme.svelte new file mode 100644 index 000000000..611c161e5 --- /dev/null +++ b/src/UI/Studio/EditTheme.svelte @@ -0,0 +1,78 @@ + +
    +
    + +

    Editing theme {$title}

    + {#if $hasErrors > 0} +
    {$hasErrors} errors detected
    + {:else} + + Try it out + + + {/if} +
    + +
    + {Object.keys(perRegion).join(";")} + +
    Basic properties
    +
    + + + +
    + +
    Layers
    +
    + + +
    +
    Feature switches
    +
    + +
    + +
    Advanced options
    +
    + +
    + +
    Configuration file
    +
    +
    + {JSON.stringify($config)} +
    + + + +
    +
    +
    + +
    diff --git a/src/UI/Studio/ErrorIndicatorForRegion.svelte b/src/UI/Studio/ErrorIndicatorForRegion.svelte new file mode 100644 index 000000000..adcafe6ad --- /dev/null +++ b/src/UI/Studio/ErrorIndicatorForRegion.svelte @@ -0,0 +1,19 @@ + + +{#if $messagesCount > 0} + + + {$messagesCount} + +{/if} diff --git a/src/UI/Studio/MappingInput.svelte b/src/UI/Studio/MappingInput.svelte new file mode 100644 index 000000000..b8d695ccf --- /dev/null +++ b/src/UI/Studio/MappingInput.svelte @@ -0,0 +1,70 @@ + + + + +{#if editMode} +
    +
    + +
    + + +
    +{:else} +
    + {#if Object.keys($thenText).length > 0} + + {$thenTextEn} + + {:else} + No then is set + {/if} + +
    +{/if} + diff --git a/src/UI/Studio/QuestionPreview.svelte b/src/UI/Studio/QuestionPreview.svelte new file mode 100644 index 000000000..adaeda45d --- /dev/null +++ b/src/UI/Studio/QuestionPreview.svelte @@ -0,0 +1,131 @@ + + +
    + +
    + + {#if $id} + TagRendering {$id} + {/if} + state.highlightedItem.setData({path, schema})}> + {#if schema.hints.question} + {schema.hints.question} + {/if} + + {#if description} + + {/if} + {#each $messages as message} + + {/each} + + + + +
    + +
    +

    Preview of this question

    + {#each $configs as config} + {#if config.error !== undefined} +
    Could not create a preview of this tagRendering: {config.error}
    + {:else} + {#if config.condition && !config.condition.matchesProperties($tags)} + This tagRendering is currently not shown. It will appear if the feature matches the condition + + + + + Try to answer the relevant question above + {:else if config.metacondition && !config.metacondition.matchesProperties($tags)} + This tagRendering is currently not shown. It will appear if the feature matches the metacondition + + + + For a breakdown of usable meta conditions, go to a mapcomplete theme > settings and enable debug-data. The meta-tags will appear at the bottom + {:else} + + {/if} + {/if} + {/each} +
    + + +
    diff --git a/src/UI/Studio/Region.svelte b/src/UI/Studio/Region.svelte new file mode 100644 index 000000000..1cc833473 --- /dev/null +++ b/src/UI/Studio/Region.svelte @@ -0,0 +1,41 @@ + +{#if configs === undefined} + Bug: 'Region' received 'undefined' +{:else if configs.length === 0} + Bug: Region received empty list as configuration +{:else if title} +
    +

    {title}

    +
    + + {#each configsFiltered as config} + + {/each} +
    +
    +{:else} +
    + {#each configsFiltered as config} + + {/each} +
    +{/if} + diff --git a/src/UI/Studio/RegisteredTagInput.svelte b/src/UI/Studio/RegisteredTagInput.svelte new file mode 100644 index 000000000..0764ef3d0 --- /dev/null +++ b/src/UI/Studio/RegisteredTagInput.svelte @@ -0,0 +1,66 @@ + + +{#if mode === "editing"} +
    +

    {schema.hints.question ?? "What tags should be applied?"}

    + {schema.description} + +
    + + +
    +
    RegisteredTagInput based on schema: {JSON.stringify(schema)}
    +
    +{:else} +
    +
    + + {schema.path.at(-1)} + {simplify($tag)} +
    + +
    +{/if} diff --git a/src/UI/Studio/SchemaBasedArray.svelte b/src/UI/Studio/SchemaBasedArray.svelte new file mode 100644 index 000000000..389e7406a --- /dev/null +++ b/src/UI/Studio/SchemaBasedArray.svelte @@ -0,0 +1,183 @@ + +
    +

    {schema.path.at(-1)}

    + + {#if subparts.length > 0} + + {schema.description} + + {/if} + {#if $currentValue === undefined} + No array defined + {:else if $currentValue.length === 0} + No values are defined + {#if $messages.length > 0} + {#each $messages as message} + + {/each} + {/if} + {:else if subparts.length === 0} + + {#each $currentValue as value, i} +
    + + +
    + {/each} + {:else} + {#each $currentValue as value, i} + {#if !isTagRenderingBlock} +
    +

    {singular} {i}

    + +
    + {/if} +
    + {#if isTagRenderingBlock} + + + + {#if i > 0} + + + + {/if} + {#if i + 1 < $currentValue.length} + + + {/if} + + + {:else if schema.hints.types} + + {:else} + {#each subparts as subpart} + + {/each} + {/if} +
    + {/each} + {/if} +
    + + {#if path.length === 1 && path[0] === "tagRenderings"} + + {/if} + +
    +
    diff --git a/src/UI/Studio/SchemaBasedField.svelte b/src/UI/Studio/SchemaBasedField.svelte new file mode 100644 index 000000000..5373eb01a --- /dev/null +++ b/src/UI/Studio/SchemaBasedField.svelte @@ -0,0 +1,176 @@ + + +{#if err !== undefined} + {err} +{:else} +
    + + {#if $messages.length > 0} + {#each $messages as message} + + {/each} + {/if} + {#if window.location.hostname === "127.0.0.1"} + console.log(schema)}>SchemaBasedField {path.join(".")} console.log(schema)}>{schema.hints.typehint} Group: {schema.hints.group} + {/if} +
    +{/if} diff --git a/src/UI/Studio/SchemaBasedInput.svelte b/src/UI/Studio/SchemaBasedInput.svelte new file mode 100644 index 000000000..cffd8a1b3 --- /dev/null +++ b/src/UI/Studio/SchemaBasedInput.svelte @@ -0,0 +1,29 @@ + +{#if (schema.hints?.group !== "expert" || $expertMode) && schema.hints.group !== "hidden"} + {#if schema.hints?.typehint?.endsWith("[]")} + + + {:else if schema.type === "array" && schema.hints.multianswer === "true"} + + {:else if schema.type === "array"} + + {:else if schema.hints?.types} + + {:else} + + {/if} +{:else if window.location.hostname === "127.0.0.1"} +
    Not showing SBI {schema.path.join(".")} due to group {schema.hints.group}
    +{/if} diff --git a/src/UI/Studio/SchemaBasedMultiType.svelte b/src/UI/Studio/SchemaBasedMultiType.svelte new file mode 100644 index 000000000..da47b7f7c --- /dev/null +++ b/src/UI/Studio/SchemaBasedMultiType.svelte @@ -0,0 +1,233 @@ + + +
    + {#if schema.hints.title !== undefined} +

    {schema.hints.title}

    +
    {schema.description}
    + {/if} + {#if hasOverride} + This object refers to {existingValue.builtin} and overrides some properties. This cannot be edited with MapComplete + Studio + {:else} +
    + +
    + + {#if chosenOption !== undefined} + {#each subSchemas as subschema} + {#if $expertMode || subschema.hints?.group !== "expert"} + + {:else if window.location.hostname === "127.0.0.1"} + Omitted expert question {subschema.path.join(".")} + + {/if} + {/each} + {:else if $messages.length > 0} + {#each $messages as message} + + {/each} + {/if} + {/if} + {#if window.location.hostname === "127.0.0.1"} + SchemaBasedMultiType {path.join(".")} console.log(schema)}>{schema.hints.typehint} + {/if} +
    diff --git a/src/UI/Studio/SchemaBasedTranslationInput.svelte b/src/UI/Studio/SchemaBasedTranslationInput.svelte new file mode 100644 index 000000000..158cd7626 --- /dev/null +++ b/src/UI/Studio/SchemaBasedTranslationInput.svelte @@ -0,0 +1,16 @@ + + + diff --git a/src/UI/Studio/ShowConversionMessage.svelte b/src/UI/Studio/ShowConversionMessage.svelte new file mode 100644 index 000000000..55de9a675 --- /dev/null +++ b/src/UI/Studio/ShowConversionMessage.svelte @@ -0,0 +1,29 @@ + + +{#if message.level === "error"} +
    + + {message.message} +
    +
    +{:else if message.level === "warning"} +
    + + {message.message} +
    +
    +{:else if message.level === "information"} +
    + + {message.message} +
    +
    +{/if} diff --git a/src/UI/Studio/ShowConversionMessages.svelte b/src/UI/Studio/ShowConversionMessages.svelte new file mode 100644 index 000000000..7cdf1d28d --- /dev/null +++ b/src/UI/Studio/ShowConversionMessages.svelte @@ -0,0 +1,22 @@ + + +{#if messages.length === 0} +
    + No errors, warnings or messages +
    + {/if} + +{#each messages as message} +
  • + {message.level} + {message.context.path.join(".")} + {message.message} + + {message.context.operation.join(".")} + +
  • +{/each} diff --git a/src/UI/Studio/StudioServer.ts b/src/UI/Studio/StudioServer.ts new file mode 100644 index 000000000..0151376a5 --- /dev/null +++ b/src/UI/Studio/StudioServer.ts @@ -0,0 +1,84 @@ +import { Utils } from "../../Utils" +import Constants from "../../Models/Constants" +import { LayerConfigJson } from "../../Models/ThemeConfig/Json/LayerConfigJson" +import { Store } from "../../Logic/UIEventSource" + +export default class StudioServer { + private readonly url: string + private readonly _userId: Store + + constructor(url: string, userId: Store) { + this.url = url + this._userId = userId + } + + public async fetchOverview(): Promise< + { + id: string + owner: number + category: "layers" | "themes" + }[] + > { + const uid = this._userId.data + const { allFiles } = <{ allFiles: string[] }>( + await Utils.downloadJson(this.url + "/overview") + ) + const layerOverview: { + id: string + owner: number | undefined + category: "layers" | "themes" + }[] = [] + for (let file of allFiles) { + let parts = file.split("/") + let owner = Number(parts[0]) + if (!isNaN(owner)) { + parts.splice(0, 1) + file = file.substring(file.indexOf("/") + 1) + } else { + owner = undefined + } + const category = <"layers" | "themes">parts[0] + const id = file.substring(file.lastIndexOf("/") + 1, file.length - ".json".length) + if (Constants.priviliged_layers.indexOf(id) > 0) { + continue + } + layerOverview.push({ id, owner, category }) + } + return layerOverview + } + + async fetch( + layerId: string, + category: "layers" | "themes", + uid?: number + ): Promise { + try { + return await Utils.downloadJson(this.urlFor(layerId, category, uid)) + } catch (e) { + return undefined + } + } + + async update(id: string, config: string, category: "layers" | "themes") { + if (id === undefined || id === "") { + return + } + await fetch(this.urlFor(id, category), { + method: "POST", + headers: { + "Content-Type": "application/json;charset=utf-8", + }, + body: config, + }) + } + + public layerUrl(id: string) { + return this.urlFor(id, "layers") + } + + public urlFor(id: string, category: "layers" | "themes", uid?: number) { + uid ??= this._userId.data + const uidStr = uid !== undefined ? "/" + uid : "" + return `${this.url}${uidStr}/${category}/${id}/${id}.json` + } +} diff --git a/src/UI/Studio/TagExpression.svelte b/src/UI/Studio/TagExpression.svelte new file mode 100644 index 000000000..d334d7db8 --- /dev/null +++ b/src/UI/Studio/TagExpression.svelte @@ -0,0 +1,173 @@ + + + +
    + + {#if !uploadableOnly} + + {/if} + +
    + {#each $basicTags as basicTag (basicTag)} +
    + + {#if $basicTags.length + $expressions.length > 1} + + {/if} +
    + {/each} + {#each $expressions as expression} + + + + {/each} +
    + + {#if !uploadableOnly} + + + {/if} + +
    +
    + +
    diff --git a/src/UI/Studio/TagInfoStats.svelte b/src/UI/Studio/TagInfoStats.svelte new file mode 100644 index 000000000..7d0b89284 --- /dev/null +++ b/src/UI/Studio/TagInfoStats.svelte @@ -0,0 +1,63 @@ + + +{#if $tagStabilized !== $tag} + {#if !silent} + + {/if} +{:else if $tagInfoStats && (!silent || $total < 250) } + + {$total} features have {$tag} + +{/if} diff --git a/src/UI/Studio/TagInput/BasicTagInput.svelte b/src/UI/Studio/TagInput/BasicTagInput.svelte new file mode 100644 index 000000000..34f763b39 --- /dev/null +++ b/src/UI/Studio/TagInput/BasicTagInput.svelte @@ -0,0 +1,134 @@ + + + +
    + +
    + + + + +
    + + {#if $feedbackKey} + + {:else if $feedbackValue} + + {:else if $feedbackGlobal} + + {/if} + +
    diff --git a/src/UI/Studio/TagInput/FullTagInput.svelte b/src/UI/Studio/TagInput/FullTagInput.svelte new file mode 100644 index 000000000..8556eb1a0 --- /dev/null +++ b/src/UI/Studio/TagInput/FullTagInput.svelte @@ -0,0 +1,19 @@ + + +
    + + + +
    diff --git a/src/UI/Studio/TagRenderingFreeformInput.svelte b/src/UI/Studio/TagRenderingFreeformInput.svelte new file mode 100644 index 000000000..fa5727ac9 --- /dev/null +++ b/src/UI/Studio/TagRenderingFreeformInput.svelte @@ -0,0 +1,14 @@ + + +XYZ diff --git a/src/UI/Studio/TagRenderingInput.svelte b/src/UI/Studio/TagRenderingInput.svelte new file mode 100644 index 000000000..9fc1caf41 --- /dev/null +++ b/src/UI/Studio/TagRenderingInput.svelte @@ -0,0 +1,173 @@ + + +{#if typeof $store === "string"} +
    + + +
    +{:else} +
    +
    + +
    + {#if $allowQuestions} + + + {/if} + {#each ($mappings ?? []) as mapping, i (mapping)} +
    + + + +
    + {/each} + + + + + +

    Text field and input element configuration

    +
    + + + + +
    + + + {#if $expertMode} + + {/if} + {#each missing as field} + + {/each} + + state.showIntro.setData("tagrenderings")}> Show the introduction again + +
    +{/if} diff --git a/src/UI/Studio/configMeta.ts b/src/UI/Studio/configMeta.ts new file mode 100644 index 000000000..2b202e769 --- /dev/null +++ b/src/UI/Studio/configMeta.ts @@ -0,0 +1,49 @@ +import { JsonSchema, JsonSchemaType } from "./jsonSchema" + +export interface ConfigMeta { + path: string[] + type: JsonSchemaType | JsonSchema[] + /** + * All fields are lowercase, as they should be case-insensitive + */ + hints: { + group?: string + typehint?: string + typehelper?: string + /** + * If multiple subcategories can be chosen + */ + types?: string + question?: string + iftrue?: string + iffalse?: string + ifunset?: string + inline?: string + default?: string + typesdefault?: string + suggestions?: [] + title?: string + multianswer?: "true" | string + } + required: boolean + description: string +} + +export class ConfigMetaUtils { + static isTranslation(configMeta: ConfigMeta) { + /* { + "$ref": "#/definitions/Record" + }, + { + "type": "string" + }*/ + if (!configMeta.type) { + return false + } + if (Array.isArray(configMeta.type)) { + return configMeta.type.some((t) => t["$ref"] === "#/definitions/Record") + } else { + return configMeta.type["$ref"] === "#/definitions/Record" + } + } +} diff --git a/src/UI/Studio/jsonSchema.ts b/src/UI/Studio/jsonSchema.ts new file mode 100644 index 000000000..349d66a5a --- /dev/null +++ b/src/UI/Studio/jsonSchema.ts @@ -0,0 +1,20 @@ +/** + * Extracts the data from the scheme file and writes them in a flatter structure + */ + +export type JsonSchemaType = + | string + | { $ref: string; description?: string } + | { type: string } + | JsonSchemaType[] +export interface JsonSchema { + description?: string + type?: JsonSchemaType + properties?: any + items?: JsonSchema + allOf?: JsonSchema[] + anyOf: JsonSchema[] + enum: JsonSchema[] + $ref: string + required: string[] +} diff --git a/src/UI/StudioGUI.svelte b/src/UI/StudioGUI.svelte new file mode 100644 index 000000000..4a19d812c --- /dev/null +++ b/src/UI/StudioGUI.svelte @@ -0,0 +1,233 @@ + + + d?.error !== undefined)}> +
    +
    + Something went wrong while contacting the MapComplete Studio Server: {$layersWithErr["error"]} +
    + The server might be offline. Please: + +
    + +
    + osmConnection.AttemptLogin()}> + Please log in to use MapComplete Studio + +
    + {#if state === undefined} +
    +
    +

    MapComplete Studio

    + + state = "edit_layer"}> + Edit an existing layer + + createNewLayer()}> + Create a new layer + + state = "edit_theme"}> + Edit a theme + + {editThemeState.configuration.setData({}); state = "editing_theme"}}> + Create a new theme + + {showIntro.setData("intro")} }> + + Show the introduction again + +
    +
    + + Enable more options (expert mode) + MapComplete version {version} +
    +
    + {:else if state === "edit_layer"} + +
    + {state =undefined}}>MapComplete Studio + +

    Choose a layer to edit

    + +

    Your layers

    +
    +

    Layers by other contributors

    + + +

    Official layers by MapComplete

    + +
    + {:else if state === "edit_theme"} + +
    + {state =undefined}}>MapComplete Studio + +

    Choose a theme to edit

    + +

    Your themes

    +
    +

    Themes by other contributors

    + +

    Official themes by MapComplete

    + + +
    + {:else if state === "loading"} +
    + +
    + {:else if state === "editing_layer"} + + {state =undefined}}>MapComplete Studio + + + {:else if state === "editing_theme"} + + {state =undefined}}>MapComplete Studio + + + {/if} +
    +
    + + +{#if {intro, tagrenderings: intro_tagrenderings}[$showIntro]?.sections} + {showIntro.setData("no")}}> +
    + {showIntro.setData("no")}} /> +
    +
    + +{/if} diff --git a/src/UI/StudioGui.ts b/src/UI/StudioGui.ts new file mode 100644 index 000000000..016df2339 --- /dev/null +++ b/src/UI/StudioGui.ts @@ -0,0 +1,10 @@ +import SvelteUIElement from "./Base/SvelteUIElement" +import StudioGUI from "./StudioGUI.svelte" + +export default class StudioGui { + public setup() { + new SvelteUIElement(StudioGUI, {}).SetClass("h-full").AttachTo("main") + } +} + +new StudioGui().setup() diff --git a/src/UI/StylesheetTestGui.svelte b/src/UI/StylesheetTestGui.svelte index ada0a9cb4..94369aa3c 100644 --- a/src/UI/StylesheetTestGui.svelte +++ b/src/UI/StylesheetTestGui.svelte @@ -16,8 +16,12 @@ -style which is used if there is nothing special going on. Some general information, with at most a link to someplace . - Alert: something went wrong - Thank you! Operation successful +
    Alert: something went wrong
    +
    Warning
    +
    Some important information
    +
    Thank you! Operation successful
    + + Loading...
    @@ -42,6 +46,11 @@ Main action (disabled) + + @@ -58,7 +67,7 @@
    -
    +
    - Alert: something went wrong - Thank you! Operation successful +
    Alert: something went wrong
    +
    Warning
    +
    Some important information
    +
    Thank you! Operation successful
    + Loading...
    @@ -98,6 +110,10 @@ Main action (disabled) +
    - Alert: something went wrong - Thank you! Operation successful +
    Alert: something went wrong
    +
    Warning
    +
    Some important information
    +
    Thank you! Operation successful
    + + Loading...
    @@ -127,6 +147,10 @@ JavaScript
    + +
    + Area with extreme high interactivity due to `border-interactive` +