diff --git a/Docs/BuiltinQuestions.md b/Docs/BuiltinQuestions.md
index aff72f926..65dc34aed 100644
--- a/Docs/BuiltinQuestions.md
+++ b/Docs/BuiltinQuestions.md
@@ -1,16 +1,759 @@
[//]: # (WARNING: this file is automatically generated. Please find the sources at the bottom and edit those sources)
- Builtin questions
-===================
+ questions
+===========
+
+
+
+
+
+Special library layer which does not need a '.questions'-prefix before being imported
-The following items can be easily reused in your layers
## Table of contents
-1. [Builtin questions](#builtin-questions)
+1. [questions](#questions)
+ - [Basic tags for this layer](#basic-tags-for-this-layer)
+ - [Supported attributes](#supported-attributes)
+ + [questions](#questions)
+ + [images](#images)
+ + [mapillary](#mapillary)
+ + [export_as_gpx](#export_as_gpx)
+ + [export_as_geojson](#export_as_geojson)
+ + [wikipedia](#wikipedia)
+ + [reviews](#reviews)
+ + [minimap](#minimap)
+ + [phone](#phone)
+ + [osmlink](#osmlink)
+ + [email](#email)
+ + [website](#website)
+ + [wheelchair-access](#wheelchair-access)
+ + [dog-access](#dog-access)
+ + [description](#description)
+ + [opening_hours](#opening_hours)
+ + [opening_hours_24_7](#opening_hours_24_7)
+ + [opening_hours_by_appointment](#opening_hours_by_appointment)
+ + [service:electricity](#serviceelectricity)
+ + [payment-options](#payment-options)
+ + [payment-options-split](#payment-options-split)
+ + [payment-options-advanced](#payment-options-advanced)
+ + [denominations-coins](#denominations-coins)
+ + [denominations-notes](#denominations-notes)
+ + [last_edit](#last_edit)
+ + [all_tags](#all_tags)
+ + [just_created](#just_created)
+ + [multilevels](#multilevels)
+ + [level](#level)
+ + [smoking](#smoking)
+ + [induction-loop](#induction-loop)
+ + [internet](#internet)
+ + [internet-fee](#internet-fee)
+ + [internet-ssid](#internet-ssid)
+ + [luminous_or_lit](#luminous_or_lit)
+
+
+
+
+ - This layer is shown at zoomlevel **0** and higher
+ - Elements don't have a title set and cannot be toggled nor will they show up in the dashboard. If you import this layer in your theme, override `title` to make this toggleable.
+ - Not visible in the layer selection by default. If you want to make this layer toggable, override `name`
+ - Not rendered on the map by default. If you want to rendering this on the map, override `mapRenderings`
+
+
+
+
+ Basic tags for this layer
+---------------------------
+
+
+
+Elements must have the all of following tags to be shown on this layer:
+
+
+
+
+
+
+
+
+ Supported attributes
+----------------------
+
+
+
+Warning:
+
+this quick overview is incomplete
+
+
+
+attribute | type | values which are supported by this layer
+----------- | ------ | ------------------------------------------
+[](https://taginfo.openstreetmap.org/keys/wikidata#values) [wikidata](https://wiki.openstreetmap.org/wiki/Key:wikidata) | [wikidata](../SpecialInputElements.md#wikidata) |
+[](https://taginfo.openstreetmap.org/keys/phone#values) [phone](https://wiki.openstreetmap.org/wiki/Key:phone) | [phone](../SpecialInputElements.md#phone) |
+[](https://taginfo.openstreetmap.org/keys/id#values) [id](https://wiki.openstreetmap.org/wiki/Key:id) | Multiple choice |
+[](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/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)
+[](https://taginfo.openstreetmap.org/keys/dog#values) [dog](https://wiki.openstreetmap.org/wiki/Key:dog) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:dog%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:dog%3Dno) [leashed](https://wiki.openstreetmap.org/wiki/Tag:dog%3Dleashed) [unleashed](https://wiki.openstreetmap.org/wiki/Tag:dog%3Dunleashed)
+[](https://taginfo.openstreetmap.org/keys/description#values) [description](https://wiki.openstreetmap.org/wiki/Key:description) | [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/opening_hours#values) [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) | [opening_hours](../SpecialInputElements.md#opening_hours) | [24/7](https://wiki.openstreetmap.org/wiki/Tag:opening_hours%3D24/7)
+[](https://taginfo.openstreetmap.org/keys/opening_hours#values) [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) | [opening_hours](../SpecialInputElements.md#opening_hours) | ["by appointment"](https://wiki.openstreetmap.org/wiki/Tag:opening_hours%3D"by appointment")
+[](https://taginfo.openstreetmap.org/keys/service:electricity#values) [service:electricity](https://wiki.openstreetmap.org/wiki/Key:service:electricity) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:service:electricity%3Dyes) [limited](https://wiki.openstreetmap.org/wiki/Tag:service:electricity%3Dlimited) [ask](https://wiki.openstreetmap.org/wiki/Tag:service:electricity%3Dask) [no](https://wiki.openstreetmap.org/wiki/Tag:service:electricity%3Dno)
+[](https://taginfo.openstreetmap.org/keys/payment:coins:denominations#values) [payment:coins:denominations](https://wiki.openstreetmap.org/wiki/Key:payment:coins:denominations) | Multiple choice | [0.01 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.01 EUR) [0.02 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.02 EUR) [0.05 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.05 EUR) [0.10 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.10 EUR) [0.20 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.20 EUR) [0.50 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.50 EUR) [1 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D1 EUR) [2 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D2 EUR)
+[](https://taginfo.openstreetmap.org/keys/payment:notes:denominations#values) [payment:notes:denominations](https://wiki.openstreetmap.org/wiki/Key:payment:notes:denominations) | Multiple choice | [5 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D5 EUR) [10 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D10 EUR) [20 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D20 EUR) [50 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D50 EUR) [100 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D100 EUR) [200 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D200 EUR) [500 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D500 EUR)
+[](https://taginfo.openstreetmap.org/keys/id#values) [id](https://wiki.openstreetmap.org/wiki/Key:id) | Multiple choice |
+[](https://taginfo.openstreetmap.org/keys/level#values) [level](https://wiki.openstreetmap.org/wiki/Key:level) | [string](../SpecialInputElements.md#string) | [0](https://wiki.openstreetmap.org/wiki/Tag:level%3D0) [1](https://wiki.openstreetmap.org/wiki/Tag:level%3D1) [-1](https://wiki.openstreetmap.org/wiki/Tag:level%3D-1)
+[](https://taginfo.openstreetmap.org/keys/level#values) [level](https://wiki.openstreetmap.org/wiki/Key:level) | [float](../SpecialInputElements.md#float) | [0](https://wiki.openstreetmap.org/wiki/Tag:level%3D0) [1](https://wiki.openstreetmap.org/wiki/Tag:level%3D1) [-1](https://wiki.openstreetmap.org/wiki/Tag:level%3D-1)
+[](https://taginfo.openstreetmap.org/keys/smoking#values) [smoking](https://wiki.openstreetmap.org/wiki/Key:smoking) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:smoking%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:smoking%3Dno) [outside](https://wiki.openstreetmap.org/wiki/Tag:smoking%3Doutside)
+[](https://taginfo.openstreetmap.org/keys/hearing_loop#values) [hearing_loop](https://wiki.openstreetmap.org/wiki/Key:hearing_loop) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:hearing_loop%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:hearing_loop%3Dno)
+[](https://taginfo.openstreetmap.org/keys/internet_access#values) [internet_access](https://wiki.openstreetmap.org/wiki/Key:internet_access) | Multiple choice | [wlan](https://wiki.openstreetmap.org/wiki/Tag:internet_access%3Dwlan) [no](https://wiki.openstreetmap.org/wiki/Tag:internet_access%3Dno) [terminal](https://wiki.openstreetmap.org/wiki/Tag:internet_access%3Dterminal) [wired](https://wiki.openstreetmap.org/wiki/Tag:internet_access%3Dwired)
+[](https://taginfo.openstreetmap.org/keys/internet_access:fee#values) [internet_access:fee](https://wiki.openstreetmap.org/wiki/Key:internet_access:fee) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:internet_access:fee%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:internet_access:fee%3Dno) [customers](https://wiki.openstreetmap.org/wiki/Tag:internet_access:fee%3Dcustomers)
+[](https://taginfo.openstreetmap.org/keys/internet_access:ssid#values) [internet_access:ssid](https://wiki.openstreetmap.org/wiki/Key:internet_access:ssid) | [string](../SpecialInputElements.md#string) | [Telekom](https://wiki.openstreetmap.org/wiki/Tag:internet_access:ssid%3DTelekom)
+
+
+
+
+### questions
+
+
+
+Show the questions block at this location
+
+This tagrendering has no question and is thus read-only
+
+
+
+
+
+### 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
+
+
+
+
+
+### mapillary
+
+
+
+Shows a button to open Mapillary on this location
+
+This tagrendering has no question and is thus read-only
+
+
+
+
+
+### export_as_gpx
+
+
+
+Shows a button to export this feature as GPX. Especially useful for route relations
+
+This tagrendering has no question and is thus read-only
+
+
+
+
+
+### export_as_geojson
+
+
+
+Shows a button to export this feature as geojson. Especially useful for debugging or using this in other programs
+
+This tagrendering has no question and is thus read-only
+
+
+
+
+
+### wikipedia
+
+
+
+Shows a wikipedia box with the corresponding wikipedia article; the wikidata-item link can be changed by a contributor
+
+The question is *What is the corresponding Wikidata entity?*
+
+This rendering asks information about the property [wikidata](https://wiki.openstreetmap.org/wiki/Key:wikidata)
+
+This is rendered with `{wikipedia():max-height:25rem}`
+
+
+
+
+
+ - *{wikipedia():max-height:25rem}* corresponds with `wikipedia~.+`
+ - This option cannot be chosen as answer
+ - *No Wikipedia page has been linked yet* corresponds with ``
+ - This option cannot be chosen as answer
+
+
+
+
+### reviews
+
+
+
+Shows the reviews module (including the possibility to leave a review)
+
+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
+
+
+
+
+
+### 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`
+
+
+
+### osmlink
+
+
+
+This tagrendering has no question and is thus read-only
+
+
+
+
+
+ - *Uploading...* corresponds with `id~^(=-)$`
+
+
+
+
+### 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`
+
+
+
+### 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`
+
+
+
+
+### dog-access
+
+
+
+The question is *Are dogs allowed in this business?*
+
+
+
+
+
+ - *Dogs are allowed* corresponds with `dog=yes`
+ - *Dogs are not allowed* corresponds with `dog=no`
+ - *Dogs are allowed, but they have to be leashed* corresponds with `dog=leashed`
+ - *Dogs are allowed and can run around freely* corresponds with `dog=unleashed`
+
+
+
+
+### description
+
+
+
+The question is *Is there still some relevant info that the previous questions did not cover? Feel free to add it here.*
+
+This rendering asks information about the property [description](https://wiki.openstreetmap.org/wiki/Key:description)
+
+This is rendered with `{description}`
+
+
+
+
+
+### 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)}`
+
+
+
+
+
+### opening_hours_24_7
+
+
+
+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)}`
+
+
+
+
+
+ - *24/7 opened (including holidays)* corresponds with `opening_hours=24/7`
+
+
+
+
+### opening_hours_by_appointment
+
+
+
+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)}`
+
+
+
+
+
+ - *Only by appointment* corresponds with `opening_hours="by appointment"`
+ - *Only by appointment* corresponds with `opening_hours~^("by appointment"|by appointment)$`
+ - This option cannot be chosen as answer
+
+
+
+
+### service:electricity
+
+
+
+The question is *Does this amenity have electrical outlets, available to customers when they are inside?*
+
+
+
+
+
+ - *There are plenty of domestic sockets available to customers seated indoors, where they can charge their electronics* corresponds with `service:electricity=yes`
+ - *There are a few domestic sockets available to customers seated indoors, where they can charge their electronics* corresponds with `service:electricity=limited`
+ - *There are no sockets available indoors to customers, but charging might be possible if the staff is asked* corresponds with `service:electricity=ask`
+ - *There are a no domestic sockets available to customers seated indoors* corresponds with `service:electricity=no`
+
+
+
+
+### 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
+
+
+
+
+### payment-options-split
+
+
+
+The question is *Which methods of payment are accepted here?*
+
+
+
+
+
+ - *Cash is accepted here* corresponds with `payment:cash=yes`
+ - This option cannot be chosen as answer
+ - Unselecting this answer will add
+ - *Payment cards are accepted here* corresponds with `payment:cards=yes`
+ - This option cannot be chosen as answer
+ - Unselecting this answer will add
+ - *Payment by QR-code is possible here* corresponds with `payment:qr_code=yes`
+ - Unselecting this answer will add payment:qr_code=no
+ - *Coins are accepted here* corresponds with `payment:coins=yes`
+ - Unselecting this answer will add payment:coins=no
+ - *Bank notes are accepted here* corresponds with `payment:notes=yes`
+ - Unselecting this answer will add payment:notes=no
+ - *Debit cards are accepted here* corresponds with `payment:debit_cards=yes`
+ - Unselecting this answer will add payment:debit_cards=no
+ - *Credit cards are accepted here* corresponds with `payment:credit_cards=yes`
+ - Unselecting this answer will add payment:credit_cards=no
+
+
+
+
+### payment-options-advanced
+
+
+
+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
+ - *Payment is done using a dedicated app* corresponds with `payment:app=yes`
+ - Unselecting this answer will add payment:app=no
+ - *Payment is done using a membership card* corresponds with `payment:membership_card=yes`
+ - Unselecting this answer will add payment:membership_card=no
+
+
+
+
+### denominations-coins
+
+
+
+The question is *What coins can you use to pay here?*
+
+
+
+
+
+ - *1 cent coins are accepted* corresponds with `payment:coins:denominations=0.01 EUR`
+ - *2 cent coins are accepted* corresponds with `payment:coins:denominations=0.02 EUR`
+ - *5 cent coins are accepted* corresponds with `payment:coins:denominations=0.05 EUR`
+ - *10 cent coins are accepted* corresponds with `payment:coins:denominations=0.10 EUR`
+ - *20 cent coins are accepted* corresponds with `payment:coins:denominations=0.20 EUR`
+ - *50 cent coins are accepted* corresponds with `payment:coins:denominations=0.50 EUR`
+ - *1 euro coins are accepted* corresponds with `payment:coins:denominations=1 EUR`
+ - *2 euro coins are accepted* corresponds with `payment:coins:denominations=2 EUR`
+
+
+This tagrendering is only visible in the popup if the following condition is met: `payment:coins=yes|payment:cash=yes&_currency=EUR`
+
+
+
+### denominations-notes
+
+
+
+The question is *what notes can you use to pay here?*
+
+
+
+
+
+ - *5 euro notes are accepted* corresponds with `payment:notes:denominations=5 EUR`
+ - *10 euro notes are accepted* corresponds with `payment:notes:denominations=10 EUR`
+ - *20 euro notes are accepted* corresponds with `payment:notes:denominations=20 EUR`
+ - *50 euro notes are accepted* corresponds with `payment:notes:denominations=50 EUR`
+ - *100 euro notes are accepted* corresponds with `payment:notes:denominations=100 EUR`
+ - *200 euro notes are accepted* corresponds with `payment:notes:denominations=200 EUR`
+ - *500 euro notes are accepted* corresponds with `payment:notes:denominations=500 EUR`
+
+
+This tagrendering is only visible in the popup if the following condition is met: `payment:notes=yes|payment:cash=yes&_currency=EUR`
+
+
+
+### 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
+
+
+
+Shows a table with all the tags of the feature
+
+This tagrendering has no question and is thus read-only
+
+
+
+
+
+### 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`
+
+
+
+### multilevels
+
+
+
+The question is *What levels does this elevator go to?*
+
+This rendering asks information about the property [level](https://wiki.openstreetmap.org/wiki/Key:level)
+
+This is rendered with `This elevator goes to floors {level}`
+
+
+
+
+
+ - *Located underground* corresponds with `location=underground`
+ - This option cannot be chosen as answer
+ - *Located on the ground floor* corresponds with `level=0`
+ - *Located on the ground floor* corresponds with ``
+ - This option cannot be chosen as answer
+ - *Located on the first floor* corresponds with `level=1`
+ - *Located on the first basement level* corresponds with `level=-1`
+
+
+
+
+### level
+
+
+
+The question is *On what level is this feature located?*
+
+This rendering asks information about the property [level](https://wiki.openstreetmap.org/wiki/Key:level)
+
+This is rendered with `Located on the {level}th floor`
+
+
+
+
+
+ - *Located underground* corresponds with `location=underground`
+ - This option cannot be chosen as answer
+ - *Located on the ground floor* corresponds with `level=0`
+ - *Located on the ground floor* corresponds with ``
+ - This option cannot be chosen as answer
+ - *Located on the first floor* corresponds with `level=1`
+ - *Located on the first basement level* corresponds with `level=-1`
+
+
+
+
+### smoking
+
+
+
+The question is *Is smoking allowed at {title()}?*
+
+
+
+
+
+ - *Smoking is allowed* corresponds with `smoking=yes`
+ - *Smoking is not allowed* corresponds with `smoking=no`
+ - *Smoking is allowed outside.* corresponds with `smoking=outside`
+
+
+
+
+### induction-loop
+
+
+
+An accessibility feature: induction loops are for hard-hearing persons which have an FM-receiver.
+
+The question is *Does this place have an audio induction loop for people with reduced hearing?*
+
+
+
+
+
+ - *This place has an audio induction loop* corresponds with `hearing_loop=yes`
+ - *This place does not have an audio induction loop* corresponds with `hearing_loop=no`
+
+
+
+
+### internet
+
+
+
+The question is *Does this place offer internet access?*
+
+
+
+
+
+ - *This place offers wireless internet access* corresponds with `internet_access=wlan`
+ - *This place does not offer internet access* corresponds with `internet_access=no`
+ - *This place offers internet access* corresponds with `internet_access=yes`
+ - This option cannot be chosen as answer
+ - *This place offers internet access via a terminal or computer* corresponds with `internet_access=terminal`
+ - *This place offers wired internet access* corresponds with `internet_access=wired`
+
+
+
+
+### internet-fee
+
+
+
+The question is *Is there a fee for internet access?*
+
+
+
+
+
+ - *There is a fee for the internet access at this place* corresponds with `internet_access:fee=yes`
+ - *Internet access is free at this place* corresponds with `internet_access:fee=no`
+ - *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~.+`
+
+
+
+### internet-ssid
+
+
+
+The question is *What is the network name for the wireless internet access?*
+
+This rendering asks information about the property [internet_access:ssid](https://wiki.openstreetmap.org/wiki/Key:internet_access:ssid)
+
+This is rendered with `The network name is {internet_access:ssid}`
+
+
+
+
+
+ - *Telekom* corresponds with `internet_access:ssid=Telekom`
+
+
+This tagrendering is only visible in the popup if the following condition is met: `internet_access=wlan`
+
+
+
+### luminous_or_lit
+
+
+
+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 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 document is autogenerated from [src/Customizations/SharedTagRenderings.ts](https://github.com/pietervdvn/MapComplete/blob/develop/src/Customizations/SharedTagRenderings.ts), [assets/layers/questions/questions.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/layers/questions/questions.json)
+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/URL_Parameters.md b/Docs/URL_Parameters.md
index 78a4cf329..6bc4020e2 100644
--- a/Docs/URL_Parameters.md
+++ b/Docs/URL_Parameters.md
@@ -77,174 +77,274 @@ The user display language is determined in the following order:
Note that this URL-parameter is not added to the URL-bar by default.
Note that the _loading_ screen will always use the navigator language.
-Translations are never complete. If a translation in a certain language is missing, English is used as fallback. No default value set
+Translations are never complete. If a translation in a certain language is missing, English is used as fallback.
+
+This documentation is defined in the source code at [Locale.ts](/UI/i18n/Locale.ts#L35)
+
+ No default value set
fs-translation-mode
---------------------
- If set, will show a translation button next to every string. The default value is _false_
+ If set, will show a translation button next to every string.
+
+This documentation is defined in the source code at [QueryParameters.ts](/Logic/Web/QueryParameters.ts#L66)
+
+ The default value is _false_
backend
---------
- The OSM backend to use - can be used to redirect mapcomplete to the testing backend when using 'osm-test' The default value is _osm_
+ The OSM backend to use - can be used to redirect mapcomplete to the testing backend when using 'osm-test'
+
+This documentation is defined in the source code at [FeatureSwitchState.ts](/Logic/State/FeatureSwitchState.ts#L29)
+
+ The default value is _osm_
fake-user
-----------
- If true, 'dryrun' mode is activated and a fake user account is loaded The default value is _false_
+ If true, 'dryrun' mode is activated and a fake user account is loaded
+
+This documentation is defined in the source code at [QueryParameters.ts](/Logic/Web/QueryParameters.ts#L66)
+
+ The default value is _false_
fs-userbadge
--------------
- Disables/Enables the user information pill (userbadge) at the top left. Disabling this disables logging in and thus disables editing all together, effectively putting MapComplete into read-only mode. The default value is _true_
+ Disables/Enables the user information pill (userbadge) at the top left. Disabling this disables logging in and thus disables editing all together, effectively putting MapComplete into read-only mode.
+
+This documentation is defined in the source code at [FeatureSwitchState.ts](/Logic/State/FeatureSwitchState.ts#L13)
+
+ The default value is _true_
fs-search
-----------
- Disables/Enables the search bar The default value is _true_
+ Disables/Enables the search bar
+
+This documentation is defined in the source code at [FeatureSwitchState.ts](/Logic/State/FeatureSwitchState.ts#L13)
+
+ The default value is _true_
fs-background
---------------
- Disables/Enables the background layer control The default value is _true_
+ Disables/Enables the background layer control
+
+This documentation is defined in the source code at [FeatureSwitchState.ts](/Logic/State/FeatureSwitchState.ts#L13)
+
+ The default value is _true_
fs-filter
-----------
- Disables/Enables the filter view The default value is _true_
+ Disables/Enables the filter view
+
+This documentation is defined in the source code at [FeatureSwitchState.ts](/Logic/State/FeatureSwitchState.ts#L13)
+
+ The default value is _true_
fs-add-new
------------
- Disables/Enables the 'add new feature'-popup. (A theme without presets might not have it in the first place) The default value is _true_
+ Disables/Enables the 'add new feature'-popup. (A theme without presets might not have it in the first place)
+
+This documentation is defined in the source code at [FeatureSwitchState.ts](/Logic/State/FeatureSwitchState.ts#L13)
+
+ The default value is _true_
fs-welcome-message
--------------------
- Disables/enables the help menu or welcome message The default value is _true_
+ Disables/enables the help menu or welcome message
+
+This documentation is defined in the source code at [FeatureSwitchState.ts](/Logic/State/FeatureSwitchState.ts#L13)
+
+ The default value is _true_
fs-community-index
--------------------
- Disables/enables the button to get in touch with the community The default value is _true_
+ Disables/enables the button to get in touch with the community
+
+This documentation is defined in the source code at [FeatureSwitchState.ts](/Logic/State/FeatureSwitchState.ts#L13)
+
+ The default value is _true_
fs-iframe-popout
------------------
- 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) The default value is _true_
+ 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](/Logic/State/FeatureSwitchState.ts#L13)
+
+ The default value is _true_
fs-more-quests
----------------
- Disables/Enables the 'More Quests'-tab in the welcome message The default value is _true_
+ Disables/Enables the 'More Quests'-tab in the welcome message
+
+This documentation is defined in the source code at [FeatureSwitchState.ts](/Logic/State/FeatureSwitchState.ts#L13)
+
+ The default value is _true_
fs-share-screen
-----------------
- Disables/Enables the 'Share-screen'-tab in the welcome message The default value is _true_
+ Disables/Enables the 'Share-screen'-tab in the welcome message
+
+This documentation is defined in the source code at [FeatureSwitchState.ts](/Logic/State/FeatureSwitchState.ts#L13)
+
+ The default value is _true_
fs-geolocation
----------------
- Disables/Enables the geolocation button The default value is _true_
+ Disables/Enables the geolocation button
+
+This documentation is defined in the source code at [FeatureSwitchState.ts](/Logic/State/FeatureSwitchState.ts#L13)
+
+ The default value is _true_
fs-all-questions
------------------
- Always show all questions The default value is _false_
+ Always show all questions
+
+This documentation is defined in the source code at [FeatureSwitchState.ts](/Logic/State/FeatureSwitchState.ts#L13)
+
+ The default value is _false_
fs-export
-----------
- Enable the export as GeoJSON and CSV button The default value is _true_
+ Enable the export as GeoJSON and CSV button
+
+This documentation is defined in the source code at [FeatureSwitchState.ts](/Logic/State/FeatureSwitchState.ts#L13)
+
+ The default value is _true_
test
------
- If true, 'dryrun' mode is activated. The app will behave as normal, except that changes to OSM will be printed onto the console instead of actually uploaded to osm.org The default value is _false_
+ 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 [QueryParameters.ts](/Logic/Web/QueryParameters.ts#L66)
+
+ The default value is _false_
debug
-------
- If true, shows some extra debugging help such as all the available tags on every object The default value is _false_
+ 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 [QueryParameters.ts](/Logic/Web/QueryParameters.ts#L66)
+
+ The default value is _false_
overpassUrl
-------------
- Point mapcomplete to a different overpass-instance. Example: https://overpass-api.de/api/interpreter The default value is _https://overpass-api.de/api/interpreter,https://overpass.kumi.systems/api/interpreter,https://overpass.openstreetmap.ru/cgi/interpreter_
+ 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](/Logic/State/FeatureSwitchState.ts#L165)
+
+ The default value is _https://overpass-api.de/api/interpreter,https://overpass.kumi.systems/api/interpreter,https://overpass.openstreetmap.ru/cgi/interpreter_
overpassTimeout
-----------------
- Set a different timeout (in seconds) for queries in overpass The default value is _30_
+ Set a different timeout (in seconds) for queries in overpass
+
+This documentation is defined in the source code at [FeatureSwitchState.ts](/Logic/State/FeatureSwitchState.ts#L176)
+
+ The default value is _30_
overpassMaxZoom
-----------------
- point to switch between OSM-api and overpass The default value is _16_
+ point to switch between OSM-api and overpass
+
+This documentation is defined in the source code at [FeatureSwitchState.ts](/Logic/State/FeatureSwitchState.ts#L184)
+
+ The default value is _16_
osmApiTileSize
----------------
- Tilesize when the OSM-API is used to fetch data within a BBOX The default value is _17_
+ Tilesize when the OSM-API is used to fetch data within a BBOX
+
+This documentation is defined in the source code at [FeatureSwitchState.ts](/Logic/State/FeatureSwitchState.ts#L192)
+
+ The default value is _17_
background
------------
- The id of the background layer to start with The default value is _osm_
+ The id of the background layer to start with
+
+This documentation is defined in the source code at [FeatureSwitchState.ts](/Logic/State/FeatureSwitchState.ts#L205)
+
+ The default value is _osm_
layer-<layer-id>
------------------------
- Wether or not the layer with id is shown The default value is _true_
+ Wether or not the layer with id is shown
+
+This documentation is defined in the source code at [QueryParameterDocumentation.ts](/UI/QueryParameterDocumentation.ts#L52)
+
+ The default value is _true_
This document is autogenerated from [src/Logic/Web/QueryParameters.ts](https://github.com/pietervdvn/MapComplete/blob/develop/src/Logic/Web/QueryParameters.ts), [src/UI/QueryParameterDocumentation.ts](https://github.com/pietervdvn/MapComplete/blob/develop/src/UI/QueryParameterDocumentation.ts)
diff --git a/src/Logic/Web/QueryParameters.ts b/src/Logic/Web/QueryParameters.ts
index 32053243b..62158ae9f 100644
--- a/src/Logic/Web/QueryParameters.ts
+++ b/src/Logic/Web/QueryParameters.ts
@@ -4,6 +4,7 @@
import { UIEventSource } from "../UIEventSource"
import Hash from "./Hash"
import { Utils } from "../../Utils"
+import doc = Mocha.reporters.doc
export class QueryParameters {
static defaults: Record = {}
@@ -21,6 +22,19 @@ export class QueryParameters {
if (!this.initialized) {
this.init()
}
+
+ if (Utils.runningFromConsole) {
+ const location = Utils.getLocationInCode(-1)
+
+ documentation +=
+ "\n\nThis documentation is defined in the source code at [" +
+ location.filename +
+ "](" +
+ location.markdownLocation +
+ ")" +
+ "\n\n"
+ }
+
QueryParameters.documentation.set(key, documentation)
if (deflt !== undefined) {
QueryParameters.defaults[key] = deflt
@@ -131,5 +145,4 @@ export class QueryParameters {
QueryParameters._wasInitialized.clear()
QueryParameters.order = []
}
-
}
diff --git a/src/Utils.ts b/src/Utils.ts
index 3ff3c59bb..daed05fe7 100644
--- a/src/Utils.ts
+++ b/src/Utils.ts
@@ -1,5 +1,5 @@
import colors from "./assets/colors.json"
-import {HTMLElement} from "node-html-parser"
+import { HTMLElement } from "node-html-parser"
export class Utils {
/**
@@ -459,7 +459,7 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
let match = txt.match(regex)
- if(!match){
+ if (!match) {
return txt
}
let result = ""
@@ -502,7 +502,7 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
result += normal + v
match = leftover.match(regex)
- if(!match){
+ if (!match) {
result += leftover
}
}
@@ -699,10 +699,10 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
if (Array.isArray(leaf)) {
for (let i = 0; i < (leaf).length; i++) {
const l = (leaf)[i]
- collectedList.push({leaf: l, path: [...travelledPath, "" + i]})
+ collectedList.push({ leaf: l, path: [...travelledPath, "" + i] })
}
} else {
- collectedList.push({leaf, path: travelledPath})
+ collectedList.push({ leaf, path: travelledPath })
}
return collectedList
}
@@ -780,7 +780,7 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
})
}
- const cp = {...json}
+ const cp = { ...json }
for (const key in json) {
cp[key] = Utils.WalkJson(json[key], f, isLeaf, [...path, key])
}
@@ -910,11 +910,11 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
const xhr = new XMLHttpRequest()
xhr.onload = () => {
if (xhr.status == 200) {
- resolve({content: xhr.response})
+ resolve({ content: xhr.response })
} else if (xhr.status === 302) {
- resolve({redirect: xhr.getResponseHeader("location")})
+ resolve({ redirect: xhr.getResponseHeader("location") })
} else if (xhr.status === 509 || xhr.status === 429) {
- resolve({error: "rate limited", url, statuscode: xhr.status})
+ resolve({ error: "rate limited", url, statuscode: xhr.status })
} else {
resolve({
error: "other error: " + xhr.statusText,
@@ -984,10 +984,10 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
}
const promise =
/*NO AWAIT as we work with the promise directly */ Utils.downloadJsonAdvanced(
- url,
- headers
- )
- Utils._download_cache.set(url, {promise, timestamp: new Date().getTime()})
+ url,
+ headers
+ )
+ Utils._download_cache.set(url, { promise, timestamp: new Date().getTime() })
return await promise
}
@@ -1006,11 +1006,11 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
const injected = Utils.injectedDownloads[url]
if (injected !== undefined) {
console.log("Using injected resource for test for URL", url)
- return new Promise((resolve, _) => resolve({content: injected}))
+ return new Promise((resolve, _) => resolve({ content: injected }))
}
const result = await Utils.downloadAdvanced(
url,
- Utils.Merge({accept: "application/json"}, headers ?? {})
+ Utils.Merge({ accept: "application/json" }, headers ?? {})
)
if (result["error"] !== undefined) {
return <{ error: string; url: string; statuscode?: number }>result
@@ -1018,12 +1018,12 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
const data = result["content"]
try {
if (typeof data === "string") {
- return {content: JSON.parse(data)}
+ return { content: JSON.parse(data) }
}
- return {content: data}
+ return { content: data }
} catch (e) {
console.error("Could not parse ", data, "due to", e, "\n", e.stack)
- return {error: "malformed", url}
+ return { error: "malformed", url }
}
}
@@ -1047,7 +1047,7 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
const element = document.createElement("a")
let file
if (typeof contents === "string") {
- file = new Blob([contents], {type: options?.mimetype ?? "text/plain"})
+ file = new Blob([contents], { type: options?.mimetype ?? "text/plain" })
} else {
file = contents
}
@@ -1318,7 +1318,7 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
if (match == undefined) {
return undefined
}
- return {r: Number(match[1]), g: Number(match[2]), b: Number(match[3])}
+ return { r: Number(match[1]), g: Number(match[2]), b: Number(match[3]) }
}
if (!hex.startsWith("#")) {
@@ -1378,7 +1378,7 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
if (inView) {
return
}
- element.scrollIntoView({behavior: "smooth", block: "nearest"})
+ element.scrollIntoView({ behavior: "smooth", block: "nearest" })
}
public static findParentWithScrolling(element: HTMLBaseElement): HTMLBaseElement {
@@ -1470,18 +1470,60 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
const postParts = prepart.split("}")
if (postParts.length === 1) {
// This was a normal part
- spec.push({message: postParts[0]})
+ spec.push({ message: postParts[0] })
} else {
const [subs, message] = postParts
- spec.push({subs})
+ spec.push({ subs })
if (message !== "") {
- spec.push({message})
+ spec.push({ message })
}
}
}
return spec
}
+ /**
+ * Returns the file and line number of the code calling this
+ */
+ public static getLocationInCode(offset: number = 0): {
+ path: string
+ line: number
+ column: number
+ markdownLocation: string
+ filename: string
+ functionName: string
+ } {
+ const error = new Error("No error")
+ const stack = error.stack.split("\n")
+ stack.shift() // Remove "Error: No error"
+ const regex = /at (.*) \(([a-zA-Z0-9/.]+):([0-9]+):([0-9]+)\)/
+ const stackItem = stack[Math.abs(offset) + 1]
+ console.log("Matching", stackItem, "with", regex, "gave", stackItem.match(regex))
+
+ let functionName: string
+ let path: string
+ let line: string
+ let column: string
+ let _: string
+ const matchWithFuncName = stackItem.match(regex)
+ if (matchWithFuncName) {
+ ;[_, functionName, path, line, column] = matchWithFuncName
+ } else {
+ let regexNoFuncName: RegExp = new RegExp("at ([a-zA-Z0-9/.]+):([0-9]+):([0-9]+)")
+ ;[_, path, line, column] = stackItem.match(regexNoFuncName)
+ }
+
+ const markdownLocation = path.substring(path.indexOf("MapComplete/src") + 15) + "#L" + line
+ return {
+ path,
+ functionName,
+ line: Number(line),
+ column: Number(column),
+ markdownLocation,
+ filename: path.substring(path.lastIndexOf("/") + 1),
+ }
+ }
+
private static colorDiff(
c0: { r: number; g: number; b: number },
c1: { r: number; g: number; b: number }