From b19dac2bf69d9b375ee3f6dea0785b92771f175a Mon Sep 17 00:00:00 2001 From: Robin van der Linde Date: Tue, 3 Jan 2023 13:52:05 +0100 Subject: [PATCH] Add commons downloader, add some Belgian signs --- .vscode/settings.json | 5 +- assets/layers/traffic_sign/generateSigns.ts | 33 +- .../images/be/A/Belgian_road_sign_A11.svg | 60 +++ .../images/be/A/Belgian_road_sign_A13.svg | 23 + .../images/be/A/Belgian_road_sign_A14.svg | 21 + .../images/be/A/Belgian_road_sign_A15.svg | 43 ++ .../images/be/A/Belgian_road_sign_A17.svg | 109 +++++ .../images/be/A/Belgian_road_sign_A19.svg | 78 +++ .../images/be/A/Belgian_road_sign_A1a.svg | 22 + .../images/be/A/Belgian_road_sign_A1b.svg | 20 + .../images/be/A/Belgian_road_sign_A1c.svg | 23 + .../images/be/A/Belgian_road_sign_A1d.svg | 24 + .../images/be/A/Belgian_road_sign_A21.svg | 103 ++++ .../images/be/A/Belgian_road_sign_A23.svg | 130 +++++ .../images/be/A/Belgian_road_sign_A25.svg | 102 ++++ .../images/be/A/Belgian_road_sign_A27.svg | 79 +++ .../images/be/A/Belgian_road_sign_A29.svg | 64 +++ .../images/be/A/Belgian_road_sign_A31.svg | 94 ++++ .../images/be/A/Belgian_road_sign_A33.svg | 27 ++ .../images/be/A/Belgian_road_sign_A35.svg | 23 + .../images/be/A/Belgian_road_sign_A37.svg | 42 ++ .../images/be/A/Belgian_road_sign_A39.svg | 23 + .../images/be/A/Belgian_road_sign_A41.svg | 42 ++ .../images/be/A/Belgian_road_sign_A43.svg | 51 ++ .../images/be/A/Belgian_road_sign_A45.svg | 70 +++ .../images/be/A/Belgian_road_sign_A47.svg | 102 ++++ .../images/be/A/Belgian_road_sign_A49.svg | 90 ++++ .../images/be/A/Belgian_road_sign_A50.svg | 50 ++ .../images/be/A/Belgian_road_sign_A51.svg | 21 + .../images/be/A/Belgian_road_sign_A7a.svg | 33 ++ .../images/be/A/Belgian_road_sign_A7b_(2).svg | 32 ++ .../images/be/A/Belgian_road_sign_A9.svg | 30 ++ .../images/be/A/license_info.json | 302 ++++++++++++ assets/layers/traffic_sign/signs/be.protojson | 212 ++++++++ assets/layers/traffic_sign/traffic_sign.json | 457 ++++++++++++++++++ scripts/downloadCommons.ts | 157 ++++++ 36 files changed, 2795 insertions(+), 2 deletions(-) create mode 100644 assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A11.svg create mode 100644 assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A13.svg create mode 100644 assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A14.svg create mode 100644 assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A15.svg create mode 100644 assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A17.svg create mode 100644 assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A19.svg create mode 100644 assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A1a.svg create mode 100644 assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A1b.svg create mode 100644 assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A1c.svg create mode 100644 assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A1d.svg create mode 100644 assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A21.svg create mode 100644 assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A23.svg create mode 100644 assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A25.svg create mode 100644 assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A27.svg create mode 100644 assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A29.svg create mode 100644 assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A31.svg create mode 100644 assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A33.svg create mode 100644 assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A35.svg create mode 100644 assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A37.svg create mode 100644 assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A39.svg create mode 100644 assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A41.svg create mode 100644 assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A43.svg create mode 100644 assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A45.svg create mode 100644 assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A47.svg create mode 100644 assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A49.svg create mode 100644 assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A50.svg create mode 100644 assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A51.svg create mode 100644 assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A7a.svg create mode 100644 assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A7b_(2).svg create mode 100644 assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A9.svg create mode 100644 assets/layers/traffic_sign/images/be/A/license_info.json create mode 100644 assets/layers/traffic_sign/signs/be.protojson create mode 100644 scripts/downloadCommons.ts diff --git a/.vscode/settings.json b/.vscode/settings.json index 25b1f4dbe9..65a4999d42 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -17,5 +17,8 @@ ], "editor.tabSize": 2, "files.autoSave": "onFocusChange", - "search.useIgnoreFiles": true + "search.useIgnoreFiles": true, + "files.associations": { + "*.protojson": "json" + } } \ No newline at end of file diff --git a/assets/layers/traffic_sign/generateSigns.ts b/assets/layers/traffic_sign/generateSigns.ts index 137847c10f..0d49151eb2 100644 --- a/assets/layers/traffic_sign/generateSigns.ts +++ b/assets/layers/traffic_sign/generateSigns.ts @@ -32,6 +32,14 @@ interface Implication { value: string; } +interface Translations { + [key: string]: Translation; +} + +interface Translation { + [key: string]: string; +} + const worldWideMappings: MappingConfigJson[] = [ { if: "traffic_sign=city_limit", @@ -61,6 +69,7 @@ function main(){ // Create new list of mappings const mappings: MappingConfigJson[] = []; const iconMappings: MappingConfigJson[] = []; + const translationMemory: Translations = {}; // Add world wide mappings for(const mapping of worldWideMappings){ @@ -79,9 +88,20 @@ function main(){ const signFile = readFileSync("signs/" + file, "utf8"); const signs = JSON.parse(signFile) as SignFile; for(const sign of signs.traffic_signs){ + // Find item in traffic_signs.json file and save the translations const originalMapping = originalSignMappings.find(m => m.if === "traffic_sign=" + sign.id); - const iconPath = "./assets/layers/traffic_sign/images/"+signs.country.toLowerCase()+"/"+sign.image.file + translationMemory[sign.name] = { + ...originalMapping?.then, + en: sign.name, + } + + // Check if the sign starts with the country + if(!sign.id.toLowerCase().startsWith(signs.country.toLowerCase())){ + throw new Error("Sign " + sign.id + " does not start with country " + signs.country + ", you should fix this!"); + } + // Create new mapping, reusing original translations + const iconPath = "./assets/layers/traffic_sign/images/"+signs.country.toLowerCase()+"/"+sign.image.file const mapping: MappingConfigJson = { if: "traffic_sign=" + sign.id, then: { @@ -104,6 +124,17 @@ function main(){ } } + // Re-run over all mappings, and add translations + for(const mapping of mappings){ + const memoryTranslation = translationMemory[mapping.then.en]; + if(memoryTranslation){ + mapping.then = { + ...mapping.then, + ...memoryTranslation, + } + } + } + // Create new layer const newLayer: LayerConfigJson = { ...originalLayer, diff --git a/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A11.svg b/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A11.svg new file mode 100644 index 0000000000..079eff173e --- /dev/null +++ b/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A11.svg @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A13.svg b/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A13.svg new file mode 100644 index 0000000000..a26c4daf96 --- /dev/null +++ b/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A13.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + diff --git a/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A14.svg b/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A14.svg new file mode 100644 index 0000000000..876fa9506d --- /dev/null +++ b/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A14.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + diff --git a/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A15.svg b/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A15.svg new file mode 100644 index 0000000000..75523c3a31 --- /dev/null +++ b/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A15.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + diff --git a/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A17.svg b/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A17.svg new file mode 100644 index 0000000000..6eac3654e4 --- /dev/null +++ b/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A17.svg @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A19.svg b/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A19.svg new file mode 100644 index 0000000000..71a6ca9112 --- /dev/null +++ b/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A19.svg @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A1a.svg b/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A1a.svg new file mode 100644 index 0000000000..afc3074ece --- /dev/null +++ b/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A1a.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + diff --git a/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A1b.svg b/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A1b.svg new file mode 100644 index 0000000000..aca9e89e23 --- /dev/null +++ b/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A1b.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + diff --git a/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A1c.svg b/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A1c.svg new file mode 100644 index 0000000000..4dfcd0a8e2 --- /dev/null +++ b/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A1c.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + diff --git a/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A1d.svg b/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A1d.svg new file mode 100644 index 0000000000..f06576e4dd --- /dev/null +++ b/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A1d.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + diff --git a/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A21.svg b/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A21.svg new file mode 100644 index 0000000000..21f94171dc --- /dev/null +++ b/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A21.svg @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A23.svg b/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A23.svg new file mode 100644 index 0000000000..5f77b8ed92 --- /dev/null +++ b/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A23.svg @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A25.svg b/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A25.svg new file mode 100644 index 0000000000..3905598e89 --- /dev/null +++ b/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A25.svg @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A27.svg b/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A27.svg new file mode 100644 index 0000000000..c5ab031d28 --- /dev/null +++ b/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A27.svg @@ -0,0 +1,79 @@ + + + + + + + + + + + diff --git a/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A29.svg b/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A29.svg new file mode 100644 index 0000000000..4bc111ad72 --- /dev/null +++ b/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A29.svg @@ -0,0 +1,64 @@ + + + + + + + + + + + diff --git a/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A31.svg b/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A31.svg new file mode 100644 index 0000000000..3fc55e0df2 --- /dev/null +++ b/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A31.svg @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + diff --git a/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A33.svg b/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A33.svg new file mode 100644 index 0000000000..b250b42b11 --- /dev/null +++ b/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A33.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + diff --git a/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A35.svg b/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A35.svg new file mode 100644 index 0000000000..3ad2cbb7f4 --- /dev/null +++ b/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A35.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + diff --git a/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A37.svg b/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A37.svg new file mode 100644 index 0000000000..62f7e2f75a --- /dev/null +++ b/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A37.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A39.svg b/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A39.svg new file mode 100644 index 0000000000..f3c8c441b6 --- /dev/null +++ b/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A39.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + diff --git a/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A41.svg b/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A41.svg new file mode 100644 index 0000000000..40e8bdd6a7 --- /dev/null +++ b/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A41.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + diff --git a/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A43.svg b/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A43.svg new file mode 100644 index 0000000000..419d4db5f6 --- /dev/null +++ b/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A43.svg @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + diff --git a/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A45.svg b/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A45.svg new file mode 100644 index 0000000000..3ed6e4be33 --- /dev/null +++ b/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A45.svg @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A47.svg b/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A47.svg new file mode 100644 index 0000000000..fa3731e9c8 --- /dev/null +++ b/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A47.svg @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A49.svg b/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A49.svg new file mode 100644 index 0000000000..7a005654bd --- /dev/null +++ b/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A49.svg @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A50.svg b/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A50.svg new file mode 100644 index 0000000000..4e1a322abd --- /dev/null +++ b/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A50.svg @@ -0,0 +1,50 @@ + + + + diff --git a/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A51.svg b/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A51.svg new file mode 100644 index 0000000000..1bfaeab866 --- /dev/null +++ b/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A51.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + diff --git a/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A7a.svg b/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A7a.svg new file mode 100644 index 0000000000..f7378851be --- /dev/null +++ b/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A7a.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + diff --git a/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A7b_(2).svg b/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A7b_(2).svg new file mode 100644 index 0000000000..6655592aa1 --- /dev/null +++ b/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A7b_(2).svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + diff --git a/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A9.svg b/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A9.svg new file mode 100644 index 0000000000..dd8278a42e --- /dev/null +++ b/assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A9.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + diff --git a/assets/layers/traffic_sign/images/be/A/license_info.json b/assets/layers/traffic_sign/images/be/A/license_info.json new file mode 100644 index 0000000000..c432401b81 --- /dev/null +++ b/assets/layers/traffic_sign/images/be/A/license_info.json @@ -0,0 +1,302 @@ +[ + { + "path": "Belgian_road_sign_A11.svg", + "license": "Public domain", + "authors": [ + "Vascer" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:Belgian_road_sign_A11.svg" + ] + }, + { + "path": "Belgian_road_sign_A13.svg", + "license": "Public domain", + "authors": [ + "Vascer" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:Belgian_road_sign_A13.svg" + ] + }, + { + "path": "Belgian_road_sign_A14.svg", + "license": "Public domain", + "authors": [ + "Vascer" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:Belgian_road_sign_A14.svg" + ] + }, + { + "path": "Belgian_road_sign_A15.svg", + "license": "Public domain", + "authors": [ + "Vascer" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:Belgian_road_sign_A15.svg" + ] + }, + { + "path": "Belgian_road_sign_A17.svg", + "license": "Public domain", + "authors": [ + "Vascer" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:Belgian_road_sign_A17.svg" + ] + }, + { + "path": "Belgian_road_sign_A19.svg", + "license": "Public domain", + "authors": [ + "Vascer" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:Belgian_road_sign_A19.svg" + ] + }, + { + "path": "Belgian_road_sign_A1a.svg", + "license": "Public domain", + "authors": [ + "Vascer" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:Belgian_road_sign_A1a.svg" + ] + }, + { + "path": "Belgian_road_sign_A1b.svg", + "license": "Public domain", + "authors": [ + "Vascer" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:Belgian_road_sign_A1b.svg" + ] + }, + { + "path": "Belgian_road_sign_A1c.svg", + "license": "Public domain", + "authors": [ + "Vascer" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:Belgian_road_sign_A1c.svg" + ] + }, + { + "path": "Belgian_road_sign_A1d.svg", + "license": "Public domain", + "authors": [ + "Vascer" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:Belgian_road_sign_A1d.svg" + ] + }, + { + "path": "Belgian_road_sign_A21.svg", + "license": "Public domain", + "authors": [ + "Vascer" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:Belgian_road_sign_A21.svg" + ] + }, + { + "path": "Belgian_road_sign_A23.svg", + "license": "Public domain", + "authors": [ + "Vascer" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:Belgian_road_sign_A23.svg" + ] + }, + { + "path": "Belgian_road_sign_A25.svg", + "license": "Public domain", + "authors": [ + "Vascer" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:Belgian_road_sign_A25.svg" + ] + }, + { + "path": "Belgian_road_sign_A27.svg", + "license": "Public domain", + "authors": [ + "Vascer" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:Belgian_road_sign_A27.svg" + ] + }, + { + "path": "Belgian_road_sign_A29.svg", + "license": "Public domain", + "authors": [ + "Vascer" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:Belgian_road_sign_A29.svg" + ] + }, + { + "path": "Belgian_road_sign_A31.svg", + "license": "Public domain", + "authors": [ + "Vascer" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:Belgian_road_sign_A31.svg" + ] + }, + { + "path": "Belgian_road_sign_A33.svg", + "license": "Public domain", + "authors": [ + "Vascer" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:Belgian_road_sign_A33.svg" + ] + }, + { + "path": "Belgian_road_sign_A35.svg", + "license": "Public domain", + "authors": [ + "Vascer" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:Belgian_road_sign_A35.svg" + ] + }, + { + "path": "Belgian_road_sign_A37.svg", + "license": "Public domain", + "authors": [ + "Vascer" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:Belgian_road_sign_A37.svg" + ] + }, + { + "path": "Belgian_road_sign_A39.svg", + "license": "Public domain", + "authors": [ + "Vascer" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:Belgian_road_sign_A39.svg" + ] + }, + { + "path": "Belgian_road_sign_A41.svg", + "license": "Public domain", + "authors": [ + "Vascer" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:Belgian_road_sign_A41.svg" + ] + }, + { + "path": "Belgian_road_sign_A43.svg", + "license": "Public domain", + "authors": [ + "Vascer" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:Belgian_road_sign_A43.svg" + ] + }, + { + "path": "Belgian_road_sign_A45.svg", + "license": "Public domain", + "authors": [ + "Vascer" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:Belgian_road_sign_A45.svg" + ] + }, + { + "path": "Belgian_road_sign_A47.svg", + "license": "Public domain", + "authors": [ + "Vascer" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:Belgian_road_sign_A47.svg" + ] + }, + { + "path": "Belgian_road_sign_A49.svg", + "license": "Public domain", + "authors": [ + "Vascer" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:Belgian_road_sign_A49.svg" + ] + }, + { + "path": "Belgian_road_sign_A50.svg", + "license": "Public domain", + "authors": [ + "FOD Mobiliteit" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:Belgian_road_sign_A50.svg" + ] + }, + { + "path": "Belgian_road_sign_A51.svg", + "license": "Public domain", + "authors": [ + "Vascer" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:Belgian_road_sign_A51.svg" + ] + }, + { + "path": "Belgian_road_sign_A7a.svg", + "license": "Public domain", + "authors": [ + "Vascer" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:Belgian_road_sign_A7a.svg" + ] + }, + { + "path": "Belgian_road_sign_A7b_(2).svg", + "license": "Public domain", + "authors": [ + "Vascer" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:Belgian_road_sign_A7b_(2).svg" + ] + }, + { + "path": "Belgian_road_sign_A9.svg", + "license": "Public domain", + "authors": [ + "Vascer" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:Belgian_road_sign_A9.svg" + ] + } +] \ No newline at end of file diff --git a/assets/layers/traffic_sign/signs/be.protojson b/assets/layers/traffic_sign/signs/be.protojson new file mode 100644 index 0000000000..ca969e73b6 --- /dev/null +++ b/assets/layers/traffic_sign/signs/be.protojson @@ -0,0 +1,212 @@ +{ + "$schema": "https://osm.rlin.eu/traffic_sign/schema/schema.json", + "name": "Traffic signs of Belgium", + "description": "Traffic signs of Belgium", + "version": "2023-01-03", + "country": "BE", + "traffic_signs": [ + { + "id": "BE:A1a", + "name": "Corner to the left", + "image": { + "file": "A/Belgian_road_sign_A1a.svg" + } + }, + { + "id": "BE:A1b", + "name": "Corner to the right", + "image": { + "file": "A/Belgian_road_sign_A1b.svg" + } + }, + { + "id": "BE:A1c", + "name": "S-bend to the left", + "image": { + "file": "A/Belgian_road_sign_A1c.svg" + } + }, + { + "id": "BE:A1d", + "name": "S-bend to the right", + "image": { + "file": "A/Belgian_road_sign_A1d.svg" + } + }, + { + "id": "BE:A7a", + "name": "Road narrows", + "image": { + "file": "A/Belgian_road_sign_A7a.svg" + } + }, + { + "id": "BE:A7b", + "name": "Road narrows on the left", + "image": { + "file": "A/Belgian_road_sign_A7b_(2).svg" + } + }, + { + "id": "BE:A9", + "name": "Movable bridge", + "image": { + "file": "A/Belgian_road_sign_A9.svg" + } + }, + { + "id": "BE:A11", + "name": "Quay or river bank", + "image": { + "file": "A/Belgian_road_sign_A11.svg" + } + }, + { + "id": "BE:A13", + "name": "Bad road surface", + "image": { + "file": "A/Belgian_road_sign_A13.svg" + } + }, + { + "id": "BE:A14", + "name": "Speed bump", + "image": { + "file": "A/Belgian_road_sign_A14.svg" + } + }, + { + "id": "BE:A15", + "name": "Slippery road", + "image": { + "file": "A/Belgian_road_sign_A15.svg" + } + }, + { + "id": "BE:A17", + "name": "Loose chippings", + "image": { + "file": "A/Belgian_road_sign_A17.svg" + } + }, + { + "id": "BE:A19", + "name": "Falling rocks", + "image": { + "file": "A/Belgian_road_sign_A19.svg" + } + }, + { + "id": "BE:A21", + "name": "Pedestrian crossing", + "image": { + "file": "A/Belgian_road_sign_A21.svg" + } + }, + { + "id": "BE:A23", + "name": "Playing children", + "image": { + "file": "A/Belgian_road_sign_A23.svg" + } + }, + { + "id": "BE:A25", + "name": "Cyclists", + "image": { + "file": "A/Belgian_road_sign_A25.svg" + } + }, + { + "id": "BE:A27", + "name": "Dangerous animals", + "image": { + "file": "A/Belgian_road_sign_A27.svg" + } + }, + { + "id": "BE:A29", + "name": "Cattle", + "image": { + "file": "A/Belgian_road_sign_A29.svg" + } + }, + { + "id": "BE:A31", + "name": "Road works", + "image": { + "file": "A/Belgian_road_sign_A31.svg" + } + }, + { + "id": "BE:A33", + "name": "Traffic lights", + "image": { + "file": "A/Belgian_road_sign_A33.svg" + } + }, + { + "id": "BE:A35", + "name": "Low-flying aircraft", + "image": { + "file": "A/Belgian_road_sign_A35.svg" + } + }, + { + "id": "BE:A37", + "name": "Side wind", + "image": { + "file": "A/Belgian_road_sign_A37.svg" + } + }, + { + "id": "BE:A39", + "name": "Two-way traffic", + "image": { + "file": "A/Belgian_road_sign_A39.svg" + } + }, + { + "id": "BE:A41", + "name": "Protected railway crossing", + "image": { + "file": "A/Belgian_road_sign_A41.svg" + } + }, + { + "id": "BE:A43", + "name": "Unprotected railway crossing", + "image": { + "file": "A/Belgian_road_sign_A43.svg" + } + }, + { + "id": "BE:A45", + "name": "Single-track railway crossing", + "image": { + "file": "A/Belgian_road_sign_A45.svg" + } + }, + { + "id": "BE:A47", + "name": "Multiple-track railway crossing", + "image": { + "file": "A/Belgian_road_sign_A47.svg" + } + }, + { + "id": "BE:A49", + "name": "Tramway crossing", + "image": { + "file": "A/Belgian_road_sign_A49.svg" + } + }, + { + "id": "BE:A51", + "name": "Danger ahead", + "image": { + "file": "A/Belgian_road_sign_A51.svg" + } + } + ] +} \ No newline at end of file diff --git a/assets/layers/traffic_sign/traffic_sign.json b/assets/layers/traffic_sign/traffic_sign.json index 7eb7332a6f..53765887c7 100644 --- a/assets/layers/traffic_sign/traffic_sign.json +++ b/assets/layers/traffic_sign/traffic_sign.json @@ -50,6 +50,347 @@ "en": "Maximum speed" } }, + { + "if": "traffic_sign=BE:A1a", + "then": { + "en": "Corner to the left", + "nl": "Bocht naar links" + }, + "hideInAnswer": "_country!=be", + "icon": { + "path": "./assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A1a.svg", + "class": "large" + } + }, + { + "if": "traffic_sign=BE:A1b", + "then": { + "en": "Corner to the right", + "nl": "Bocht naar rechts" + }, + "hideInAnswer": "_country!=be", + "icon": { + "path": "./assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A1b.svg", + "class": "large" + } + }, + { + "if": "traffic_sign=BE:A1c", + "then": { + "en": "S-bend to the left", + "nl": "S-bocht naar links" + }, + "hideInAnswer": "_country!=be", + "icon": { + "path": "./assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A1c.svg", + "class": "large" + } + }, + { + "if": "traffic_sign=BE:A1d", + "then": { + "en": "S-bend to the right", + "nl": "S-bocht naar rechts" + }, + "hideInAnswer": "_country!=be", + "icon": { + "path": "./assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A1d.svg", + "class": "large" + } + }, + { + "if": "traffic_sign=BE:A7a", + "then": { + "en": "Road narrows", + "nl": "Wegversmalling" + }, + "hideInAnswer": "_country!=be", + "icon": { + "path": "./assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A7a.svg", + "class": "large" + } + }, + { + "if": "traffic_sign=BE:A7b", + "then": { + "en": "Road narrows on the left", + "nl": "Wegversmalling aan de linkerkant" + }, + "hideInAnswer": "_country!=be", + "icon": { + "path": "./assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A7b_(2).svg", + "class": "large" + } + }, + { + "if": "traffic_sign=BE:A9", + "then": { + "en": "Movable bridge", + "nl": "Beweegbare brug" + }, + "hideInAnswer": "_country!=be", + "icon": { + "path": "./assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A9.svg", + "class": "large" + } + }, + { + "if": "traffic_sign=BE:A11", + "then": { + "en": "Quay or river bank", + "nl": "Kade of rivieroever" + }, + "hideInAnswer": "_country!=be", + "icon": { + "path": "./assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A11.svg", + "class": "large" + } + }, + { + "if": "traffic_sign=BE:A13", + "then": { + "en": "Bad road surface", + "nl": "Slecht wegdek" + }, + "hideInAnswer": "_country!=be", + "icon": { + "path": "./assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A13.svg", + "class": "large" + } + }, + { + "if": "traffic_sign=BE:A14", + "then": { + "en": "Speed bump", + "nl": "Drempel" + }, + "hideInAnswer": "_country!=be", + "icon": { + "path": "./assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A14.svg", + "class": "large" + } + }, + { + "if": "traffic_sign=BE:A15", + "then": { + "en": "Slippery road", + "nl": "Slipgevaar" + }, + "hideInAnswer": "_country!=be", + "icon": { + "path": "./assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A15.svg", + "class": "large" + } + }, + { + "if": "traffic_sign=BE:A17", + "then": { + "en": "Loose chippings", + "nl": "Opspattend grind" + }, + "hideInAnswer": "_country!=be", + "icon": { + "path": "./assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A17.svg", + "class": "large" + } + }, + { + "if": "traffic_sign=BE:A19", + "then": { + "en": "Falling rocks" + }, + "hideInAnswer": "_country!=be", + "icon": { + "path": "./assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A19.svg", + "class": "large" + } + }, + { + "if": "traffic_sign=BE:A21", + "then": { + "en": "Pedestrian crossing", + "nl": "Voetgangersoversteekplaats" + }, + "hideInAnswer": "_country!=be", + "icon": { + "path": "./assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A21.svg", + "class": "large" + } + }, + { + "if": "traffic_sign=BE:A23", + "then": { + "en": "Playing children", + "nl": "Spelende kinderen" + }, + "hideInAnswer": "_country!=be", + "icon": { + "path": "./assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A23.svg", + "class": "large" + } + }, + { + "if": "traffic_sign=BE:A25", + "then": { + "en": "Cyclists" + }, + "hideInAnswer": "_country!=be", + "icon": { + "path": "./assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A25.svg", + "class": "large" + } + }, + { + "if": "traffic_sign=BE:A27", + "then": { + "en": "Dangerous animals", + "nl": "Gevaarlijk wild" + }, + "hideInAnswer": "_country!=be", + "icon": { + "path": "./assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A27.svg", + "class": "large" + } + }, + { + "if": "traffic_sign=BE:A29", + "then": { + "en": "Cattle", + "nl": "Vee" + }, + "hideInAnswer": "_country!=be", + "icon": { + "path": "./assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A29.svg", + "class": "large" + } + }, + { + "if": "traffic_sign=BE:A31", + "then": { + "en": "Road works", + "nl": "Wegwerkzaamheden" + }, + "hideInAnswer": "_country!=be", + "icon": { + "path": "./assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A31.svg", + "class": "large" + } + }, + { + "if": "traffic_sign=BE:A33", + "then": { + "en": "Traffic lights" + }, + "hideInAnswer": "_country!=be", + "icon": { + "path": "./assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A33.svg", + "class": "large" + } + }, + { + "if": "traffic_sign=BE:A35", + "then": { + "en": "Low-flying aircraft", + "nl": "Laagvliegende vliegtuigen" + }, + "hideInAnswer": "_country!=be", + "icon": { + "path": "./assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A35.svg", + "class": "large" + } + }, + { + "if": "traffic_sign=BE:A37", + "then": { + "en": "Side wind", + "nl": "Zijwind" + }, + "hideInAnswer": "_country!=be", + "icon": { + "path": "./assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A37.svg", + "class": "large" + } + }, + { + "if": "traffic_sign=BE:A39", + "then": { + "en": "Two-way traffic" + }, + "hideInAnswer": "_country!=be", + "icon": { + "path": "./assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A39.svg", + "class": "large" + } + }, + { + "if": "traffic_sign=BE:A41", + "then": { + "en": "Protected railway crossing", + "nl": "Beveiligde spoorwegovergang" + }, + "hideInAnswer": "_country!=be", + "icon": { + "path": "./assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A41.svg", + "class": "large" + } + }, + { + "if": "traffic_sign=BE:A43", + "then": { + "en": "Unprotected railway crossing", + "nl": "Onbeveiligde spoorwegovergang" + }, + "hideInAnswer": "_country!=be", + "icon": { + "path": "./assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A43.svg", + "class": "large" + } + }, + { + "if": "traffic_sign=BE:A45", + "then": { + "en": "Single-track railway crossing" + }, + "hideInAnswer": "_country!=be", + "icon": { + "path": "./assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A45.svg", + "class": "large" + } + }, + { + "if": "traffic_sign=BE:A47", + "then": { + "en": "Multiple-track railway crossing" + }, + "hideInAnswer": "_country!=be", + "icon": { + "path": "./assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A47.svg", + "class": "large" + } + }, + { + "if": "traffic_sign=BE:A49", + "then": { + "en": "Tramway crossing" + }, + "hideInAnswer": "_country!=be", + "icon": { + "path": "./assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A49.svg", + "class": "large" + } + }, + { + "if": "traffic_sign=BE:A51", + "then": { + "en": "Danger ahead", + "nl": "Gevaar" + }, + "hideInAnswer": "_country!=be", + "icon": { + "path": "./assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A51.svg", + "class": "large" + } + }, { "if": "traffic_sign=NL:A01-5", "then": { @@ -1881,6 +2222,122 @@ "icon": { "render": "./assets/layers/traffic_sign/images/unknown.svg", "mappings": [ + { + "if": "traffic_sign~BE:A1a(;.*)*$", + "then": "./assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A1a.svg" + }, + { + "if": "traffic_sign~BE:A1b(;.*)*$", + "then": "./assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A1b.svg" + }, + { + "if": "traffic_sign~BE:A1c(;.*)*$", + "then": "./assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A1c.svg" + }, + { + "if": "traffic_sign~BE:A1d(;.*)*$", + "then": "./assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A1d.svg" + }, + { + "if": "traffic_sign~BE:A7a(;.*)*$", + "then": "./assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A7a.svg" + }, + { + "if": "traffic_sign~BE:A7b(;.*)*$", + "then": "./assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A7b_(2).svg" + }, + { + "if": "traffic_sign~BE:A9(;.*)*$", + "then": "./assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A9.svg" + }, + { + "if": "traffic_sign~BE:A11(;.*)*$", + "then": "./assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A11.svg" + }, + { + "if": "traffic_sign~BE:A13(;.*)*$", + "then": "./assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A13.svg" + }, + { + "if": "traffic_sign~BE:A14(;.*)*$", + "then": "./assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A14.svg" + }, + { + "if": "traffic_sign~BE:A15(;.*)*$", + "then": "./assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A15.svg" + }, + { + "if": "traffic_sign~BE:A17(;.*)*$", + "then": "./assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A17.svg" + }, + { + "if": "traffic_sign~BE:A19(;.*)*$", + "then": "./assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A19.svg" + }, + { + "if": "traffic_sign~BE:A21(;.*)*$", + "then": "./assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A21.svg" + }, + { + "if": "traffic_sign~BE:A23(;.*)*$", + "then": "./assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A23.svg" + }, + { + "if": "traffic_sign~BE:A25(;.*)*$", + "then": "./assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A25.svg" + }, + { + "if": "traffic_sign~BE:A27(;.*)*$", + "then": "./assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A27.svg" + }, + { + "if": "traffic_sign~BE:A29(;.*)*$", + "then": "./assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A29.svg" + }, + { + "if": "traffic_sign~BE:A31(;.*)*$", + "then": "./assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A31.svg" + }, + { + "if": "traffic_sign~BE:A33(;.*)*$", + "then": "./assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A33.svg" + }, + { + "if": "traffic_sign~BE:A35(;.*)*$", + "then": "./assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A35.svg" + }, + { + "if": "traffic_sign~BE:A37(;.*)*$", + "then": "./assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A37.svg" + }, + { + "if": "traffic_sign~BE:A39(;.*)*$", + "then": "./assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A39.svg" + }, + { + "if": "traffic_sign~BE:A41(;.*)*$", + "then": "./assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A41.svg" + }, + { + "if": "traffic_sign~BE:A43(;.*)*$", + "then": "./assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A43.svg" + }, + { + "if": "traffic_sign~BE:A45(;.*)*$", + "then": "./assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A45.svg" + }, + { + "if": "traffic_sign~BE:A47(;.*)*$", + "then": "./assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A47.svg" + }, + { + "if": "traffic_sign~BE:A49(;.*)*$", + "then": "./assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A49.svg" + }, + { + "if": "traffic_sign~BE:A51(;.*)*$", + "then": "./assets/layers/traffic_sign/images/be/A/Belgian_road_sign_A51.svg" + }, { "if": "traffic_sign~NL:A01-5(;.*)*$", "then": "./assets/layers/traffic_sign/images/nl/A/Nederlands_verkeersbord_A1-5.svg" diff --git a/scripts/downloadCommons.ts b/scripts/downloadCommons.ts new file mode 100644 index 0000000000..99072a58a9 --- /dev/null +++ b/scripts/downloadCommons.ts @@ -0,0 +1,157 @@ +/** + * Script to download images from Wikimedia Commons, and save them together with license information. + */ + +import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs" +import { unescape } from "querystring" +import SmallLicense from "../Models/smallLicense" + +interface ExtMetadataProp { + value: string + source: string + hidden: string +} + +interface ImageQueryAPIResponse { + continue: { + iistart: string + continue: string + } + query: { + normalized?: { + from: string + to: string + }[] + pages: { + [key: string]: { + pageid: number + ns: number + title: string + imagerepository: string + imageinfo: { + url: string + descriptionurl: string + descriptionshorturl: string + extmetadata: { + DateTime: ExtMetadataProp + ObjectName: ExtMetadataProp + CommonsMetadataExtension: ExtMetadataProp + Categories: ExtMetadataProp + Assessments: ExtMetadataProp + ImageDescription: ExtMetadataProp + DateTimeOriginal: ExtMetadataProp + Credit: ExtMetadataProp + Artist: ExtMetadataProp + LicenseShortName: ExtMetadataProp + UsageTerms: ExtMetadataProp + AttributionRequired: ExtMetadataProp + Copyrighted: ExtMetadataProp + Restrictions: ExtMetadataProp + License: ExtMetadataProp + } + }[] + } + } + } +} + +interface CategoryMember { + pageid: number + ns: number + title: string +} + +interface CategoryQueryAPIResponse { + batchcomplete: string + query: { + categorymembers: CategoryMember[] + } +} + +// Map license names of Wikimedia Commons to different names +const licenseMapping = {} + +async function main(args: string[]) { + if (args.length < 2) { + console.log("Usage: downloadCommons.ts .. ") + return + } + const [outputFolder, ...urls] = args + + for (const url of urls) { + // Download details from the API + const commonsFileName = url.split("/").pop().split("?").shift() + console.log(`Processing ${commonsFileName}...`) + + // Check if it is a file or a category + if (url.includes("Category:")) { + // Download all files in the category + const apiUrl = `https://commons.wikimedia.org/w/api.php?action=query&format=json&list=categorymembers&cmtitle=${commonsFileName}&cmlimit=250&cmtype=file` + const response = await fetch(apiUrl) + const apiDetails: CategoryQueryAPIResponse = await response.json() + for (const member of apiDetails.query.categorymembers) { + await downloadImage(member.title, outputFolder) + } + } else { + await downloadImage(commonsFileName, outputFolder) + } + } +} + +async function downloadImage(filename: string, outputFolder: string) { + const apiUrl = `https://commons.wikimedia.org/w/api.php?action=query&format=json&prop=imageinfo&iiprop=url|extmetadata&titles=${filename}` + const response = await fetch(apiUrl) + const apiDetails: ImageQueryAPIResponse = await response.json() + + // Harvest useful information + const wikiPage = apiDetails.query.pages[Object.keys(apiDetails.query.pages)[0]] + const wikiUrl = wikiPage.imageinfo[0].descriptionurl + const fileUrl = wikiPage.imageinfo[0].url + const author = wikiPage.imageinfo[0].extmetadata.Artist.value + const license = wikiPage.imageinfo[0].extmetadata.LicenseShortName.value + + // Check if the output folder exists + if (!existsSync(outputFolder)) { + const parts = outputFolder.split("/") + for (var i = 0; i < parts.length; i++) { + const part = parts.slice(0, i + 1).join("/") + if (!existsSync(part)) { + console.log(`Creating folder ${part}`) + mkdirSync(part) + } + } + } + + // Download the file and save it + const cleanFileName = unescape(filename).replace("File:", "") + console.log( + `Downloading ${cleanFileName} from ${fileUrl} and saving it to ${outputFolder}/${cleanFileName}...` + ) + const fileResponse = await fetch(fileUrl) + const fileBuffer = await fileResponse.arrayBuffer() + const file = Buffer.from(fileBuffer) + const filePath = `${outputFolder}/${cleanFileName}` + writeFileSync(filePath, file) + + // Save the license information + const licenseInfo: SmallLicense = { + path: cleanFileName, + license: licenseMapping[license] || license, + authors: [author], + sources: [wikiUrl], + } + + const licensePath = `${outputFolder}/license_info.json` + if (!existsSync(licensePath)) { + // Create the file if it doesn't exist + writeFileSync(licensePath, JSON.stringify([licenseInfo], null, 2)) + } else { + // Append to the file if it does exist + const licenseFile = await readFileSync(licensePath, "utf8") + const licenseData = JSON.parse(licenseFile) + licenseData.push(licenseInfo) + writeFileSync(licensePath, JSON.stringify(licenseData, null, 2)) + } +} + +main(process.argv.slice(2))