|
| 1 | +"""Configuration interface for freee_a11y_gl module.""" |
| 2 | +import re |
| 3 | +from typing import Dict, Literal, Optional |
| 4 | +from .settings import settings |
| 5 | + |
| 6 | +LanguageCode = Literal["ja", "en"] |
| 7 | + |
| 8 | +class Config: |
| 9 | + """Configuration interface.""" |
| 10 | + |
| 11 | + @classmethod |
| 12 | + def register_settings(cls, new_settings: Optional[Dict[str, any]] = None) -> None: |
| 13 | + """Register new settings.""" |
| 14 | + settings.update(new_settings) |
| 15 | + |
| 16 | + @classmethod |
| 17 | + def get_basedir(cls) -> str: |
| 18 | + """Get base directory path. |
| 19 | + |
| 20 | + Returns: |
| 21 | + Base directory path from settings, or '.' if not set |
| 22 | + """ |
| 23 | + return settings.get("basedir", ".") |
| 24 | + |
| 25 | + @classmethod |
| 26 | + def get_base_url(cls, lang: Optional[LanguageCode] = None) -> str: |
| 27 | + """Get base URL for specified language.""" |
| 28 | + effective_lang = lang if lang is not None else settings.get("languages.default", "ja") |
| 29 | + return settings.get(f"base_url.{effective_lang}", "") |
| 30 | + |
| 31 | + @classmethod |
| 32 | + def get_guidelines_path(cls) -> str: |
| 33 | + """Get guidelines (categories) path.""" |
| 34 | + return settings.get("paths.guidelines", "/") |
| 35 | + |
| 36 | + @classmethod |
| 37 | + def get_separator(cls, lang: Optional[LanguageCode] = None, separator_type: Optional[str] = None) -> str: |
| 38 | + """Get separator of specified type for language.""" |
| 39 | + effective_lang = lang if lang is not None else settings.get("languages.default", "ja") |
| 40 | + effective_type = separator_type if separator_type is not None else "text" |
| 41 | + return settings.get(f"separators.{effective_type}.{effective_lang}", "") |
| 42 | + |
| 43 | + @classmethod |
| 44 | + def get_text_separator(cls, lang: Optional[LanguageCode] = None) -> str: |
| 45 | + """Get text separator for specified language.""" |
| 46 | + effective_lang = lang if lang is not None else settings.get("languages.default", "ja") |
| 47 | + return settings.get(f"separators.text.{effective_lang}", "") |
| 48 | + |
| 49 | + @classmethod |
| 50 | + def get_list_separator(cls, lang: Optional[LanguageCode] = None) -> str: |
| 51 | + """Get list item separator for specified language.""" |
| 52 | + effective_lang = lang if lang is not None else settings.get("languages.default", "ja") |
| 53 | + return settings.get(f"separators.list.{effective_lang}", ", ") |
| 54 | + |
| 55 | + @classmethod |
| 56 | + def get_pass_text(cls, lang: Optional[LanguageCode] = None) -> str: |
| 57 | + """Get localized pass text for conditions. |
| 58 | + |
| 59 | + Args: |
| 60 | + lang: Language code. If None, default language from settings will be used. |
| 61 | + |
| 62 | + Returns: |
| 63 | + Localized pass text |
| 64 | + """ |
| 65 | + effective_lang = lang if lang is not None else settings.get("languages.default", "ja") |
| 66 | + return settings.get(f"separators.pass_text.{effective_lang}", " is true") |
| 67 | + |
| 68 | + def get_conjunction(cls, lang: Optional[LanguageCode] = None, conjunction_type: Optional[str] = None) -> str: |
| 69 | + """Get conjunction of specified type for language.""" |
| 70 | + effective_lang = lang if lang is not None else settings.get("languages.default", "ja") |
| 71 | + effective_type = conjunction_type if conjunction_type is not None else "and" |
| 72 | + return settings.get(f"separators.{effective_type}_conjunction.{effective_lang}", " and ") |
| 73 | + |
| 74 | + @classmethod |
| 75 | + def get_check_tool_name(cls, tool_id: str, lang: Optional[LanguageCode] = None) -> str: |
| 76 | + """Get localized check tool name.""" |
| 77 | + effective_lang = lang if lang is not None else settings.get("languages.default", "ja") |
| 78 | + try: |
| 79 | + return settings.config.check_tools.names[tool_id][effective_lang] |
| 80 | + except (KeyError, AttributeError): |
| 81 | + return tool_id |
| 82 | + |
| 83 | + @classmethod |
| 84 | + def get_check_target_name(cls, target: str, lang: Optional[LanguageCode] = None) -> str: |
| 85 | + """Get localized check target name.""" |
| 86 | + effective_lang = lang if lang is not None else settings.get("languages.default", "ja") |
| 87 | + try: |
| 88 | + return settings.config.check_targets.names[target][effective_lang] |
| 89 | + except (KeyError, AttributeError): |
| 90 | + return target |
| 91 | + |
| 92 | + @classmethod |
| 93 | + def get_severity_tag(cls, severity: str, lang: Optional[LanguageCode] = None) -> str: |
| 94 | + """Get localized severity tag.""" |
| 95 | + effective_lang = lang if lang is not None else settings.get("languages.default", "ja") |
| 96 | + try: |
| 97 | + return settings.config.severity_tags.tags[severity][effective_lang] |
| 98 | + except (KeyError, AttributeError): |
| 99 | + return severity |
| 100 | + |
| 101 | + @classmethod |
| 102 | + def get_implementation_target_name(cls, target: str, lang: Optional[LanguageCode] = None) -> str: |
| 103 | + """Get localized implementation target name.""" |
| 104 | + effective_lang = lang if lang is not None else settings.get("languages.default", "ja") |
| 105 | + try: |
| 106 | + return settings.config.implementation_targets.targets[target][effective_lang] |
| 107 | + except (KeyError, AttributeError): |
| 108 | + return target |
| 109 | + |
| 110 | + @classmethod |
| 111 | + def get_platform_name(cls, platform: str, lang: Optional[LanguageCode] = None) -> str: |
| 112 | + """Get localized platform name.""" |
| 113 | + effective_lang = lang if lang is not None else settings.get("languages.default", "ja") |
| 114 | + try: |
| 115 | + return settings.config.platform.names[platform][effective_lang] |
| 116 | + except (KeyError, AttributeError): |
| 117 | + return platform |
| 118 | + |
| 119 | + @classmethod |
| 120 | + def get_platform_separator(cls, lang: Optional[LanguageCode] = None) -> str: |
| 121 | + """Get platform list separator for specified language.""" |
| 122 | + effective_lang = lang if lang is not None else settings.get("languages.default", "ja") |
| 123 | + try: |
| 124 | + return settings.config.platform.separator[effective_lang] |
| 125 | + except (KeyError, AttributeError): |
| 126 | + return ", " |
| 127 | + |
| 128 | + @classmethod |
| 129 | + def get_faq_path(cls) -> str: |
| 130 | + """Get FAQ path |
| 131 | + Returns: |
| 132 | + Path string for FAQ articles |
| 133 | + """ |
| 134 | + return settings.get("paths.faq", "/faq/articles/") |
| 135 | + |
| 136 | + @classmethod |
| 137 | + def get_examples_url(cls, lang: Optional[LanguageCode] = None) -> str: |
| 138 | + """Get examples base URL for specified language.""" |
| 139 | + """Get examples base URL for specified language. |
| 140 | + |
| 141 | + Args: |
| 142 | + lang: Language code. If None, default language from settings will be used. |
| 143 | + |
| 144 | + Returns: |
| 145 | + URL string for examples in the specified language |
| 146 | + """ |
| 147 | + base_url = cls.get_base_url(lang) |
| 148 | + return f"{base_url}/checks/examples/" |
| 149 | + |
| 150 | + @staticmethod |
| 151 | + @classmethod |
| 152 | + def get_date_format(cls, lang: Optional[LanguageCode] = None) -> str: |
| 153 | + """Get localized date format string. |
| 154 | + |
| 155 | + Args: |
| 156 | + lang: Language code. If None, default language from settings will be used. |
| 157 | + |
| 158 | + Returns: |
| 159 | + Date format string in strftime format |
| 160 | + """ |
| 161 | + effective_lang = lang if lang is not None else settings.get("languages.default", "ja") |
| 162 | + default_format = "%Y年%-m月%-d日" if effective_lang == "ja" else "%B %-d, %Y" |
| 163 | + return settings.get(f"formats.date.{effective_lang}", default_format) |
| 164 | + |
| 165 | + @staticmethod |
| 166 | + def tag2sc(tag: str) -> str: |
| 167 | + """Convert axe-core tag to WCAG SC identifier. |
| 168 | + |
| 169 | + Args: |
| 170 | + tag: axe-core tag (e.g., 'wcag111') |
| 171 | + |
| 172 | + Returns: |
| 173 | + WCAG SC identifier (e.g., '1.1.1') |
| 174 | + """ |
| 175 | + return re.sub(r'wcag(\d)(\d)(\d+)', r'\1.\2.\3', tag) |
0 commit comments