diff --git a/.github/workflows/integrity-check.yml b/.github/workflows/integrity-check.yml index f97a3694..8b9716ac 100644 --- a/.github/workflows/integrity-check.yml +++ b/.github/workflows/integrity-check.yml @@ -20,8 +20,12 @@ jobs: python3 -m pip install --upgrade pipenv pipenv install - - name: Validate + - name: Validate regular & extended decks run: | pipenv run build + - name: Validate experimental deck + run: | + pipenv run build_experimental + # TODO: Validate the csv file structure diff --git a/LICENSE.md b/LICENSE.md index d95ae33b..6f656adc 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -46,3 +46,7 @@ The sources and licenses of the flags (`ug-flag-...`) and maps (`ug-map-...`) in `sources.csv` references only the licenses of the files themselves. Some flags, like the [European Union flag](https://www.coe.int/en/web/about-us/the-european-flag#column-5), may come with additional copyright restrictions. All images have been optimised, resized and/or converted to reduce file size. Any further modifications are listed in the _Modifications_ column. + +## jsvectormap + +[MIT License — Copyright (c) 2020 Mustafa Omar](https://github.com/themustafaomar/jsvectormap/blob/main/LICENSE) diff --git a/Pipfile b/Pipfile index c53ea083..95594bad 100644 --- a/Pipfile +++ b/Pipfile @@ -13,3 +13,4 @@ python_version = "3.7" [scripts] build = "brain_brew run recipes/source_to_anki.yaml" +build_experimental = "brain_brew run recipes/source_to_anki_[experimental].yaml" diff --git a/README.md b/README.md index aadd299e..7899c592 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ The deck is available in **English**, **German**, **Spanish**, **French**, **Nor ## Features -The standard version of the deck comes with four note templates: _Country - Capital_, _Capital - Country_, _Flag - Country_, and _Map - Country_. An **extended version** is also available, with two additional note templates: _Country - Flag_ and _Country - Map_. +The standard version of the deck comes with four note templates: _Country - Capital_, _Capital - Country_, _Flag - Country_, and _Map - Country_. An **extended version** is also available, with two additional note templates: _Country - Flag_ and _Country - Map_. The [experimental version](https://github.com/anki-geo/ultimate-geography/wiki/Experimental-extended-deck) is a clone of extended version except it also provides interactivity for the _Country - Map_ note template. @@ -103,9 +103,10 @@ In order to install and later upgrade _Ultimate Geography_, you'll need to first You're now ready to install _Ultimate Geography_: 1. Go to the **[_Releases_ page](https://github.com/anki-geo/ultimate-geography/releases)**. -1. In the latest release's _Assets_ section, download the ZIP archive of the version of the deck you'd like to use. You can choose between [a standard and an extended version](#features) in a number of [languages](#ultimate-geography) -- for instance, if you're after the standard German deck, download `Ultimate_Geography_v[...]_DE.zip`. +1. In the latest release's _Assets_ section, download the ZIP archive of the version of the deck you'd like to use. You can choose between [a standard, extended and experimental version](#features) in a number of [languages](#ultimate-geography) -- for instance, if you're after the standard German deck, download `Ultimate_Geography_v[...]_DE.zip`. 1. Extract the content of the archive on your computer. 1. Open Anki and make sure your devices are all synchronised. +1. Create [a manual backup](https://docs.ankiweb.net/backups.html#creating) via _File -> Create Backup_ in case something goes wrong. 1. In the _File_ menu, select _CrowdAnki: Import from disk_. 1. Browse for and select the folder you extracted from the archive, which contains the deck's JSON file and `media` folder -- e.g. `Ultimate Geography [DE]`. 1. Don't change anything in the _CrowdAnki Import Settings_ dialog box that opens -- just press _OK_ to start the import. A dialog box should then confirm that the import was successful. diff --git a/recipes/source_to_anki.yaml b/recipes/source_to_anki.yaml index c8850704..98a85a2d 100644 --- a/recipes/source_to_anki.yaml +++ b/recipes/source_to_anki.yaml @@ -51,8 +51,11 @@ name: Ultimate Geography [ZH] - media_group_from_folder: - - part_id: all_media - source: src/media + - part_id: maps + source: src/media/maps + recursive: true + - part_id: flags + source: src/media/flags recursive: true @@ -361,7 +364,7 @@ <<: &default_crowd_anki_gen headers: default header media: - parts: [all_media] + parts: [maps, flags] note_models: parts: - part_id: Ultimate Geography @@ -443,7 +446,7 @@ <<: &extended_deck headers: default header media: - parts: [ all_media ] + parts: [ maps, flags ] note_models: parts: - part_id: Ultimate Geography [Extended] diff --git a/recipes/source_to_anki_[experimental].yaml b/recipes/source_to_anki_[experimental].yaml new file mode 100644 index 00000000..c67414fc --- /dev/null +++ b/recipes/source_to_anki_[experimental].yaml @@ -0,0 +1,433 @@ +- generate_guids_in_csv: + source: src/data/guid.csv + columns: + - guid + - guid:de + - guid:es + - guid:fr + - guid:nb + - guid:cs + - guid:ru + - guid:nl + - guid:sv + - guid:pt + - guid:zh + - guid:pl + - guid:it + - guid:da + +- build_parts: + - note_model_from_yaml_part: + part_id: Ultimate Geography [Experimental] + file: src/note_models/Ultimate_Geography_[Experimental].yaml + + - headers_from_yaml_part: + - part_id: default header + file: src/headers/default.yaml + override: + deck_description_html_file: src/headers/desc.html + crowdanki_uuid: 43c5ba66-9a65-11e8-90c9-a0481cc15658 + name: Ultimate Geography + - part_id: default header:es + file: src/headers/default.yaml + override: + deck_description_html_file: src/headers/desc_es.html + crowdanki_uuid: cb4d32ee-12ed-9960-1841-28c09449ded0 + name: Ultimate Geography [ES] + - part_id: default header:sv + file: src/headers/default.yaml + override: + deck_description_html_file: src/headers/desc_sv.html + crowdanki_uuid: 75bfcdb5-0ff3-4038-83cb-3e6ed974f439 + name: Ultimate Geography [SV] + - part_id: default header:zh + file: src/headers/default.yaml + override: + deck_description_html_file: src/headers/desc_zh.html + crowdanki_uuid: 6c995ee1-4b62-4019-a033-de0ef8651c83 + name: Ultimate Geography [ZH] + + - media_group_from_folder: + - part_id: maps + source: src/media/maps + recursive: true + - part_id: flags + source: src/media/flags + recursive: true + - part_id: experimental_assets + source: src/media/experimental_assets + + - notes_from_csvs: + part_id: english + + note_model_mappings: + - note_models: ¬e_models_in_mapping + - Ultimate Geography [Experimental] + columns_to_fields: + <<: &default_columns_to_fields + flag: Flag + map: Map + region code: Region code + tags: tags + + guid : guid + country : Country + country info : Country info + capital : Capital + capital info : Capital info + capital hint : Capital hint + flag similarity : Flag similarity + + personal_fields: [ ] + + file_mappings: &file_mappings + - file: src/data/main.csv + note_model: Ultimate Geography [Experimental] + derivatives: + - file: src/data/guid.csv + - file: src/data/country.csv + - file: src/data/country_info.csv + - file: src/data/capital.csv + - file: src/data/capital_info.csv + - file: src/data/capital_hint.csv + - file: src/data/flag_similarity.csv + + - notes_from_csvs: + part_id: german + + note_model_mappings: + - note_models: *note_models_in_mapping + columns_to_fields: + <<: *default_columns_to_fields + + guid:de : guid + country:de : Country + country info:de : Country info + capital:de : Capital + capital info:de : Capital info + capital hint:de : Capital hint + flag similarity:de : Flag similarity + + personal_fields: [ ] + + file_mappings: *file_mappings + - notes_from_csvs: + part_id: spanish + + note_model_mappings: + - note_models: *note_models_in_mapping + columns_to_fields: + <<: *default_columns_to_fields + + guid:es : guid + country:es : Country + country info:es : Country info + capital:es : Capital + capital info:es : Capital info + capital hint:es : Capital hint + flag similarity:es : Flag similarity + + personal_fields: [ ] + + file_mappings: *file_mappings + + - notes_from_csvs: + part_id: french + + note_model_mappings: + - note_models: *note_models_in_mapping + columns_to_fields: + <<: *default_columns_to_fields + + guid:fr : guid + country:fr : Country + country info:fr : Country info + capital:fr : Capital + capital info:fr : Capital info + capital hint:fr : Capital hint + flag similarity:fr : Flag similarity + + personal_fields: [ ] + + file_mappings: *file_mappings + + - notes_from_csvs: + part_id: norwegian + + note_model_mappings: + - note_models: *note_models_in_mapping + columns_to_fields: + <<: *default_columns_to_fields + + guid:nb : guid + country:nb : Country + country info:nb : Country info + capital:nb : Capital + capital info:nb : Capital info + capital hint:nb : Capital hint + flag similarity:nb : Flag similarity + + personal_fields: [ ] + + file_mappings: *file_mappings + + - notes_from_csvs: + part_id: czech + + note_model_mappings: + - note_models: *note_models_in_mapping + columns_to_fields: + <<: *default_columns_to_fields + + guid:cs : guid + country:cs : Country + country info:cs : Country info + capital:cs : Capital + capital info:cs : Capital info + capital hint:cs : Capital hint + flag similarity:cs : Flag similarity + + personal_fields: [ ] + + file_mappings: *file_mappings + + - notes_from_csvs: + part_id: russian + + note_model_mappings: + - note_models: *note_models_in_mapping + columns_to_fields: + <<: *default_columns_to_fields + + guid:ru : guid + country:ru : Country + country info:ru : Country info + capital:ru : Capital + capital info:ru : Capital info + capital hint:ru : Capital hint + flag similarity:ru : Flag similarity + + personal_fields: [ ] + + file_mappings: *file_mappings + + - notes_from_csvs: + part_id: dutch + + note_model_mappings: + - note_models: *note_models_in_mapping + columns_to_fields: + <<: *default_columns_to_fields + + guid:nl : guid + country:nl : Country + country info:nl : Country info + capital:nl : Capital + capital info:nl : Capital info + capital hint:nl : Capital hint + flag similarity:nl : Flag similarity + + personal_fields: [ ] + + file_mappings: *file_mappings + + - notes_from_csvs: + part_id: swedish + + note_model_mappings: + - note_models: *note_models_in_mapping + columns_to_fields: + <<: *default_columns_to_fields + + guid:sv : guid + country:sv : Country + country info:sv : Country info + capital:sv : Capital + capital info:sv : Capital info + capital hint:sv : Capital hint + flag similarity:sv : Flag similarity + + personal_fields: [ ] + + file_mappings: *file_mappings + + - notes_from_csvs: + part_id: portuguese + + note_model_mappings: + - note_models: *note_models_in_mapping + columns_to_fields: + <<: *default_columns_to_fields + + guid:pt : guid + country:pt : Country + country info:pt : Country info + capital:pt : Capital + capital info:pt : Capital info + capital hint:pt : Capital hint + flag similarity:pt : Flag similarity + + personal_fields: [ ] + + file_mappings: *file_mappings + + - notes_from_csvs: + part_id: chinese + + note_model_mappings: + - note_models: *note_models_in_mapping + columns_to_fields: + <<: *default_columns_to_fields + + guid:zh : guid + country:zh : Country + country info:zh : Country info + capital:zh : Capital + capital info:zh : Capital info + capital hint:zh : Capital hint + flag similarity:zh : Flag similarity + + personal_fields: [ ] + + file_mappings: *file_mappings + + - notes_from_csvs: + part_id: polish + + note_model_mappings: + - note_models: *note_models_in_mapping + columns_to_fields: + <<: *default_columns_to_fields + + guid:pl : guid + country:pl : Country + country info:pl : Country info + capital:pl : Capital + capital info:pl : Capital info + capital hint:pl : Capital hint + flag similarity:pl : Flag similarity + + personal_fields: [ ] + + file_mappings: *file_mappings + + - notes_from_csvs: + part_id: italian + + note_model_mappings: + - note_models: *note_models_in_mapping + columns_to_fields: + <<: *default_columns_to_fields + + guid:it : guid + country:it : Country + country info:it : Country info + capital:it : Capital + capital info:it : Capital info + capital hint:it : Capital hint + flag similarity:it : Flag similarity + + personal_fields: [ ] + + file_mappings: *file_mappings + + - notes_from_csvs: + part_id: danish + + note_model_mappings: + - note_models: *note_models_in_mapping + columns_to_fields: + <<: *default_columns_to_fields + + guid:da : guid + country:da : Country + country info:da : Country info + capital:da : Capital + capital info:da : Capital info + capital hint:da : Capital hint + flag similarity:da : Flag similarity + + personal_fields: [ ] + + file_mappings: *file_mappings + + +- generate_crowd_anki: + <<: &extended_deck + headers: default header + media: + parts: [ maps, flags, experimental_assets ] + note_models: + parts: + - part_id: Ultimate Geography [Experimental] + + folder: build/Ultimate Geography [EN] [Experimental] + notes: + part_id: english +- generate_crowd_anki: + <<: *extended_deck + folder: build/Ultimate Geography [DE] [Experimental] + notes: + part_id: german +- generate_crowd_anki: + <<: *extended_deck + headers: default header:es + folder: build/Ultimate Geography [ES] [Experimental] + notes: + part_id: spanish +- generate_crowd_anki: + <<: *extended_deck + folder: build/Ultimate Geography [FR] [Experimental] + notes: + part_id: french +- generate_crowd_anki: + <<: *extended_deck + folder: build/Ultimate Geography [NB] [Experimental] + notes: + part_id: norwegian +- generate_crowd_anki: + <<: *extended_deck + folder: build/Ultimate Geography [CS] [Experimental] + notes: + part_id: czech +- generate_crowd_anki: + <<: *extended_deck + folder: build/Ultimate Geography [RU] [Experimental] + notes: + part_id: russian +- generate_crowd_anki: + <<: *extended_deck + folder: build/Ultimate Geography [NL] [Experimental] + notes: + part_id: dutch +- generate_crowd_anki: + <<: *extended_deck + folder: build/Ultimate Geography [SV] [Experimental] + notes: + part_id: swedish +- generate_crowd_anki: + <<: *extended_deck + folder: build/Ultimate Geography [PT] [Experimental] + notes: + part_id: portuguese +- generate_crowd_anki: + <<: *extended_deck + headers: default header:zh + folder: build/Ultimate Geography [ZH] [Experimental] + notes: + part_id: chinese +- generate_crowd_anki: + <<: *extended_deck + folder: build/Ultimate Geography [PL] [Experimental] + notes: + part_id: polish +- generate_crowd_anki: + <<: *extended_deck + folder: build/Ultimate Geography [IT] [Experimental] + notes: + part_id: italian +- generate_crowd_anki: + <<: *extended_deck + folder: build/Ultimate Geography [DA] [Experimental] + notes: + part_id: danish diff --git a/src/data/main.csv b/src/data/main.csv index 29db1a9d..9bddb262 100644 --- a/src/data/main.csv +++ b/src/data/main.csv @@ -1,320 +1,320 @@ -country,flag,map,tags -England,"","",UG::Europe -Scotland,"","",UG::Europe -United Kingdom,"","","UG::Europe, UG::Sovereign_State" -Northern Ireland,,"",UG::Europe -France,"","","UG::Europe, UG::European_Union, UG::Mediterranean, UG::Sovereign_State" -Wales,"","",UG::Europe -Georgia,"","","UG::Europe, UG::Sovereign_State" -Germany,"","","UG::Europe, UG::European_Union, UG::Sovereign_State" -Greece,"","","UG::Europe, UG::European_Union, UG::Mediterranean, UG::Sovereign_State" -Greenland,"","",UG::North_America -Hungary,"","","UG::Europe, UG::European_Union, UG::Sovereign_State" -Albania,"","","UG::Europe, UG::Mediterranean, UG::Sovereign_State" -Andorra,"","","UG::Europe, UG::Sovereign_State" -Austria,"","","UG::Europe, UG::European_Union, UG::Sovereign_State" -Azerbaijan,"","","UG::Europe, UG::Sovereign_State" -Belarus,"","","UG::Europe, UG::Sovereign_State" -Belgium,"","","UG::Europe, UG::European_Union, UG::Sovereign_State" -Bosnia and Herzegovina,"","","UG::Europe, UG::Mediterranean, UG::Sovereign_State" -Bulgaria,"","","UG::Europe, UG::European_Union, UG::Sovereign_State" -Croatia,"","","UG::Europe, UG::European_Union, UG::Mediterranean, UG::Sovereign_State" -Czech Republic,"","","UG::Europe, UG::European_Union, UG::Sovereign_State" -Denmark,"","","UG::Europe, UG::European_Union, UG::Sovereign_State" -Estonia,"","","UG::Europe, UG::European_Union, UG::Sovereign_State" -Faroe Islands,"","",UG::Europe -Finland,"","","UG::Europe, UG::European_Union, UG::Sovereign_State" -Iceland,"","","UG::Europe, UG::Sovereign_State" -Ireland,"","","UG::Europe, UG::European_Union, UG::Sovereign_State" -Italy,"","","UG::Europe, UG::European_Union, UG::Mediterranean, UG::Sovereign_State" -Latvia,"","","UG::Europe, UG::European_Union, UG::Sovereign_State" -Liechtenstein,"","","UG::Europe, UG::Sovereign_State" -Lithuania,"","","UG::Europe, UG::European_Union, UG::Sovereign_State" -Luxembourg,"","","UG::Europe, UG::European_Union, UG::Sovereign_State" -North Macedonia,"","","UG::Europe, UG::Sovereign_State" -Malta,"","","UG::Europe, UG::European_Union, UG::Mediterranean, UG::Sovereign_State" -Moldova,"","","UG::Europe, UG::Sovereign_State" -Monaco,"","","UG::Europe, UG::Mediterranean, UG::Sovereign_State" -Montenegro,"","","UG::Europe, UG::Mediterranean, UG::Sovereign_State" -Netherlands,"","","UG::Europe, UG::European_Union, UG::Sovereign_State" -Norway,"","","UG::Europe, UG::Sovereign_State" -Poland,"","","UG::Europe, UG::European_Union, UG::Sovereign_State" -Portugal,"","","UG::Europe, UG::European_Union, UG::Sovereign_State" -Romania,"","","UG::Europe, UG::European_Union, UG::Sovereign_State" -Russia,"","","UG::Europe, UG::Sovereign_State" -San Marino,"","","UG::Europe, UG::Sovereign_State" -Serbia,"","","UG::Europe, UG::Sovereign_State" -Slovakia,"","","UG::Europe, UG::European_Union, UG::Sovereign_State" -Slovenia,"","","UG::Europe, UG::European_Union, UG::Mediterranean, UG::Sovereign_State" -Spain,"","","UG::Europe, UG::European_Union, UG::Mediterranean, UG::Sovereign_State" -Sweden,"","","UG::Europe, UG::European_Union, UG::Sovereign_State" -Switzerland,"","","UG::Europe, UG::Sovereign_State" -Turkey,"","","UG::Asia, UG::Mediterranean, UG::Middle_East, UG::Sovereign_State" -Ukraine,"","","UG::Europe, UG::Sovereign_State" -Vatican City,"","","UG::Europe, UG::Sovereign_State" -Armenia,"","","UG::Europe, UG::Sovereign_State" -Cyprus,"","","UG::Asia, UG::European_Union, UG::Mediterranean, UG::Middle_East, UG::Sovereign_State" -Kazakhstan,"","","UG::Asia, UG::Sovereign_State" -Egypt,"","","UG::Africa, UG::Mediterranean, UG::Middle_East, UG::Sovereign_State" -Algeria,"","","UG::Africa, UG::Mediterranean, UG::Sovereign_State" -Angola,"","","UG::Africa, UG::Sovereign_State" -Benin,"","","UG::Africa, UG::Sovereign_State, UG::West_Africa" -Botswana,"","","UG::Africa, UG::Sovereign_State" -Burkina Faso,"","","UG::Africa, UG::Sovereign_State, UG::West_Africa" -Cameroon,"","","UG::Africa, UG::Sovereign_State" -Burundi,"","","UG::Africa, UG::East_Africa, UG::Sovereign_State" -Cape Verde,"","","UG::Africa, UG::Sovereign_State, UG::West_Africa" -São Tomé and Príncipe,"","","UG::Africa, UG::Sovereign_State" -Central African Republic,"","","UG::Africa, UG::Sovereign_State" -Chad,"","","UG::Africa, UG::Sovereign_State" -Equatorial Guinea,"","","UG::Africa, UG::Sovereign_State" -Kenya,"","","UG::Africa, UG::East_Africa, UG::Sovereign_State" -Comoros,"","","UG::Africa, UG::East_Africa, UG::Sovereign_State" -Ivory Coast,"","","UG::Africa, UG::Sovereign_State, UG::West_Africa" -Democratic Republic of the Congo,"","","UG::Africa, UG::Sovereign_State" -Djibouti,"","","UG::Africa, UG::East_Africa, UG::Sovereign_State" -Guinea-Bissau,"","","UG::Africa, UG::Sovereign_State, UG::West_Africa" -Eritrea,"","","UG::Africa, UG::East_Africa, UG::Sovereign_State" -Ethiopia,"","","UG::Africa, UG::East_Africa, UG::Sovereign_State" -Gabon,"","","UG::Africa, UG::Sovereign_State" -The Gambia,"","","UG::Africa, UG::Sovereign_State, UG::West_Africa" -Lesotho,"","","UG::Africa, UG::Sovereign_State" -Liberia,"","","UG::Africa, UG::Sovereign_State, UG::West_Africa" -Madagascar,"","","UG::Africa, UG::East_Africa, UG::Sovereign_State" -Malawi,"","","UG::Africa, UG::East_Africa, UG::Sovereign_State" -Mali,"","","UG::Africa, UG::Sovereign_State, UG::West_Africa" -Mauritania,"","","UG::Africa, UG::Sovereign_State, UG::West_Africa" -Mauritius,"","","UG::Africa, UG::East_Africa, UG::Sovereign_State" -Morocco,"","","UG::Africa, UG::Mediterranean, UG::Sovereign_State" -Mozambique,"","","UG::Africa, UG::East_Africa, UG::Sovereign_State" -Namibia,"","","UG::Africa, UG::Sovereign_State" -Niger,"","","UG::Africa, UG::Sovereign_State, UG::West_Africa" -Nigeria,"","","UG::Africa, UG::Sovereign_State, UG::West_Africa" -Republic of the Congo,"","","UG::Africa, UG::Sovereign_State" -Rwanda,"","","UG::Africa, UG::East_Africa, UG::Sovereign_State" -Senegal,"","","UG::Africa, UG::Sovereign_State, UG::West_Africa" -Seychelles,"","","UG::Africa, UG::East_Africa, UG::Sovereign_State" -Sierra Leone,"","","UG::Africa, UG::Sovereign_State, UG::West_Africa" -South Africa,"","","UG::Africa, UG::Sovereign_State" -Sudan,"","","UG::Africa, UG::Sovereign_State" -Eswatini,"","","UG::Africa, UG::Sovereign_State" -Tanzania,"","","UG::Africa, UG::East_Africa, UG::Sovereign_State" -Togo,"","","UG::Africa, UG::Sovereign_State, UG::West_Africa" -Tunisia,"","","UG::Africa, UG::Mediterranean, UG::Sovereign_State" -Uganda,"","","UG::Africa, UG::East_Africa, UG::Sovereign_State" -Sahrawi Arab Democratic Republic,"","","UG::Africa, UG::Sovereign_State" -Zambia,"","","UG::Africa, UG::East_Africa, UG::Sovereign_State" -Zimbabwe,"","","UG::Africa, UG::East_Africa, UG::Sovereign_State" -Canary Islands,,"",UG::Africa -Afghanistan,"","","UG::Asia, UG::Sovereign_State" -Bahrain,"","","UG::Asia, UG::Middle_East, UG::Sovereign_State" -Bangladesh,"","","UG::Asia, UG::Sovereign_State" -Bhutan,"","","UG::Asia, UG::Sovereign_State" -Brunei,"","","UG::Asia, UG::Southeast_Asia, UG::Sovereign_State" -China,"","","UG::Asia, UG::Sovereign_State" -Cambodia,"","","UG::Asia, UG::Southeast_Asia, UG::Sovereign_State" -Indonesia,"","","UG::Asia, UG::Southeast_Asia, UG::Sovereign_State" -India,"","","UG::Asia, UG::Sovereign_State" -Hong Kong,"","",UG::Asia -Iran,"","","UG::Asia, UG::Middle_East, UG::Sovereign_State" -Israel,"","","UG::Asia, UG::Mediterranean, UG::Middle_East, UG::Sovereign_State" -Iraq,"","","UG::Asia, UG::Middle_East, UG::Sovereign_State" -South Korea,"","","UG::Asia, UG::Sovereign_State" -North Korea,"","","UG::Asia, UG::Sovereign_State" -Jordan,"","","UG::Asia, UG::Middle_East, UG::Sovereign_State" -Japan,"","","UG::Asia, UG::Sovereign_State" -Lebanon,"","","UG::Asia, UG::Mediterranean, UG::Middle_East, UG::Sovereign_State" -Laos,"","","UG::Asia, UG::Southeast_Asia, UG::Sovereign_State" -Kyrgyzstan,"","","UG::Asia, UG::Sovereign_State" -Kuwait,"","","UG::Asia, UG::Middle_East, UG::Sovereign_State" -Myanmar,"","","UG::Asia, UG::Southeast_Asia, UG::Sovereign_State" -Mongolia,"","","UG::Asia, UG::Sovereign_State" -Maldives,"","","UG::Asia, UG::Sovereign_State" -Malaysia,"","","UG::Asia, UG::Southeast_Asia, UG::Sovereign_State" -Oman,"","","UG::Asia, UG::Middle_East, UG::Sovereign_State" -Nepal,"","","UG::Asia, UG::Sovereign_State" -Palestine,"","","UG::Asia, UG::Mediterranean, UG::Middle_East, UG::Sovereign_State" -Pakistan,"","","UG::Asia, UG::Sovereign_State" -Qatar,"","","UG::Asia, UG::Middle_East, UG::Sovereign_State" -Saudi Arabia,"","","UG::Asia, UG::Middle_East, UG::Sovereign_State" -Singapore,"","","UG::Asia, UG::Southeast_Asia, UG::Sovereign_State" -Syria,"","","UG::Asia, UG::Mediterranean, UG::Middle_East, UG::Sovereign_State" -Taiwan,"","","UG::Asia, UG::Sovereign_State" -Sri Lanka,"","","UG::Asia, UG::Sovereign_State" -Tajikistan,"","","UG::Asia, UG::Sovereign_State" -Thailand,"","","UG::Asia, UG::Southeast_Asia, UG::Sovereign_State" -East Timor,"","","UG::Asia, UG::Southeast_Asia, UG::Sovereign_State" -United Arab Emirates,"","","UG::Asia, UG::Middle_East, UG::Sovereign_State" -Turkmenistan,"","","UG::Asia, UG::Sovereign_State" -Yemen,"","","UG::Asia, UG::Middle_East, UG::Sovereign_State" -Vietnam,"","","UG::Asia, UG::Southeast_Asia, UG::Sovereign_State" -Uzbekistan,"","","UG::Asia, UG::Sovereign_State" -Fiji,"","","UG::Oceania, UG::Sovereign_State" -Papua New Guinea,"","","UG::Oceania, UG::Sovereign_State" -Australia,"","","UG::Oceania, UG::Sovereign_State" -Solomon Islands,"","","UG::Oceania, UG::Sovereign_State" -Argentina,"","","UG::South_America, UG::Sovereign_State" -Bolivia,"","","UG::South_America, UG::Sovereign_State" -Brazil,"","","UG::South_America, UG::Sovereign_State" -Chile,"","","UG::South_America, UG::Sovereign_State" -Colombia,"","","UG::South_America, UG::Sovereign_State" -Ecuador,"","","UG::South_America, UG::Sovereign_State" -Guyana,"","","UG::South_America, UG::Sovereign_State" -Paraguay,"","","UG::South_America, UG::Sovereign_State" -Peru,"","","UG::South_America, UG::Sovereign_State" -Suriname,"","","UG::South_America, UG::Sovereign_State" -Uruguay,"","","UG::South_America, UG::Sovereign_State" -Venezuela,"","","UG::South_America, UG::Sovereign_State" -Cook Islands,"","","UG::Oceania, UG::Sovereign_State" -Federated States of Micronesia,"","","UG::Oceania, UG::Sovereign_State" -Guam,"","",UG::Oceania -Vanuatu,"","","UG::Oceania, UG::Sovereign_State" -Canada,"","","UG::North_America, UG::Sovereign_State" -United States of America,"","","UG::North_America, UG::Sovereign_State" -Mexico,"","","UG::North_America, UG::Sovereign_State" -Puerto Rico,"","","UG::Caribbean, UG::North_America" -Cuba,"","","UG::Caribbean, UG::North_America, UG::Sovereign_State" -Dominican Republic,"","","UG::Caribbean, UG::North_America, UG::Sovereign_State" -Haiti,"","","UG::Caribbean, UG::North_America, UG::Sovereign_State" -Jamaica,"","","UG::Caribbean, UG::North_America, UG::Sovereign_State" -Trinidad and Tobago,"","","UG::Caribbean, UG::North_America, UG::Sovereign_State" -Bermuda,,"","UG::Caribbean, UG::North_America" -Guadeloupe,,"","UG::Caribbean, UG::North_America" -The Bahamas,"","","UG::Caribbean, UG::North_America, UG::Sovereign_State" -Barbados,"","","UG::Caribbean, UG::North_America, UG::Sovereign_State" -Belize,"","","UG::North_America, UG::Sovereign_State" -Costa Rica,"","","UG::North_America, UG::Sovereign_State" -El Salvador,"","","UG::North_America, UG::Sovereign_State" -Guatemala,"","","UG::North_America, UG::Sovereign_State" -Honduras,"","","UG::North_America, UG::Sovereign_State" -Nicaragua,"","","UG::North_America, UG::Sovereign_State" -Panama,"","","UG::North_America, UG::Sovereign_State" -Antigua and Barbuda,"","","UG::Caribbean, UG::North_America, UG::Sovereign_State" -Dominica,"","","UG::Caribbean, UG::North_America, UG::Sovereign_State" -Saint Vincent and the Grenadines,"","","UG::Caribbean, UG::North_America, UG::Sovereign_State" -Somalia,"","","UG::Africa, UG::East_Africa, UG::Sovereign_State" -Zanzibar,,"",UG::Africa -Ghana,"","","UG::Africa, UG::Sovereign_State, UG::West_Africa" -Guinea,"","","UG::Africa, UG::Sovereign_State, UG::West_Africa" -New Zealand,"","","UG::Oceania, UG::Sovereign_State" -French Polynesia,"","",UG::Oceania -Philippines,"","","UG::Asia, UG::Southeast_Asia, UG::Sovereign_State" -Kosovo,"","","UG::Europe, UG::Sovereign_State" -Libya,"","","UG::Africa, UG::Mediterranean, UG::Sovereign_State" -Palau,"","","UG::Oceania, UG::Sovereign_State" -Saint Lucia,"","","UG::Caribbean, UG::North_America, UG::Sovereign_State" -Bali,,"",UG::Asia -Grenada,"","","UG::Caribbean, UG::North_America, UG::Sovereign_State" -British Virgin Islands,,"","UG::Caribbean, UG::North_America" -Turks and Caicos Islands,,"","UG::Caribbean, UG::North_America" -Cayman Islands,,"","UG::Caribbean, UG::North_America" -Anguilla,,"","UG::Caribbean, UG::North_America" -Azores,,"",UG::Europe -Curaçao,"","","UG::Caribbean, UG::North_America" -French Guiana,,"",UG::South_America -Gibraltar,,"","UG::Europe, UG::Mediterranean" -Guernsey,,"",UG::Europe -Isle of Man,,"",UG::Europe -Jersey,,"",UG::Europe -Kiribati,"","","UG::Oceania, UG::Sovereign_State" -Macau,"","",UG::Asia -Madeira,,"",UG::Europe -Marshall Islands,"","","UG::Oceania, UG::Sovereign_State" -Nauru,"","","UG::Oceania, UG::Sovereign_State" -New Caledonia,"","",UG::Oceania -Niue,"","","UG::Oceania, UG::Sovereign_State" -Northern Cyprus,"","","UG::Asia, UG::Mediterranean, UG::Middle_East, UG::Sovereign_State" -Saint Kitts and Nevis,"","","UG::Caribbean, UG::North_America, UG::Sovereign_State" -Samoa,"","","UG::Oceania, UG::Sovereign_State" -Somaliland,"","","UG::Africa, UG::East_Africa, UG::Sovereign_State" -South Sudan,"","","UG::Africa, UG::East_Africa, UG::Sovereign_State" -Tuvalu,"","","UG::Oceania, UG::Sovereign_State" -United States Virgin Islands,"","","UG::Caribbean, UG::North_America" -Åland Islands,"","",UG::Europe -South Ossetia,"","","UG::Europe, UG::Sovereign_State" -American Samoa,,"",UG::Oceania -Northern Mariana Islands,,"",UG::Oceania -Aruba,"","","UG::Caribbean, UG::North_America" -Abkhazia,"","","UG::Europe, UG::Sovereign_State" -Sint Maarten,,"","UG::Caribbean, UG::North_America" -Tonga,"","","UG::Oceania, UG::Sovereign_State" -Transnistria,"","","UG::Europe, UG::Sovereign_State" -Sardinia,,"",UG::Europe -Kaliningrad Oblast,,"",UG::Europe -Martinique,,"","UG::Caribbean, UG::North_America" -Java,,"",UG::Asia -Corsica,,"",UG::Europe -European Union,"","",UG::Europe -Gulf of Mexico,,"",UG::Oceans+Seas -Philippine Sea,,"",UG::Oceans+Seas -Southern Ocean,,"",UG::Oceans+Seas -Gulf of Thailand,,"",UG::Oceans+Seas -Micronesia,,"",UG::Oceania -Pacific Ocean,,"",UG::Oceans+Seas -Atlantic Ocean,,"",UG::Oceans+Seas -Indian Ocean,,"",UG::Oceans+Seas -Arctic Ocean,,"",UG::Oceans+Seas -Hudson Bay,,"",UG::Oceans+Seas -Labrador Sea,,"",UG::Oceans+Seas -White Sea,,"",UG::Oceans+Seas -Denmark Strait,,"",UG::Oceans+Seas -Norwegian Sea,,"",UG::Oceans+Seas -Baltic Sea,,"",UG::Oceans+Seas -Celtic Sea,,"",UG::Oceans+Seas -English Channel,,"",UG::Oceans+Seas -Adriatic Sea,,"",UG::Oceans+Seas -Bay of Biscay,,"",UG::Oceans+Seas -Black Sea,,"",UG::Oceans+Seas -Aegean Sea,,"",UG::Oceans+Seas -Balkan Peninsula,,"",UG::Europe -Caspian Sea,,"",UG::Oceans+Seas -Mediterranean Sea,,"",UG::Oceans+Seas -East Siberian Sea,,"",UG::Oceans+Seas -Bering Strait,,"",UG::Oceans+Seas -Arabian Sea,,"",UG::Oceans+Seas -Red Sea,,"",UG::Oceans+Seas -Dead Sea,,"",UG::Oceans+Seas -Bay of Bengal,,"",UG::Oceans+Seas -Sea of Japan,,"",UG::Oceans+Seas -Yellow Sea,,"",UG::Oceans+Seas -Coral Sea,,"",UG::Oceans+Seas -South China Sea,,"",UG::Oceans+Seas -Tasman Sea,,"",UG::Oceans+Seas -Gulf of Carpentaria,,"",UG::Oceans+Seas -Aral Sea,,"",UG::Oceans+Seas -Persian Gulf,,"",UG::Oceans+Seas -Caribbean Sea,,"",UG::Oceans+Seas -Gulf of California,,"",UG::Oceans+Seas -Polynesia,,"",UG::Oceania -Melanesia,,"",UG::Oceania -Scandinavia,,"",UG::Europe -Sea of Galilee,,"",UG::Oceans+Seas -Sumatra,,"",UG::Asia -Sicily,,"",UG::Europe -Mayotte,,"","UG::Africa, UG::East_Africa" -Réunion,,"","UG::Africa, UG::East_Africa" -Falkland Islands,,"",UG::South_America -Europe,,"",UG::Continents -North America,,"",UG::Continents -South America,,"",UG::Continents -Asia,,"",UG::Continents -Africa,,"",UG::Continents -Oceania,,"",UG::Continents -Antarctica,,"",UG::Continents -Saint Martin,,"","UG::Caribbean, UG::North_America" -Wallis and Futuna,,"",UG::Oceania -Akrotiri and Dhekelia,,"","UG::Asia, UG::Mediterranean, UG::Middle_East" -Svalbard,,"",UG::Europe -Hawaii,,"",UG::Oceania -Alaska,,"",UG::North_America -Bougainville,,"",UG::Oceania -Jeju,,"",UG::Asia -Banda Sea,,"",UG::Oceans+Seas -Barents Sea,,"",UG::Oceans+Seas -Celebes Sea,,"",UG::Oceans+Seas -East China Sea,,"",UG::Oceans+Seas -Gulf of Alaska,,"",UG::Oceans+Seas -Gulf of Guinea,,"",UG::Oceans+Seas -North Sea,,"",UG::Oceans+Seas -Sea of Okhotsk,,"",UG::Oceans+Seas -Timor Sea,,"",UG::Oceans+Seas +country,flag,map,region code,tags +England,"","",,UG::Europe +Scotland,"","",,UG::Europe +United Kingdom,"","",GB,"UG::Europe, UG::Sovereign_State" +Northern Ireland,,"",,UG::Europe +France,"","",FR,"UG::Europe, UG::European_Union, UG::Mediterranean, UG::Sovereign_State" +Wales,"","",,UG::Europe +Georgia,"","",GE,"UG::Europe, UG::Sovereign_State" +Germany,"","",DE,"UG::Europe, UG::European_Union, UG::Sovereign_State" +Greece,"","",GR,"UG::Europe, UG::European_Union, UG::Mediterranean, UG::Sovereign_State" +Greenland,"","",GL,UG::North_America +Hungary,"","",HU,"UG::Europe, UG::European_Union, UG::Sovereign_State" +Albania,"","",AL,"UG::Europe, UG::Mediterranean, UG::Sovereign_State" +Andorra,"","",AD,"UG::Europe, UG::Sovereign_State" +Austria,"","",AT,"UG::Europe, UG::European_Union, UG::Sovereign_State" +Azerbaijan,"","",AZ,"UG::Europe, UG::Sovereign_State" +Belarus,"","",BY,"UG::Europe, UG::Sovereign_State" +Belgium,"","",BE,"UG::Europe, UG::European_Union, UG::Sovereign_State" +Bosnia and Herzegovina,"","",BA,"UG::Europe, UG::Mediterranean, UG::Sovereign_State" +Bulgaria,"","",BG,"UG::Europe, UG::European_Union, UG::Sovereign_State" +Croatia,"","",HR,"UG::Europe, UG::European_Union, UG::Mediterranean, UG::Sovereign_State" +Czech Republic,"","",CZ,"UG::Europe, UG::European_Union, UG::Sovereign_State" +Denmark,"","",DK,"UG::Europe, UG::European_Union, UG::Sovereign_State" +Estonia,"","",EE,"UG::Europe, UG::European_Union, UG::Sovereign_State" +Faroe Islands,"","",FO,UG::Europe +Finland,"","",FI,"UG::Europe, UG::European_Union, UG::Sovereign_State" +Iceland,"","",IS,"UG::Europe, UG::Sovereign_State" +Ireland,"","",IE,"UG::Europe, UG::European_Union, UG::Sovereign_State" +Italy,"","",IT,"UG::Europe, UG::European_Union, UG::Mediterranean, UG::Sovereign_State" +Latvia,"","",LV,"UG::Europe, UG::European_Union, UG::Sovereign_State" +Liechtenstein,"","",,"UG::Europe, UG::Sovereign_State" +Lithuania,"","",LT,"UG::Europe, UG::European_Union, UG::Sovereign_State" +Luxembourg,"","",LU,"UG::Europe, UG::European_Union, UG::Sovereign_State" +North Macedonia,"","",MK,"UG::Europe, UG::Sovereign_State" +Malta,"","",,"UG::Europe, UG::European_Union, UG::Mediterranean, UG::Sovereign_State" +Moldova,"","",MD,"UG::Europe, UG::Sovereign_State" +Monaco,"","",,"UG::Europe, UG::Mediterranean, UG::Sovereign_State" +Montenegro,"","",ME,"UG::Europe, UG::Mediterranean, UG::Sovereign_State" +Netherlands,"","",NL,"UG::Europe, UG::European_Union, UG::Sovereign_State" +Norway,"","",NO,"UG::Europe, UG::Sovereign_State" +Poland,"","",PL,"UG::Europe, UG::European_Union, UG::Sovereign_State" +Portugal,"","",PT,"UG::Europe, UG::European_Union, UG::Sovereign_State" +Romania,"","",RO,"UG::Europe, UG::European_Union, UG::Sovereign_State" +Russia,"","",RU,"UG::Europe, UG::Sovereign_State" +San Marino,"","",,"UG::Europe, UG::Sovereign_State" +Serbia,"","",RS,"UG::Europe, UG::Sovereign_State" +Slovakia,"","",SK,"UG::Europe, UG::European_Union, UG::Sovereign_State" +Slovenia,"","",SI,"UG::Europe, UG::European_Union, UG::Mediterranean, UG::Sovereign_State" +Spain,"","",ES,"UG::Europe, UG::European_Union, UG::Mediterranean, UG::Sovereign_State" +Sweden,"","",SE,"UG::Europe, UG::European_Union, UG::Sovereign_State" +Switzerland,"","",CH,"UG::Europe, UG::Sovereign_State" +Turkey,"","",TR,"UG::Asia, UG::Mediterranean, UG::Middle_East, UG::Sovereign_State" +Ukraine,"","",UA,"UG::Europe, UG::Sovereign_State" +Vatican City,"","",,"UG::Europe, UG::Sovereign_State" +Armenia,"","",AM,"UG::Europe, UG::Sovereign_State" +Cyprus,"","",CY,"UG::Asia, UG::European_Union, UG::Mediterranean, UG::Middle_East, UG::Sovereign_State" +Kazakhstan,"","",KZ,"UG::Asia, UG::Sovereign_State" +Egypt,"","",EG,"UG::Africa, UG::Mediterranean, UG::Middle_East, UG::Sovereign_State" +Algeria,"","",DZ,"UG::Africa, UG::Mediterranean, UG::Sovereign_State" +Angola,"","",AO,"UG::Africa, UG::Sovereign_State" +Benin,"","",BJ,"UG::Africa, UG::Sovereign_State, UG::West_Africa" +Botswana,"","",BW,"UG::Africa, UG::Sovereign_State" +Burkina Faso,"","",BF,"UG::Africa, UG::Sovereign_State, UG::West_Africa" +Cameroon,"","",CM,"UG::Africa, UG::Sovereign_State" +Burundi,"","",BI,"UG::Africa, UG::East_Africa, UG::Sovereign_State" +Cape Verde,"","",CV,"UG::Africa, UG::Sovereign_State, UG::West_Africa" +São Tomé and Príncipe,"","",ST,"UG::Africa, UG::Sovereign_State" +Central African Republic,"","",CF,"UG::Africa, UG::Sovereign_State" +Chad,"","",TD,"UG::Africa, UG::Sovereign_State" +Equatorial Guinea,"","",GQ,"UG::Africa, UG::Sovereign_State" +Kenya,"","",KE,"UG::Africa, UG::East_Africa, UG::Sovereign_State" +Comoros,"","",KM,"UG::Africa, UG::East_Africa, UG::Sovereign_State" +Ivory Coast,"","",CI,"UG::Africa, UG::Sovereign_State, UG::West_Africa" +Democratic Republic of the Congo,"","",CD,"UG::Africa, UG::Sovereign_State" +Djibouti,"","",DJ,"UG::Africa, UG::East_Africa, UG::Sovereign_State" +Guinea-Bissau,"","",GW,"UG::Africa, UG::Sovereign_State, UG::West_Africa" +Eritrea,"","",ER,"UG::Africa, UG::East_Africa, UG::Sovereign_State" +Ethiopia,"","",ET,"UG::Africa, UG::East_Africa, UG::Sovereign_State" +Gabon,"","",GA,"UG::Africa, UG::Sovereign_State" +The Gambia,"","",GM,"UG::Africa, UG::Sovereign_State, UG::West_Africa" +Lesotho,"","",LS,"UG::Africa, UG::Sovereign_State" +Liberia,"","",LR,"UG::Africa, UG::Sovereign_State, UG::West_Africa" +Madagascar,"","",MG,"UG::Africa, UG::East_Africa, UG::Sovereign_State" +Malawi,"","",MW,"UG::Africa, UG::East_Africa, UG::Sovereign_State" +Mali,"","",ML,"UG::Africa, UG::Sovereign_State, UG::West_Africa" +Mauritania,"","",MR,"UG::Africa, UG::Sovereign_State, UG::West_Africa" +Mauritius,"","",MU,"UG::Africa, UG::East_Africa, UG::Sovereign_State" +Morocco,"","",MA,"UG::Africa, UG::Mediterranean, UG::Sovereign_State" +Mozambique,"","",MZ,"UG::Africa, UG::East_Africa, UG::Sovereign_State" +Namibia,"","",NA,"UG::Africa, UG::Sovereign_State" +Niger,"","",NE,"UG::Africa, UG::Sovereign_State, UG::West_Africa" +Nigeria,"","",NG,"UG::Africa, UG::Sovereign_State, UG::West_Africa" +Republic of the Congo,"","",CG,"UG::Africa, UG::Sovereign_State" +Rwanda,"","",RW,"UG::Africa, UG::East_Africa, UG::Sovereign_State" +Senegal,"","",SN,"UG::Africa, UG::Sovereign_State, UG::West_Africa" +Seychelles,"","",,"UG::Africa, UG::East_Africa, UG::Sovereign_State" +Sierra Leone,"","",SL,"UG::Africa, UG::Sovereign_State, UG::West_Africa" +South Africa,"","",ZA,"UG::Africa, UG::Sovereign_State" +Sudan,"","",SD,"UG::Africa, UG::Sovereign_State" +Eswatini,"","",SZ,"UG::Africa, UG::Sovereign_State" +Tanzania,"","",TZ,"UG::Africa, UG::East_Africa, UG::Sovereign_State" +Togo,"","",TG,"UG::Africa, UG::Sovereign_State, UG::West_Africa" +Tunisia,"","",TN,"UG::Africa, UG::Mediterranean, UG::Sovereign_State" +Uganda,"","",UG,"UG::Africa, UG::East_Africa, UG::Sovereign_State" +Sahrawi Arab Democratic Republic,"","",,"UG::Africa, UG::Sovereign_State" +Zambia,"","",ZM,"UG::Africa, UG::East_Africa, UG::Sovereign_State" +Zimbabwe,"","",ZW,"UG::Africa, UG::East_Africa, UG::Sovereign_State" +Canary Islands,,"",,UG::Africa +Afghanistan,"","",AF,"UG::Asia, UG::Sovereign_State" +Bahrain,"","",BH,"UG::Asia, UG::Middle_East, UG::Sovereign_State" +Bangladesh,"","",BD,"UG::Asia, UG::Sovereign_State" +Bhutan,"","",BT,"UG::Asia, UG::Sovereign_State" +Brunei,"","",BN,"UG::Asia, UG::Southeast_Asia, UG::Sovereign_State" +China,"","",CN,"UG::Asia, UG::Sovereign_State" +Cambodia,"","",KH,"UG::Asia, UG::Southeast_Asia, UG::Sovereign_State" +Indonesia,"","",ID,"UG::Asia, UG::Southeast_Asia, UG::Sovereign_State" +India,"","",IN,"UG::Asia, UG::Sovereign_State" +Hong Kong,"","",HK,UG::Asia +Iran,"","",IR,"UG::Asia, UG::Middle_East, UG::Sovereign_State" +Israel,"","",IL,"UG::Asia, UG::Mediterranean, UG::Middle_East, UG::Sovereign_State" +Iraq,"","",IQ,"UG::Asia, UG::Middle_East, UG::Sovereign_State" +South Korea,"","",KR,"UG::Asia, UG::Sovereign_State" +North Korea,"","",KP,"UG::Asia, UG::Sovereign_State" +Jordan,"","",JO,"UG::Asia, UG::Middle_East, UG::Sovereign_State" +Japan,"","",JP,"UG::Asia, UG::Sovereign_State" +Lebanon,"","",LB,"UG::Asia, UG::Mediterranean, UG::Middle_East, UG::Sovereign_State" +Laos,"","",LA,"UG::Asia, UG::Southeast_Asia, UG::Sovereign_State" +Kyrgyzstan,"","",KG,"UG::Asia, UG::Sovereign_State" +Kuwait,"","",KW,"UG::Asia, UG::Middle_East, UG::Sovereign_State" +Myanmar,"","",MM,"UG::Asia, UG::Southeast_Asia, UG::Sovereign_State" +Mongolia,"","",MN,"UG::Asia, UG::Sovereign_State" +Maldives,"","",,"UG::Asia, UG::Sovereign_State" +Malaysia,"","",MY,"UG::Asia, UG::Southeast_Asia, UG::Sovereign_State" +Oman,"","",OM,"UG::Asia, UG::Middle_East, UG::Sovereign_State" +Nepal,"","",NP,"UG::Asia, UG::Sovereign_State" +Palestine,"","",PS,"UG::Asia, UG::Mediterranean, UG::Middle_East, UG::Sovereign_State" +Pakistan,"","",PK,"UG::Asia, UG::Sovereign_State" +Qatar,"","",QA,"UG::Asia, UG::Middle_East, UG::Sovereign_State" +Saudi Arabia,"","",SA,"UG::Asia, UG::Middle_East, UG::Sovereign_State" +Singapore,"","",SG,"UG::Asia, UG::Southeast_Asia, UG::Sovereign_State" +Syria,"","",SY,"UG::Asia, UG::Mediterranean, UG::Middle_East, UG::Sovereign_State" +Taiwan,"","",TW,"UG::Asia, UG::Sovereign_State" +Sri Lanka,"","",LK,"UG::Asia, UG::Sovereign_State" +Tajikistan,"","",TJ,"UG::Asia, UG::Sovereign_State" +Thailand,"","",TH,"UG::Asia, UG::Southeast_Asia, UG::Sovereign_State" +East Timor,"","",TL,"UG::Asia, UG::Southeast_Asia, UG::Sovereign_State" +United Arab Emirates,"","",AE,"UG::Asia, UG::Middle_East, UG::Sovereign_State" +Turkmenistan,"","",TM,"UG::Asia, UG::Sovereign_State" +Yemen,"","",YE,"UG::Asia, UG::Middle_East, UG::Sovereign_State" +Vietnam,"","",VN,"UG::Asia, UG::Southeast_Asia, UG::Sovereign_State" +Uzbekistan,"","",UZ,"UG::Asia, UG::Sovereign_State" +Fiji,"","",FJ,"UG::Oceania, UG::Sovereign_State" +Papua New Guinea,"","",PG,"UG::Oceania, UG::Sovereign_State" +Australia,"","",AU,"UG::Oceania, UG::Sovereign_State" +Solomon Islands,"","",SB,"UG::Oceania, UG::Sovereign_State" +Argentina,"","",AR,"UG::South_America, UG::Sovereign_State" +Bolivia,"","",BO,"UG::South_America, UG::Sovereign_State" +Brazil,"","",BR,"UG::South_America, UG::Sovereign_State" +Chile,"","",CL,"UG::South_America, UG::Sovereign_State" +Colombia,"","",CO,"UG::South_America, UG::Sovereign_State" +Ecuador,"","",EC,"UG::South_America, UG::Sovereign_State" +Guyana,"","",GY,"UG::South_America, UG::Sovereign_State" +Paraguay,"","",PY,"UG::South_America, UG::Sovereign_State" +Peru,"","",PE,"UG::South_America, UG::Sovereign_State" +Suriname,"","",SR,"UG::South_America, UG::Sovereign_State" +Uruguay,"","",UY,"UG::South_America, UG::Sovereign_State" +Venezuela,"","",VE,"UG::South_America, UG::Sovereign_State" +Cook Islands,"","",,"UG::Oceania, UG::Sovereign_State" +Federated States of Micronesia,"","",,"UG::Oceania, UG::Sovereign_State" +Guam,"","",,UG::Oceania +Vanuatu,"","",VU,"UG::Oceania, UG::Sovereign_State" +Canada,"","",CA,"UG::North_America, UG::Sovereign_State" +United States of America,"","",US,"UG::North_America, UG::Sovereign_State" +Mexico,"","",MX,"UG::North_America, UG::Sovereign_State" +Puerto Rico,"","",PR,"UG::Caribbean, UG::North_America" +Cuba,"","",CU,"UG::Caribbean, UG::North_America, UG::Sovereign_State" +Dominican Republic,"","",DO,"UG::Caribbean, UG::North_America, UG::Sovereign_State" +Haiti,"","",HT,"UG::Caribbean, UG::North_America, UG::Sovereign_State" +Jamaica,"","",JM,"UG::Caribbean, UG::North_America, UG::Sovereign_State" +Trinidad and Tobago,"","",TT,"UG::Caribbean, UG::North_America, UG::Sovereign_State" +Bermuda,,"",,"UG::Caribbean, UG::North_America" +Guadeloupe,,"",GP,"UG::Caribbean, UG::North_America" +The Bahamas,"","",BS,"UG::Caribbean, UG::North_America, UG::Sovereign_State" +Barbados,"","",BB,"UG::Caribbean, UG::North_America, UG::Sovereign_State" +Belize,"","",BZ,"UG::North_America, UG::Sovereign_State" +Costa Rica,"","",CR,"UG::North_America, UG::Sovereign_State" +El Salvador,"","",SV,"UG::North_America, UG::Sovereign_State" +Guatemala,"","",GT,"UG::North_America, UG::Sovereign_State" +Honduras,"","",HN,"UG::North_America, UG::Sovereign_State" +Nicaragua,"","",NI,"UG::North_America, UG::Sovereign_State" +Panama,"","",PA,"UG::North_America, UG::Sovereign_State" +Antigua and Barbuda,"","",AG,"UG::Caribbean, UG::North_America, UG::Sovereign_State" +Dominica,"","",DM,"UG::Caribbean, UG::North_America, UG::Sovereign_State" +Saint Vincent and the Grenadines,"","",,"UG::Caribbean, UG::North_America, UG::Sovereign_State" +Somalia,"","",SO,"UG::Africa, UG::East_Africa, UG::Sovereign_State" +Zanzibar,,"",,UG::Africa +Ghana,"","",GH,"UG::Africa, UG::Sovereign_State, UG::West_Africa" +Guinea,"","",GN,"UG::Africa, UG::Sovereign_State, UG::West_Africa" +New Zealand,"","",NZ,"UG::Oceania, UG::Sovereign_State" +French Polynesia,"","",,UG::Oceania +Philippines,"","",PH,"UG::Asia, UG::Southeast_Asia, UG::Sovereign_State" +Kosovo,"","",,"UG::Europe, UG::Sovereign_State" +Libya,"","",LY,"UG::Africa, UG::Mediterranean, UG::Sovereign_State" +Palau,"","",,"UG::Oceania, UG::Sovereign_State" +Saint Lucia,"","",,"UG::Caribbean, UG::North_America, UG::Sovereign_State" +Bali,,"",,UG::Asia +Grenada,"","",,"UG::Caribbean, UG::North_America, UG::Sovereign_State" +British Virgin Islands,,"",,"UG::Caribbean, UG::North_America" +Turks and Caicos Islands,,"",,"UG::Caribbean, UG::North_America" +Cayman Islands,,"",,"UG::Caribbean, UG::North_America" +Anguilla,,"",,"UG::Caribbean, UG::North_America" +Azores,,"",,UG::Europe +Curaçao,"","",,"UG::Caribbean, UG::North_America" +French Guiana,,"",GF,UG::South_America +Gibraltar,,"",,"UG::Europe, UG::Mediterranean" +Guernsey,,"",,UG::Europe +Isle of Man,,"",IM,UG::Europe +Jersey,,"",,UG::Europe +Kiribati,"","",,"UG::Oceania, UG::Sovereign_State" +Macau,"","",,UG::Asia +Madeira,,"",,UG::Europe +Marshall Islands,"","",,"UG::Oceania, UG::Sovereign_State" +Nauru,"","",,"UG::Oceania, UG::Sovereign_State" +New Caledonia,"","",NC,UG::Oceania +Niue,"","",,"UG::Oceania, UG::Sovereign_State" +Northern Cyprus,"","",,"UG::Asia, UG::Mediterranean, UG::Middle_East, UG::Sovereign_State" +Saint Kitts and Nevis,"","",,"UG::Caribbean, UG::North_America, UG::Sovereign_State" +Samoa,"","",,"UG::Oceania, UG::Sovereign_State" +Somaliland,"","",,"UG::Africa, UG::East_Africa, UG::Sovereign_State" +South Sudan,"","",SS,"UG::Africa, UG::East_Africa, UG::Sovereign_State" +Tuvalu,"","",,"UG::Oceania, UG::Sovereign_State" +United States Virgin Islands,"","",,"UG::Caribbean, UG::North_America" +Åland Islands,"","",AX,UG::Europe +South Ossetia,"","",,"UG::Europe, UG::Sovereign_State" +American Samoa,,"",,UG::Oceania +Northern Mariana Islands,,"",,UG::Oceania +Aruba,"","",,"UG::Caribbean, UG::North_America" +Abkhazia,"","",,"UG::Europe, UG::Sovereign_State" +Sint Maarten,,"",,"UG::Caribbean, UG::North_America" +Tonga,"","",,"UG::Oceania, UG::Sovereign_State" +Transnistria,"","",,"UG::Europe, UG::Sovereign_State" +Sardinia,,"",,UG::Europe +Kaliningrad Oblast,,"",,UG::Europe +Martinique,,"",MQ,"UG::Caribbean, UG::North_America" +Java,,"",,UG::Asia +Corsica,,"",,UG::Europe +European Union,"","",,UG::Europe +Gulf of Mexico,,"",,UG::Oceans+Seas +Philippine Sea,,"",,UG::Oceans+Seas +Southern Ocean,,"",,UG::Oceans+Seas +Gulf of Thailand,,"",,UG::Oceans+Seas +Micronesia,,"",,UG::Oceania +Pacific Ocean,,"",,UG::Oceans+Seas +Atlantic Ocean,,"",,UG::Oceans+Seas +Indian Ocean,,"",,UG::Oceans+Seas +Arctic Ocean,,"",,UG::Oceans+Seas +Hudson Bay,,"",,UG::Oceans+Seas +Labrador Sea,,"",,UG::Oceans+Seas +White Sea,,"",,UG::Oceans+Seas +Denmark Strait,,"",,UG::Oceans+Seas +Norwegian Sea,,"",,UG::Oceans+Seas +Baltic Sea,,"",,UG::Oceans+Seas +Celtic Sea,,"",,UG::Oceans+Seas +English Channel,,"",,UG::Oceans+Seas +Adriatic Sea,,"",,UG::Oceans+Seas +Bay of Biscay,,"",,UG::Oceans+Seas +Black Sea,,"",,UG::Oceans+Seas +Aegean Sea,,"",,UG::Oceans+Seas +Balkan Peninsula,,"",,UG::Europe +Caspian Sea,,"",,UG::Oceans+Seas +Mediterranean Sea,,"",,UG::Oceans+Seas +East Siberian Sea,,"",,UG::Oceans+Seas +Bering Strait,,"",,UG::Oceans+Seas +Arabian Sea,,"",,UG::Oceans+Seas +Red Sea,,"",,UG::Oceans+Seas +Dead Sea,,"",,UG::Oceans+Seas +Bay of Bengal,,"",,UG::Oceans+Seas +Sea of Japan,,"",,UG::Oceans+Seas +Yellow Sea,,"",,UG::Oceans+Seas +Coral Sea,,"",,UG::Oceans+Seas +South China Sea,,"",,UG::Oceans+Seas +Tasman Sea,,"",,UG::Oceans+Seas +Gulf of Carpentaria,,"",,UG::Oceans+Seas +Aral Sea,,"",,UG::Oceans+Seas +Persian Gulf,,"",,UG::Oceans+Seas +Caribbean Sea,,"",,UG::Oceans+Seas +Gulf of California,,"",,UG::Oceans+Seas +Polynesia,,"",,UG::Oceania +Melanesia,,"",,UG::Oceania +Scandinavia,,"",,UG::Europe +Sea of Galilee,,"",,UG::Oceans+Seas +Sumatra,,"",,UG::Asia +Sicily,,"",,UG::Europe +Mayotte,,"",YT,"UG::Africa, UG::East_Africa" +Réunion,,"",RE,"UG::Africa, UG::East_Africa" +Falkland Islands,,"",FK,UG::South_America +Europe,,"",,UG::Continents +North America,,"",,UG::Continents +South America,,"",,UG::Continents +Asia,,"",,UG::Continents +Africa,,"",,UG::Continents +Oceania,,"",,UG::Continents +Antarctica,,"",,UG::Continents +Saint Martin,,"",,"UG::Caribbean, UG::North_America" +Wallis and Futuna,,"",,UG::Oceania +Akrotiri and Dhekelia,,"",,"UG::Asia, UG::Mediterranean, UG::Middle_East" +Svalbard,,"",SJ,UG::Europe +Hawaii,,"",,UG::Oceania +Alaska,,"",,UG::North_America +Bougainville,,"",,UG::Oceania +Jeju,,"",,UG::Asia +Banda Sea,,"",,UG::Oceans+Seas +Barents Sea,,"",,UG::Oceans+Seas +Celebes Sea,,"",,UG::Oceans+Seas +East China Sea,,"",,UG::Oceans+Seas +Gulf of Alaska,,"",,UG::Oceans+Seas +Gulf of Guinea,,"",,UG::Oceans+Seas +North Sea,,"",,UG::Oceans+Seas +Sea of Okhotsk,,"",,UG::Oceans+Seas +Timor Sea,,"",,UG::Oceans+Seas diff --git a/src/media/experimental_assets/_ug-interactive_map_config.js b/src/media/experimental_assets/_ug-interactive_map_config.js new file mode 100644 index 00000000..2eeae64f --- /dev/null +++ b/src/media/experimental_assets/_ug-interactive_map_config.js @@ -0,0 +1,91 @@ +/** + * Overall configuration. Includes validated user properties + * and core properties - program auxiliary data. Should not + * be modified unless the author understands what they are doing + */ +function getMapConfig() { + let userConfig = JSON.parse(sessionStorage.getItem("userConfig")); + let configObj = {}; + configObj.commonConfig = { + interactiveEnabled: true, + interactiveMobileEnabled: true, + autoAnswerEnabled: true, + toolTipEnabled: false, + ...filterObjValidBooleans(userConfig.commonFeatures), + + isMobile: document.documentElement.classList.contains("mobile"), + regionCode: document.currentScript.dataset.regionCode, + cardSide: document.currentScript.dataset.cardSide, + questionCardSideName: "question", + answerCardSideName: "answer", + selectedRegionSessionKey: "selectedRegion", + mapSvgId: "world" + } + configObj.commonColors = { + region: "#fdfbe5", + selectedRegion: "#e7f3ea", + incorrectRegionHighlight: "#c02637", + correctRegionHighlight: "#329446", + background: "#b3dff5", + border: "#757674", + tooltipBackground: "#fdfbe5", + tooltipText: "#000000", + ...filterObjValidColors(userConfig.commonColors) + }; + configObj.commonElements = { + interactiveMap: document.querySelector(".value--map"), + staticMap: document.querySelector(".value--image"), + mapTooltips: document.querySelectorAll("body > div.jvm-tooltip"), + hiddenTextarea: document.querySelector("textarea#typeans") + }; + configObj.commonMap = { + selector: configObj.commonElements.interactiveMap, + map: configObj.commonConfig.mapSvgId, + zoomButtons: false, + zoomMax: 25, + backgroundColor: configObj.commonColors.background, + regionStyle: { + initial: { + fill: configObj.commonColors.region, + stroke: configObj.commonColors.border, + strokeWidth: 0.2 + } + } + }; + return configObj; +} + +/** + * Assemble the object from properties of original object + * values of which match the predicate + */ +function filterObj(obj, predicate, mapper) { + let filtered = {}; + for (let [key, value] of Object.entries(obj)) + if (predicate(value)) + filtered[key] = mapper ? mapper(value) : value; + return filtered; +} + +/** + * Assemble the object with valid boolean property values + * ignoring invalid and non-boolean properties + */ +function filterObjValidBooleans(obj) { + let toLower = v => v.toString().toLowerCase() + return filterObj( + obj, + v => ["true", "false"].some(x => toLower(v) === x), + v => toLower(v) === "true"); +} + +/** + * Assemble the object with valid HEX string property values + * ignoring invalid and non-HEX properties + */ +function filterObjValidColors(obj) { + return filterObj( + obj, + v => v.toString().match(/^#(?:[0-9a-fA-F]{3}){1,2}$/g) + ); +} diff --git a/src/media/experimental_assets/_ug-interactive_map_init.js b/src/media/experimental_assets/_ug-interactive_map_init.js new file mode 100644 index 00000000..32d48b53 --- /dev/null +++ b/src/media/experimental_assets/_ug-interactive_map_init.js @@ -0,0 +1,182 @@ +(function () { + const mapConfig = getMapConfig(); + const commonConfig = mapConfig.commonConfig; + const commonColors = mapConfig.commonColors; + const commonElements = mapConfig.commonElements; + const commonMap = mapConfig.commonMap; + + clearTooltips(); + + if (resolveInteractiveEnabled()) { + interactiveMapMode(true); + try { + if (cardSide(commonConfig.questionCardSideName)) + initFrontMap(); + else if (cardSide(commonConfig.answerCardSideName)) { + failInvalidRegionCode() + initBackMap(); + } + } catch (e) { + interactiveMapMode(false); + throw e; + } + } + + + /** + * Using configuration options to determine whether to display interactive map + */ + function resolveInteractiveEnabled() { + return commonConfig.interactiveEnabled && (nonMobile() || interactiveMobileEnabled()) + } + + /** + * @returns {boolean} true when device is not mobile, false otherwise + */ + function nonMobile() { + return !commonConfig.isMobile + } + + /** + * @returns {boolean} true if and only if the device is mobile + * and interactive map is enabled + */ + function interactiveMobileEnabled() { + return commonConfig.isMobile && commonConfig.interactiveMobileEnabled; + } + + /** + * Set interactive display map mode based on passed boolean argument + * Note, that static fallback is specifically displayed by default in case current script fails to be loaded + */ + function interactiveMapMode(enabled) { + commonElements.staticMap.style.display = enabled ? "none" : "block"; + commonElements.interactiveMap.style.display = enabled ? "block" : "none"; + } + + /** + * Determine card side using predefined names from configuration. + * Note that current card side is figured out via accessing the value of + * data attribute of the <script> element invoking the program + */ + function cardSide(cardSideName) { + return commonConfig.cardSide === cardSideName; + } + + /** + * Throw an error if region code specified in the card field is absent in the map object to indicate + * the reason of static map display and to automatically undo enabled interactive map mode + */ + function failInvalidRegionCode() { + let usedMapObj = window[commonConfig.mapSvgId]; + if (!usedMapObj.paths[commonConfig.regionCode]) + throw Error(`Region code "${commonConfig.regionCode || "empty"}" does not exist in the map`); + } + + /** + * Initialization of the map displayed on the front side of the card + */ + function initFrontMap() { + new jsVectorMap({ + ...commonMap, + regionsSelectable: true, + regionsSelectableOne: true, + + regionStyle: { + ...commonMap.regionStyle, + selected: {fill: commonColors.selectedRegion} + }, + + onRegionSelected: swapToBackSide, + + ...mobileSwipingHack(false) + }); + } + + /** + * Initialization of the map displayed on the back side of the card + */ + function initBackMap() { + new jsVectorMap({ + ...commonMap, + selectedRegions: [commonConfig.regionCode], + + regionStyle: { + ...commonMap.regionStyle, + selected: {fill: getRegionColor()} + }, + focusOn: { + region: commonConfig.regionCode, + animate: true + }, + + ...mobileSwipingHack(commonConfig.toolTipEnabled, (event, tooltip) => { + tooltip._tooltip.style.backgroundColor = commonColors.tooltipBackground; + tooltip._tooltip.style.color = commonColors.tooltipText; + }) + }); + } + + /** + * Jsvectormap logic incompatibility with project specifics - tooltips are inserted + * as direct children of <body> element and get persisted during cards review session + * accumulating and littering the canvas. Current handling is temporary fix until library issue is resolved + */ + function clearTooltips() { + commonElements.mapTooltips.forEach(x => x.remove()); + } + + /** + * Jsvectormap library bug - map swiping does not work on mobile with disabled tooltip. + * Enable tooltip and hide it in case original tooltip is not displayable. + * Current handling is temporary fix until library issue is resolved + */ + function mobileSwipingHack(tooltipEnabled, tooltipShowHandler) { + return commonConfig.isMobile + ? { + showTooltip: true, + onRegionTooltipShow(event, tooltip) { + if (tooltipEnabled && tooltipShowHandler) + tooltipShowHandler(event, tooltip) + else + tooltip._tooltip.style.display = "none"; + } + } + : { + showTooltip: tooltipEnabled, + onRegionTooltipShow: tooltipShowHandler + } + } + + /** + * After region on the front card side is selected persist its region code and + * swap the card to back side if configuration allows to do so. The action is + * achieved via sending "Enter" key event on manually defined hidden text area + */ + function swapToBackSide(selectedRegionCode) { + sessionStorage.setItem(commonConfig.selectedRegionSessionKey, selectedRegionCode); + + if (!commonConfig.autoAnswerEnabled) + return + + if (!commonElements.hiddenTextarea.onkeypress) + commonElements.hiddenTextarea.onkeypress = () => _typeAnsPress(); + + if (typeof AnkiDroidJS !== "undefined") { + showAnswer(); + } else { + commonElements.hiddenTextarea.dispatchEvent(new KeyboardEvent("keypress", {code: "Enter"})); + } + } + + /** + * Retrieve region highlighting color for answer card side + * depending on the configuration and whether the selected + * by the user on question side region is correct + */ + function getRegionColor() { + return commonConfig.regionCode === sessionStorage.getItem(commonConfig.selectedRegionSessionKey) + ? commonColors.correctRegionHighlight + : commonColors.incorrectRegionHighlight; + } +}()) diff --git a/src/media/experimental_assets/_ug-jsvectormap.js b/src/media/experimental_assets/_ug-jsvectormap.js new file mode 100644 index 00000000..7091f1be --- /dev/null +++ b/src/media/experimental_assets/_ug-jsvectormap.js @@ -0,0 +1 @@ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).jsVectorMap=e()}(this,(function(){"use strict";var t=function(t){return function(t){return!!t&&"object"==typeof t}(t)&&!function(t){var i=Object.prototype.toString.call(t);return"[object RegExp]"===i||"[object Date]"===i||function(t){return t instanceof Node}(t)||function(t){return t.$$typeof===e}(t)}(t)};var e="function"==typeof Symbol&&Symbol.for?Symbol.for("react.element"):60103;function i(t,e){return!1!==e.clone&&e.isMergeableObject(t)?o((i=t,Array.isArray(i)?[]:{}),t,e):t;var i}function s(t,e,s){return t.concat(e).map((function(t){return i(t,s)}))}function a(t){return Object.keys(t).concat(function(t){return Object.getOwnPropertySymbols?Object.getOwnPropertySymbols(t).filter((function(e){return t.propertyIsEnumerable(e)})):[]}(t))}function n(t,e){try{return e in t}catch(t){return!1}}function r(t,e,s){var r={};return s.isMergeableObject(t)&&a(t).forEach((function(e){r[e]=i(t[e],s)})),a(e).forEach((function(a){(function(t,e){return n(t,e)&&!(Object.hasOwnProperty.call(t,e)&&Object.propertyIsEnumerable.call(t,e))})(t,a)||(n(t,a)&&s.isMergeableObject(e[a])?r[a]=function(t,e){if(!e.customMerge)return o;var i=e.customMerge(t);return"function"==typeof i?i:o}(a,s)(t[a],e[a],s):r[a]=i(e[a],s))})),r}var o=function(e,a,n){(n=n||{}).arrayMerge=n.arrayMerge||s,n.isMergeableObject=n.isMergeableObject||t,n.cloneUnlessOtherwiseSpecified=i;var o=Array.isArray(a);return o===Array.isArray(e)?o?n.arrayMerge(e,a,n):r(e,a,n):i(a,n)},h=function(t){return"object"==typeof t&&void 0!==t.nodeType?t:"string"==typeof t?document.querySelector(t):null},l=function(t,e,i,s){void 0===s&&(s=!1);var a=document.createElement(t);return i&&(a[s?"innerHTML":"textContent"]=i),e&&(a.className=e),a},c=function(t){t.parentNode.removeChild(t)},u=function(t,e,i){return void 0===i&&(i=!1),i?o(t,e):Object.assign(t,e)},p=function(t,e){return t.toLowerCase()+":to:"+e.toLowerCase()},d=function(t,e){Object.assign(t.prototype,e)},f={},m=1,g={on:function(t,e,i,s){void 0===s&&(s={});var a="jvm:"+e+"::"+m++;f[a]={selector:t,handler:i},i._uid=a,t.addEventListener(e,i,s)},delegate:function(t,e,i,s){(e=e.split(" ")).forEach((function(e){g.on(t,e,(function(t){var e=t.target;e.matches(i)&&s.call(e,t)}))}))},off:function(t,e,i){var s=e.split(":")[1];t.removeEventListener(s,i),delete f[i._uid]},flush:function(){Object.keys(f).forEach((function(t){g.off(f[t].selector,t,f[t].handler)}))},getEventRegistry:function(){return f}};var v={onLoaded:"map:loaded",onViewportChange:"viewport:changed",onRegionClick:"region:clicked",onMarkerClick:"marker:clicked",onRegionSelected:"region:selected",onMarkerSelected:"marker:selected",onRegionTooltipShow:"region.tooltip:show",onMarkerTooltipShow:"marker.tooltip:show",onDestroyed:"map:destroyed"},_=function(t,e,i){var s=h(e),a=-1===s.getAttribute("class").indexOf("jvm-region")?"marker":"region",n="region"===a,r=n?s.getAttribute("data-code"):s.getAttribute("data-index"),o=n?v.onRegionSelected:v.onMarkerSelected;return i&&(o=n?v.onRegionTooltipShow:v.onMarkerTooltipShow),{type:a,code:r,event:o,element:n?t.regions[r].element:t._markers[r].element,tooltipText:n?t._mapData.paths[r].name||"":t._markers[r].config.name||""}};function y(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,s=Array(e);i=t.length?{done:!0}:{done:!1,value:t[s++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function S(){return S=Object.assign?Object.assign.bind():function(t){for(var e=1;e>10||1),a=i.container.getBoundingClientRect(),n=t.pageX-a.left-window.pageXOffset,r=t.pageY-a.top-window.pageYOffset,o=Math.pow(1+s.params.zoomOnScrollSpeed/1e3,-1.5*e);s.tooltip&&s._tooltip.hide(),s._setScale(s.scale*o,n,r),t.preventDefault()}))},_setupElementEvents:function(){var t,e,i,s=this,a=this.container;g.on(a,"mousemove",(function(s){Math.abs(t-s.pageX)+Math.abs(e-s.pageY)>2&&(i=!0)})),g.delegate(a,"mousedown",".jvm-element",(function(s){t=s.pageX,e=s.pageY,i=!1})),g.delegate(a,"mouseover mouseout",".jvm-element",(function(t){var e=_(s,this,!0),i=s.params.showTooltip;"mouseover"===t.type?(e.element.hover(!0),i&&(s._tooltip.text(e.tooltipText),s._tooltip.show(),s._emit(e.event,[t,s._tooltip,e.code]))):(e.element.hover(!1),i&&s._tooltip.hide())})),g.delegate(a,"mouseup",".jvm-element",(function(t){var e=_(s,this);if(!i&&("region"===e.type&&s.params.regionsSelectable||"marker"===e.type&&s.params.markersSelectable)){var a=e.element;s.params[e.type+"sSelectableOne"]&&s._clearSelected(e.type+"s"),e.element.isSelected?a.select(!1):a.select(!0),s._emit(e.event,[e.code,a.isSelected,s._getSelected(e.type+"s")])}})),g.delegate(a,"click",".jvm-element",(function(t){var e=_(s,this),i=e.type,a=e.code;s._emit("region"===i?v.onRegionClick:v.onMarkerClick,[t,a])}))},_setupZoomButtons:function(){var t=this,e=l("div","jvm-zoom-btn jvm-zoomin","+",!0),i=l("div","jvm-zoom-btn jvm-zoomout","−",!0);this.container.appendChild(e),this.container.appendChild(i);var s=function(e){return void 0===e&&(e=!0),function(){return t._setScale(e?t.scale*t.params.zoomStep:t.scale/t.params.zoomStep,t._width/2,t._height/2,!1,t.params.zoomAnimate)}};g.on(e,"click",s()),g.on(i,"click",s(!1))},_setupContainerTouchEvents:function(){var t,e,i,s,a,n,r,o=this,h=function(h){var l,c,u,p,d=h.touches;if("touchstart"==h.type&&(r=0),1==d.length)1==r&&(u=o.transX,p=o.transY,o.transX-=(i-d[0].pageX)/o.scale,o.transY-=(s-d[0].pageY)/o.scale,o._tooltip.hide(),o._applyTransform(),u==o.transX&&p==o.transY||h.preventDefault()),i=d[0].pageX,s=d[0].pageY;else if(2==d.length)if(2==r)c=Math.sqrt(Math.pow(d[0].pageX-d[1].pageX,2)+Math.pow(d[0].pageY-d[1].pageY,2))/e,o._setScale(t*c,a,n),o._tooltip.hide(),h.preventDefault();else{var f=o.container.getBoundingClientRect();l={top:f.top+window.scrollY,left:f.left+window.scrollX},a=d[0].pageX>d[1].pageX?d[1].pageX+(d[0].pageX-d[1].pageX)/2:d[0].pageX+(d[1].pageX-d[0].pageX)/2,n=d[0].pageY>d[1].pageY?d[1].pageY+(d[0].pageY-d[1].pageY)/2:d[0].pageY+(d[1].pageY-d[0].pageY)/2,a-=l.left,n-=l.top,t=o.scale,e=Math.sqrt(Math.pow(d[0].pageX-d[1].pageX,2)+Math.pow(d[0].pageY-d[1].pageY,2))}r=d.length};g.on(o.container,"touchstart",h),g.on(o.container,"touchmove",h)},_createRegions:function(){for(var t in this._regionLabelsGroup=this._regionLabelsGroup||this.canvas.createGroup("jvm-regions-labels-group"),this._mapData.paths){var e=new j({map:this,code:t,path:this._mapData.paths[t].path,style:u({},this.params.regionStyle),labelStyle:this.params.regionLabelStyle,labelsGroup:this._regionLabelsGroup,label:this.params.labels&&this.params.labels.regions});this.regions[t]={config:this._mapData.paths[t],element:e}}},_createLines:function(t,e,i){void 0===i&&(i=!1);var s=!1,a=!1;for(var n in this.linesGroup=this.linesGroup||this.canvas.createGroup("jvm-lines-group"),t){var r=t[n];for(var o in e){var h=i?e[o].config:e[o];h.name===r.from&&(s=this.getMarkerPosition(h)),h.name===r.to&&(a=this.getMarkerPosition(h))}!1!==s&&!1!==a&&(this._lines[p(r.from,r.to)]=new C({index:n,map:this,style:u({initial:this.params.lineStyle},{initial:r.style||{}},!0),x1:s.x,y1:s.y,x2:a.x,y2:a.y,group:this.linesGroup,config:r}))}},_createMarkers:function(t,e){var i=this;void 0===t&&(t={}),void 0===e&&(e=!1),this._markersGroup=this._markersGroup||this.canvas.createGroup("jvm-markers-group"),this._markerLabelsGroup=this._markerLabelsGroup||this.canvas.createGroup("jvm-markers-labels-group");var s=function(){var s=t[a],n=i.getMarkerPosition(s),r=s.coords.join(":");if(!n)return 0;if(e){if(Object.keys(i._markers).filter((function(t){return i._markers[t]._uid===r})).length)return 0;a=Object.keys(i._markers).length}var o=new L({index:a,map:i,style:u(i.params.markerStyle,S({},s.style||{}),!0),label:i.params.labels&&i.params.labels.markers,labelsGroup:i._markerLabelsGroup,cx:n.x,cy:n.y,group:i._markersGroup,marker:s,isRecentlyCreated:e});i._markers[a]&&i.removeMarkers([a]),i._markers[a]={_uid:r,config:s,element:o}};for(var a in t)s()},_createSeries:function(){for(var t in this.series={markers:[],regions:[]},this.params.series)for(var e=0;ee?this.transY=e:this.transYt?this.transX=t:this.transXthis._defaultWidth/this._defaultHeight?(this._baseScale=this._height/this._defaultHeight,this._baseTransX=Math.abs(this._width-this._defaultWidth*this._baseScale)/(2*this._baseScale)):(this._baseScale=this._width/this._defaultWidth,this._baseTransY=Math.abs(this._height-this._defaultHeight*this._baseScale)/(2*this._baseScale)),this.scale*=this._baseScale/t,this.transX*=this._baseScale/t,this.transY*=this._baseScale/t},_setScale:function(t,e,i,s,a){var n,r,o,h,l,c,u,p,d,f,m=this,g=0,_=Math.abs(Math.round(60*(t-this.scale)/Math.max(t,this.scale)));t>this.params.zoomMax*this._baseScale?t=this.params.zoomMax*this._baseScale:t0?(o=this.scale,h=(t-o)/_,l=this.transX*this.scale,u=this.transY*this.scale,c=(d*t-l)/_,p=(f*t-u)/_,r=setInterval((function(){g+=1,m.scale=o+h*g,m.transX=(l+c*g)/m.scale,m.transY=(u+p*g)/m.scale,m._applyTransform(),g==_&&(clearInterval(r),m._emit(v.onViewportChange,[m.scale,m.transX,m.transY]))}),10)):(this.transX=d,this.transY=f,this.scale=t,this._applyTransform(),this._emit(v.onViewportChange,[this.scale,this.transX,this.transY]))},setFocus:function(t){var e=this;void 0===t&&(t={});var i,s=[];if(t.region?s.push(t.region):t.regions&&(s=t.regions),s.length)return s.forEach((function(t){if(e.regions[t]){var s=e.regions[t].element.shape.getBBox();s&&(i=void 0===i?s:{x:Math.min(i.x,s.x),y:Math.min(i.y,s.y),width:Math.max(i.x+i.width,s.x+s.width)-Math.min(i.x,s.x),height:Math.max(i.y+i.height,s.y+s.height)-Math.min(i.y,s.y)})}})),this._setScale(Math.min(this._width/i.width,this._height/i.height),-(i.x+i.width/2),-(i.y+i.height/2),!0,t.animate);if(t.coords){var a=this.coordsToPoint(t.coords[0],t.coords[1]),n=this.transX-a.x/this.scale,r=this.transY-a.y/this.scale;return this._setScale(t.scale*this._baseScale,n,r,!0,t.animate)}},updateSize:function(){this._width=this.container.offsetWidth,this._height=this.container.offsetHeight,this._resize(),this.canvas.setSize(this._width,this._height),this._applyTransform()},coordsToPoint:function(t,e){var i=V.maps[this.params.map].projection,s=O[i.type](t,e,i.centralMeridian),a=s.x,n=s.y,r=this.getInsetForPoint(a,n);if(!r)return!1;var o=r.bbox;return a=(a-o[0].x)/(o[1].x-o[0].x)*r.width*this.scale,n=(n-o[0].y)/(o[1].y-o[0].y)*r.height*this.scale,{x:a+this.transX*this.scale+r.left*this.scale,y:n+this.transY*this.scale+r.top*this.scale}},getInsetForPoint:function(t,e){for(var i=V.maps[this.params.map].insets,s=0;sn.x&&tn.y&&ethis.max&&(this.max=e),e-1)})),this._markers,!0)},e.removeLines=function(t){var e=this;(t=Array.isArray(t)?t.map((function(t){return p(t.from,t.to)})):this._getLinesAsUids()).forEach((function(t){e._lines[t].dispose(),delete e._lines[t]}))},e.removeLine=function(t,e){console.warn("`removeLine` method is deprecated, please use `removeLines` instead.");var i=p(t,e);this._lines.hasOwnProperty(i)&&(this._lines[i].element.remove(),delete this._lines[i])},e.reset=function(){for(var t in this.series)for(var e=0;e img, .value > .placeholder { max-width: 100%; diff --git a/src/note_models/templates/Country - Map [Experimental].html b/src/note_models/templates/Country - Map [Experimental].html new file mode 100644 index 00000000..97272bf4 --- /dev/null +++ b/src/note_models/templates/Country - Map [Experimental].html @@ -0,0 +1,62 @@ + +
{{Country}}
+
+ +
Location
+ +
+ + + +
+ + + + + + + + +-- + +
{{Country}}
+{{#Country info}}
{{Country info}}
{{/Country info}} + +
+ +
Location
+ +
{{Map}}
+ + + + +
Flag - Country