diff --git a/stsg.toml b/stsg.toml index 8dbaff7..6ca37b5 100644 --- a/stsg.toml +++ b/stsg.toml @@ -1,2 +1,25 @@ +[setup] +source_directory = "src" +dist_directory = "dist" + [formatting] -datetime_format = "%d. %B %Y" \ No newline at end of file +article_preview_length = 400 +datetime_format = "%d. %B %Y" +default_language = "de" + +[languages] +[languages.de] +native_name = "Schland" +priority = 100 + +[languages.en] +priority = 90 + +[languages.ar_sy] +priority = 50 + +[languages.ku] +priority = 49 + +[languages.tr] +priority = 60 diff --git a/stsg/__init__.py b/stsg/__init__.py index e69de29..30db4d5 100644 --- a/stsg/__init__.py +++ b/stsg/__init__.py @@ -0,0 +1,793 @@ +class config: + class setup: + source_directory = "src" + dist_directory = "dist" + + class formatting: + article_preview_length = 200 + datetime_format = "%d. %B %Y" + fallback_language = "en" + + languages = { + "af": { + "flag": "🇿🇦", + "name": "Afrikaans", + "native_name": "Afrikaans" + }, + "am": { + "flag": "🇪🇹", + "name": "Amharic", + "native_name": "አማርኛ" + }, + "an": { + "flag": "🇪🇸", + "name": "Aragonese", + "native_name": "aragonés" + }, + "ar": { + "flag": "🇸🇦", + "name": "Arabic", + "native_name": "العربية" + }, + "ar_ae": { + "flag": "🇦🇪", + "name": "Arabic (UAE)", + "native_name": "العربية (الإمارات)" + }, + "ar_bh": { + "flag": "🇧🇭", + "name": "Arabic (Bahrain)", + "native_name": "العربية (البحرين)" + }, + "ar_dz": { + "flag": "🇩🇿", + "name": "Arabic (Algeria)", + "native_name": "العربية (الجزائر)" + }, + "ar_eg": { + "flag": "🇪🇬", + "name": "Arabic (Egypt)", + "native_name": "العربية (مصر)" + }, + "ar_iq": { + "flag": "🇮🇶", + "name": "Arabic (Iraq)", + "native_name": "العربية (العراق)" + }, + "ar_jo": { + "flag": "🇯🇴", + "name": "Arabic (Jordan)", + "native_name": "العربية (الأردن)" + }, + "ar_kw": { + "flag": "🇰🇼", + "name": "Arabic (Kuwait)", + "native_name": "العربية (الكويت)" + }, + "ar_lb": { + "flag": "🇱🇧", + "name": "Arabic (Lebanon)", + "native_name": "العربية (لبنان)" + }, + "ar_ly": { + "flag": "🇱🇾", + "name": "Arabic (Libya)", + "native_name": "العربية (ليبيا)" + }, + "ar_ma": { + "flag": "🇲🇦", + "name": "Arabic (Morocco)", + "native_name": "العربية (المغرب)" + }, + "ar_om": { + "flag": "🇴🇲", + "name": "Arabic (Oman)", + "native_name": "العربية (عُمان)" + }, + "ar_qa": { + "flag": "🇶🇦", + "name": "Arabic (Qatar)", + "native_name": "العربية (قطر)" + }, + "ar_sa": { + "flag": "🇸🇦", + "name": "Arabic (Saudi Arabia)", + "native_name": "العربية (السعودية)" + }, + "ar_sd": { + "flag": "🇸🇩", + "name": "Arabic (Sudan)", + "native_name": "العربية (السودان)" + }, + "ar_sy": { + "flag": "🇸🇾", + "name": "Arabic (Syria)", + "native_name": "العربية (سوريا)", + }, + "ar_tn": { + "flag": "🇹🇳", + "name": "Arabic (Tunisia)", + "native_name": "العربية (تونس)" + }, + "ar_ye": { + "flag": "🇾🇪", + "name": "Arabic (Yemen)", + "native_name": "العربية (اليمن)" + }, + "ars_ae": { + "flag": "🇦🇪", + "name": "Najdi Arabic (UAE)", + "native_name": "نَجْدِيّ" + }, + "ars_arab_sa": { + "flag": "🇸🇦", + "name": "Najdi Arabic (Saudi Arabia, Arabic Script)", + "native_name": "نَجْدِيّ" + }, + "ars_sa": { + "flag": "🇸🇦", + "name": "Najdi Arabic (Saudi Arabia)", + "native_name": "نَجْدِيّ" + }, + "as": { + "flag": "🇮🇳", + "name": "Assamese", + "native_name": "অসমীয়া" + }, + "az": { + "flag": "🇦🇿", + "name": "Azerbaijani", + "native_name": "Azərbaycan" + }, + "be": { + "flag": "🇧🇾", + "name": "Belarusian", + "native_name": "Беларуская" + }, + "bg": { + "flag": "🇧🇬", + "name": "Bulgarian", + "native_name": "Български" + }, + "bm": { + "flag": "🇲🇱", + "name": "Bambara", + "native_name": "bamanankan" + }, + "bn": { + "flag": "🇧🇩", + "name": "Bengali", + "native_name": "বাংলা" + }, + "bn_in": { + "flag": "🇮🇳", + "name": "Bengali (India)", + "native_name": "বাংলা (ভারত)" + }, + "br": { + "flag": "🏴", + "name": "Breton", + "native_name": "brezhoneg" + }, + "bs": { + "flag": "🇧🇦", + "name": "Bosnian", + "native_name": "Bosanski" + }, + "ca": { + "flag": "🇪🇸", + "name": "Catalan", + "native_name": "Català" + }, + "crh": { + "flag": "🇺🇦", + "name": "Crimean Tatar", + "native_name": "qırımtatarca" + }, + "cs": { + "flag": "🇨🇿", + "name": "Czech", + "native_name": "Čeština" + }, + "cv": { + "flag": "🇷🇺", + "name": "Chuvash", + "native_name": "чӑваш чӗлхи" + }, + "cy": { + "flag": "🏴", + "name": "Welsh", + "native_name": "Cymraeg" + }, + "da": { + "flag": "🇩🇰", + "name": "Danish", + "native_name": "Dansk" + }, + "de": { + "flag": "🇩🇪", + "name": "German", + "native_name": "Deutsch", + }, + "de_at": { + "flag": "🇦🇹", + "name": "German (Austria)", + "native_name": "Deutsch (Österreich)" + }, + "de_be": { + "flag": "🇧🇪", + "name": "German (Belgium)", + "native_name": "Deutsch (Belgien)" + }, + "de_ch": { + "flag": "🇨🇭", + "name": "German (Switzerland)", + "native_name": "Deutsch (Schweiz)" + }, + "dv": { + "flag": "🇲🇻", + "name": "Dhivehi", + "native_name": "ދިވެހި" + }, + "dz": { + "flag": "🇧🇹", + "name": "Dzongkha", + "native_name": "རྫོང་ཁ" + }, + "el": { + "flag": "🇬🇷", + "name": "Greek", + "native_name": "Ελληνικά" + }, + "en": { + "flag": "🇺🇸", + "name": "English", + "native_name": "English", + }, + "en_au": { + "flag": "🇦🇺", + "name": "English (Australia)", + "native_name": "English (Australia)" + }, + "en_ca": { + "flag": "🇨🇦", + "name": "English (Canada)", + "native_name": "English (Canada)" + }, + "en_gb": { + "flag": "🇬🇧", + "name": "English (UK)", + "native_name": "English (UK)", + }, + "en_ie": { + "flag": "🇮🇪", + "name": "English (Ireland)", + "native_name": "English (Ireland)" + }, + "en_in": { + "flag": "🇮🇳", + "name": "English (India)", + "native_name": "English (India)" + }, + "en_nz": { + "flag": "🇳🇿", + "name": "English (New Zealand)", + "native_name": "English (New Zealand)" + }, + "en_us": { + "flag": "🇺🇸", + "name": "English (US)", + "native_name": "English (US)", + }, + "es": { + "flag": "🇪🇸", + "name": "Spanish", + "native_name": "Español" + }, + "es_ar": { + "flag": "🇦🇷", + "name": "Spanish (Argentina)", + "native_name": "Español (Argentina)" + }, + "es_mx": { + "flag": "🇲🇽", + "name": "Spanish (Mexico)", + "native_name": "Español (México)" + }, + "et": { + "flag": "🇪🇪", + "name": "Estonian", + "native_name": "Eesti" + }, + "fa": { + "flag": "🇮🇷", + "name": "Persian", + "native_name": "فارسی" + }, + "ff": { + "flag": "🌍", + "name": "Fula", + "native_name": "Fulfulde" + }, + "fi": { + "flag": "🇫🇮", + "name": "Finnish", + "native_name": "Suomi" + }, + "fo": { + "flag": "🇫🇴", + "name": "Faroese", + "native_name": "føroyskt" + }, + "fr": { + "flag": "🇫🇷", + "name": "French", + "native_name": "Français" + }, + "fr_ca": { + "flag": "🇨🇦", + "name": "French (Canada)", + "native_name": "Français (Canada)" + }, + "fr_ch": { + "flag": "🇨🇭", + "name": "French (Switzerland)", + "native_name": "Français (Suisse)" + }, + "ga": { + "flag": "🇮🇪", + "name": "Irish", + "native_name": "Gaeilge" + }, + "gl": { + "flag": "🇪🇸", + "name": "Galician", + "native_name": "Galego" + }, + "gn": { + "flag": "🇵🇾", + "name": "Guarani", + "native_name": "Avañe'ẽ" + }, + "gu": { + "flag": "🇮🇳", + "name": "Gujarati", + "native_name": "ગુજરાતી" + }, + "ha": { + "flag": "🇳🇬", + "name": "Hausa", + "native_name": "هَوُسَ" + }, + "he": { + "flag": "🇮🇱", + "name": "Hebrew", + "native_name": "עברית" + }, + "hi": { + "flag": "🇮🇳", + "name": "Hindi", + "native_name": "हिन्दी" + }, + "hr": { + "flag": "🇭🇷", + "name": "Croatian", + "native_name": "Hrvatski" + }, + "ht": { + "flag": "🇭🇹", + "name": "Haitian Creole", + "native_name": "Kreyòl ayisyen" + }, + "hu": { + "flag": "🇭🇺", + "name": "Hungarian", + "native_name": "Magyar" + }, + "id": { + "flag": "🇮🇩", + "name": "Indonesian", + "native_name": "Bahasa Indonesia" + }, + "io": { + "flag": "🌍", + "name": "Ido", + "native_name": "Ido" + }, + "is": { + "flag": "🇮🇸", + "name": "Icelandic", + "native_name": "Íslenska" + }, + "it": { + "flag": "🇮🇹", + "name": "Italian", + "native_name": "Italiano" + }, + "ja": { + "flag": "🇯🇵", + "name": "Japanese", + "native_name": "日本語" + }, + "jv_id": { + "flag": "🇮🇩", + "name": "Javanese (Indonesia)", + "native_name": "basa jawa" + }, + "ka": { + "flag": "🇬🇪", + "name": "Georgian", + "native_name": "ქართული" + }, + "kg": { + "flag": "🇨🇬", + "name": "Kongo", + "native_name": "KiKongo" + }, + "kj": { + "flag": "🇳🇦", + "name": "Kuanyama", + "native_name": "Oshikwanyama" + }, + "kk": { + "flag": "🇰🇿", + "name": "Kazakh", + "native_name": "Қазақ" + }, + "kl": { + "flag": "🇬🇱", + "name": "Kalaallisut", + "native_name": "kalaallisut" + }, + "km": { + "flag": "🇰🇭", + "name": "Khmer", + "native_name": "ខ្មែរ" + }, + "ko": { + "flag": "🇰🇷", + "name": "Korean", + "native_name": "한국어" + }, + "ks": { + "flag": "🇮🇳", + "name": "Kashmiri", + "native_name": "کٲشُر" + }, + "ku": { + "flag": "🇮🇶", + "name": "Kurdish", + "native_name": "Kurdî", + }, + "lo": { + "flag": "🇱🇦", + "name": "Lao", + "native_name": "ລາວ" + }, + "lt": { + "flag": "🇱🇹", + "name": "Lithuanian", + "native_name": "Lietuvių" + }, + "lv": { + "flag": "🇱🇻", + "name": "Latvian", + "native_name": "Latviešu" + }, + "mg": { + "flag": "🇲🇬", + "name": "Malagasy", + "native_name": "Malagasy" + }, + "mg_mg": { + "flag": "🇲🇬", + "name": "Malagasy (Madagascar)", + "native_name": "malagasy" + }, + "mh": { + "flag": "🇲🇭", + "name": "Marshallese", + "native_name": "Kajin M̧ajeļ" + }, + "mk": { + "flag": "🇲🇰", + "name": "Macedonian", + "native_name": "Македонски" + }, + "mn_mn": { + "flag": "🇲🇳", + "name": "Mongolian (Mongolia)", + "native_name": "Монгол хэл" + }, + "mr_in": { + "flag": "🇮🇳", + "name": "Marathi (India)", + "native_name": "मराठी" + }, + "ms": { + "flag": "🇲🇾", + "name": "Malay", + "native_name": "Bahasa Melayu" + }, + "my": { + "flag": "🇲🇲", + "name": "Burmese", + "native_name": "မြန်မာဘာသာ" + }, + "na": { + "flag": "🇳🇷", + "name": "Nauruan", + "native_name": "Dorerin Naoero" + }, + "nb": { + "flag": "🇳🇴", + "name": "Norwegian Bokmål", + "native_name": "Norsk Bokmål" + }, + "ng": { + "flag": "🇳🇦", + "name": "Ndonga", + "native_name": "Oshindonga" + }, + "nl": { + "flag": "🇳🇱", + "name": "Dutch", + "native_name": "Nederlands" + }, + "om": { + "flag": "🇪🇹", + "name": "Oromo", + "native_name": "Afaan Oromoo" + }, + "os": { + "flag": "🇷🇺", + "name": "Ossetian", + "native_name": "ирон æвзаг" + }, + "pl": { + "flag": "🇵🇱", + "name": "Polish", + "native_name": "Polski" + }, + "pt": { + "flag": "🇵🇹", + "name": "Portuguese", + "native_name": "Português" + }, + "pt_br": { + "flag": "🇧🇷", + "name": "Portuguese (Brazil)", + "native_name": "Português (Brasil)" + }, + "qu": { + "flag": "🇵🇪", + "name": "Quechua", + "native_name": "Runa Simi" + }, + "ro": { + "flag": "🇷🇴", + "name": "Romanian", + "native_name": "Română" + }, + "ru": { + "flag": "🇷🇺", + "name": "Russian", + "native_name": "Русский" + }, + "rw": { + "flag": "🇷🇼", + "name": "Kinyarwanda", + "native_name": "Ikinyarwanda" + }, + "sc": { + "flag": "🇮🇹", + "name": "Sardinian", + "native_name": "sardu" + }, + "sg": { + "flag": "🇨🇫", + "name": "Sango", + "native_name": "yângâ tî sängö" + }, + "sk": { + "flag": "🇸🇰", + "name": "Slovak", + "native_name": "Slovenčina" + }, + "sl": { + "flag": "🇸🇮", + "name": "Slovenian", + "native_name": "Slovenščina" + }, + "sm": { + "flag": "🇼🇸", + "name": "Samoan", + "native_name": "Gagana Samoa" + }, + "sn": { + "flag": "🇿🇼", + "name": "Shona", + "native_name": "chiShona" + }, + "so": { + "flag": "🇸🇴", + "name": "Somali", + "native_name": "Soomaaliga" + }, + "sr": { + "flag": "🇷🇸", + "name": "Serbian", + "native_name": "Српски" + }, + "ss": { + "flag": "🇸🇿", + "name": "Swati", + "native_name": "SiSwati" + }, + "st": { + "flag": "🇱🇸", + "name": "Southern Sotho", + "native_name": "Sesotho" + }, + "su_id": { + "flag": "🇮🇩", + "name": "Sundanese (Indonesia)", + "native_name": "basa sunda" + }, + "sv": { + "flag": "🇸🇪", + "name": "Swedish", + "native_name": "Svenska" + }, + "th": { + "flag": "🇹🇭", + "name": "Thai", + "native_name": "ไทย" + }, + "tk": { + "flag": "🇹🇲", + "name": "Turkmen", + "native_name": "Türkmen" + }, + "tn": { + "flag": "🇧🇼", + "name": "Tswana", + "native_name": "Setswana" + }, + "to": { + "flag": "🇹🇴", + "name": "Tongan", + "native_name": "faka-Tonga" + }, + "tr": { + "flag": "🇹🇷", + "name": "Turkish", + "native_name": "Türkçe", + }, + "ts": { + "flag": "🇿🇦", + "name": "Tsonga", + "native_name": "Xitsonga" + }, + "ts_zw": { + "flag": "🇿🇼", + "name": "Tsonga (Zimbabwe)", + "native_name": "xitsonga" + }, + "ty": { + "flag": "🇵🇫", + "name": "Tahitian", + "native_name": "Reo Tahiti" + }, + "uk": { + "flag": "🇺🇦", + "name": "Ukrainian", + "native_name": "Українська" + }, + "ur": { + "flag": "🇵🇰", + "name": "Urdu", + "native_name": "اردو" + }, + "uz": { + "flag": "🇺🇿", + "name": "Uzbek", + "native_name": "oʻzbek" + }, + "ve": { + "flag": "🇿🇦", + "name": "Venda", + "native_name": "Tshivenda" + }, + "vi": { + "flag": "🇻🇳", + "name": "Vietnamese", + "native_name": "Tiếng Việt" + }, + "vo": { + "flag": "🌍", + "name": "Volapük", + "native_name": "Volapük" + }, + "wa": { + "flag": "🇧🇪", + "name": "Walloon", + "native_name": "walon" + }, + "xh": { + "flag": "🇿🇦", + "name": "Xhosa", + "native_name": "isiXhosa" + }, + "yi": { + "flag": "🌍", + "name": "Yiddish", + "native_name": "ייִדיש" + }, + "yo": { + "flag": "🇳🇬", + "name": "Yoruba", + "native_name": "Yorùbá" + }, + "zh": { + "flag": "🇨🇳", + "name": "Chinese", + "native_name": "中文" + }, + "zh_hk": { + "flag": "🇭🇰", + "name": "Chinese (Hong Kong)", + "native_name": "中文(香港)" + }, + "zh_tw": { + "flag": "🇹🇼", + "name": "Chinese (Taiwan)", + "native_name": "中文(台灣)" + }, + "zu": { + "flag": "🇿🇦", + "name": "Zulu", + "native_name": "isiZulu" + } + } + + +if True: + import toml + from pathlib import Path + + def process_data_dict(data: dict, existing: dict): + for key, value in data.items(): + if key not in existing: + existing[key] = value + continue + + if isinstance(value, dict): + if isinstance(existing[key], dict): + process_data_dict(value, existing[key]) + continue + + existing[key] = value + + def process_data(data: dict, obj): + for key, value in data.items(): + if not hasattr(obj, key): + continue + + existing = getattr(obj, key) + if isinstance(existing, dict): + process_data_dict(value, existing) + continue + + + if isinstance(value, dict): + process_data(value, getattr(obj, key)) + continue + + setattr(obj, key, value) + + + config_file = Path("stsg.toml") + if config_file.exists() and config_file.is_file(): + with config_file.open("r") as f: + process_data(toml.loads(f.read()), config) diff --git a/stsg/__main__.py b/stsg/__main__.py index e3b90e9..41f8b58 100644 --- a/stsg/__main__.py +++ b/stsg/__main__.py @@ -5,9 +5,14 @@ import time import os import subprocess -from .config import SOURCE_DIRECTORY, CODE_DIRECTORY + +from . import config from .build import build as complete_build + +CODE_DIRECTORY = "stsg" + + logging.basicConfig(level=logging.INFO) logger = logging.getLogger("stsg") @@ -69,7 +74,7 @@ def build_on_change(): build() observer = Observer() - observer.schedule(MarkdownChangeHandler(), path=SOURCE_DIRECTORY, recursive=True) + observer.schedule(MarkdownChangeHandler(), path=config.setup.source_directory, recursive=True) observer.start() try: @@ -97,3 +102,4 @@ def hot_reload(): observer.stop() observer.join() + diff --git a/stsg/build.py b/stsg/build.py index 5626f8a..0afedc4 100644 --- a/stsg/build.py +++ b/stsg/build.py @@ -8,8 +8,7 @@ from typing import Optional, Union, Dict, Generator, List, DefaultDict from bs4 import BeautifulSoup from collections import defaultdict -from .config import SOURCE_DIRECTORY, DIST_DIRECTORY, LANGUAGE_INFORMATION, ARTICLE_PREVIEW_LENGTH, DEFAULT_LANGUAGE - +from . import config def replace_values(template: str, values: Dict[str, str]) -> str: @@ -19,14 +18,14 @@ def replace_values(template: str, values: Dict[str, str]) -> str: return template -def get_first_header_content(content): +def get_first_header_content(content, fallback: str = ""): soup = BeautifulSoup(content, 'html.parser') for level in range(1, 7): header = soup.find(f'h{level}') if header: return header.get_text(strip=True) - return self.language_code.native_name + return fallback class Template: @@ -48,23 +47,25 @@ class ArticleTranslation: self.article_content = self.file.read_text() if self.file.suffix == ".md": self.article_content = markdown.markdown(self.article_content) - self.title = get_first_header_content(self.article_content) self.location_in_tree = [self.language_code, *self.article_overview.location_in_tree] self.url = "/" + "/".join(self.location_in_tree) - self.dist_path = Path(DIST_DIRECTORY, *self.location_in_tree) + self.dist_path = Path(config.setup.dist_directory, *self.location_in_tree) - _language_info = DEFAULT_LANGUAGE + _language_info = config.languages[config.formatting.fallback_language] parsed_language_code = self.language_code.lower().replace("-", "_") - if parsed_language_code in LANGUAGE_INFORMATION: - _language_info = LANGUAGE_INFORMATION[parsed_language_code] - elif parsed_language_code.split("_")[0] in LANGUAGE_INFORMATION: - _language_info = LANGUAGE_INFORMATION[parsed_language_code.split("_")[0]] + if parsed_language_code in config.languages: + _language_info = config.languages[parsed_language_code] + elif parsed_language_code.split("_")[0] in config.languages: + _language_info = config.languages[parsed_language_code.split("_")[0]] self.language_name: str = _language_info["native_name"] self.language_flag: str = _language_info["flag"] self.priority: int = _language_info.get("priority", 0) + self.title = get_first_header_content(self.article_content, fallback=self.language_name) + + def build(self): self.dist_path.mkdir(parents=True, exist_ok=True) @@ -76,7 +77,7 @@ class ArticleTranslation: def _get_values(self, return_foreign_articles: bool = True) -> Dict[str, str]: r = { "article_content": self.article_content, - "article_preview": self.article_content[:ARTICLE_PREVIEW_LENGTH] + "...", + "article_preview": self.article_content[:config.formatting.article_preview_length] + "...", "article_url": self.url, "article_overview_url": self.article_overview.url, "article_slug": self.article_overview.slug, @@ -118,7 +119,7 @@ class ArticleOverview: self.location_in_tree: List[str] = location_in_tree or [] self.location_in_tree.append(self.slug) self.url = "/" + "/".join(self.location_in_tree) - self.dist_path = Path(DIST_DIRECTORY, *self.location_in_tree) + self.dist_path = Path(config.setup.dist_directory, *self.location_in_tree) if self.slug in ARTICLE_LAKE: logger.error("two articles have the same name at %s and %r", ARTICLE_LAKE[self.slug].directory, self.directory) @@ -183,8 +184,8 @@ class ArticleOverview: def copy_static(): - src = str(Path(SOURCE_DIRECTORY, "static")) - dst = str(Path(DIST_DIRECTORY, "static")) + src = str(Path(config.setup.source_directory, "static")) + dst = str(Path(config.setup.dist_directory, "static")) if not os.path.exists(src): @@ -217,7 +218,7 @@ def copy_static(): # GLOBALS logger = logging.getLogger("stsg.build") -TEMPLATE = Template(Path(SOURCE_DIRECTORY, "templates")) +TEMPLATE = Template(Path(config.setup.source_directory, "templates")) ARTICLE_LAKE: Dict[str, ArticleOverview] = {} ARTICLE_REFERENCE_VALUES: DefaultDict[str, Dict[str, str]] = defaultdict(dict) @@ -225,7 +226,7 @@ def build(): logger.info("building static page") copy_static() - tree = ArticleOverview(directory=Path(SOURCE_DIRECTORY, "articles")) + tree = ArticleOverview(directory=Path(config.setup.source_directory, "articles")) # build article reverence values for article_overview in ARTICLE_LAKE.values(): diff --git a/stsg/config.py b/stsg/config.py deleted file mode 100644 index 64eade7..0000000 --- a/stsg/config.py +++ /dev/null @@ -1,772 +0,0 @@ -import typing -import typing_extensions - -SOURCE_DIRECTORY = "src" -DIST_DIRECTORY = "dist" - -# config template stuff -ARTICLE_PREVIEW_LENGTH = 200 - -# FOR DEVELOPMENT -CODE_DIRECTORY = "stsg" - - -class TypedLanguageInformation(typing_extensions.TypedDict): - flag: str - name: str - native_name: str - priority: typing_extensions.NotRequired[int] - - -# LANGUAGE INFORMATION -LANGUAGE_INFORMATION: typing.Dict[str, TypedLanguageInformation] = { - "af": { - "flag": "🇿🇦", - "name": "Afrikaans", - "native_name": "Afrikaans" - }, - "am": { - "flag": "🇪🇹", - "name": "Amharic", - "native_name": "አማርኛ" - }, - "an": { - "flag": "🇪🇸", - "name": "Aragonese", - "native_name": "aragonés" - }, - "ar": { - "flag": "🇸🇦", - "name": "Arabic", - "native_name": "العربية" - }, - "ar_ae": { - "flag": "🇦🇪", - "name": "Arabic (UAE)", - "native_name": "العربية (الإمارات)" - }, - "ar_bh": { - "flag": "🇧🇭", - "name": "Arabic (Bahrain)", - "native_name": "العربية (البحرين)" - }, - "ar_dz": { - "flag": "🇩🇿", - "name": "Arabic (Algeria)", - "native_name": "العربية (الجزائر)" - }, - "ar_eg": { - "flag": "🇪🇬", - "name": "Arabic (Egypt)", - "native_name": "العربية (مصر)" - }, - "ar_iq": { - "flag": "🇮🇶", - "name": "Arabic (Iraq)", - "native_name": "العربية (العراق)" - }, - "ar_jo": { - "flag": "🇯🇴", - "name": "Arabic (Jordan)", - "native_name": "العربية (الأردن)" - }, - "ar_kw": { - "flag": "🇰🇼", - "name": "Arabic (Kuwait)", - "native_name": "العربية (الكويت)" - }, - "ar_lb": { - "flag": "🇱🇧", - "name": "Arabic (Lebanon)", - "native_name": "العربية (لبنان)" - }, - "ar_ly": { - "flag": "🇱🇾", - "name": "Arabic (Libya)", - "native_name": "العربية (ليبيا)" - }, - "ar_ma": { - "flag": "🇲🇦", - "name": "Arabic (Morocco)", - "native_name": "العربية (المغرب)" - }, - "ar_om": { - "flag": "🇴🇲", - "name": "Arabic (Oman)", - "native_name": "العربية (عُمان)" - }, - "ar_qa": { - "flag": "🇶🇦", - "name": "Arabic (Qatar)", - "native_name": "العربية (قطر)" - }, - "ar_sa": { - "flag": "🇸🇦", - "name": "Arabic (Saudi Arabia)", - "native_name": "العربية (السعودية)" - }, - "ar_sd": { - "flag": "🇸🇩", - "name": "Arabic (Sudan)", - "native_name": "العربية (السودان)" - }, - "ar_sy": { - "flag": "🇸🇾", - "name": "Arabic (Syria)", - "native_name": "العربية (سوريا)", - "priority": 50, - }, - "ar_tn": { - "flag": "🇹🇳", - "name": "Arabic (Tunisia)", - "native_name": "العربية (تونس)" - }, - "ar_ye": { - "flag": "🇾🇪", - "name": "Arabic (Yemen)", - "native_name": "العربية (اليمن)" - }, - "ars_ae": { - "flag": "🇦🇪", - "name": "Najdi Arabic (UAE)", - "native_name": "نَجْدِيّ" - }, - "ars_arab_sa": { - "flag": "🇸🇦", - "name": "Najdi Arabic (Saudi Arabia, Arabic Script)", - "native_name": "نَجْدِيّ" - }, - "ars_sa": { - "flag": "🇸🇦", - "name": "Najdi Arabic (Saudi Arabia)", - "native_name": "نَجْدِيّ" - }, - "as": { - "flag": "🇮🇳", - "name": "Assamese", - "native_name": "অসমীয়া" - }, - "az": { - "flag": "🇦🇿", - "name": "Azerbaijani", - "native_name": "Azərbaycan" - }, - "be": { - "flag": "🇧🇾", - "name": "Belarusian", - "native_name": "Беларуская" - }, - "bg": { - "flag": "🇧🇬", - "name": "Bulgarian", - "native_name": "Български" - }, - "bm": { - "flag": "🇲🇱", - "name": "Bambara", - "native_name": "bamanankan" - }, - "bn": { - "flag": "🇧🇩", - "name": "Bengali", - "native_name": "বাংলা" - }, - "bn_in": { - "flag": "🇮🇳", - "name": "Bengali (India)", - "native_name": "বাংলা (ভারত)" - }, - "br": { - "flag": "🏴", - "name": "Breton", - "native_name": "brezhoneg" - }, - "bs": { - "flag": "🇧🇦", - "name": "Bosnian", - "native_name": "Bosanski" - }, - "ca": { - "flag": "🇪🇸", - "name": "Catalan", - "native_name": "Català" - }, - "crh": { - "flag": "🇺🇦", - "name": "Crimean Tatar", - "native_name": "qırımtatarca" - }, - "cs": { - "flag": "🇨🇿", - "name": "Czech", - "native_name": "Čeština" - }, - "cv": { - "flag": "🇷🇺", - "name": "Chuvash", - "native_name": "чӑваш чӗлхи" - }, - "cy": { - "flag": "🏴", - "name": "Welsh", - "native_name": "Cymraeg" - }, - "da": { - "flag": "🇩🇰", - "name": "Danish", - "native_name": "Dansk" - }, - "de": { - "flag": "🇩🇪", - "name": "German", - "native_name": "Deutsch", - "priority": 100, - }, - "de_at": { - "flag": "🇦🇹", - "name": "German (Austria)", - "native_name": "Deutsch (Österreich)" - }, - "de_be": { - "flag": "🇧🇪", - "name": "German (Belgium)", - "native_name": "Deutsch (Belgien)" - }, - "de_ch": { - "flag": "🇨🇭", - "name": "German (Switzerland)", - "native_name": "Deutsch (Schweiz)" - }, - "dv": { - "flag": "🇲🇻", - "name": "Dhivehi", - "native_name": "ދިވެހި" - }, - "dz": { - "flag": "🇧🇹", - "name": "Dzongkha", - "native_name": "རྫོང་ཁ" - }, - "el": { - "flag": "🇬🇷", - "name": "Greek", - "native_name": "Ελληνικά" - }, - "en": { - "flag": "🇺🇸", - "name": "English", - "native_name": "English", - "priority": 80, - }, - "en_au": { - "flag": "🇦🇺", - "name": "English (Australia)", - "native_name": "English (Australia)" - }, - "en_ca": { - "flag": "🇨🇦", - "name": "English (Canada)", - "native_name": "English (Canada)" - }, - "en_gb": { - "flag": "🇬🇧", - "name": "English (UK)", - "native_name": "English (UK)", - "priority": 80, - }, - "en_ie": { - "flag": "🇮🇪", - "name": "English (Ireland)", - "native_name": "English (Ireland)" - }, - "en_in": { - "flag": "🇮🇳", - "name": "English (India)", - "native_name": "English (India)" - }, - "en_nz": { - "flag": "🇳🇿", - "name": "English (New Zealand)", - "native_name": "English (New Zealand)" - }, - "en_us": { - "flag": "🇺🇸", - "name": "English (US)", - "native_name": "English (US)", - }, - "es": { - "flag": "🇪🇸", - "name": "Spanish", - "native_name": "Español" - }, - "es_ar": { - "flag": "🇦🇷", - "name": "Spanish (Argentina)", - "native_name": "Español (Argentina)" - }, - "es_mx": { - "flag": "🇲🇽", - "name": "Spanish (Mexico)", - "native_name": "Español (México)" - }, - "et": { - "flag": "🇪🇪", - "name": "Estonian", - "native_name": "Eesti" - }, - "fa": { - "flag": "🇮🇷", - "name": "Persian", - "native_name": "فارسی" - }, - "ff": { - "flag": "🌍", - "name": "Fula", - "native_name": "Fulfulde" - }, - "fi": { - "flag": "🇫🇮", - "name": "Finnish", - "native_name": "Suomi" - }, - "fo": { - "flag": "🇫🇴", - "name": "Faroese", - "native_name": "føroyskt" - }, - "fr": { - "flag": "🇫🇷", - "name": "French", - "native_name": "Français" - }, - "fr_ca": { - "flag": "🇨🇦", - "name": "French (Canada)", - "native_name": "Français (Canada)" - }, - "fr_ch": { - "flag": "🇨🇭", - "name": "French (Switzerland)", - "native_name": "Français (Suisse)" - }, - "ga": { - "flag": "🇮🇪", - "name": "Irish", - "native_name": "Gaeilge" - }, - "gl": { - "flag": "🇪🇸", - "name": "Galician", - "native_name": "Galego" - }, - "gn": { - "flag": "🇵🇾", - "name": "Guarani", - "native_name": "Avañe'ẽ" - }, - "gu": { - "flag": "🇮🇳", - "name": "Gujarati", - "native_name": "ગુજરાતી" - }, - "ha": { - "flag": "🇳🇬", - "name": "Hausa", - "native_name": "هَوُسَ" - }, - "he": { - "flag": "🇮🇱", - "name": "Hebrew", - "native_name": "עברית" - }, - "hi": { - "flag": "🇮🇳", - "name": "Hindi", - "native_name": "हिन्दी" - }, - "hr": { - "flag": "🇭🇷", - "name": "Croatian", - "native_name": "Hrvatski" - }, - "ht": { - "flag": "🇭🇹", - "name": "Haitian Creole", - "native_name": "Kreyòl ayisyen" - }, - "hu": { - "flag": "🇭🇺", - "name": "Hungarian", - "native_name": "Magyar" - }, - "id": { - "flag": "🇮🇩", - "name": "Indonesian", - "native_name": "Bahasa Indonesia" - }, - "io": { - "flag": "🌍", - "name": "Ido", - "native_name": "Ido" - }, - "is": { - "flag": "🇮🇸", - "name": "Icelandic", - "native_name": "Íslenska" - }, - "it": { - "flag": "🇮🇹", - "name": "Italian", - "native_name": "Italiano" - }, - "ja": { - "flag": "🇯🇵", - "name": "Japanese", - "native_name": "日本語" - }, - "jv_id": { - "flag": "🇮🇩", - "name": "Javanese (Indonesia)", - "native_name": "basa jawa" - }, - "ka": { - "flag": "🇬🇪", - "name": "Georgian", - "native_name": "ქართული" - }, - "kg": { - "flag": "🇨🇬", - "name": "Kongo", - "native_name": "KiKongo" - }, - "kj": { - "flag": "🇳🇦", - "name": "Kuanyama", - "native_name": "Oshikwanyama" - }, - "kk": { - "flag": "🇰🇿", - "name": "Kazakh", - "native_name": "Қазақ" - }, - "kl": { - "flag": "🇬🇱", - "name": "Kalaallisut", - "native_name": "kalaallisut" - }, - "km": { - "flag": "🇰🇭", - "name": "Khmer", - "native_name": "ខ្មែរ" - }, - "ko": { - "flag": "🇰🇷", - "name": "Korean", - "native_name": "한국어" - }, - "ks": { - "flag": "🇮🇳", - "name": "Kashmiri", - "native_name": "کٲشُر" - }, - "ku": { - "flag": "🇮🇶", - "name": "Kurdish", - "native_name": "Kurdî", - "priority": 49, - }, - "lo": { - "flag": "🇱🇦", - "name": "Lao", - "native_name": "ລາວ" - }, - "lt": { - "flag": "🇱🇹", - "name": "Lithuanian", - "native_name": "Lietuvių" - }, - "lv": { - "flag": "🇱🇻", - "name": "Latvian", - "native_name": "Latviešu" - }, - "mg": { - "flag": "🇲🇬", - "name": "Malagasy", - "native_name": "Malagasy" - }, - "mg_mg": { - "flag": "🇲🇬", - "name": "Malagasy (Madagascar)", - "native_name": "malagasy" - }, - "mh": { - "flag": "🇲🇭", - "name": "Marshallese", - "native_name": "Kajin M̧ajeļ" - }, - "mk": { - "flag": "🇲🇰", - "name": "Macedonian", - "native_name": "Македонски" - }, - "mn_mn": { - "flag": "🇲🇳", - "name": "Mongolian (Mongolia)", - "native_name": "Монгол хэл" - }, - "mr_in": { - "flag": "🇮🇳", - "name": "Marathi (India)", - "native_name": "मराठी" - }, - "ms": { - "flag": "🇲🇾", - "name": "Malay", - "native_name": "Bahasa Melayu" - }, - "my": { - "flag": "🇲🇲", - "name": "Burmese", - "native_name": "မြန်မာဘာသာ" - }, - "na": { - "flag": "🇳🇷", - "name": "Nauruan", - "native_name": "Dorerin Naoero" - }, - "nb": { - "flag": "🇳🇴", - "name": "Norwegian Bokmål", - "native_name": "Norsk Bokmål" - }, - "ng": { - "flag": "🇳🇦", - "name": "Ndonga", - "native_name": "Oshindonga" - }, - "nl": { - "flag": "🇳🇱", - "name": "Dutch", - "native_name": "Nederlands" - }, - "om": { - "flag": "🇪🇹", - "name": "Oromo", - "native_name": "Afaan Oromoo" - }, - "os": { - "flag": "🇷🇺", - "name": "Ossetian", - "native_name": "ирон æвзаг" - }, - "pl": { - "flag": "🇵🇱", - "name": "Polish", - "native_name": "Polski" - }, - "pt": { - "flag": "🇵🇹", - "name": "Portuguese", - "native_name": "Português" - }, - "pt_br": { - "flag": "🇧🇷", - "name": "Portuguese (Brazil)", - "native_name": "Português (Brasil)" - }, - "qu": { - "flag": "🇵🇪", - "name": "Quechua", - "native_name": "Runa Simi" - }, - "ro": { - "flag": "🇷🇴", - "name": "Romanian", - "native_name": "Română" - }, - "ru": { - "flag": "🇷🇺", - "name": "Russian", - "native_name": "Русский" - }, - "rw": { - "flag": "🇷🇼", - "name": "Kinyarwanda", - "native_name": "Ikinyarwanda" - }, - "sc": { - "flag": "🇮🇹", - "name": "Sardinian", - "native_name": "sardu" - }, - "sg": { - "flag": "🇨🇫", - "name": "Sango", - "native_name": "yângâ tî sängö" - }, - "sk": { - "flag": "🇸🇰", - "name": "Slovak", - "native_name": "Slovenčina" - }, - "sl": { - "flag": "🇸🇮", - "name": "Slovenian", - "native_name": "Slovenščina" - }, - "sm": { - "flag": "🇼🇸", - "name": "Samoan", - "native_name": "Gagana Samoa" - }, - "sn": { - "flag": "🇿🇼", - "name": "Shona", - "native_name": "chiShona" - }, - "so": { - "flag": "🇸🇴", - "name": "Somali", - "native_name": "Soomaaliga" - }, - "sr": { - "flag": "🇷🇸", - "name": "Serbian", - "native_name": "Српски" - }, - "ss": { - "flag": "🇸🇿", - "name": "Swati", - "native_name": "SiSwati" - }, - "st": { - "flag": "🇱🇸", - "name": "Southern Sotho", - "native_name": "Sesotho" - }, - "su_id": { - "flag": "🇮🇩", - "name": "Sundanese (Indonesia)", - "native_name": "basa sunda" - }, - "sv": { - "flag": "🇸🇪", - "name": "Swedish", - "native_name": "Svenska" - }, - "th": { - "flag": "🇹🇭", - "name": "Thai", - "native_name": "ไทย" - }, - "tk": { - "flag": "🇹🇲", - "name": "Turkmen", - "native_name": "Türkmen" - }, - "tn": { - "flag": "🇧🇼", - "name": "Tswana", - "native_name": "Setswana" - }, - "to": { - "flag": "🇹🇴", - "name": "Tongan", - "native_name": "faka-Tonga" - }, - "tr": { - "flag": "🇹🇷", - "name": "Turkish", - "native_name": "Türkçe", - "priority": 60, - }, - "ts": { - "flag": "🇿🇦", - "name": "Tsonga", - "native_name": "Xitsonga" - }, - "ts_zw": { - "flag": "🇿🇼", - "name": "Tsonga (Zimbabwe)", - "native_name": "xitsonga" - }, - "ty": { - "flag": "🇵🇫", - "name": "Tahitian", - "native_name": "Reo Tahiti" - }, - "uk": { - "flag": "🇺🇦", - "name": "Ukrainian", - "native_name": "Українська" - }, - "ur": { - "flag": "🇵🇰", - "name": "Urdu", - "native_name": "اردو" - }, - "uz": { - "flag": "🇺🇿", - "name": "Uzbek", - "native_name": "oʻzbek" - }, - "ve": { - "flag": "🇿🇦", - "name": "Venda", - "native_name": "Tshivenda" - }, - "vi": { - "flag": "🇻🇳", - "name": "Vietnamese", - "native_name": "Tiếng Việt" - }, - "vo": { - "flag": "🌍", - "name": "Volapük", - "native_name": "Volapük" - }, - "wa": { - "flag": "🇧🇪", - "name": "Walloon", - "native_name": "walon" - }, - "xh": { - "flag": "🇿🇦", - "name": "Xhosa", - "native_name": "isiXhosa" - }, - "yi": { - "flag": "🌍", - "name": "Yiddish", - "native_name": "ייִדיש" - }, - "yo": { - "flag": "🇳🇬", - "name": "Yoruba", - "native_name": "Yorùbá" - }, - "zh": { - "flag": "🇨🇳", - "name": "Chinese", - "native_name": "中文" - }, - "zh_hk": { - "flag": "🇭🇰", - "name": "Chinese (Hong Kong)", - "native_name": "中文(香港)" - }, - "zh_tw": { - "flag": "🇹🇼", - "name": "Chinese (Taiwan)", - "native_name": "中文(台灣)" - }, - "zu": { - "flag": "🇿🇦", - "name": "Zulu", - "native_name": "isiZulu" - } -} - - -DEFAULT_LANGUAGE: TypedLanguageInformation = LANGUAGE_INFORMATION["de"]