diff --git a/.vscode/settings.json b/.vscode/settings.json index e975a613f..0eedd1323 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -7,6 +7,41 @@ { "fileMatch": ["/assets/themes/*/*.json", "!/assets/themes/*/license_info.json"], "url": "./Docs/Schemas/LayoutConfigJson.schema.json" + }, + { + "fileMatch": ["/assets/themes/*/license_info.json", "/assets/layers/*/license_info.json"], + "schema": { + "type": "array", + "title": "License Info", + "items": { + "type": "object", + "properties": { + "path": { + "type": "string", + "description": "Path to the file" + }, + "authors": { + "type": "array", + "description": "Authors of the file", + "items": { + "type": "string" + } + }, + "license": { + "type": "string", + "description": "License of the file" + }, + "sources": { + "type": "array", + "description": "Sources of the file", + "items": { + "type": "string" + } + } + }, + "required": ["path", "authors", "license", "sources"] + } + } } ], "editor.tabSize": 2, diff --git a/assets/layers/elongated_coin/elongated_coin.json b/assets/layers/elongated_coin/elongated_coin.json index 41e2e5b87..398b7921f 100644 --- a/assets/layers/elongated_coin/elongated_coin.json +++ b/assets/layers/elongated_coin/elongated_coin.json @@ -18,7 +18,7 @@ "osmTags": { "and": [ "amenity=vending_machine", - "vending=elongated_coin" + "vending~.*elongated_coin.*" ] } }, @@ -440,8 +440,5 @@ "accepts_credit_cards" ], "deletion": true, - "allowMove": { - "enableImproveAccuracy": true, - "enableRelocation": true - } -} + "allowMove": true +} \ No newline at end of file diff --git a/assets/layers/playground_equipment/DeimosXL1.jpg b/assets/layers/playground_equipment/DeimosXL1.jpg new file mode 100644 index 000000000..c4317cdfc Binary files /dev/null and b/assets/layers/playground_equipment/DeimosXL1.jpg differ diff --git a/assets/layers/playground_equipment/DeimosXL1.jpg.license b/assets/layers/playground_equipment/DeimosXL1.jpg.license new file mode 100644 index 000000000..b5361dfb2 --- /dev/null +++ b/assets/layers/playground_equipment/DeimosXL1.jpg.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: Damian stawowy +SPDX-License-Identifier: CC-BY-SA 4.0 \ No newline at end of file diff --git a/assets/layers/playground_equipment/Funnel_ball.jpg b/assets/layers/playground_equipment/Funnel_ball.jpg new file mode 100644 index 000000000..68f755444 Binary files /dev/null and b/assets/layers/playground_equipment/Funnel_ball.jpg differ diff --git a/assets/layers/playground_equipment/Funnel_ball.jpg.license b/assets/layers/playground_equipment/Funnel_ball.jpg.license new file mode 100644 index 000000000..f7f6dc635 --- /dev/null +++ b/assets/layers/playground_equipment/Funnel_ball.jpg.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: Pavtron (talk) +SPDX-License-Identifier: Public domain \ No newline at end of file diff --git a/assets/layers/playground_equipment/Hinkelbaan_tegels.jpg b/assets/layers/playground_equipment/Hinkelbaan_tegels.jpg new file mode 100644 index 000000000..073112d07 Binary files /dev/null and b/assets/layers/playground_equipment/Hinkelbaan_tegels.jpg differ diff --git a/assets/layers/playground_equipment/Hinkelbaan_tegels.jpg.license b/assets/layers/playground_equipment/Hinkelbaan_tegels.jpg.license new file mode 100644 index 000000000..1c4862346 --- /dev/null +++ b/assets/layers/playground_equipment/Hinkelbaan_tegels.jpg.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: M.Minderhoud +SPDX-License-Identifier: Public domain \ No newline at end of file diff --git a/assets/layers/playground_equipment/Hupfkissen.jpg b/assets/layers/playground_equipment/Hupfkissen.jpg new file mode 100644 index 000000000..194e215c5 Binary files /dev/null and b/assets/layers/playground_equipment/Hupfkissen.jpg differ diff --git a/assets/layers/playground_equipment/Hupfkissen.jpg.license b/assets/layers/playground_equipment/Hupfkissen.jpg.license new file mode 100644 index 000000000..1ebe81d59 --- /dev/null +++ b/assets/layers/playground_equipment/Hupfkissen.jpg.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: Peter Wanders +SPDX-License-Identifier: Public domain \ No newline at end of file diff --git a/assets/layers/playground_equipment/Manually_powered_carousel_on_a_playground_in_Saint-Petersburg.JPG b/assets/layers/playground_equipment/Manually_powered_carousel_on_a_playground_in_Saint-Petersburg.JPG new file mode 100644 index 000000000..0eaaddf0d Binary files /dev/null and b/assets/layers/playground_equipment/Manually_powered_carousel_on_a_playground_in_Saint-Petersburg.JPG differ diff --git a/assets/layers/playground_equipment/Manually_powered_carousel_on_a_playground_in_Saint-Petersburg.JPG.license b/assets/layers/playground_equipment/Manually_powered_carousel_on_a_playground_in_Saint-Petersburg.JPG.license new file mode 100644 index 000000000..20e81e6eb --- /dev/null +++ b/assets/layers/playground_equipment/Manually_powered_carousel_on_a_playground_in_Saint-Petersburg.JPG.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: Reda Kerbouche +SPDX-License-Identifier: CC-BY-SA 4.0 \ No newline at end of file diff --git a/assets/layers/playground_equipment/Playground_Map,_Washington_Elementary.jpg b/assets/layers/playground_equipment/Playground_Map,_Washington_Elementary.jpg new file mode 100644 index 000000000..82dd923be Binary files /dev/null and b/assets/layers/playground_equipment/Playground_Map,_Washington_Elementary.jpg differ diff --git a/assets/layers/playground_equipment/Playground_Map,_Washington_Elementary.jpg.license b/assets/layers/playground_equipment/Playground_Map,_Washington_Elementary.jpg.license new file mode 100644 index 000000000..2fedec783 --- /dev/null +++ b/assets/layers/playground_equipment/Playground_Map,_Washington_Elementary.jpg.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: Jleedev +SPDX-License-Identifier: CC-BY-SA 4.0 \ No newline at end of file diff --git a/assets/layers/playground_equipment/Playground_climbingwall.jpg b/assets/layers/playground_equipment/Playground_climbingwall.jpg new file mode 100644 index 000000000..5cbc109db Binary files /dev/null and b/assets/layers/playground_equipment/Playground_climbingwall.jpg differ diff --git a/assets/layers/playground_equipment/Playground_climbingwall.jpg.license b/assets/layers/playground_equipment/Playground_climbingwall.jpg.license new file mode 100644 index 000000000..7bceb516a --- /dev/null +++ b/assets/layers/playground_equipment/Playground_climbingwall.jpg.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: Mktravel +SPDX-License-Identifier: Public Domain \ No newline at end of file diff --git a/assets/layers/playground_equipment/Playground_in_Muchall_Park,_Wolverhampton_-_geograph.org.uk_-_2735437.jpg b/assets/layers/playground_equipment/Playground_in_Muchall_Park,_Wolverhampton_-_geograph.org.uk_-_2735437.jpg new file mode 100644 index 000000000..409f54d62 Binary files /dev/null and b/assets/layers/playground_equipment/Playground_in_Muchall_Park,_Wolverhampton_-_geograph.org.uk_-_2735437.jpg differ diff --git a/assets/layers/playground_equipment/Playground_in_Muchall_Park,_Wolverhampton_-_geograph.org.uk_-_2735437.jpg.license b/assets/layers/playground_equipment/Playground_in_Muchall_Park,_Wolverhampton_-_geograph.org.uk_-_2735437.jpg.license new file mode 100644 index 000000000..26950d9bd --- /dev/null +++ b/assets/layers/playground_equipment/Playground_in_Muchall_Park,_Wolverhampton_-_geograph.org.uk_-_2735437.jpg.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: Roger Kidd +SPDX-License-Identifier: CC-BY-SA 2.0 \ No newline at end of file diff --git a/assets/layers/playground_equipment/Playground_swing_03.jpg b/assets/layers/playground_equipment/Playground_swing_03.jpg new file mode 100644 index 000000000..65faea838 Binary files /dev/null and b/assets/layers/playground_equipment/Playground_swing_03.jpg differ diff --git a/assets/layers/playground_equipment/Playground_swing_03.jpg.license b/assets/layers/playground_equipment/Playground_swing_03.jpg.license new file mode 100644 index 000000000..6e28763e5 --- /dev/null +++ b/assets/layers/playground_equipment/Playground_swing_03.jpg.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: Kritzolina +SPDX-License-Identifier: CC-BY-SA 4.0 \ No newline at end of file diff --git a/assets/layers/playground_equipment/Playhouse.jpg b/assets/layers/playground_equipment/Playhouse.jpg new file mode 100644 index 000000000..8382d5c7e Binary files /dev/null and b/assets/layers/playground_equipment/Playhouse.jpg differ diff --git a/assets/layers/playground_equipment/Playhouse.jpg.license b/assets/layers/playground_equipment/Playhouse.jpg.license new file mode 100644 index 000000000..f669d50ad --- /dev/null +++ b/assets/layers/playground_equipment/Playhouse.jpg.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: Saku +SPDX-License-Identifier: CC-BY-SA 3.0 \ No newline at end of file diff --git a/assets/layers/playground_equipment/Rekstok.JPG b/assets/layers/playground_equipment/Rekstok.JPG new file mode 100644 index 000000000..393a73968 Binary files /dev/null and b/assets/layers/playground_equipment/Rekstok.JPG differ diff --git a/assets/layers/playground_equipment/Rekstok.JPG.license b/assets/layers/playground_equipment/Rekstok.JPG.license new file mode 100644 index 000000000..c537adb04 --- /dev/null +++ b/assets/layers/playground_equipment/Rekstok.JPG.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: self +SPDX-License-Identifier: Public domain \ No newline at end of file diff --git a/assets/layers/playground_equipment/Seesaw-aa.jpg b/assets/layers/playground_equipment/Seesaw-aa.jpg new file mode 100644 index 000000000..8c85458ec Binary files /dev/null and b/assets/layers/playground_equipment/Seesaw-aa.jpg differ diff --git a/assets/layers/playground_equipment/Seesaw-aa.jpg.license b/assets/layers/playground_equipment/Seesaw-aa.jpg.license new file mode 100644 index 000000000..5d722d6d1 --- /dev/null +++ b/assets/layers/playground_equipment/Seesaw-aa.jpg.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: Itsmine +SPDX-License-Identifier: Public domain \ No newline at end of file diff --git a/assets/layers/playground_equipment/Spinning_circle.jpg b/assets/layers/playground_equipment/Spinning_circle.jpg new file mode 100644 index 000000000..d951bfaa3 Binary files /dev/null and b/assets/layers/playground_equipment/Spinning_circle.jpg differ diff --git a/assets/layers/playground_equipment/Spinning_circle.jpg.license b/assets/layers/playground_equipment/Spinning_circle.jpg.license new file mode 100644 index 000000000..511651924 --- /dev/null +++ b/assets/layers/playground_equipment/Spinning_circle.jpg.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: Jose1711 +SPDX-License-Identifier: CC0 1.0 \ No newline at end of file diff --git a/assets/layers/playground_equipment/SunwardCohousingPlayStructure2005.jpg b/assets/layers/playground_equipment/SunwardCohousingPlayStructure2005.jpg new file mode 100644 index 000000000..b9f8cda85 Binary files /dev/null and b/assets/layers/playground_equipment/SunwardCohousingPlayStructure2005.jpg differ diff --git a/assets/layers/playground_equipment/SunwardCohousingPlayStructure2005.jpg.license b/assets/layers/playground_equipment/SunwardCohousingPlayStructure2005.jpg.license new file mode 100644 index 000000000..9f8c82b3b --- /dev/null +++ b/assets/layers/playground_equipment/SunwardCohousingPlayStructure2005.jpg.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: Mc on avon +SPDX-License-Identifier: Public domain \ No newline at end of file diff --git a/assets/layers/playground_equipment/Szwedy_-_plac_zabaw_-_kotko_i_krzyzyk.jpg b/assets/layers/playground_equipment/Szwedy_-_plac_zabaw_-_kotko_i_krzyzyk.jpg new file mode 100644 index 000000000..fcf36bc56 Binary files /dev/null and b/assets/layers/playground_equipment/Szwedy_-_plac_zabaw_-_kotko_i_krzyzyk.jpg differ diff --git a/assets/layers/playground_equipment/Szwedy_-_plac_zabaw_-_kotko_i_krzyzyk.jpg.license b/assets/layers/playground_equipment/Szwedy_-_plac_zabaw_-_kotko_i_krzyzyk.jpg.license new file mode 100644 index 000000000..4cb296323 --- /dev/null +++ b/assets/layers/playground_equipment/Szwedy_-_plac_zabaw_-_kotko_i_krzyzyk.jpg.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: Pece +SPDX-License-Identifier: CC-BY 3.0 \ No newline at end of file diff --git a/assets/layers/playground_equipment/Teen_shelter_near_former_coastguard_lookout,_Watchet_-_geograph.org.uk_-_1714960.jpg b/assets/layers/playground_equipment/Teen_shelter_near_former_coastguard_lookout,_Watchet_-_geograph.org.uk_-_1714960.jpg new file mode 100644 index 000000000..890bbca14 Binary files /dev/null and b/assets/layers/playground_equipment/Teen_shelter_near_former_coastguard_lookout,_Watchet_-_geograph.org.uk_-_1714960.jpg differ diff --git a/assets/layers/playground_equipment/Teen_shelter_near_former_coastguard_lookout,_Watchet_-_geograph.org.uk_-_1714960.jpg.license b/assets/layers/playground_equipment/Teen_shelter_near_former_coastguard_lookout,_Watchet_-_geograph.org.uk_-_1714960.jpg.license new file mode 100644 index 000000000..45f44de24 --- /dev/null +++ b/assets/layers/playground_equipment/Teen_shelter_near_former_coastguard_lookout,_Watchet_-_geograph.org.uk_-_1714960.jpg.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: Phil Champion +SPDX-License-Identifier: CC-BY-SA 2.0 \ No newline at end of file diff --git a/assets/layers/playground_equipment/Urbeach-high-park-splashpad.jpg b/assets/layers/playground_equipment/Urbeach-high-park-splashpad.jpg new file mode 100644 index 000000000..94fc56557 Binary files /dev/null and b/assets/layers/playground_equipment/Urbeach-high-park-splashpad.jpg differ diff --git a/assets/layers/playground_equipment/Urbeach-high-park-splashpad.jpg.license b/assets/layers/playground_equipment/Urbeach-high-park-splashpad.jpg.license new file mode 100644 index 000000000..1bf123f8f --- /dev/null +++ b/assets/layers/playground_equipment/Urbeach-high-park-splashpad.jpg.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: Glogger +SPDX-License-Identifier: CC-BY-SA 3.0 \ No newline at end of file diff --git a/assets/layers/playground_equipment/Zandbakw.jpg b/assets/layers/playground_equipment/Zandbakw.jpg new file mode 100644 index 000000000..9609d8669 Binary files /dev/null and b/assets/layers/playground_equipment/Zandbakw.jpg differ diff --git a/assets/layers/playground_equipment/Zandbakw.jpg.license b/assets/layers/playground_equipment/Zandbakw.jpg.license new file mode 100644 index 000000000..741273635 --- /dev/null +++ b/assets/layers/playground_equipment/Zandbakw.jpg.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: Waerth +SPDX-License-Identifier: CC-BY-SA 3.0 \ No newline at end of file diff --git a/assets/layers/playground_equipment/license_info.json b/assets/layers/playground_equipment/license_info.json new file mode 100644 index 000000000..c16a117c1 --- /dev/null +++ b/assets/layers/playground_equipment/license_info.json @@ -0,0 +1,182 @@ +[ + { + "path": "DeimosXL1.jpg", + "license": "CC-BY-SA 4.0", + "authors": [ + "Damian stawowy" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:DeimosXL1.jpg" + ] + }, + { + "path": "Funnel_ball.jpg", + "license": "Public domain", + "authors": [ + "Pavtron (talk)" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:Funnel_ball.jpg" + ] + }, + { + "path": "Hinkelbaan_tegels.jpg", + "license": "Public domain", + "authors": [ + "M.Minderhoud" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:Hinkelbaan_tegels.jpg" + ] + }, + { + "path": "Hupfkissen.jpg", + "license": "Public domain", + "authors": [ + "Peter Wanders" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:H%C3%BCpfkissen.jpg" + ] + }, + { + "path": "Manually_powered_carousel_on_a_playground_in_Saint-Petersburg.JPG", + "license": "CC-BY-SA 4.0", + "authors": [ + "Reda Kerbouche" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:Manually_powered_carousel_on_a_playground_in_Saint-Petersburg.JPG" + ] + }, + { + "path": "Playground_Map,_Washington_Elementary.jpg", + "license": "CC-BY-SA 4.0", + "authors": [ + "Jleedev" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:Playground_Map,_Washington_Elementary.jpg" + ] + }, + { + "path": "Playground_climbingwall.jpg", + "license": "Public Domain", + "authors": [ + "Mktravel" + ], + "sources": [ + "https://wiki.openstreetmap.org/wiki/File:Playground_climbingwall.jpg" + ] + }, + { + "path": "Playground_in_Muchall_Park,_Wolverhampton_-_geograph.org.uk_-_2735437.jpg", + "license": "CC-BY-SA 2.0", + "authors": [ + "Roger Kidd" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:Playground_in_Muchall_Park,_Wolverhampton_-_geograph.org.uk_-_2735437.jpg" + ] + }, + { + "path": "Playground_swing_03.jpg", + "license": "CC-BY-SA 4.0", + "authors": [ + "Kritzolina" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:Playground_swing_03.jpg" + ] + }, + { + "path": "Playhouse.jpg", + "license": "CC-BY-SA 3.0", + "authors": [ + "Saku" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:Playhouse.jpg" + ] + }, + { + "path": "Rekstok.JPG", + "license": "Public domain", + "authors": [ + "self" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:Rekstok.JPG" + ] + }, + { + "path": "Seesaw-aa.jpg", + "license": "Public domain", + "authors": [ + "Itsmine" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:Seesaw-aa.jpg" + ] + }, + { + "path": "Spinning_circle.jpg", + "license": "CC0 1.0", + "authors": [ + "Jose1711" + ], + "sources": [ + "https://wiki.openstreetmap.org/wiki/File:Spinning_circle.jpg" + ] + }, + { + "path": "SunwardCohousingPlayStructure2005.jpg", + "license": "Public domain", + "authors": [ + "Mc on avon" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:SunwardCohousingPlayStructure2005.jpg" + ] + }, + { + "path": "Szwedy_-_plac_zabaw_-_kotko_i_krzyzyk.jpg", + "license": "CC-BY 3.0", + "authors": [ + "Pece" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:Szwedy_-_plac_zabaw_-_k%C3%B3%C5%82ko_i_krzy%C5%BCyk.jpg" + ] + }, + { + "path": "Teen_shelter_near_former_coastguard_lookout,_Watchet_-_geograph.org.uk_-_1714960.jpg", + "license": "CC-BY-SA 2.0", + "authors": [ + "Phil Champion" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:Teen_shelter_near_former_coastguard_lookout,_Watchet_-_geograph.org.uk_-_1714960.jpg" + ] + }, + { + "path": "Urbeach-high-park-splashpad.jpg", + "license": "CC-BY-SA 3.0", + "authors": [ + "Glogger" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:Urbeach-high-park-splashpad.jpg" + ] + }, + { + "path": "Zandbakw.jpg", + "license": "CC-BY-SA 3.0", + "authors": [ + "Waerth" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:Zandbakw.jpg" + ] + } +] \ No newline at end of file diff --git a/assets/layers/playground_equipment/playground_equipment.json b/assets/layers/playground_equipment/playground_equipment.json new file mode 100644 index 000000000..9ee9450e4 --- /dev/null +++ b/assets/layers/playground_equipment/playground_equipment.json @@ -0,0 +1,337 @@ +{ + "minzoom": 18, + "pointRendering": [ + { + "location": [ + "point", + "centroid" + ], + "marker": [ + { + "icon": "circle", + "color": "white" + }, + { + "icon": "./assets/themes/playgrounds/playground.svg" + } + ], + "iconSize": "20,20" + } + ], + "tagRenderings": [ + "images", + { + "render": { + "en": "This is a {playground}" + }, + "id": "type", + "freeform": { + "key": "playground", + "placeholder": { + "en": "Type of device" + }, + "addExtraTags": [ + "fixme=Freeform input used" + ] + }, + "question": { + "en": "What kind of device is this?", + "nl": "Wat voor speeltoestel is dit?" + }, + "invalidValues": "playground=yes", + "mappings": [ + { + "if": "playground=swing", + "then": { + "en": "This is a swing", + "nl": "Dit is een schommel" + } + }, + { + "if": "playground=structure", + "then": { + "en": "This is a structure consisting of several connected playground devices" + }, + "icon": { + "path": "./assets/layers/playground_equipment/SunwardCohousingPlayStructure2005.jpg", + "class": "large" + } + }, + { + "if": "playground=slide", + "then": { + "en": "This is a slide" + } + }, + { + "if": "playground=sandpit", + "then": { + "en": "This is a sand pit", + "nl": "Dit is een zandbak" + }, + "searchTerms": { + "en": [ + "sandbox" + ] + }, + "icon": { + "path": "./assets/layers/playground_equipment/Zandbakw.jpg", + "class": "large" + } + }, + { + "if": "playground=springy", + "then": { + "en": "This is a spring rider", + "nl": "Dit is een veertoestel" + }, + "searchTerms": { + "en": [ + "springy" + ], + "nl": [ + "wipkip" + ] + } + }, + { + "if": "playground=climbingframe", + "then": { + "en": "This is a climbing frame", + "nl": "Dit is een klimrek" + }, + "searchTerms": { + "en": [ + "jungle gym", + "rope spider" + ] + }, + "icon": { + "path": "./assets/layers/playground_equipment/DeimosXL1.jpg", + "class": "large" + } + }, + { + "if": "playground=seesaw", + "then": { + "en": "This is a seesaw", + "nl": "Dit is een wipwap" + }, + "searchTerms": { + "en": [ + "teeter-totter", + "teeterboard" + ] + }, + "icon": { + "path": "./assets/layers/playground_equipment/Seesaw-aa.jpg", + "class": "large" + } + }, + { + "if": "playground=playhouse", + "then": { + "en": "This is a playhouse" + }, + "searchTerms": { + "en": [ + "Wendyhouse" + ] + }, + "icon": { + "path": "./assets/layers/playground_equipment/Playhouse.jpg", + "class": "large" + } + }, + { + "if": "playground=roundabout", + "then": { + "en": "This is a roundabout" + }, + "searchTerms": { + "en": [ + "merry-go-round" + ] + }, + "icon": { + "path": "./assets/layers/playground_equipment/Manually_powered_carousel_on_a_playground_in_Saint-Petersburg.JPG", + "class": "large" + } + }, + { + "if": "playground=basketswing", + "then": { + "en": "This is a basket swing" + }, + "icon": { + "path": "./assets/layers/playground_equipment/Playground_swing_03.jpg", + "class": "large" + } + }, + { + "if": "playground=zipwire", + "then": { + "en": "This is a zip wire" + } + }, + { + "if": "playground=horizontal_bar", + "then": { + "en": "This is a horizontal bar", + "nl": "Dit is een rekstok" + }, + "icon": { + "path": "./assets/layers/playground_equipment/Rekstok.JPG", + "class": "large" + } + }, + { + "if": "playground=hopscotch", + "then": { + "en": "This is a hopscotch" + }, + "icon": { + "path": "./assets/layers/playground_equipment/Hinkelbaan_tegels.jpg", + "class": "large" + } + }, + { + "if": "playground=splash_pad", + "then": { + "en": "This is a splash pad" + }, + "searchTerms": { + "en": "spray pool" + }, + "icon": { + "path": "./assets/layers/playground_equipment/Urbeach-high-park-splashpad.jpg", + "class": "large" + } + }, + { + "if": "playground=climbingwall", + "then": { + "en": "This is a climbing wall" + }, + "icon": { + "path": "./assets/layers/playground_equipment/Playground_climbingwall.jpg", + "class": "large" + } + }, + { + "if": "playground=map", + "then": { + "en": "This is a map" + }, + "icon": { + "path": "./assets/layers/playground_equipment/Playground_Map,_Washington_Elementary.jpg", + "class": "large" + } + }, + { + "if": "playground=bridge", + "then": { + "en": "This is a bridge (either as a standalone device or as part of a larger structure)" + }, + "icon": { + "path": "./assets/layers/playground_equipment/Playground_in_Muchall_Park,_Wolverhampton_-_geograph.org.uk_-_2735437.jpg", + "class": "large" + } + }, + { + "if": "playground=cushion", + "then": { + "en": "This is a bouncy cushion" + }, + "icon": { + "path": "./assets/layers/playground_equipment/Hupfkissen.jpg", + "class": "large" + } + }, + { + "if": "playground=activitypanel", + "then": { + "en": "This is an activity panel" + }, + "icon": { + "path": "./assets/layers/playground_equipment/Szwedy_-_plac_zabaw_-_kotko_i_krzyzyk.jpg", + "class": "large" + } + }, + { + "if": "playground=teenshelter", + "then": { + "en": "This is a teen shelter" + }, + "icon": { + "path": "./assets/layers/playground_equipment/Teen_shelter_near_former_coastguard_lookout,_Watchet_-_geograph.org.uk_-_1714960.jpg", + "class": "large" + } + }, + { + "if": "playground=funnel_ball", + "then": { + "en": "This is a funnel used to play with funnel ball" + }, + "icon": { + "path": "./assets/layers/playground_equipment/Funnel_ball.jpg", + "class": "large" + } + }, + { + "if": "playground=spinning_circle", + "then": { + "en": "This is a spinning circle" + }, + "icon": { + "path": "./assets/layers/playground_equipment/Spinning_circle.jpg", + "class": "large" + } + } + ] + }, + { + "builtin": "wheelchair-access", + "override": { + "question": { + "en": "Is this device accessible by wheelchair?" + } + } + } + ], + "lineRendering": [ + { + "width": 1, + "color": "blue" + } + ], + "id": "playground_equipment", + "name": { + "en": "Playground equipment" + }, + "description": { + "en": "Layer showing playground equipment" + }, + "source": { + "osmTags": "playground~*" + }, + "title": { + "render": { + "en": "Playground device" + } + }, + "allowMove": true, + "presets": [ + { + "tags": [ + "playground=yes" + ], + "title": { + "en": "a playground device" + }, + "description": { + "en": "An exact type is asked later" + } + } + ] +} \ No newline at end of file diff --git a/assets/layers/postoffices/postoffices.json b/assets/layers/postoffices/postoffices.json index 826b68ca2..69eb6e9f0 100644 --- a/assets/layers/postoffices/postoffices.json +++ b/assets/layers/postoffices/postoffices.json @@ -552,6 +552,86 @@ } ], "filter": [ - "open_now" + "open_now", + { + "id": "letter_from", + "options": [ + { + "question": { + "en": "Offers letter posting" + }, + "osmTags": { + "and": [ + "post_office:letter_from~*", + "post_office:letter_from!~i~no" + ] + } + } + ] + }, + { + "id": "parcel_from", + "options": [ + { + "question": { + "en": "Offers parcel posting" + }, + "osmTags": { + "and": [ + "post_office:parcel_from~*", + "post_office:parcel_from!~i~no" + ] + } + } + ] + }, + { + "id": "parcel_pickup", + "options": [ + { + "question": { + "en": "Offers pickup of missed parcels" + }, + "osmTags": { + "and": [ + "post_office:parcel_pickup~*", + "post_office:parcel_pickup!~i~no" + ] + } + } + ] + }, + { + "id": "parcel_to", + "options": [ + { + "question": { + "en": "Accepts pickup of parcels sent here" + }, + "osmTags": { + "and": [ + "post_office:parcel_to~*", + "post_office:parcel_to!~i~no" + ] + } + } + ] + }, + { + "id": "stamps", + "options": [ + { + "question": { + "en": "Sells stamps" + }, + "osmTags": { + "and": [ + "post_office:stamps~*", + "post_office:stamps!~i~no" + ] + } + } + ] + } ] -} +} \ No newline at end of file diff --git a/assets/layers/souvenir_coin/license_info.json b/assets/layers/souvenir_coin/license_info.json new file mode 100644 index 000000000..81c6e8d3e --- /dev/null +++ b/assets/layers/souvenir_coin/license_info.json @@ -0,0 +1,10 @@ +[ + { + "path": "souvenir_coin.svg", + "license": "CC0-1.0", + "authors": [ + "Robin van der Linde" + ], + "sources": [] + } +] \ No newline at end of file diff --git a/assets/layers/souvenir_coin/souvenir_coin.json b/assets/layers/souvenir_coin/souvenir_coin.json new file mode 100644 index 000000000..ee5639039 --- /dev/null +++ b/assets/layers/souvenir_coin/souvenir_coin.json @@ -0,0 +1,160 @@ +{ + "pointRendering": [ + { + "location": [ + "point", + "centroid" + ], + "iconBadges": [ + { + "if": "opening_hours~*", + "then": "icons.isOpen" + } + ], + "marker": [ + { + "icon": "circle", + "color": "#FFFFFF00" + }, + { + "icon": "./assets/layers/souvenir_coin/souvenir_coin.svg" + } + ] + } + ], + "tagRenderings": [ + "images", + "opening_hours_24_7", + { + "builtin": "elongated_coin.designs", + "id": "designs", + "override": { + "render": { + "en": "This machine has {coin:design_count} designs available" + }, + "mappings": [ + { + "if": "coin:design_count=1", + "then": { + "en": "This machine has one design available" + } + }, + { + "if": "coin:design_count=2", + "then": { + "en": "This machine has two designs available" + } + }, + { + "if": "coin:design_count=3", + "then": { + "en": "This machine has three designs available" + } + }, + { + "if": "coin:design_count=4", + "then": { + "en": "This machine has four designs available" + } + } + ] + } + }, + "payment-options-split", + "website", + { + "question": { + "en": "How much does a souvenir coin cost?" + }, + "id": "charge", + "render": { + "en": "A souvenir coins costs {charge}" + }, + "freeform": { + "key": "charge", + "placeholder": { + "en": "Cost (e.g. 2 EUR)" + } + }, + "mappings": [ + { + "if": "charge=2 EUR", + "then": { + "en": "A souvenir coin costs 2 euro" + }, + "hideInAnswer": "_currency!~.*EUR.*" + } + ] + }, + "denominations-coins", + { + "question": { + "en": "Is this machine located indoors?" + }, + "id": "indoor", + "mappings": [ + { + "if": "indoor=yes", + "then": { + "en": "This machine is located indoors." + } + }, + { + "if": "indoor=no", + "then": { + "en": "This machine is located outdoors." + } + } + ] + }, + "level", + "check_date" + ], + "lineRendering": [ + { + "width": 1, + "color": "blue" + } + ], + "id": "souvenir_coin", + "name": { + "en": "Souvenir Coin Machines" + }, + "description": { + "en": "Layer showing machines selling souvenir coins" + }, + "source": { + "osmTags": { + "and": [ + "amenity=vending_machine", + "vending~.*souvenir_coins.*" + ] + } + }, + "title": { + "render": { + "en": "Souvenir Coin Machine" + } + }, + "presets": [ + { + "title": { + "en": "a souvenir coin machine" + }, + "description": { + "en": "Add a machine selling souvenir coins" + }, + "tags": [ + "amenity=vending_machine", + "vending=souvenir_coins" + ] + } + ], + "filter": [ + "open_now", + "accepts_debit_cards", + "accepts_credit_cards" + ], + "deletion": true, + "allowMove": true +} \ No newline at end of file diff --git a/assets/layers/souvenir_coin/souvenir_coin.svg b/assets/layers/souvenir_coin/souvenir_coin.svg new file mode 100644 index 000000000..9bf8075ee --- /dev/null +++ b/assets/layers/souvenir_coin/souvenir_coin.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/assets/layers/souvenir_coin/souvenir_coin.svg.license b/assets/layers/souvenir_coin/souvenir_coin.svg.license new file mode 100644 index 000000000..75299f884 --- /dev/null +++ b/assets/layers/souvenir_coin/souvenir_coin.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/souvenir_note/license_info.json b/assets/layers/souvenir_note/license_info.json new file mode 100644 index 000000000..4693f1204 --- /dev/null +++ b/assets/layers/souvenir_note/license_info.json @@ -0,0 +1,10 @@ +[ + { + "path": "souvenir_note.svg", + "license": "CC0-1.0", + "authors": [ + "Robin van der Linde" + ], + "sources": [] + } +] \ No newline at end of file diff --git a/assets/layers/souvenir_note/souvenir_note.json b/assets/layers/souvenir_note/souvenir_note.json new file mode 100644 index 000000000..df79f0585 --- /dev/null +++ b/assets/layers/souvenir_note/souvenir_note.json @@ -0,0 +1,178 @@ +{ + "pointRendering": [ + { + "location": [ + "point", + "centroid" + ], + "iconBadges": [ + { + "if": "opening_hours~*", + "then": "icons.isOpen" + } + ], + "marker": [ + { + "icon": "circle", + "color": "#FFFFFF00" + }, + { + "icon": "./assets/layers/souvenir_note/souvenir_note.svg" + } + ] + } + ], + "tagRenderings": [ + "images", + "opening_hours_24_7", + { + "id": "designs", + "question": { + "en": "How many designs are available?" + }, + "freeform": { + "key": "note:design_count", + "type": "pnat", + "placeholder": { + "en": "Number of designs (e.g. 5)", + "de": "Motivanzahl (z.B. 5)", + "es": "Número de diseños (por ejemplo, 5)", + "ca": "Nombre de dissenys (p. e. 5)", + "cs": "Počet vzorů (např. 5)" + } + }, + "render": { + "en": "This machine has {note:design_count} designs available." + }, + "mappings": [ + { + "if": "note:design_count=1", + "then": { + "en": "This machine has one design available." + } + }, + { + "if": "note:design_count=2", + "then": { + "en": "This machine has two designs available." + } + }, + { + "if": "note:design_count=3", + "then": { + "en": "This machine has three designs available." + } + }, + { + "if": "note:design_count=4", + "then": { + "en": "This machine has four designs available." + } + } + ] + }, + "payment-options-split", + "website", + { + "question": { + "en": "How much does a souvenir note cost?" + }, + "id": "charge", + "render": { + "en": "A souvenir note costs {charge}" + }, + "freeform": { + "key": "charge", + "placeholder": { + "en": "Cost (e.g. 2 EUR)" + } + }, + "mappings": [ + { + "if": "charge=2 EUR", + "then": { + "en": "A souvenir note costs 2 euro" + }, + "hideInAnswer": "_currency!~.*EUR.*" + }, + { + "if": "charge=3 EUR", + "then": { + "en": "A souvenir note costs 3 euro" + }, + "hideInAnswer": "_currency!~.*EUR.*" + } + ] + }, + "denominations-coins", + { + "question": { + "en": "Is this machine located indoors?" + }, + "id": "indoor", + "mappings": [ + { + "if": "indoor=yes", + "then": { + "en": "This machine is located indoors." + } + }, + { + "if": "indoor=no", + "then": { + "en": "This machine is located outdoors." + } + } + ] + }, + "level", + "check_date" + ], + "lineRendering": [ + { + "width": 1, + "color": "blue" + } + ], + "id": "souvenir_note", + "name": { + "en": "Souvenir Banknote Machines" + }, + "description": { + "en": "Layer showing machines selling souvenir banknotes" + }, + "source": { + "osmTags": { + "and": [ + "amenity=vending_machine", + "vending~.*souvenir_notes.*" + ] + } + }, + "title": { + "render": { + "en": "Souvenir Banknote Machine" + } + }, + "presets": [ + { + "title": { + "en": "a souvenir banknote machine" + }, + "description": { + "en": "Add a machine selling souvenir banknotes" + }, + "tags": [ + "amenity=vending_machine", + "vending=souvenir_notes" + ] + } + ], + "filter": [ + "open_now", + "accepts_debit_cards", + "accepts_credit_cards" + ], + "deletion": true, + "allowMove": true +} \ No newline at end of file diff --git a/assets/layers/souvenir_note/souvenir_note.svg b/assets/layers/souvenir_note/souvenir_note.svg new file mode 100644 index 000000000..a5f9ab9a1 --- /dev/null +++ b/assets/layers/souvenir_note/souvenir_note.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/assets/layers/souvenir_note/souvenir_note.svg.license b/assets/layers/souvenir_note/souvenir_note.svg.license new file mode 100644 index 000000000..75299f884 --- /dev/null +++ b/assets/layers/souvenir_note/souvenir_note.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/elongated_coin/elongated_coin.json b/assets/themes/elongated_coin/elongated_coin.json index d3e98e5d6..49afe2f65 100644 --- a/assets/themes/elongated_coin/elongated_coin.json +++ b/assets/themes/elongated_coin/elongated_coin.json @@ -21,6 +21,8 @@ "startLat": 53.0565, "startLon": 8.7492, "layers": [ - "elongated_coin" + "elongated_coin", + "souvenir_coin", + "souvenir_note" ] } \ No newline at end of file diff --git a/assets/themes/ghostsigns/ghostsigns.json b/assets/themes/ghostsigns/ghostsigns.json new file mode 100644 index 000000000..21577bb77 --- /dev/null +++ b/assets/themes/ghostsigns/ghostsigns.json @@ -0,0 +1,179 @@ +{ + "id": "ghostsigns", + "title": { + "en": "Ghost Signs" + }, + "description": { + "en": "A map showing disused signs on buildings" + }, + "icon": "./assets/themes/advertising/wall_painting.svg", + "layers": [ + { + "id": "ghostsigns", + "title": { + "render": { + "en": "Ghost Sign" + } + }, + "description": { + "en": "Layer showing disused signs on buildings" + }, + "name": { + "en": "Ghost Signs" + }, + "source": { + "osmTags": { + "and": [ + "historic~*", + "advertising=wall_painting" + ] + } + }, + "minzoom": 10, + "allowMove": { + "enableImproveAccuracy": true + }, + "tagRenderings": [ + { + "id": "historic", + "question": { + "en": "Is this a ghost sign?" + }, + "questionHint": { + "en": "Is this sign for a business that no longer exists or no longer being maintained?" + }, + "mappings": [ + { + "if": "historic=advertising", + "then": { + "en": "This is a ghost sign" + }, + "alsoShowIf": "historic=yes" + }, + { + "if": "historic=", + "then": { + "en": "This is not a ghost sign, answering this will hide the sign from the map" + } + } + ] + }, + "images", + { + "id": "name", + "condition": "name~*", + "render": { + "*": "{name}" + } + }, + { + "id": "inscription", + "question": { + "en": "What is the text on the sign?" + }, + "freeform": { + "key": "inscription", + "type": "string", + "placeholder": { + "en": "Text on the sign" + } + }, + "render": { + "en": "The text on the sign is: {inscription}" + } + }, + { + "id": "brand", + "question": { + "en": "For what business was this sign made?" + }, + "freeform": { + "key": "brand", + "type": "string", + "placeholder": { + "en": "Business name" + } + }, + "render": { + "en": "This sign was made for: {brand}" + } + } + ], + "lineRendering": [ + { + "color": "blue", + "width": 2 + } + ], + "pointRendering": [ + { + "location": [ + "point", + "centroid" + ], + "marker": [ + { + "icon": "./assets/themes/advertising/wall_painting.svg" + } + ] + } + ], + "presets": [ + { + "tags": [ + "historic=advertising", + "advertising=wall_painting" + ], + "title": { + "en": "a ghost sign" + }, + "snapToLayer": [ + "walls_and_buildings" + ], + "maxSnapDistance": 5 + } + ] + }, + { + "builtin": "advertising", + "override": { + "source": { + "osmTags": "advertising=wall_painting" + }, + "minzoom": 18, + "+tagRenderings": [ + { + "id": "historic", + "question": { + "en": "Is this a ghost sign?" + }, + "questionHint": { + "en": "Is this sign for a business that no longer exists or no longer being maintained?" + }, + "mappings": [ + { + "if": "historic=advertising", + "then": { + "en": "This is a ghost sign" + }, + "alsoShowIf": "historic=yes" + }, + { + "if": "historic=", + "then": { + "en": "This is not a ghost sign" + } + } + ] + } + ], + "=presets": [], + "pointRendering": [ + { + "iconSize": "20,20" + } + ] + } + } + ] +} \ 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 2e8d73909..591381bdf 100644 --- a/assets/themes/mapcomplete-changes/mapcomplete-changes.json +++ b/assets/themes/mapcomplete-changes/mapcomplete-changes.json @@ -252,6 +252,10 @@ "if": "theme=ghostbikes", "then": "./assets/themes/ghostbikes/logo.svg" }, + { + "if": "theme=ghostsigns", + "then": "./assets/themes/advertising/wall_painting.svg" + }, { "if": "theme=grb", "then": "./assets/themes/grb/logo.svg" diff --git a/assets/themes/playgrounds/playgrounds.json b/assets/themes/playgrounds/playgrounds.json index 32c82105d..87db0468e 100644 --- a/assets/themes/playgrounds/playgrounds.json +++ b/assets/themes/playgrounds/playgrounds.json @@ -60,6 +60,7 @@ "startLon": 4.399, "layers": [ "playground", + "playground_equipment", { "builtin": [ "bench", diff --git a/assets/themes/postboxes/postboxes.json b/assets/themes/postboxes/postboxes.json index 491d46d3c..13ce50ff7 100644 --- a/assets/themes/postboxes/postboxes.json +++ b/assets/themes/postboxes/postboxes.json @@ -54,7 +54,54 @@ "layers": [ "postboxes", "postoffices", - "parcel_lockers" + "parcel_lockers", + { + "builtin": "shops", + "override": { + "minzoom": 18, + "minzoomVisible": 18, + "description": { + "en": "Add a new post partner to the map in an existing shop" + }, + "+tagRenderings": [ + { + "id": "post_partner", + "question": { + "en": "Is this shop a post partner?" + }, + "mappings": [ + { + "if": "post_office=post_partner", + "then": { + "en": "This shop is a post partner" + } + }, + { + "if": "post_office=", + "then": { + "en": "This shop is not a post partner" + } + } + ] + } + ], + "shownByDefault": false, + "=presets": [ + { + "tags": [ + "shop=yes", + "post_office=post_partner" + ], + "title": { + "en": "a missing shop that is a post partner" + }, + "description": { + "en": "If a shop is not yet on the map and is a post partner, you can add it here." + } + } + ] + } + } ], "widenFactor": 1.5, "clustering": { diff --git a/langs/en.json b/langs/en.json index 30cc414dc..7f192dfac 100644 --- a/langs/en.json +++ b/langs/en.json @@ -224,6 +224,10 @@ "example": "Example", "examples": "Examples", "fewChangesBefore": "Please, answer a few questions of existing features before adding a new feature.", + "filterPanel": { + "disableAll": "Disable all", + "enableAll": "Enable all" + }, "geopermissionDenied": "Using the geolocation was denied", "getStartedLogin": "Log in with OpenStreetMap to get started", "getStartedNewAccount": " or create a new account", diff --git a/package-lock.json b/package-lock.json index 6593f7b78..123278a2e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -45,6 +45,7 @@ "lz-string": "^1.4.4", "mangrove-reviews-typescript": "^1.1.0", "maplibre-gl": "^3.5.0", + "monaco-editor": "^0.46.0", "nano-markdown": "^1.2.2", "opening_hours": "^3.6.0", "osm-auth": "^2.2.0", @@ -71,6 +72,7 @@ "@babeard/svelte-heroicons": "^2.0.0-rc.0", "@babel/polyfill": "^7.10.4", "@babel/preset-env": "7.13.8", + "@monaco-editor/loader": "^1.4.0", "@parcel/service-worker": "^2.6.0", "@rollup/plugin-json": "^6.0.0", "@sveltejs/vite-plugin-svelte": "^2.0.2", @@ -2358,6 +2360,18 @@ "gl-style-validate": "dist/gl-style-validate.mjs" } }, + "node_modules/@monaco-editor/loader": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@monaco-editor/loader/-/loader-1.4.0.tgz", + "integrity": "sha512-00ioBig0x642hytVspPl7DbQyaSWRaolYie/UFNjoTdvoKPzo6xrXLhTk9ixgIKcLH5b5vDOjVNiGyY+uDCUlg==", + "dev": true, + "dependencies": { + "state-local": "^1.0.6" + }, + "peerDependencies": { + "monaco-editor": ">= 0.21.0 < 1" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -9450,6 +9464,11 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/monaco-editor": { + "version": "0.46.0", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.46.0.tgz", + "integrity": "sha512-ADwtLIIww+9FKybWscd7OCfm9odsFYHImBRI1v9AviGce55QY8raT+9ihH8jX/E/e6QVSGM+pKj4jSUSRmALNQ==" + }, "node_modules/monotone-convex-hull-2d": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/monotone-convex-hull-2d/-/monotone-convex-hull-2d-1.0.1.tgz", @@ -11721,6 +11740,12 @@ "node": ">=0.1.14" } }, + "node_modules/state-local": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/state-local/-/state-local-1.0.7.tgz", + "integrity": "sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==", + "dev": true + }, "node_modules/std-env": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.2.tgz", @@ -15579,6 +15604,15 @@ "sort-object": "^3.0.3" } }, + "@monaco-editor/loader": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@monaco-editor/loader/-/loader-1.4.0.tgz", + "integrity": "sha512-00ioBig0x642hytVspPl7DbQyaSWRaolYie/UFNjoTdvoKPzo6xrXLhTk9ixgIKcLH5b5vDOjVNiGyY+uDCUlg==", + "dev": true, + "requires": { + "state-local": "^1.0.6" + } + }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -20964,6 +20998,11 @@ } } }, + "monaco-editor": { + "version": "0.46.0", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.46.0.tgz", + "integrity": "sha512-ADwtLIIww+9FKybWscd7OCfm9odsFYHImBRI1v9AviGce55QY8raT+9ihH8jX/E/e6QVSGM+pKj4jSUSRmALNQ==" + }, "monotone-convex-hull-2d": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/monotone-convex-hull-2d/-/monotone-convex-hull-2d-1.0.1.tgz", @@ -22608,6 +22647,12 @@ "integrity": "sha512-EeNzTVfj+1In7aSLPKDD03F/ly4RxEuF/EX0YcOG0cKoPXs+SLZxDawQbexQDBzwROs4VKLWTOaZQlZkGBFEIQ==", "optional": true }, + "state-local": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/state-local/-/state-local-1.0.7.tgz", + "integrity": "sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==", + "dev": true + }, "std-env": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.2.tgz", diff --git a/package.json b/package.json index e8059d7e4..e0b3b8339 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,10 @@ { "name": "mapcomplete", +<<<<<<< HEAD "version": "0.40.0", +======= + "version": "0.38.1", +>>>>>>> develop "repository": "https://github.com/pietervdvn/MapComplete", "description": "A small website to edit OSM easily", "bugs": "https://github.com/pietervdvn/MapComplete/issues", @@ -146,6 +150,7 @@ "lz-string": "^1.4.4", "mangrove-reviews-typescript": "^1.1.0", "maplibre-gl": "^3.5.0", + "monaco-editor": "^0.46.0", "nano-markdown": "^1.2.2", "opening_hours": "^3.6.0", "osm-auth": "^2.2.0", @@ -172,6 +177,7 @@ "@babeard/svelte-heroicons": "^2.0.0-rc.0", "@babel/polyfill": "^7.10.4", "@babel/preset-env": "7.13.8", + "@monaco-editor/loader": "^1.4.0", "@parcel/service-worker": "^2.6.0", "@rollup/plugin-json": "^6.0.0", "@sveltejs/vite-plugin-svelte": "^2.0.2", diff --git a/public/css/index-tailwind-output.css b/public/css/index-tailwind-output.css index 828557555..81bf9ff94 100644 --- a/public/css/index-tailwind-output.css +++ b/public/css/index-tailwind-output.css @@ -777,6 +777,10 @@ video { float: left; } +.m-8 { + margin: 2rem; +} + .m-4 { margin: 1rem; } @@ -789,10 +793,6 @@ video { margin: 0px; } -.m-8 { - margin: 2rem; -} - .m-2 { margin: 0.5rem; } @@ -896,6 +896,10 @@ video { margin-right: 4rem; } +.mb-4 { + margin-bottom: 1rem; +} + .mt-4 { margin-top: 1rem; } @@ -928,10 +932,6 @@ video { margin-right: 0.25rem; } -.mb-4 { - margin-bottom: 1rem; -} - .ml-1 { margin-left: 0.25rem; } @@ -1127,14 +1127,14 @@ video { height: 50%; } -.h-7 { - height: 1.75rem; -} - .h-3 { height: 0.75rem; } +.h-7 { + height: 1.75rem; +} + .h-11 { height: 2.75rem; } @@ -1163,6 +1163,10 @@ video { height: 20rem; } +.h-5\/6 { + height: 83.333333%; +} + .h-56 { height: 14rem; } @@ -1233,14 +1237,14 @@ video { width: 1rem; } -.w-7 { - width: 1.75rem; -} - .w-3 { width: 0.75rem; } +.w-7 { + width: 1.75rem; +} + .w-11 { width: 2.75rem; } @@ -1266,6 +1270,14 @@ video { width: 4rem; } +.w-5\/6 { + width: 83.333333%; +} + +.w-1\/6 { + width: 16.666667%; +} + .w-min { width: -webkit-min-content; width: min-content; diff --git a/scripts/downloadCommons.ts b/scripts/downloadCommons.ts index 78cb8e217..dad3013e6 100644 --- a/scripts/downloadCommons.ts +++ b/scripts/downloadCommons.ts @@ -69,6 +69,30 @@ interface CategoryQueryAPIResponse { } } +interface ImagesQueryAPIResponse { + continue: { + imcontinue: string + continue: string + } + query: { + normalized?: { + from: string + to: string + }[] + pages: { + [key: string]: { + pageid: number + ns: number + title: string + images?: { + ns: number + title: string + }[] + } + } + } +} + interface TemplateQueryAPIResponse { batchcomplete: string query: { @@ -96,13 +120,14 @@ const licenseMapping = {} // Map template names to license names const templateMapping = { "Template:PD": "Public Domain", + "Template:CC0": "CC0 1.0", } async function main(args: string[]) { if (args.length < 2) { console.log("Usage: downloadCommons.ts .. ") console.log( - "Example: npx vite-node downloadCommons.ts -- assets/svg https://commons.wikimedia.org/wiki/File:Example.jpg" + "Example: npx vite-node scripts/downloadCommons.ts -- assets/svg https://commons.wikimedia.org/wiki/File:Example.jpg" ) process.exit(1) } @@ -128,8 +153,24 @@ async function main(args: string[]) { for (const member of apiDetails.query.categorymembers) { await downloadImage(member.title, outputFolder, baseUrl) } - } else { + } else if (url.includes("File:")) { await downloadImage(commonsFileName, outputFolder, baseUrl) + } else { + // Probably a page url, try to get all images from the page + const apiUrl = `${baseUrl}/w/api.php?action=query&format=json&prop=images&titles=${commonsFileName}&imlimit=250` + const response = await fetch(apiUrl) + const apiDetails: ImagesQueryAPIResponse = await response.json() + const page = apiDetails.query.pages[Object.keys(apiDetails.query.pages)[0]] + if (page.images) { + for (const image of page.images) { + await downloadImage(image.title, outputFolder, baseUrl) + } + } else { + console.log( + "\x1b[31m%s\x1b[0m", + `URL ${url} doesn't seem to contain any images! Skipping...` + ) + } } } else { console.log( @@ -154,6 +195,12 @@ async function downloadImage(filename: string, outputFolder: string, baseUrl: st const apiDetails: ImageQueryAPIResponse = await response.json() const missingPage = apiDetails.query.pages["-1"] + // Check if the local file already exists, if it does, skip it + if (existsSync(`${outputFolder}/${filename}`)) { + console.log(`\x1b[33m%s\x1b[0m`, `${filename} already exists, skipping...`) + return + } + // Check if the file exists, locally or externally if (missingPage !== undefined) { // Image does not exist locally, check if it exists externally @@ -271,8 +318,8 @@ async function downloadImage(filename: string, outputFolder: string, baseUrl: st // Save the license information const licenseInfo: SmallLicense = { path: cleanFileName, - license: licenseMapping[license] || license, - authors: [author], + license: licenseMapping[license] || license.replace("CC BY", "CC-BY"), + authors: [removeLinks(author)], sources: [wikiUrl], } @@ -293,4 +340,9 @@ async function downloadImage(filename: string, outputFolder: string, baseUrl: st } } +function removeLinks(text: string): string { + // Remove tags + return text.replace(/(.*?)<\/a>/g, "$1") +} + main(process.argv.slice(2)) diff --git a/scripts/generateTranslations.ts b/scripts/generateTranslations.ts index dfcc2f03d..fd62b8a2a 100644 --- a/scripts/generateTranslations.ts +++ b/scripts/generateTranslations.ts @@ -5,7 +5,7 @@ import ScriptUtils from "./ScriptUtils" import Script from "./Script" const knownLanguages = ["en", "nl", "de", "fr", "es", "gl", "ca"] - +const ignoreTerms = ["searchTerms"] class TranslationPart { contents: Map = new Map() @@ -49,6 +49,7 @@ class TranslationPart { if (!translations.hasOwnProperty(translationsKey)) { continue } + const v = translations[translationsKey] if (typeof v != "string") { console.error( @@ -106,6 +107,9 @@ class TranslationPart { if (!object.hasOwnProperty(key)) { continue } + if (ignoreTerms.indexOf(key) >= 0) { + continue + } if (dontTranslateKeys?.indexOf(key) >= 0) { continue diff --git a/scripts/server.ts b/scripts/server.ts index 8c036721c..8bed5bc18 100644 --- a/scripts/server.ts +++ b/scripts/server.ts @@ -9,7 +9,7 @@ export class Server { handle: { mustMatch: string | RegExp mimetype: string - handle: (path: string) => Promise + handle: (path: string, queryParams: URLSearchParams) => Promise }[] ) { handle.push({ @@ -89,7 +89,7 @@ export class Server { } try { - const result = await handler.handle(path) + const result = await handler.handle(path, url.searchParams) res.writeHead(200, { "Content-Type": handler.mimetype }) res.write(result) res.end() diff --git a/scripts/serverLdScrape.ts b/scripts/serverLdScrape.ts new file mode 100644 index 000000000..31d66b0e8 --- /dev/null +++ b/scripts/serverLdScrape.ts @@ -0,0 +1,43 @@ +import Script from "../scripts/Script" +import { Server } from "../scripts/server" +import { Utils } from "../src/Utils" +import parse from "node-html-parser" +class ServerLdScrape extends Script { + constructor() { + super("Starts a server which fetches a webpage and returns embedded LD+JSON") + } + async main(args: string[]): Promise { + const port = Number(args[0] ?? 2346) + new Server(port, {}, [ + { + mustMatch: "extractgraph", + mimetype: "application/ld+json", + async handle(content, searchParams: URLSearchParams) { + const url = searchParams.get("url") + const dloaded = await Utils.download(url, { + "User-Agent": + "MapComplete/openstreetmap scraper; pietervdvn@posteo.net; https://github.com/pietervdvn/MapComplete", + }) + const parsed = parse(dloaded) + const scripts = Array.from(parsed.getElementsByTagName("script")) + const snippets = [] + for (const script of scripts) { + const tp = script.attributes["type"] + if (tp !== "application/ld+json") { + continue + } + try { + snippets.push(JSON.parse(script.textContent)) + } catch (e) { + console.error(e) + } + } + + return JSON.stringify(snippets) + }, + }, + ]) + } +} + +new ServerLdScrape().run() diff --git a/src/UI/Base/Checkbox.svelte b/src/UI/Base/Checkbox.svelte index 0b610d5f3..6580aeeb1 100644 --- a/src/UI/Base/Checkbox.svelte +++ b/src/UI/Base/Checkbox.svelte @@ -8,6 +8,9 @@ let _c: boolean = selected.data ?? true let id = `checkbox-input-${Math.round(Math.random()*100000000)}` $: selected.set(_c) + selected.addCallbackD(s => { + _c = s + })