diff --git a/Cargo.toml b/Cargo.toml index 89c6e9f46..37c55108a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mathcat" -version = "0.7.6-beta.4" +version = "0.7.6-beta.5" authors = ["Neil Soiffer "] license = "MIT" description = "MathCAT: Math Capable Assistive Technology ('Speech and braille from MathML')" diff --git a/PythonScripts/audit_translations/README.md b/PythonScripts/audit_translations/README.md index ee4af211d..b4d611d94 100644 --- a/PythonScripts/audit_translations/README.md +++ b/PythonScripts/audit_translations/README.md @@ -1,15 +1,15 @@ # MathCAT Translation Audit Tool -This tool compares English YAML rule files with translated versions to identify translation gaps and formatting issues. It assists translators in ensuring their translations are complete, consistent, and properly formatted. +This tool compares YAML rule files from a source language with translated versions to identify translation gaps and formatting issues. It assists translators in ensuring their translations are complete, consistent, and properly formatted. ### ๐Ÿ” Detection Capabilities The tool analyzes rule files to detect the following issues: -* **Missing Rules:** Rules present in the master English file but missing in the target translation. -* **Extra Rules:** Rules present in the translation but absent in English (flagged as potentially intentional language-specific additions). +* **Missing Rules:** Rules present in the source file but missing in the target translation. +* **Extra Rules:** Rules present in the target translation but absent in the source (flagged as potentially intentional language-specific additions). * **Untranslated Text:** Detects text keys that still use **lowercase** formatting, indicating they haven't been verified or translated yet. -* **Rule Differences:** Structural changes (match expressions, conditions, variables, or test/replace layout) between English and the translation. +* **Rule Differences:** Structural changes (match expressions, conditions, variables, or test/replace layout) between the source and target translation. Add `# audit-ignore` to a rule block to suppress auditing that rule. @@ -57,20 +57,23 @@ The tool automatically adjusts its matching logic based on the file type: **Syntax:** ```bash uv run audit-translations [--file ] +uv run audit-translations --source uv run audit-translations --list # If running from the repo root, point uv at the project: uv run --project PythonScripts audit-translations +uv run --project PythonScripts audit-translations --source uv run --project PythonScripts audit-translations --list ``` **Convenience Features:** * `--list`: Displays all available languages. * Region variants are shown as `lang-region` (e.g., `zz-aa`) based on subdirectories under `Rules/Languages/`. +* `--source`: Sets the source/reference language. Defaults to `en`. * `--file`: Audits a single specific file instead of the whole directory. * `--rules-dir`: Override the Rules/Languages directory path. * `--only`: Filter issue types (comma-separated): `missing`, `untranslated`, `extra`, `diffs`, `all`. -* `--verbose`: Show detailed output including English/translated snippets for rule differences. +* `--verbose`: Show detailed output including source/target snippets for rule differences. * **Summary Stats:** Provides a statistical summary after every run. **Examples:** @@ -88,19 +91,23 @@ uv run audit-translations es # Audit German translations uv run audit-translations de +# Compare Norwegian Bokmal against Swedish instead of English +uv run audit-translations nb --source sv + # Audit only a specific file uv run audit-translations es --file SharedRules/default.yaml # Audit a regional variant (merges Rules/Languages/de and Rules/Languages/de/CH) uv run audit-translations de-CH -# Show detailed output with English/translated snippets for rule differences +# Show detailed output with source/target snippets for rule differences uv run audit-translations es --verbose ``` **Running from the repo root (without `cd PythonScripts`):** ```bash uv run --project PythonScripts audit-translations es +uv run --project PythonScripts audit-translations nb --source sv uv run --project PythonScripts audit-translations --list ``` diff --git a/PythonScripts/audit_translations/__init__.py b/PythonScripts/audit_translations/__init__.py index 1d0764943..5773302a7 100644 --- a/PythonScripts/audit_translations/__init__.py +++ b/PythonScripts/audit_translations/__init__.py @@ -1,7 +1,7 @@ """ MathCAT Translation Audit Tool -Compares English YAML rule files with translated versions to identify translation +Compares source YAML rule files with translated versions to identify translation gaps and issues. This tool helps translators ensure their translations are complete and properly formatted. diff --git a/PythonScripts/audit_translations/auditor.py b/PythonScripts/audit_translations/auditor.py index 3c333628b..efc14790e 100644 --- a/PythonScripts/audit_translations/auditor.py +++ b/PythonScripts/audit_translations/auditor.py @@ -1,7 +1,7 @@ """ Auditing and comparison logic. -Contains functions for comparing English and translated files, +Contains functions for comparing source and translated files, and for performing full language audits. """ @@ -60,7 +60,7 @@ def compare_files( translated_region_path: Path | None = None, english_region_path: Path | None = None, ) -> ComparisonResult: - """Compare English and translated YAML files""" + """Compare source and translated YAML files""" def load_rules(path: Path | None) -> list[RuleInfo]: if path and path.exists(): @@ -95,14 +95,14 @@ def merge_rules(base_rules: list[RuleInfo], region_rules: list[RuleInfo]) -> lis include_extra = include_all or "extra" in issue_filter include_diffs = include_all or "diffs" in issue_filter - # Find missing rules (in English but not in translation) + # Find missing rules (in source but not in translation) missing_rules = [] if include_missing: for key, rule in english_by_key.items(): if key not in translated_by_key: missing_rules.append(rule) - # Find extra rules (in translation but not in English) + # Find extra rules (in translation but not in source) extra_rules = [] if include_extra: for key, rule in translated_by_key.items(): @@ -142,29 +142,35 @@ def audit_language( rules_dir: str | None = None, issue_filter: set[str] | None = None, verbose: bool = False, + source_language: str = "en", ) -> int: """Audit translations for a specific language. Returns total issue count.""" rules_dir_path = get_rules_dir(rules_dir) - english_dir = rules_dir_path / "en" - base_language, region = split_language_into_base_and_region(language) - translated_dir = rules_dir_path / base_language - translated_region_dir = translated_dir / region if region else None - english_region_dir = english_dir / region if region else None + source_base_language, source_region = split_language_into_base_and_region(source_language) + source_dir = rules_dir_path / source_base_language + source_region_dir = source_dir / source_region if source_region else None - if not english_dir.exists(): - raise AuditError(f"English rules directory not found: {english_dir}") + target_base_language, target_region = split_language_into_base_and_region(language) + translated_dir = rules_dir_path / target_base_language + translated_region_dir = translated_dir / target_region if target_region else None + + if not source_dir.exists(): + raise AuditError(f"Source rules directory not found: {source_dir}") + + if source_region and not (source_region_dir and source_region_dir.exists()): + raise AuditError(f"Source region directory not found: {source_region_dir}") if not translated_dir.exists(): - raise AuditError(f"Translation directory not found: {translated_dir}") + raise AuditError(f"Target rules directory not found: {translated_dir}") - if region and not (translated_region_dir and translated_region_dir.exists()): - raise AuditError(f"Region directory not found: {translated_region_dir}") + if target_region and not (translated_region_dir and translated_region_dir.exists()): + raise AuditError(f"Target region directory not found: {translated_region_dir}") # Get list of files to audit - files = [specific_file] if specific_file else get_yaml_files(english_dir, english_region_dir) + files = [specific_file] if specific_file else get_yaml_files(source_dir, source_region_dir) - print_audit_header(language, len(files)) + print_audit_header(language, len(files), source_language) total_issues = 0 total_missing = 0 @@ -175,13 +181,13 @@ def audit_language( files_ok = 0 for file_name in files: - english_path = english_dir / file_name + english_path = source_dir / file_name translated_path = translated_dir / file_name translated_region_path = translated_region_dir / file_name if translated_region_dir else None - english_region_path = english_region_dir / file_name if english_region_dir else None + english_region_path = source_region_dir / file_name if source_region_dir else None if not english_path.exists(): - console.print(f"\n[yellow]โš  Warning:[/] English file not found: {english_path}") + console.print(f"\n[yellow]โš  Warning:[/] Source file not found: {english_path}") continue result = compare_files( @@ -193,7 +199,7 @@ def audit_language( ) if result.has_issues: - issues = print_warnings(result, file_name, verbose, language) + issues = print_warnings(result, file_name, verbose, language, source_language) if issues > 0: files_with_issues += 1 total_issues += issues diff --git a/PythonScripts/audit_translations/cli.py b/PythonScripts/audit_translations/cli.py index aaba14449..ee1b48739 100644 --- a/PythonScripts/audit_translations/cli.py +++ b/PythonScripts/audit_translations/cli.py @@ -17,17 +17,19 @@ def main() -> None: sys.stdout.reconfigure(encoding="utf-8") parser = argparse.ArgumentParser( - description="Audit MathCAT translation files against English originals", + description="Audit MathCAT translation files against a source language", formatter_class=argparse.RawDescriptionHelpFormatter, epilog=""" Examples: uv run audit-translations es + uv run audit-translations nb --source sv uv run audit-translations de --file SharedRules/default.yaml uv run audit-translations --list """, ) parser.add_argument("language", nargs="?", help="Language code to audit (e.g., 'es', 'de', 'fi')") + parser.add_argument("--source", default="en", help="Source/reference language code (default: 'en')") parser.add_argument("--file", dest="specific_file", help="Audit only a specific file (e.g., 'SharedRules/default.yaml')") parser.add_argument("--list", action="store_true", help="List available languages") parser.add_argument("--rules-dir", help="Override Rules/Languages directory path") @@ -68,6 +70,7 @@ def main() -> None: args.rules_dir, issue_filter, args.verbose, + args.source, ) except AuditError as exc: console.print(f"\n[red]โœ— Error:[/] {exc}") diff --git a/PythonScripts/audit_translations/differ.py b/PythonScripts/audit_translations/differ.py index 574c43993..5ae4483ce 100644 --- a/PythonScripts/audit_translations/differ.py +++ b/PythonScripts/audit_translations/differ.py @@ -1,7 +1,7 @@ """ Rule diffing logic. -Compares English and translated rules to find fine-grained structural differences. +Compares source and translated rules to find fine-grained structural differences. """ from .extractors import ( diff --git a/PythonScripts/audit_translations/models.py b/PythonScripts/audit_translations/models.py index a54dadb72..350ffed33 100644 --- a/PythonScripts/audit_translations/models.py +++ b/PythonScripts/audit_translations/models.py @@ -25,7 +25,7 @@ class IssueType(StrEnum): class DiffType(StrEnum): """Rule-difference subcategories used for fine-grained diagnostics.""" - MATCH = "match" # `match` XPath differs between English and translation. + MATCH = "match" # `match` XPath differs between source and translation. CONDITION = "condition" # `if` / `test` condition expressions differ. VARIABLES = "variables" # Variable names defined in `variables` differ. STRUCTURE = "structure" # Control-flow block shape/order differs (if/then/else/with/replace). @@ -91,7 +91,7 @@ def untranslated_keys(self) -> list[str]: @dataclass class RuleDifference: - """Fine-grained difference between English and translated rule""" + """Fine-grained difference between source and translated rule""" english_rule: RuleInfo translated_rule: RuleInfo @@ -107,10 +107,10 @@ def __post_init__(self) -> None: @dataclass class ComparisonResult: - """Results from comparing English and translated files""" + """Results from comparing source and translated files""" - missing_rules: list[RuleInfo] # Rules in English but not in translation - extra_rules: list[RuleInfo] # Rules in translation but not in English + missing_rules: list[RuleInfo] # Rules in source but not in translation + extra_rules: list[RuleInfo] # Rules in translation but not in source untranslated_text: list[tuple[RuleInfo, list[UntranslatedEntry]]] english_rule_count: int translated_rule_count: int diff --git a/PythonScripts/audit_translations/renderer.py b/PythonScripts/audit_translations/renderer.py index 2d0f975d3..c76da6b2c 100644 --- a/PythonScripts/audit_translations/renderer.py +++ b/PythonScripts/audit_translations/renderer.py @@ -44,16 +44,23 @@ def rule_label(rule: RuleInfo) -> str: return f"[cyan]{escape(rule.name)}[/] [dim]({escape(tag)})[/]" +def language_label(language: str) -> str: + """Normalize a language code for display.""" + return language.lower().replace("_", "-") + + def print_warnings( result: ComparisonResult, file_name: str, verbose: bool = False, target_language: str = "tr", + source_language: str = "en", ) -> int: """Print warnings to console. Returns count of issues found.""" issues = 0 display_name = Path(file_name).as_posix() - target_label = target_language.lower().replace("_", "-") + source_label = language_label(source_language) + target_label = language_label(target_language) if not result.has_issues: return issues @@ -68,7 +75,9 @@ def print_warnings( console.print() console.rule(style="cyan") console.print(f"[{style}]{icon}[/] [bold]{escape(display_name)}[/]") - console.print(f" [dim]English: {result.english_rule_count} rules โ†’ Translated: {result.translated_rule_count} rules[/]") + console.print( + f" [dim]{source_label}: {result.english_rule_count} rules โ†’ {target_label}: {result.translated_rule_count} rules[/]" + ) console.rule(style="cyan") grouped_issues: dict[str, dict[str, Any]] = {} @@ -120,7 +129,7 @@ def add_issue(rule: RuleInfo, group_key: IssueGroupKey, payload: dict[str, Any]) console.print(f" [dim]{ISSUE_GROUP_LABELS[group_key]} [{len(entries)}][/]") for entry in entries: if issue_type is IssueType.MISSING_RULE: - console.print(f" [dim]โ€ข[/] [dim](line {entry['line_en']} in English)[/]") + console.print(f" [dim]โ€ข[/] [dim](line {entry['line_en']} in {source_label})[/]") elif issue_type is IssueType.EXTRA_RULE: console.print(f" [dim]โ€ข[/] [dim](line {entry['line_tr']} in {target_label})[/]") elif issue_type is IssueType.UNTRANSLATED_TEXT: @@ -131,11 +140,12 @@ def add_issue(rule: RuleInfo, group_key: IssueGroupKey, payload: dict[str, Any]) else: diff: RuleDifference = entry["diff"] console.print( - f" [dim]โ€ข[/] [dim](line {entry['line_en']} en, {entry['line_tr']} {target_label})[/]" + f" [dim]โ€ข[/] [dim](line {entry['line_en']} {source_label}, " + f"{entry['line_tr']} {target_label})[/]" ) console.print(f" [dim]{diff.description}[/]") if verbose: - console.print(f" [green]en:[/] {escape(diff.english_snippet)}") + console.print(f" [green]{source_label}:[/] {escape(diff.english_snippet)}") console.print(f" [red]{target_label}:[/] {escape(diff.translated_snippet)}") issues += len(entries) @@ -155,10 +165,10 @@ def file_count_color(file_count: int) -> str: return "red" -def print_audit_header(language: str, file_count: int) -> None: +def print_audit_header(language: str, file_count: int, source_language: str = "en") -> None: """Print the audit header panel.""" console.print(Panel(f"MathCAT Translation Audit: {language.upper()}", style="bold cyan")) - console.print("\n [dim]Comparing against English (en) reference files[/]") + console.print(f"\n [dim]Comparing against {language_label(source_language)} reference files[/]") console.print(f" [dim]Files to check: {file_count}[/]") @@ -197,4 +207,4 @@ def print_language_list(languages: list[tuple[str, int]]) -> None: table.add_row(code, f"[{color}]{count}[/] files") console.print(table) - console.print("\n [dim]Reference: en (English) - base translation[/]\n") + console.print("\n [dim]Default reference: en; use --source to compare against another language[/]\n") diff --git a/PythonScripts/audit_translations/tests/conftest.py b/PythonScripts/audit_translations/tests/conftest.py index c58afaada..a78b24283 100644 --- a/PythonScripts/audit_translations/tests/conftest.py +++ b/PythonScripts/audit_translations/tests/conftest.py @@ -1,4 +1,38 @@ +""" +Shared pytest configuration for audit translation tests. + +Rich can emit ANSI styling codes into captured test output when a terminal or +environment variable forces color output. That made string and golden-output +assertions fail on some machines even though the visible CLI output was correct. +These helpers normalize captured renderer/CLI output so tests compare the text +users see, not terminal control bytes. +""" + +import re import sys +import pytest + +from audit_translations.renderer import console + # needed for running tests on Windows sys.stdout.reconfigure(encoding="utf-8") + +ANSI_RE = re.compile(r"\x1b\[[0-?]*[ -/]*[@-~]") + + +def strip_ansi(text: str) -> str: + """Remove ANSI escape sequences from Rich output captured in tests.""" + return ANSI_RE.sub("", text) + + +@pytest.fixture(autouse=True) +def deterministic_rich_output(): + """Keep Rich output assertions stable when the shell forces ANSI colors.""" + old_no_color = console.no_color + old_force_terminal = console._force_terminal + console.no_color = True + console._force_terminal = False + yield + console.no_color = old_no_color + console._force_terminal = old_force_terminal diff --git a/PythonScripts/audit_translations/tests/golden/rich/cli_calculus_verbose.golden b/PythonScripts/audit_translations/tests/golden/rich/cli_calculus_verbose.golden index 776f9f3b2..a75c81d3d 100644 --- a/PythonScripts/audit_translations/tests/golden/rich/cli_calculus_verbose.golden +++ b/PythonScripts/audit_translations/tests/golden/rich/cli_calculus_verbose.golden @@ -2,18 +2,18 @@ โ”‚ MathCAT Translation Audit: ES โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ - Comparing against English (en) reference files + Comparing against en reference files Files to check: 1 โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โš  SharedRules/calculus.yaml - English: 4 rules โ†’ Translated: 3 rules + en: 4 rules โ†’ es: 3 rules โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ‰  Rule Issues [13] (grouped by rule and issue type) โ€ข laplacian (laplacian) Missing in Translation [1] - โ€ข (line 4 in English) + โ€ข (line 4 in en) โ€ข divergence (divergence) Untranslated Text [3] โ€ข (line 10 es) "divergence" diff --git a/PythonScripts/audit_translations/tests/golden/rich/structure_diff_nonverbose.golden b/PythonScripts/audit_translations/tests/golden/rich/structure_diff_nonverbose.golden index 868bf0071..ad5320aa8 100644 --- a/PythonScripts/audit_translations/tests/golden/rich/structure_diff_nonverbose.golden +++ b/PythonScripts/audit_translations/tests/golden/rich/structure_diff_nonverbose.golden @@ -1,7 +1,7 @@ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โœ“ structure_diff.yaml - English: 1 rules โ†’ Translated: 1 rules + en: 1 rules โ†’ tr: 1 rules โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ‰  Rule Issues [1] (grouped by rule and issue type) diff --git a/PythonScripts/audit_translations/tests/golden/rich/structure_diff_verbose.golden b/PythonScripts/audit_translations/tests/golden/rich/structure_diff_verbose.golden index bde66a075..efd4de940 100644 --- a/PythonScripts/audit_translations/tests/golden/rich/structure_diff_verbose.golden +++ b/PythonScripts/audit_translations/tests/golden/rich/structure_diff_verbose.golden @@ -1,7 +1,7 @@ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โœ“ structure_diff.yaml - English: 1 rules โ†’ Translated: 1 rules + en: 1 rules โ†’ tr: 1 rules โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ‰  Rule Issues [1] (grouped by rule and issue type) diff --git a/PythonScripts/audit_translations/tests/test_auditor.py b/PythonScripts/audit_translations/tests/test_auditor.py index e1cd94b73..cec10fe40 100644 --- a/PythonScripts/audit_translations/tests/test_auditor.py +++ b/PythonScripts/audit_translations/tests/test_auditor.py @@ -6,10 +6,11 @@ import pytest -from ..auditor import compare_files, get_yaml_files, list_languages +from ..auditor import audit_language, compare_files, get_yaml_files, list_languages from ..line_resolver import resolve_diff_lines from ..models import ComparisonResult, DiffType, RuleDifference, RuleInfo, UntranslatedEntry from ..renderer import console, print_warnings +from .conftest import strip_ansi @pytest.fixture() @@ -234,6 +235,73 @@ def test_compare_files_skips_untranslated_and_diffs_when_audit_ignored(tmp_path) assert result.rule_differences == [] +def test_audit_language_uses_configurable_source_language(tmp_path, fixed_console_width) -> None: + """ + Ensure non-English source comparisons remain directional. + + Source rules define missing items and source-side snippets. Target rules + define extra items and target-only untranslated text. + """ + rules_dir = tmp_path / "Rules" / "Languages" + source_dir = rules_dir / "sv" + target_dir = rules_dir / "nb" + source_dir.mkdir(parents=True) + target_dir.mkdir(parents=True) + + (source_dir / "sample.yaml").write_text( + """- name: common-rule + tag: mo + match: "self::m:mo" + replace: + - T: "source" +- name: source-only + tag: mi + match: "." + replace: + - T: "source only" +""", + encoding="utf-8", + ) + (target_dir / "sample.yaml").write_text( + """- name: common-rule + tag: mo + match: "self::m:mi" + replace: + - t: "target" +- name: target-only + tag: mi + match: "." + replace: + - T: "target only" +""", + encoding="utf-8", + ) + + with console.capture() as capture: + total_issues = audit_language( + "nb", + specific_file="sample.yaml", + rules_dir=str(rules_dir), + verbose=True, + source_language="sv", + ) + output = strip_ansi(capture.get()) + + assert total_issues == 4 + assert "Comparing against sv reference files" in output + assert "sv: 2 rules โ†’ nb: 2 rules" in output + assert "Missing in Translation [1]" in output + assert "(line 6 in sv)" in output + assert "Extra in Translation [1]" in output + assert "(line 6 in nb)" in output + assert "Untranslated Text [1]" in output + assert '(line 5 nb) "target"' in output + assert "Match Pattern Differences [1]" in output + assert "(line 3 sv, 3 nb)" in output + assert "sv: self::m:mo" in output + assert "nb: self::m:mi" in output + + def test_get_yaml_files_includes_region(tmp_path) -> None: """ Ensures get_yaml_files merges base and region file lists. @@ -273,7 +341,7 @@ def test_list_languages_includes_region_codes(tmp_path) -> None: with console.capture() as capture: list_languages(str(rules_dir)) - output = capture.get() + output = strip_ansi(capture.get()) assert "zz" in output assert "zz-aa" in output @@ -298,7 +366,7 @@ def test_list_languages_ignores_sharedrules_as_region(tmp_path) -> None: with console.capture() as capture: list_languages(str(rules_dir)) - output = capture.get() + output = strip_ansi(capture.get()) assert "zz-aa" in output assert "zz-SharedRules" not in output @@ -320,7 +388,7 @@ def test_print_warnings_omits_snippets_when_not_verbose(fixed_console_width) -> with console.capture() as capture: print_warnings(result, "structure_diff.yaml", verbose=False) - output = capture.get() + output = strip_ansi(capture.get()) assert output == golden_path.read_text(encoding="utf-8") @@ -341,7 +409,7 @@ def test_print_warnings_includes_snippets_when_verbose(fixed_console_width) -> N with console.capture() as capture: print_warnings(result, "structure_diff.yaml", verbose=True) - output = capture.get() + output = strip_ansi(capture.get()) assert output == golden_path.read_text(encoding="utf-8") @@ -511,7 +579,7 @@ def test_print_warnings_shows_misaligned_structures() -> None: with console.capture() as capture: issues_count = print_warnings(result, "structure_misaligned.yaml", verbose=False) - output = capture.get() + output = strip_ansi(capture.get()) # Misaligned structure differences should be rendered. assert "Rule structure differs" in output, "Expected misaligned structure differences to be shown in display" @@ -538,7 +606,7 @@ def test_print_warnings_still_shows_missing_else() -> None: with console.capture() as capture: issues_count = print_warnings(result, "structure_missing_else.yaml", verbose=False) - output = capture.get() + output = strip_ansi(capture.get()) # CRITICAL: This legitimate difference should appear in output assert "Rule structure differs" in output, "Expected missing else block to be shown in output" @@ -597,7 +665,7 @@ def test_print_warnings_groups_multiple_subgroups_for_single_rule(fixed_console_ with console.capture() as capture: issues_count = print_warnings(result, "grouped.yaml", verbose=False) - output = capture.get() + output = strip_ansi(capture.get()) assert output.count("โ€ข grouped-rule (mi)") == 1 assert "Untranslated Text [2]" in output @@ -648,7 +716,7 @@ def test_print_warnings_groups_missing_and_extra_by_rule(fixed_console_width) -> with console.capture() as capture: issues_count = print_warnings(result, "mixed.yaml", verbose=False) - output = capture.get() + output = strip_ansi(capture.get()) assert output.count("โ€ข missing-rule (mn)") == 1 assert output.count("โ€ข extra-rule (mo)") == 1 @@ -692,13 +760,13 @@ def test_print_warnings_verbose_shows_snippets_only_for_differences(fixed_consol with console.capture() as capture: issues_count = print_warnings(result, "verbose.yaml", verbose=True) - output = capture.get() + output = strip_ansi(capture.get()) assert "Missing in Translation [1]" in output assert "Untranslated Text [1]" in output assert "Match Pattern Differences [1]" in output - assert output.count("en:") == 1 - assert output.count("tr:") == 1 + assert output.count(" en:") == 1 + assert output.count(" tr:") == 1 assert "en-snippet" in output assert "tr-snippet" in output assert issues_count == 3 diff --git a/PythonScripts/audit_translations/tests/test_cli_end_to_end.py b/PythonScripts/audit_translations/tests/test_cli_end_to_end.py index 2547b9eca..c4c8364b7 100644 --- a/PythonScripts/audit_translations/tests/test_cli_end_to_end.py +++ b/PythonScripts/audit_translations/tests/test_cli_end_to_end.py @@ -13,6 +13,7 @@ from .. import cli as audit_cli from ..renderer import console +from .conftest import strip_ansi def fixture_rules_dir() -> Path: @@ -33,7 +34,7 @@ def test_cli_main_rich_only_filters_issue_groups(capsys, monkeypatch) -> None: try: monkeypatch.setattr(sys, "argv", ["audit_translations", *args]) audit_cli.main() - output = capsys.readouterr().out + output = strip_ansi(capsys.readouterr().out) finally: console.width = old_width @@ -46,6 +47,26 @@ def test_cli_main_rich_only_filters_issue_groups(capsys, monkeypatch) -> None: assert "Structure Differences" not in output +def test_cli_main_accepts_source_language(capsys, monkeypatch) -> None: + """ + Ensure --source changes the reference language without changing target semantics. + """ + args = ["en", "--source", "es", "--rules-dir", str(fixture_rules_dir()), "--file", "overview.yaml"] + + old_width = console.width + console.width = 80 + try: + monkeypatch.setattr(sys, "argv", ["audit_translations", *args]) + audit_cli.main() + output = strip_ansi(capsys.readouterr().out) + finally: + console.width = old_width + + assert "Comparing against es reference files" in output + assert "es:" in output + assert "en:" in output + + def test_cli_main_rich_output_groups_by_rule_and_type(capsys, monkeypatch) -> None: """ Ensure rich CLI output is grouped by rule and subgrouped by issue type. @@ -61,7 +82,7 @@ def test_cli_main_rich_output_groups_by_rule_and_type(capsys, monkeypatch) -> No try: monkeypatch.setattr(sys, "argv", ["audit_translations", *args]) audit_cli.main() - output = capsys.readouterr().out + output = strip_ansi(capsys.readouterr().out) finally: console.width = old_width @@ -93,7 +114,7 @@ def test_cli_main_rich_output_matches_grouped_golden(capsys, monkeypatch) -> Non try: monkeypatch.setattr(sys, "argv", ["audit_translations", *args]) audit_cli.main() - output = capsys.readouterr().out + output = strip_ansi(capsys.readouterr().out) finally: console.width = old_width @@ -110,7 +131,7 @@ def test_cli_main_requires_language_or_list(capsys, monkeypatch) -> None: with pytest.raises(SystemExit) as exc: audit_cli.main() - output = capsys.readouterr().out + output = strip_ansi(capsys.readouterr().out) assert exc.value.code == 1 assert "Please specify a language code or use --list" in output @@ -127,7 +148,7 @@ def test_cli_main_rejects_unknown_only_token(capsys, monkeypatch) -> None: with pytest.raises(SystemExit) as exc: audit_cli.main() - output = capsys.readouterr().out + output = strip_ansi(capsys.readouterr().out) assert exc.value.code == 1 assert "Unknown issue types: bogus" in output @@ -144,10 +165,10 @@ def test_cli_main_reports_missing_region_directory(capsys, monkeypatch) -> None: with pytest.raises(SystemExit) as exc: audit_cli.main() - output = capsys.readouterr().out + output = strip_ansi(capsys.readouterr().out) assert exc.value.code == 1 - assert "Region directory not found" in output + assert "Target region directory not found" in output def test_cli_module_rich_output_groups_by_rule_and_type() -> None: @@ -173,7 +194,7 @@ def test_cli_module_rich_output_groups_by_rule_and_type() -> None: check=True, ) - output = result.stdout + output = strip_ansi(result.stdout) assert "โ‰  Rule Issues [13] (grouped by rule and issue type)" in output assert "โ€ข laplacian (laplacian)" in output assert "โ€ข divergence (divergence)" in output diff --git a/PythonScripts/pyproject.toml b/PythonScripts/pyproject.toml index 6f919ee0c..7b9adf68d 100644 --- a/PythonScripts/pyproject.toml +++ b/PythonScripts/pyproject.toml @@ -17,7 +17,7 @@ dependencies = [ "jsonpath-ng>=1.8.0", "pyyaml", "rich", - "ruamel.yaml", + "ruamel.yaml>=0.19.1", ] [project.scripts] @@ -33,6 +33,9 @@ dev = [ requires = ["uv_build>=0.9.25,<0.10.0"] build-backend = "uv_build" +[tool.uv] +exclude-newer = "1 week" + [tool.uv.build-backend] module-name = "audit_translations" module-root = "" diff --git a/PythonScripts/uv.lock b/PythonScripts/uv.lock index 993f3f44b..81e0404c4 100644 --- a/PythonScripts/uv.lock +++ b/PythonScripts/uv.lock @@ -2,6 +2,10 @@ version = 1 revision = 3 requires-python = ">=3.14" +[options] +exclude-newer = "0001-01-01T00:00:00Z" # This has no effect and is included for backwards compatibility when using relative exclude-newer values. +exclude-newer-span = "P1W" + [[package]] name = "anyio" version = "4.12.1" @@ -299,7 +303,7 @@ requires-dist = [ { name = "jsonpath-ng", specifier = ">=1.8.0" }, { name = "pyyaml" }, { name = "rich" }, - { name = "ruamel-yaml" }, + { name = "ruamel-yaml", specifier = ">=0.19.1" }, ] [package.metadata.requires-dev] @@ -364,22 +368,13 @@ wheels = [ [[package]] name = "ruamel-yaml" -version = "0.19.0" +version = "0.19.1" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "ruamel-yaml-clibz", marker = "platform_python_implementation == 'CPython'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/0c/5d/8a1de57b5a11245c61c906d422cd1e66b6778e134a1c68823a451be5759c/ruamel_yaml-0.19.0.tar.gz", hash = "sha256:ff19233e1eb3e9301e7a3d437847713e361a80faace167639327efbe8c0e5f95", size = 142095, upload-time = "2025-12-31T16:47:31.837Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c7/3b/ebda527b56beb90cb7652cb1c7e4f91f48649fbcd8d2eb2fb6e77cd3329b/ruamel_yaml-0.19.1.tar.gz", hash = "sha256:53eb66cd27849eff968ebf8f0bf61f46cdac2da1d1f3576dd4ccee9b25c31993", size = 142709, upload-time = "2026-01-02T16:50:31.84Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9b/3e/835d495068a4bb03419ce8c5464734ff6f3343df948e033cb5e5f81f7f08/ruamel_yaml-0.19.0-py3-none-any.whl", hash = "sha256:96ea8bafd9f3fdb0181ce3cc05e6ec02ce0a8788cbafa9b5a6e47c76fe26dfc6", size = 117777, upload-time = "2025-12-31T16:47:29.07Z" }, + { url = "https://files.pythonhosted.org/packages/b8/0c/51f6841f1d84f404f92463fc2b1ba0da357ca1e3db6b7fbda26956c3b82a/ruamel_yaml-0.19.1-py3-none-any.whl", hash = "sha256:27592957fedf6e0b62f281e96effd28043345e0e66001f97683aa9a40c667c93", size = 118102, upload-time = "2026-01-02T16:50:29.201Z" }, ] -[[package]] -name = "ruamel-yaml-clibz" -version = "0.3.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8f/95/9bcc25e84703180c3941062796572e0fc73bd659086efdc4ef9b8af19e36/ruamel_yaml_clibz-0.3.4.tar.gz", hash = "sha256:e99077ac6aa4943af1000161a0cb793a379c5c8cd03ea8dd3803e0b58739b685", size = 231076, upload-time = "2025-12-31T17:11:09.341Z" } - [[package]] name = "ruff" version = "0.15.4" diff --git a/Rules/Braille/ASCIIMath/unicode-full.yaml b/Rules/Braille/ASCIIMath/unicode-full.yaml index ded24da79..1a3688307 100644 --- a/Rules/Braille/ASCIIMath/unicode-full.yaml +++ b/Rules/Braille/ASCIIMath/unicode-full.yaml @@ -188,7 +188,7 @@ - "๐ŸŽ-๐Ÿ—": # 0x1d7ce - 0x1d7d7 - t: "bb๐–" - - spell: "translate('.', '๐ŸŽ๐Ÿ๐Ÿ๐Ÿ‘๐Ÿ’๐Ÿ“๐Ÿ”๐Ÿ•๐Ÿ–๐Ÿ—', '0123456789')" + - spell: "translate('.', '๐Ÿข๐Ÿฃ๐Ÿค๐Ÿฅ๐Ÿฆ๐Ÿง๐Ÿจ๐Ÿฉ๐Ÿช๐Ÿซ', '0123456789')" - "๐Ÿฌ-๐Ÿต": # 0x1D7EC - 0x1D7F5 - t: "sf๐–" @@ -196,7 +196,7 @@ - "๐Ÿข-๐Ÿซ": # 0x1d7e2 - 0x1d7eb - t: "sf๐–" - - spell: "translate('.', '๐Ÿถ๐Ÿท๐Ÿธ๐Ÿน๐Ÿบ๐Ÿป๐Ÿผ๐Ÿฝ๐Ÿพ๐Ÿฟ', '0123456789')" + - spell: "translate('.', '๐Ÿข๐Ÿฃ๐Ÿค๐Ÿฅ๐Ÿฆ๐Ÿง๐Ÿจ๐Ÿฉ๐Ÿช๐Ÿซ', '0123456789')" - "๐Ÿถ-๐Ÿฟ": # 0x1d7f6 - 0x1d7ff - t: "tt๐–" diff --git a/Rules/Braille/Russian/Russian_Rules.yaml b/Rules/Braille/Russian/Russian_Rules.yaml new file mode 100644 index 000000000..2848c62f4 --- /dev/null +++ b/Rules/Braille/Russian/Russian_Rules.yaml @@ -0,0 +1,369 @@ +--- +# Russian mathematical braille rules. + +- + name: whitespace + tag: "!*" + match: "not(self::m:math) and not($MatchingWhitespace) and (@data-previous-space-width >= 0.25 or @data-following-space-width >= 0.25)" + replace: + - with: + variables: [MatchingWhitespace: "true()"] + replace: + - test: + - if: "@data-previous-space-width > 1.1" + then: [t: "โ €"] + - else_if: "@data-previous-space-width >= 0.25" + then: [t: "W"] + - x: "." + - test: + - if: "@data-following-space-width > 1.1" + then: [t: "โ €"] + - else_if: "@data-following-space-width >= 0.25" + then: [t: "W"] + +- + name: omission-intent + tag: "!*" + match: "contains(@intent, ':blank')" + replace: [t: "โ €"] + +- + name: unicode-override + tag: "*" + match: "@data-unicode" + replace: [x: "@data-unicode"] + +- + name: default + tag: math + match: "." + variables: + - RowStart: "''" + - RowEnd: "''" + - MatchingWhitespace: "false()" + replace: [x: "*"] + +- + name: default + tag: [mrow, mstyle, semantics] + match: "." + replace: [x: "*[1] | *[position()>1]"] + +- + name: no-content + tag: [math, mrow] + match: "not(*)" + replace: [t: "โ €"] + +- + name: default + tag: msqrt + match: "." + replace: + - t: "โ ฉโ ฑ" + - x: "*[1]" + - t: "โ น" + +- + name: default + tag: mroot + match: "not(*[2][self::m:mn and translate(., '0123456789', '')=''])" + replace: + - t: "โ ฉ" + - x: "*[2]" + - t: "โ ฑ" + - x: "*[1]" + - t: "โ น" + +- + name: integer-index + tag: mroot + match: "*[2][self::m:mn and translate(., '0123456789', '')='']" + replace: + - t: "โ ฉ" + - x: "BrailleChars(translate(*[2], '0123456789', '\ue000\ue001\ue002\ue003\ue004\ue005\ue006\ue007\ue008\ue009'), 'Russian')" + - t: "โ ฑ" + - x: "*[1]" + - t: "โ น" + +- + name: simple-numeric + tag: mfrac + match: + - "*[1][self::m:mn and translate(., '0123456789', '')=''] and" + - "*[2][self::m:mn and translate(., '0123456789', '')='']" + replace: + - x: "*[1]" + - x: "BrailleChars(translate(*[2], '0123456789', '\ue000\ue001\ue002\ue003\ue004\ue005\ue006\ue007\ue008\ue009'), 'Russian')" + +- + name: simple-algebraic + tag: mfrac + match: + - "(*[1][self::m:mi] or *[1][self::m:mn and translate(., '0123456789', '')='']) and" + - "(*[2][self::m:mi] or *[2][self::m:mn and translate(., '0123456789', '')=''])" + replace: + - x: "*[1]" + - t: "โ ณ" + - test: + if: "*[2][self::m:mn]" + then: + - x: "BrailleChars(translate(*[2], '0123456789', '\ue000\ue001\ue002\ue003\ue004\ue005\ue006\ue007\ue008\ue009'), 'Russian')" + else: + - x: "*[2]" + +- + name: default + tag: mfrac + match: "." + replace: + - t: "โ †" + - x: "*[1]" + - t: "โ €โ ณ" + - x: "*[2]" + - t: "โ ฐ" + +- + name: binomial-frac + tag: mrow + match: "IsBracketed(., '(', ')') and *[2][self::m:mfrac][@linethickness=0]" + replace: + - x: "*[1]" + - t: "โ จโ ‰โ ก" + - x: "*[2]/*[2]" + - t: "โ Œ" + - x: "*[2]/*[1]" + - x: "*[3]" + +- + name: binomial-table + tag: mrow + match: "IsBracketed(., '(', ')') and *[2][self::m:mtable][count(*)=2 and count(*[1])=1] and contains(@intent, 'binomial(')" + replace: + - x: "*[1]" + - t: "โ จโ ‰โ ก" + - x: "*[2]/*[2]/*[1]/*[1]" + - t: "โ Œ" + - x: "*[2]/*[1]/*[1]/*[1]" + - x: "*[3]" + +- + name: default-matrix + tag: mrow + variables: + - RowStart: "*[1]" + - RowEnd: "*[3]" + match: + - "*[2][self::m:mtable] and" + - (IsBracketed(., '(', ')') or IsBracketed(., '[', ']') or IsBracketed(., '|', '|')) + replace: [x: "*[2]"] + +- + name: default + tag: mtable + match: "." + replace: [x: "*"] + +- + name: default + tag: [mtr, mlabeledtr] + match: "." + replace: + - test: + if: "preceding-sibling::*" + then: [t: "โ จโ ณ"] + - x: $RowStart + - test: + if: .[self::m:mlabeledtr] + then: [x: "*[position()>1]"] + else: [x: "*"] + - x: $RowEnd + +- + name: default + tag: mtd + match: "." + replace: + - test: + if: "*" + then: + - test: + if: "preceding-sibling::*" + then: [t: "W"] + - x: "*" + +- + name: single-char-exceptions + tag: msup + match: "*[2][translate(., \"'*`ยชยฐยฒยณยดยนยบโ€ฒโ€ณโ€ดโ€ตโ€ถโ€ทโ—\",'')='']" + replace: [x: "*"] + +- + name: integer + tag: [msub, munder] + match: "*[2][self::m:mn and translate(., '0123456789', '')='']" + replace: + - x: "*[1]" + - test: + if: "self::m:munder" + then: [t: "โ จโ ก"] + else: [t: "โ ก"] + - x: "BrailleChars(translate(*[2], '0123456789', '\ue000\ue001\ue002\ue003\ue004\ue005\ue006\ue007\ue008\ue009'), 'Russian')" + +- + name: default + tag: [msub, munder] + match: "." + replace: + - x: "*[1]" + - test: + if: "self::m:munder" + then: [t: "โ จโ ก"] + else: [t: "โ ก"] + - x: "*[2]" + - t: "โ ฑ" + +- + name: integer + tag: [msup, mover] + match: "*[2][self::m:mn and translate(., '0123456789', '')='']" + replace: + - x: "*[1]" + - test: + if: "self::m:mover" + then: [t: "โ จโ Œ"] + else: [t: "โ Œ"] + - x: "BrailleChars(translate(*[2], '0123456789', '\ue000\ue001\ue002\ue003\ue004\ue005\ue006\ue007\ue008\ue009'), 'Russian')" + +- + name: default + tag: [msup, mover] + match: "." + replace: + - x: "*[1]" + - test: + if: "self::m:mover" + then: [t: "โ จโ Œ"] + else: [t: "โ Œ"] + - x: "*[2]" + - t: "โ ฑ" + +- + name: default + tag: [msubsup, munderover] + match: "count(*)=3" + replace: + - x: "*[1]" + - test: + if: "self::m:munderover" + then: [t: "โ จโ ก"] + else: [t: "โ ก"] + - x: "*[2]" + - test: + if: "self::m:munderover" + then: [t: "โ จโ Œ"] + else: [t: "โ Œ"] + - x: "*[3]" + - t: "โ ฑ" + +- + name: default + tag: mmultiscripts + match: "." + replace: [x: "*"] + +- + name: default + tag: menclose + match: "." + replace: + - t: "โ ฃ" + - x: "*" + - t: "โ œ" + +- + name: chemical-formula-operator-bond + tag: mo + match: "@data-chemical-bond" + replace: + - test: + - if: ".='-' or .=':'" + then: [t: "โ ค"] + - else_if: ".='=' or .='โˆท'" + then: [t: "โ ฆ"] + - else_if: ".='โ‰ก'" + then: [t: "โ ฟ"] + else: [x: "text()"] + +- + name: prefix-geometry-ops + tag: mo + match: + - "parent::*[count(*) = 2 and name()='mrow' and not(preceding-sibling::*)] and" + - "( .='โˆ ' or .='โ–ณ' or .='โˆช' )" + replace: + - x: "text()" + - t: "#" + +- + name: default + tag: mo + match: "." + replace: + - x: "text()" + +- + name: default + tag: mn + match: "." + replace: + - x: "BrailleChars(., 'Russian')" + +- + name: functions + tag: mi + match: "DefinitionValue(., 'Braille', 'RussianFunctionBraille') != ''" + replace: + - x: "DefinitionValue(., 'Braille', 'RussianFunctionBraille')" + +- + name: default + tag: [mi, mtext] + match: "." + replace: + - x: "BrailleChars(., 'Russian')" + +- + name: default + tag: ms + match: "." + replace: + - test: + if: "string(@lquote)!=''" + then: [x: "@lquote"] + else: [t: "โ ฆ"] + - x: "BrailleChars(., 'Russian')" + - test: + if: "string(@rquote)!=''" + then: [x: "@rquote"] + else: [t: "โ ด"] + +- + name: default-children + tag: "*" + match: "*" + replace: + - x: "*" + +- + name: default-no-children + tag: "*" + match: "text()" + replace: + - x: "text()" + +- + name: default-no-text + tag: "*" + match: "." + replace: [t: ""] diff --git a/Rules/Braille/Russian/definitions.yaml b/Rules/Braille/Russian/definitions.yaml new file mode 100644 index 000000000..c2fe639ed --- /dev/null +++ b/Rules/Braille/Russian/definitions.yaml @@ -0,0 +1,10 @@ +--- +- include: "../definitions.yaml" + +- RussianFunctionBraille: { + "arcsin": "\uE100", "arccos": "\uE101", "arctg": "\uE102", "arctan": "\uE102", + "arcctg": "\uE103", "arccotan": "\uE103", "arccot": "\uE103", + "sin": "\uE104", "cos": "\uE105", "tg": "\uE106", "tan": "\uE106", "ctg": "\uE107", "cotan": "\uE107", "cot": "\uE107", + "log": "\uE108", "ln": "\uE109", "lg": "\uE10A", + "lim": "\uE10B", "min": "\uE10C", "max": "\uE10D", "exp": "\uE10E" + } diff --git a/Rules/Braille/Russian/unicode-full.yaml b/Rules/Braille/Russian/unicode-full.yaml new file mode 100644 index 000000000..f78feac35 --- /dev/null +++ b/Rules/Braille/Russian/unicode-full.yaml @@ -0,0 +1,301 @@ +--- + - "โ‹‡": [tc: "1โ Œโ ฏโ ฆ"] # 0x22C7 (Division times) + - "โŠฉ": [tc: "โ ธโ ณโ ฟโ ธโ ’"] # 0x22A9 (Forces) + - "โ„": [tc: "โ ˆโ ’โ “"] # t: "B"F (reduced Plank's constant) + - "โ…†": [tc: "โ ™"] # 0x2146 + - "โ…‡": [tc: "โ ‘"] # 0x2147 + - "โ…ˆ": [tc: "โ Š"] # 0x2148 + - "โจฏ": [tc: "โ โ ฆ"] # U+2A2F(VECTOR OR CROSS PRODUCT) -- make the same as 0x00D7 (Multiplication sign) + + + - "ยผ": [tc: "#Nโ Nโ ŒNโ ™"] # 0x00BC (Vulgar Fraction One Quarter) + - "ยฝ": [tc: "#Nโ Nโ ŒNโ ƒ"] # 0x00BD (Vulgar Fraction One Half) + - "ยพ": [tc: "#Nโ ‰Nโ ŒNโ ™"] # 0x00BE (Vulgar Fraction Three Quarters) + - "โ…": [tc: "#Nโ Nโ ŒNโ ›"] # 0x2150 (Vulgar Fraction One Seventh) + - "โ…‘": [tc: "#Nโ Nโ ŒNโ Š"] # 0x2151 (Vulgar Fraction One Ninth) + - "โ…’": [tc: "#Nโ Nโ ŒNโ Nโ š"] # 0x2152 (Vulgar Fraction One Tenth) + - "โ…“": [tc: "#Nโ Nโ ŒNโ ‰"] # 0x2153 (Vulgar Fraction One Third) + - "โ…”": [tc: "#Nโ ƒNโ ŒNโ ‰"] # 0x2154 (Vulgar Fraction Two Thirds) + - "โ…•": [tc: "#Nโ Nโ ŒNโ ‘"] # 0x2155 (Vulgar Fraction One Fifth) + - "โ…–": [tc: "#Nโ ƒNโ ŒNโ ‘"] # 0x2156 (Vulgar Fraction Two Fifths) + - "โ…—": [tc: "#Nโ ‰Nโ ŒNโ ‘"] # 0x2157 (Vulgar Fraction Three Fifths) + - "โ…˜": [tc: "#Nโ ™Nโ ŒNโ ‘"] # 0x2158 (Vulgar Fraction Four Fifths) + - "โ…™": [tc: "#Nโ Nโ ŒNโ ‹"] # 0x2159 (Vulgar Fraction One Sixth) + - "โ…š": [tc: "#Nโ ‘Nโ ŒNโ ‹"] # 0x215A (Vulgar Fraction Five Sixths) + - "โ…›": [tc: "#Nโ Nโ ŒNโ “"] # 0x215B (Vulgar Fraction One Eighth) + - "โ…œ": [tc: "#Nโ ‰Nโ ŒNโ “"] # 0x215C (Vulgar Fraction Three Eighths) + - "โ…": [tc: "#Nโ ‘Nโ ŒNโ “"] # 0x215D (Vulgar Fraction Five Eighths) + - "โ…ž": [tc: "#Nโ ›Nโ ŒNโ “"] # 0x215E (Vulgar Fraction Seven Eighths) + - "โ†‰": [tc: "#Nโ šNโ ŒNโ ‘"] # 0x2189 (Vulgar Fraction Zero Thirds) + + + + - "โ„Š": [tc: "TLโ ›โ "] # 0x210a (Script Small G) + - "โ„‹": [tc: "TCLโ “โ "] # 0x210b (Script Capital H) + - "โ„’": [tc: "TCLโ ‡"] # 0x2113 (Script Capital L) + - "โ„“": [tc: "TLโ ‡"] # 0x2113 (Script Small L) + - "โ„˜": [tc: "TCLโ "] # 0x2118 (Script Capital P) + - "โ„›": [tc: "TCLโ —"] # 0x211B (Script Capital R) + - "โ„ฏ": [tc: "TLโ ‘"] # 0x212F (Script Small E) + - "โ„ฐ": [tc: "TCLโ ‘"] # 0x2130 (Script Capital E) + - "โ„ฑ": [tc: "TCLโ ‹"] # 0x2131 (Script Capital F) + - "โ„ณ": [tc: "TCLโ "] # 0x2133 (Script Capital M) + - "โ„ด": [tc: "TLโ •"] # 0x21334 (Script Small O) + - "โ„Œ": [tc: "DCLโ “"] # 0x210C (Fraktur Capital H) + - "โ„‘": [tc: "DCLโ Š"] # 0x2111 (Fraktur Capital I) + - "โ„œ": [tc: "DCLโ —"] # 0x211C (Fraktur Capital R) + - "โ„จ": [tc: "DCLโ ต"] # 0x2128 (Fraktur Capital Z) + - "โ„ญ": [tc: "DCLโ ‰"] # 0x22DC (Fraktur Capital C) + + - "โ„‚": [tc: "๐”นCLโ ‰"] # 0x2102 + - "โ„": [tc: "๐”นCLโ “"] # 0x210d + - "โ„•": [tc: "๐”นCLโ "] # 0x2115 + - "โ„™": [tc: "๐”นCLโ "] # 0x2119 + - "โ„š": [tc: "๐”นCLโ Ÿ"] # 0x211a + - "โ„": [tc: "๐”นCLโ —"] # 0x211d + - "โ„ค": [tc: "๐”นCLโ ต"] # 0x2124 + + + - "๐šจ-๐›€": # 0x1d6a8 - 0x1d6c0 + - tc: "B" + - spell: "translate('.', '๐›‚๐›ƒ๐›„๐›…๐›†๐›‡๐›ˆ๐›‰๐›Š๐›‹๐›Œ๐›๐›Ž๐›๐›๐›‘๐›’๐›“๐›”๐›•๐›–๐›—๐›˜๐›™๐›š', 'ฮฑฮฒฮณฮดฮตฮถฮทฮธฮนฮบฮปฮผฮฝฮพฮฟฯ€ฯฯ‚ฯƒฯ„ฯ…ฯ†ฯ‡ฯˆฯ‰')" + + + - "๐›‚-๐›š": # 0x1d6c2 - 0x1d6da + - tc: "BGL" + - spell: "translate('.', '๐›‚๐›ƒ๐›„๐›…๐›†๐›‡๐›ˆ๐›‰๐›Š๐›‹๐›Œ๐›๐›Ž๐›๐›๐›‘๐›’๐›“๐›”๐›•๐›–๐›—๐›˜๐›™๐›š', 'ฮฑฮฒฮณฮดฮตฮถฮทฮธฮนฮบฮปฮผฮฝฮพฮฟฯ€ฯฯ‚ฯƒฯ„ฯ…ฯ†ฯ‡ฯˆฯ‰')" + + + - "๐”„-๐”œ": # 0x1d504 - 0x1d51d ('z' version is reserved) + - tc: "DC" + - spell: "translate('.', '๐”„๐”…๐”†๐”‡๐”ˆ๐”‰๐”Š๐”‹๐”Œ๐”๐”Ž๐”๐”๐”‘๐”’๐”“๐””๐”•๐”–๐”—๐”˜๐”™๐”š๐”›๐”œ', 'abcdefghijklmnopqrstuvwxyz')" + + - "๐”ž-๐”ท": # 0x1d51e - 0x1d537 + - tc: "D" + - spell: "translate('.', '๐”ž๐”Ÿ๐” ๐”ก๐”ข๐”ฃ๐”ค๐”ฅ๐”ฆ๐”ง๐”จ๐”ฉ๐”ช๐”ซ๐”ฌ๐”ญ๐”ฎ๐”ฏ๐”ฐ๐”ฑ๐”ฒ๐”ณ๐”ด๐”ต๐”ถ๐”ท', 'abcdefghijklmnopqrstuvwxyz')" + + - "๐•ฌ-๐–…": # 0x1D56C - 0x1D585 + - tc: "BDC" + - spell: "translate('.', '๐•ฌ๐•ญ๐•ฎ๐•ฏ๐•ฐ๐•ฑ๐•ฒ๐•ณ๐•ด๐•ต๐•ถ๐•ท๐•ธ๐•น๐•บ๐•ป๐•ผ๐•ฝ๐•พ๐•ฟ๐–€๐–๐–‚๐–ƒ๐–„๐–…', 'abcdefghijklmnopqrstuvwxyz')" + + - "๐–†-๐–Ÿ": # 0x1d586 - 0x1d59f + - tc: "D" + - spell: "translate('.', '๐–†๐–‡๐–ˆ๐–‰๐–Š๐–‹๐–Œ๐–๐–Ž๐–๐–๐–‘๐–’๐–“๐–”๐–•๐––๐–—๐–˜๐–™๐–š๐–›๐–œ๐–๐–ž๐–Ÿ', 'abcdefghijklmnopqrstuvwxyz')" + + # double struck (blackboard bold) chars in math alphabetic block and also MathType private use area + # Some of these are reserved because they were used in Plane 0 -- that shouldn't be an issue other than causing the other chars to not display + - "๐”ธ-๐•": # 0x1d504 - 0x1d51d ('z' version is reserved) + - tc: "DC" + - spell: "translate('.', '๐”ธ๐”น๐”บ๐”ป๐”ผ๐”ฝ๐”พ๐”ฟ๐•€๐•๐•‚๐•ƒ๐•„๐•…๐•†๐•‡๐•ˆ๐•‰๐•Š๐•‹๐•Œ๐•๐•Ž๐•๐•', 'abcdefghijklmnopqrstuvwxyz')" + + - "๐•’-๐•ซ": # 0x1d552 - 0x1d56b + - tc: "D" + - spell: "translate('.', '๐•’๐•“๐•”๐••๐•–๐•—๐•˜๐•™๐•š๐•›๐•œ๐•๐•ž๐•Ÿ๐• ๐•ก๐•ข๐•ฃ๐•ค๐•ฅ๐•ฆ๐•ง๐•จ๐•ฉ๐•ช๐•ซ', 'abcdefghijklmnopqrstuvwxyz')" + + - "๐Ÿ˜-๐Ÿก": # 0x1d7d8 - 0x1d7e1 + - tc: "D" + - spell: "translate('.', '๐Ÿ˜๐Ÿ™๐Ÿš๐Ÿ›๐Ÿœ๐Ÿ๐Ÿž๐ŸŸ๐Ÿ ๐Ÿก', '0123456789')" + + # script chars in math alphabetic block and also MathType private use area + - "๐’œ-๐’ต": # 0x1d49c - 0x1d4b5 + - tc: "TsC" + - spell: "translate('.', '๐’œ๐’๐’ž๐’Ÿ๐’ ๐’ก๐’ข๐’ฃ๐’ค๐’ฅ๐’ฆ๐’ง๐’จ๐’ฉ๐’ช๐’ซ๐’ฌ๐’ญ๐’ฎ๐’ฏ๐’ฐ๐’ฑ๐’ฒ๐’ณ๐’ด๐’ต', 'abcdefghijklmnopqrstuvwxyza')" + + - "๐’ถ-๐“": # 0x1d4b6 - 0x1d4cf + - tc: "Ts" + - spell: "translate('.', '๐’ถ๐’ท๐’ธ๐’น๐’บ๐’ป๐’ผ๐’ฝ๐’พ๐’ฟ๐“€๐“๐“‚๐“ƒ๐“„๐“…๐“†๐“‡๐“ˆ๐“‰๐“Š๐“‹๐“Œ๐“๐“Ž๐“', 'abcdefghijklmnopqrstuvwxyz')" + + # bold script chars in math alphabetic block + - "๐“-๐“ฉ": # 0x1d4d0 - 0x1d4e9 + - tc: "BTs" + - spell: "translate('.', '๐“๐“‘๐“’๐““๐“”๐“•๐“–๐“—๐“˜๐“™๐“š๐“›๐“œ๐“๐“ž๐“Ÿ๐“ ๐“ก๐“ข๐“ฃ๐“ค๐“ฅ๐“ฆ๐“ง๐“จ๐“ฉ', 'abcdefghijklmnopqrstuvwxyz')" + + - "๐“ช-๐”ƒ": # 0x1d4ea - 0x1d503 + - tc: "BTs" + - spell: "translate('.', '๐“ช๐“ซ๐“ฌ๐“ญ๐“ฎ๐“ฏ๐“ฐ๐“ฑ๐“ฒ๐“ณ๐“ด๐“ต๐“ถ๐“ท๐“ธ๐“น๐“บ๐“ป๐“ผ๐“ฝ๐“พ๐“ฟ๐”€๐”๐”‚๐”ƒ', 'abcdefghijklmnopqrstuvwxyz')" + + - "๐€-๐™": # 0x1d400 - 0x1d419 + - tc: "B" + - spell: "translate('.', '๐€๐๐‚๐ƒ๐„๐…๐†๐‡๐ˆ๐‰๐Š๐‹๐Œ๐๐Ž๐๐๐‘๐’๐“๐”๐•๐–๐—๐˜๐™', 'abcdefghijklmnopqrstuvwxyz')" + + - "๐š-๐ณ": # 0x1d41a - 0x1d433 + - tc: "B" + - spell: "translate('.', '๐š๐›๐œ๐๐ž๐Ÿ๐ ๐ก๐ข๐ฃ๐ค๐ฅ๐ฆ๐ง๐จ๐ฉ๐ช๐ซ๐ฌ๐ญ๐ฎ๐ฏ๐ฐ๐ฑ๐ฒ๐ณ', 'abcdefghijklmnopqrstuvwxyz')" + + - "๐ด-๐‘": # 0x1d434 - 0x1d44d + # don't include italics + - tc: "C" + - spell: "translate('.', '๐ด๐ต๐ถ๐ท๐ธ๐น๐บ๐ป๐ผ๐ฝ๐พ๐ฟ๐‘€๐‘๐‘‚๐‘ƒ๐‘„๐‘…๐‘†๐‘‡๐‘ˆ๐‘‰๐‘Š๐‘‹๐‘Œ๐‘', 'abcdefghijklmnopqrstuvwxyz')" + + - "๐‘Ž-๐‘ง": # 0x1d44e - 0x1d467 + # don't include italics + - spell: "translate('.', '๐‘Ž๐‘๐‘๐‘‘๐‘’๐‘“๐‘”๐‘•๐‘–๐‘—๐‘˜๐‘™๐‘š๐‘›๐‘œ๐‘๐‘ž๐‘Ÿ๐‘ ๐‘ก๐‘ข๐‘ฃ๐‘ค๐‘ฅ๐‘ฆ๐‘ง', 'abcdefghijklmnopqrstuvwxyz')" + + - "๐‘จ-๐’": # 0x1d468 - 0x1d481 + - tc: "BIC" + - spell: "translate('.', '๐‘จ๐‘ฉ๐‘ช๐‘ซ๐‘ฌ๐‘ญ๐‘ฎ๐‘ฏ๐‘ฐ๐‘ฑ๐‘ฒ๐‘ณ๐‘ด๐‘ต๐‘ถ๐‘ท๐‘ธ๐‘น๐‘บ๐‘ป๐‘ผ๐‘ฝ๐‘พ๐‘ฟ๐’€๐’', 'abcdefghijklmnopqrstuvwxyz')" + + - "๐’‚-๐’›": # 0x1d482 - 0x1d49b + - spell: "translate('.', '๐’‚๐’ƒ๐’„๐’…๐’†๐’‡๐’ˆ๐’‰๐’Š๐’‹๐’Œ๐’๐’Ž๐’๐’๐’‘๐’’๐’“๐’”๐’•๐’–๐’—๐’˜๐’™๐’š๐’›', 'abcdefghijklmnopqrstuvwxyz')" + + - "๐– -๐–น": # 0x1d5a0 - 0x1d5b9 + - spell: "translate('.', '๐– ๐–ก๐–ข๐–ฃ๐–ค๐–ฅ๐–ฆ๐–ง๐–จ๐–ฉ๐–ช๐–ซ๐–ฌ๐–ญ๐–ฎ๐–ฏ๐–ฐ๐–ฑ๐–ฒ๐–ณ๐–ด๐–ต๐–ถ๐–ท๐–ธ๐–น', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "๐–บ-๐—“": # 0x1d5ba - 0x1d5d3 + - spell: "translate('.', '๐–บ๐–ป๐–ผ๐–ฝ๐–พ๐–ฟ๐—€๐—๐—‚๐—ƒ๐—„๐—…๐—†๐—‡๐—ˆ๐—‰๐—Š๐—‹๐—Œ๐—๐—Ž๐—๐—๐—‘๐—’๐—“', 'abcdefghijklmnopqrstuvwxyz')" + + - "๐—”-๐—ญ": # 0x1d5d4 - 0x1d5ed + - test: + if: "not($IgnoreBold)" + then: [tc: "B"] + - spell: "translate('.', '๐—”๐—•๐—–๐——๐—˜๐—™๐—š๐—›๐—œ๐—๐—ž๐—Ÿ๐— ๐—ก๐—ข๐—ฃ๐—ค๐—ฅ๐—ฆ๐—ง๐—จ๐—ฉ๐—ช๐—ซ๐—ฌ๐—ญ', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "๐—ฎ-๐˜‡": # 0x1d5ee - 0x1d607 + - test: + if: "not($IgnoreBold)" + then: [tc: "B"] + - spell: "translate('.', '๐—ฎ๐—ฏ๐—ฐ๐—ฑ๐—ฒ๐—ณ๐—ด๐—ต๐—ถ๐—ท๐—ธ๐—น๐—บ๐—ป๐—ผ๐—ฝ๐—พ๐—ฟ๐˜€๐˜๐˜‚๐˜ƒ๐˜„๐˜…๐˜†๐˜‡', 'abcdefghijklmnopqrstuvwxyz')" + + - "๐˜ˆ-๐˜ก": # 0x1d608 - 0x1d621 + # - tc: "italic" + - spell: "translate('.', '๐˜ˆ๐˜‰๐˜Š๐˜‹๐˜Œ๐˜๐˜Ž๐˜๐˜๐˜‘๐˜’๐˜“๐˜”๐˜•๐˜–๐˜—๐˜˜๐˜™๐˜š๐˜›๐˜œ๐˜๐˜ž๐˜Ÿ๐˜ ๐˜ก', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "๐˜ข-๐˜ป": # 0x1d622 - 0x1d63b + # - tc: "italic" + - spell: "translate('.', '๐˜ข๐˜ฃ๐˜ค๐˜ฅ๐˜ฆ๐˜ง๐˜จ๐˜ฉ๐˜ช๐˜ซ๐˜ฌ๐˜ญ๐˜ฎ๐˜ฏ๐˜ฐ๐˜ฑ๐˜ฒ๐˜ณ๐˜ด๐˜ต๐˜ถ๐˜ท๐˜ธ๐˜น๐˜บ๐˜ป', 'abcdefghijklmnopqrstuvwxyz')" + + - "๐˜ผ-๐™•": # 0x1d63c - 0x1d655 + # - tc: "bold italic" + - test: + if: "$IgnoreBold" + then: [tc: I] + else: [tc: "BI"] + - spell: "translate('.', '๐˜ผ๐˜ฝ๐˜พ๐˜ฟ๐™€๐™๐™‚๐™ƒ๐™„๐™…๐™†๐™‡๐™ˆ๐™‰๐™Š๐™‹๐™Œ๐™๐™Ž๐™๐™๐™‘๐™’๐™“๐™”๐™•', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" + + - "๐™–-๐™ฏ": # 0x1d656 - 0x1d66f + # - tc: "bold italic" + - test: + if: "$IgnoreBold" + then: [tc: I] + else: [tc: "BI"] + - spell: "translate('.', '๐™–๐™—๐™˜๐™™๐™š๐™›๐™œ๐™๐™ž๐™Ÿ๐™ ๐™ก๐™ข๐™ฃ๐™ค๐™ฅ๐™ฆ๐™ง๐™จ๐™ฉ๐™ช๐™ซ๐™ฌ๐™ญ๐™ฎ๐™ฏ', 'abcdefghijklmnopqrstuvwxyz')" + + - "๐™ฐ-๐š‰": # 0x1d670 - 0x1d689 + - tc: "C" + - spell: "translate('.', '๐™ฐ๐™ฑ๐™ฒ๐™ณ๐™ด๐™ต๐™ถ๐™ท๐™ธ๐™น๐™บ๐™ป๐™ผ๐™ฝ๐™พ๐™ฟ๐š€๐š๐š‚๐šƒ๐š„๐š…๐š†๐š‡๐šˆ๐š‰', 'abcdefghijklmnopqrstuvwxyz')" + + - "๐šŠ-๐šฃ": # 0x1d68a - 0x1d6a3 + - spell: "translate('.', '๐šŠ๐š‹๐šŒ๐š๐šŽ๐š๐š๐š‘๐š’๐š“๐š”๐š•๐š–๐š—๐š˜๐š™๐šš๐š›๐šœ๐š๐šž๐šŸ๐š ๐šก๐šข๐šฃ', 'abcdefghijklmnopqrstuvwxyz')" + + - "๐šค๐šฅ": # 0x1d6a4, 0x1d6a5 + - spell: "translate('.', '๐šค๐šฅ', 'ij')" # not sure what else these should be + + - "๐šจ-๐›€": # 0x1d6a8 - 0x1d6c0 + - test: + if: "not($IgnoreBold)" + then: [tc: "B"] + - spell: "translate('.', '๐šจ๐šฉ๐šช๐šซ๐šฌ๐šญ๐šฎ๐šฏ๐šฐ๐šฑ๐šฒ๐šณ๐šด๐šต๐šถ๐šท๐šธ๐šน๐šบ๐šป๐šผ๐šฝ๐šพ๐šฟ๐›€', 'ฮ‘ฮ’ฮ“ฮ”ฮ•ฮ–ฮ—ฮ˜ฮ™ฮšฮ›ฮœฮฮžฮŸฮ ฮกฮขฮฃฮคฮฅฮฆฮงฮจฮฉ')" + + - "๐›‚-๐›š": # 0x1d6c2 - 0x1d6da + - test: + if: "not($IgnoreBold)" + then: [tc: "B"] + - spell: "translate('.', '๐›‚๐›ƒ๐›„๐›…๐›†๐›‡๐›ˆ๐›‰๐›Š๐›‹๐›Œ๐›๐›Ž๐›๐›๐›‘๐›’๐›“๐›”๐›•๐›–๐›—๐›˜๐›™๐›š', 'ฮฑฮฒฮณฮดฮตฮถฮทฮธฮนฮบฮปฮผฮฝฮพฮฟฯ€ฯฯ‚ฯƒฯ„ฯ…ฯ†ฯ‡ฯˆฯ‰')" + + - "๐›": # 0x1d6c1 + - test: + if: "not($IgnoreBold)" + then: [tc: "B"] + - spell: "translate('.', '๐œต', 'โˆ‡')" + + - "๐››๐›œ๐›๐›ž๐›Ÿ๐› ๐›ก": # 0x1D6DB - 0x1D6E1 + - test: + if: "not($IgnoreBold)" + then: [tc: "B"] + - spell: "translate('.', '๐››๐›œ๐›๐›ž๐›Ÿ๐› ๐›ก', 'โˆ‚ฮตฮธฮบฯ†ฯฯ€')" + + - "๐›ข-๐›บ": # 0x1d6e2 - 0x1d6fa + - tc: "IC" + - spell: "translate('.', '๐›ข๐›ฃ๐›ค๐›ฅ๐›ฆ๐›ง๐›จ๐›ฉ๐›ช๐›ซ๐›ฌ๐›ญ๐›ฎ๐›ฏ๐›ฐ๐›ฑ๐›ฒ๐›ณ๐›ด๐›ต๐›ถ๐›ท๐›ธ๐›น๐›บ', 'ฮฑฮฒฮณฮดฮตฮถฮทฮธฮนฮบฮปฮผฮฝฮพฮฟฯ€ฯฯ‚ฯƒฯ„ฯ…ฯ†ฯ‡ฯˆฯ‰')" + + - "๐›ผ-๐œ”": # 0x1d6fc - 0x1d714 + - spell: "translate('.', '๐›ผ๐›ฝ๐›พ๐›ฟ๐œ€๐œ๐œ‚๐œƒ๐œ„๐œ…๐œ†๐œ‡๐œˆ๐œ‰๐œŠ๐œ‹๐œŒ๐œ๐œŽ๐œ๐œ๐œ‘๐œ’๐œ“๐œ”', 'ฮฑฮฒฮณฮดฮตฮถฮทฮธฮนฮบฮปฮผฮฝฮพฮฟฯ€ฯฯ‚ฯƒฯ„ฯ…ฯ†ฯ‡ฯˆฯ‰')" + + + - "๐›ป": # 0x1d6fb + - spell: "translate('.', '๐œต', 'โˆ‡')" + + - "๐œ•๐œ–๐œ—๐œ˜๐œ™๐œš๐œ›": # 0x1d715 - 0x1d71b + # - tc: "italic" + - spell: "translate('.', '๐œ•๐œ–๐œ—๐œ˜๐œ™๐œš๐œ›', 'โˆ‚ฮตฮธฮบฯ†ฯฯ€')" + + - "๐œœ-๐œด": # 0x1d71c - 0x1d734 + # - tc: "bold italic" + - tc: 'BICโ ' + - spell: "translate('.', '๐œœ๐œ๐œž๐œŸ๐œ ๐œก๐œข๐œฃ๐œค๐œฅ๐œฆ๐œง๐œจ๐œฉ๐œช๐œซ๐œฌ๐œญ๐œฎ๐œฏ๐œฐ๐œฑ๐œฒ๐œณ๐œด', 'ฮฑฮฒฮณฮดฮตฮถฮทฮธฮนฮบฮปฮผฮฝฮพฮฟฯ€ฯฯ‚ฯƒฯ„ฯ…ฯ†ฯ‡ฯˆฯ‰')" + + - "๐œถ-๐Ž": # 0x1d736 - 0x1d74e + - tc: "BI" + - spell: "translate('.', '๐œถ๐œท๐œธ๐œน๐œบ๐œป๐œผ๐œฝ๐œพ๐œฟ๐€๐๐‚๐ƒ๐„๐…๐†๐‡๐ˆ๐‰๐Š๐‹๐Œ๐๐Ž', 'ฮฑฮฒฮณฮดฮตฮถฮทฮธฮนฮบฮปฮผฮฝฮพฮฟฯ€ฯฯ‚ฯƒฯ„ฯ…ฯ†ฯ‡ฯˆฯ‰')" + + - "๐๐๐‘๐’๐“๐”๐•": # 0x1d74f - 0x1d755 + - tc: "BI" + - spell: "translate('.', '๐๐๐‘๐’๐“๐”๐•', 'โˆ‚ฮตฮบฮธฯ†ฯฯ€')" + + - "๐œต": # 0x1d735 + - tc: "BI" + - spell: "translate('.', '๐œต', 'โˆ‡')" + + - "๐–-๐ฎ": # 0x1d756 - 0x1d76e + - tc: "BSC" + - spell: "translate('.', '๐–๐—๐˜๐™๐š๐›๐œ๐๐ž๐Ÿ๐ ๐ก๐ข๐ฃ๐ค๐ฅ๐ฆ๐ง๐จ๐ฉ๐ช๐ซ๐ฌ๐ญ๐ฎ', 'ฮฑฮฒฮณฮดฮตฮถฮทฮธฮนฮบฮปฮผฮฝฮพฮฟฯ€ฯฯ‚ฯƒฯ„ฯ…ฯ†ฯ‡ฯˆฯ‰')" + + - "๐ฐ-๐žˆ": # 0x1d770 - 0x1d788 + - tc: "BS" + - spell: "translate('.', '๐ฐ๐ฑ๐ฒ๐ณ๐ด๐ต๐ถ๐ท๐ธ๐น๐บ๐ป๐ผ๐ฝ๐พ๐ฟ๐ž€๐ž๐ž‚๐žƒ๐ž„๐ž…๐ž†๐ž‡๐žˆ', 'ฮฑฮฒฮณฮดฮตฮถฮทฮธฮนฮบฮปฮผฮฝฮพฮฟฯ€ฯฯ‚ฯƒฯ„ฯ…ฯ†ฯ‡ฯˆฯ‰')" + + - "๐ž‰๐žŠ๐ž‹๐žŒ๐ž๐žŽ๐ž": # 0x1d789 - 0x1d78f + - tc: "B" + - spell: "translate('.', '๐ž‰๐žŠ๐ž‹๐žŒ๐ž๐žŽ๐ž', 'โˆ‚ฮตฮธฮบฯ†ฯฯ€')" + + - "๐ฏ": # 0x1d76f + - tc: "B" + - spell: "translate('.', '๐œต', 'โˆ‡')" + + - "๐ž-๐žจ": # 0x1d790 - 0x1d7a8 + # - tc: "bold italic" + - test: + if: "$IgnoreBold" + then: [tc: I] + else: [tc: "BI"] + - spell: "translate('.', '๐ž๐ž‘๐ž’๐ž“๐ž”๐ž•๐ž–๐ž—๐ž˜๐ž™๐žš๐ž›๐žœ๐ž๐žž๐žŸ๐ž ๐žก๐žข๐žฃ๐žค๐žฅ๐žฆ๐žง๐žจ', 'ฮ‘ฮ’ฮ“ฮ”ฮ•ฮ–ฮ—ฮ˜ฮ™ฮšฮ›ฮœฮฮžฮŸฮ ฮกฮขฮฃฮคฮฅฮฆฮงฮจฮฉ')" + + - "๐žช-๐Ÿ‚": # 0x1d7aa - 0x1d7c2 + # - tc: "bold italic" + - test: + if: "$IgnoreBold" + then: [tc: I] + else: [tc: "BI"] + - spell: "translate('.', '๐žช๐žซ๐žฌ๐žญ๐žฎ๐žฏ๐žฐ๐žฑ๐žฒ๐žณ๐žด๐žต๐žถ๐žท๐žธ๐žน๐žบ๐žป๐žผ๐žฝ๐žพ๐žฟ๐Ÿ€๐Ÿ๐Ÿ‚', 'ฮฑฮฒฮณฮดฮตฮถฮทฮธฮนฮบฮปฮผฮฝฮพฮฟฯ€ฯฯ‚ฯƒฯ„ฯ…ฯ†ฯ‡ฯˆฯ‰')" + + - "๐Ÿƒ๐Ÿ„๐Ÿ…๐Ÿ†๐Ÿ‡๐Ÿˆ๐Ÿ‰": # 0x1d7c3 - 0x1d7c9 + - tc: "B" + - spell: "translate('.', '๐Ÿƒ๐Ÿ„๐Ÿ…๐Ÿ†๐Ÿ‡๐Ÿˆ๐Ÿ‰', 'โˆ‚ฮตฮธฮบฯ†ฯฯ€')" + + - "๐žฉ": [tc: "B"] # 0x1d7a9 + + - "๐ŸŽ-๐Ÿ—": # 0x1d7ce - 0x1d7d7 + - tc: "B" + - spell: "translate('.', '๐ŸŽ๐Ÿ๐Ÿ๐Ÿ‘๐Ÿ’๐Ÿ“๐Ÿ”๐Ÿ•๐Ÿ–๐Ÿ—', '0123456789')" + + - "๐Ÿฌ-๐Ÿต": # 0x1D7EC - 0x1D7F5 + - tc: "BS" + - spell: "translate('.', '๐Ÿฌ๐Ÿญ๐Ÿฎ๐Ÿฏ๐Ÿฐ๐Ÿฑ๐Ÿฒ๐Ÿณ๐Ÿด๐Ÿต', '0123456789')" + + - "๐Ÿข-๐Ÿซ": # 0x1d7e2 - 0x1d7eb + - tc: "S" + - spell: "translate('.', '๐Ÿถ๐Ÿท๐Ÿธ๐Ÿน๐Ÿบ๐Ÿป๐Ÿผ๐Ÿฝ๐Ÿพ๐Ÿฟ', '0123456789')" + + - "๐Ÿถ-๐Ÿฟ": # 0x1d7f6 - 0x1d7ff + - spell: "translate('.', '๐Ÿถ๐Ÿท๐Ÿธ๐Ÿน๐Ÿบ๐Ÿป๐Ÿผ๐Ÿฝ๐Ÿพ๐Ÿฟ', '0123456789')" + diff --git a/Rules/Braille/Russian/unicode.yaml b/Rules/Braille/Russian/unicode.yaml new file mode 100644 index 000000000..37d64bd97 --- /dev/null +++ b/Rules/Braille/Russian/unicode.yaml @@ -0,0 +1,334 @@ +--- +# Russian mathematical braille characters +- ".": [t: "โ  โ ฒ"] +- ",": [t: "โ  โ ‚"] +- "!": [t: "โ  โ –"] +- "?": [t: "โ  โ ข"] +- ":": [t: "โ €โ ฒ"] +- ";": [t: "โ  โ †"] +- "{": [t: "โ  โ ช"] +- "}": [t: "โ  โ •"] +- "+": [t: "โ €โ –"] +- "-": [t: "โ €โ ค"] +- "=": [t: "โ €โ ถ"] +- "(": [t: "โ ฃ"] +- ")": [t: "โ œ"] +- ">": [t: "โ €โ •โ €"] +- "<": [t: "โ €โ ชโ €"] +- "%": [t: "โ ผโ ด"] +- "ยฑ": [t: "โ €โ –โ ค"] +- "อพ": [t: "โ  โ ข"] +- "อฟ": [t: "โ ฐโ Š"] +- "ฮ‡": [t: "โ ฐ"] +- "ฮฑ": [t: "gโ "] +- "ฮฒ": [t: "gโ ƒ"] +- "ฮณ": [t: "gโ ›"] +- "ฮด": [t: "gโ ™"] +- "ฮต": [t: "gโ ‘"] +- "ฮถ": [t: "gโ ต"] +- "ฮท": [t: "gโ š"] +- "ฮธ": [t: "gโ “"] +- "ฮน": [t: "gโ Š"] +- "ฮบ": [t: "gโ …"] +- "ฮป": [t: "gโ ‡"] +- "ฮผ": [t: "gโ "] +- "ฮฝ": [t: "gโ "] +- "ฮพ": [t: "gโ ญ"] +- "ฮฟ": [t: "gโ •"] +- "ฯ€": [t: "gโ "] +- "ฯ": [t: "gโ —"] +- "ฯƒ": [t: "gโ Ž"] +- "ฯ„": [t: "gโ ž"] +- "ฯ…": [t: "gโ ฅ"] +- "ฯ†": [t: "gโ ‹"] +- "ฯ‡": [t: "gโ ‰"] +- "ฯˆ": [t: "gโ ฝ"] +- "ฯ‰": [t: "gโ บ"] +- "ฮ‘": [t: "vโ "] +- "ฮ’": [t: "vโ ƒ"] +- "ฮ“": [t: "vโ ›"] +- "ฮ”": [t: "vโ ™"] +- "ฮ•": [t: "vโ ‘"] +- "ฮ–": [t: "vโ ต"] +- "ฮ—": [t: "vโ š"] +- "ฮ˜": [t: "vโ “"] +- "ฮ™": [t: "vโ Š"] +- "ฮš": [t: "vโ …"] +- "ฮ›": [t: "vโ ‡"] +- "ฮœ": [t: "vโ "] +- "ฮ": [t: "vโ "] +- "ฮž": [t: "vโ ญ"] +- "ฮŸ": [t: "vโ •"] +- "ฮ ": [t: "vโ "] +- "ฮก": [t: "vโ —"] +- "ฮฃ": [t: "vโ Ž"] +- "ฮค": [t: "vโ ž"] +- "ฮฅ": [t: "vโ ฅ"] +- "ฮฆ": [t: "vโ ‹"] +- "ฮง": [t: "vโ ‰"] +- "ฮจ": [t: "vโ ฝ"] +- "ฮฉ": [t: "vโ บ"] +- "ฯ": [t: "gโ ƒ"] +- "ฯ‘": [t: "gโ “"] +- "ฯ•": [t: "gโ ‹"] +- "ฯ–": [t: "gโ "] +- "ฯฑ": [t: "gโ —"] +- "โ€ฒ": [t: "โ ”"] +- "โ€ณ": [t: "โ ”โ ”"] +- "โ€ด": [t: "โ ”โ ”โ ”"] +- "ยฐ": [t: "โ จโ ด"] +- "โˆ€": [t: "โ ซโ „"] +- "โˆ‚": [t: "โ น"] +- "โˆƒ": [t: "โ ซโ ข"] +- "โˆ…": [t: "โ ˆโ ด"] +- "โˆ‡": [t: "โ ซโ ด"] +- "โˆˆ": [t: "โ €โ โ ชโ €"] +- "โˆ‰": [t: "โ ˜โ ช"] +- "โˆ‹": [t: "โ €โ •โ ‚โ €"] +- "โˆŒ": [t: "โ ˆโ •โ ‚โ „"] +- "โˆŽ": [t: "โ €โ ธโ ‡โ €"] +- "โˆ": [t: "โ ธโ "] +- "โˆ‘": [t: "โ ธโ Ž"] +- "โˆ’": [t: "โ €โ ค"] +- "โˆ“": [t: "โ €โ คโ –"] +- "โˆ”": [t: "โ ˆโ –"] +- "โˆ•": [t: "โ  โ Œ"] +- "โˆ–": [t: "โ €โ ฐโ ค"] +- "โˆ—": [t: "โ ”"] +- "ยท": [t: "โ „"] +- "ร—": [t: "โ €โ ฆ"] +- "โ‹…": [t: "โ „"] +- "โก": [t: ""] +- "โข": [t: ""] +- "โฃ": [t: ""] +- "โค": [t: ""] +- "\uE100": [t: "โ ซโ โ Ž#"] +- "\uE101": [t: "โ ซโ โ ‰#"] +- "\uE102": [t: "โ ซโ โ ž#"] +- "\uE103": [t: "โ ซโ โ ‰โ ž#"] +- "\uE104": [t: "โ ซโ Ž#"] +- "\uE105": [t: "โ ซโ ‰#"] +- "\uE106": [t: "โ ซโ ž#"] +- "\uE107": [t: "โ ซโ ‰โ ž#"] +- "\uE108": [t: "โ ซโ ‡#"] +- "\uE109": [t: "โ ซโ ‡โ #"] +- "\uE10A": [t: "โ ซโ ‡โ ›#"] +- "\uE10B": [t: "โ ซโ ‡โ #"] +- "\uE10C": [t: "โ ซโ โ #"] +- "\uE10D": [t: "โ ซโ โ ญ#"] +- "\uE10E": [t: "โ ซโ ‘#"] +- "โˆ˜": [t: "โ ด"] +- "โˆš": [t: "โ ฉโ ฑ"] +- "โˆ›": [t: "โ ฉโ ’โ ฑ"] +- "โˆœ": [t: "โ ฉโ ฒโ ฑ"] +- "โˆž": [t: "โ ป"] +- "โˆ ": [t: "โ ธโ ช"] +- "โˆฃ": [t: "โ ธ"] +- "โˆค": [t: "โ €โ ผโ €"] +- "โˆฅ": [t: "โ ธโ ธ#"] +- "โˆง": [t: "โ €โ ฐโ ข"] +- "โˆจ": [t: "โ €โ ฐโ ”"] +- "โˆฉ": [t: "โ €โ ฐโ ฒ"] +- "โˆช": + - test: + if: "following-sibling::*[1][self::m:mi]" + then: [t: "โ ธโ œ"] + else: [t: "โ €โ ฐโ ด"] +- "โˆซ": [t: "โ ฎ"] +- "โˆฌ": [t: "โ ฎโ ฎ"] +- "โˆญ": [t: "โ ฎโ ฎโ ฎ"] +- "โˆฎ": [t: "โ ฎโ ด"] +- "โˆฏ": [t: "โ ฎโ ฎโ ด"] +- "โˆด": [t: "โ €โ  โ กโ €"] +- "โˆต": [t: "โ €โ ˆโ Œโ €"] +- "โˆถ": [t: "โ €โ ณ"] +- "โˆธ": [t: "โ ˆโ ค"] +- "โˆผ": [t: "โ €โ ข"] +- "โ‰…": [t: "โ €โ ข"] +- "โ‰ˆ": [t: "โ €โ ขโ ข"] +- "โ‰": [t: "โ €โ ’โ •"] +- "โ‰”": [t: "โ €โ ถโ ’"] +- "โ‰•": [t: "โ €โ ถโ ’"] +- "โ‰–": [t: "โ €โ ถโ ด"] +- "โ‰—": [t: "โ €โ ถโ ด"] +- "โ‰›": [t: "โ €โ ถโ †"] +- "โ‰Ÿ": [t: "โ ถโ ข"] +- "โ‰ ": [t: "โ €โ พ"] +- "โ‰ก": [t: "โ €โ ฐโ ถ"] +- "โ‰ข": [t: "โ €โ ฐโ พ"] +- "โ‰ค": [t: "โ €โ ชโ ถ"] +- "โ‰ฅ": [t: "โ €โ •โ ถ"] +- "โ‰ช": [t: "โ €โ ชโ ชโ €"] +- "โ‰ซ": [t: "โ €โ •โ •โ €"] +- "โ‰บ": [t: "โ €โ ’โ ชโ €"] +- "โ‰ป": [t: "โ €โ •โ ’โ €"] +- "โ‰ผ": [t: "โ €โ ’โ ชโ ถ"] +- "โ‰ฝ": [t: "โ €โ •โ ’โ ถ"] +- "โŠ‚": [t: "โ €โ ฏโ €"] +- "โŠƒ": [t: "โ €โ นโ €"] +- "โŠ„": [t: "โ ˆโ ฏ"] +- "โŠ…": [t: "โ ˆโ น"] +- "โІ": [t: "โ €โ ฏโ ถ"] +- "โЇ": [t: "โ €โ นโ ถ"] +- "โŠ•": [t: "โ €โ ฐโ –"] +- "โŠฅ": [t: "โ ผโ „"] +- "โŠจ": [t: "โ ผโ Ž"] +- "โŠผ": [t: "โ ฐโ Œ"] +- "โŠฝ": [t: "โ ˜โ ก"] +- "โ‹…": [t: "โ „"] +- "โ‹†": [t: "โ ”"] +- "โ‹ฎ": [t: "โ  โ ฒโ ฒโ ฒ"] +- "โ‹ฏ": [t: "โ  โ ฒโ ฒโ ฒ"] +- "โ‹ฐ": [t: "โ  โ ฒโ ฒโ ฒ"] +- "โ‹ฑ": [t: "โ  โ ฒโ ฒโ ฒ"] +- "โ–ณ": [t: "โ ธโ ™"] +- "โ†’": [t: "โ €โ ’โ •"] +- "โŸถ": [t: "โ €โ ’โ •"] +- "โ†": [t: "โ €โ ฆโ ถ"] +- "โŸต": [t: "โ €โ ฆโ ถ"] +- "โ—ป": [t: "โ ถ"] +- "โ™ฎ": [t: "โ ปโ จโ โ ป"] + +# Latin letters and digits used for mathematical identifiers. +- "a": [t: "lโ "] +- "A": [t: "uโ "] +- "b": [t: "lโ ƒ"] +- "B": [t: "uโ ƒ"] +- "c": [t: "lโ ‰"] +- "C": [t: "uโ ‰"] +- "d": [t: "lโ ™"] +- "D": [t: "uโ ™"] +- "e": [t: "lโ ‘"] +- "E": [t: "uโ ‘"] +- "f": [t: "lโ ‹"] +- "F": [t: "uโ ‹"] +- "g": [t: "lโ ›"] +- "G": [t: "uโ ›"] +- "h": [t: "lโ “"] +- "H": [t: "uโ “"] +- "i": [t: "lโ Š"] +- "I": [t: "uโ Š"] +- "j": [t: "lโ š"] +- "J": [t: "uโ š"] +- "k": [t: "lโ …"] +- "K": [t: "uโ …"] +- "l": [t: "lโ ‡"] +- "L": [t: "uโ ‡"] +- "m": [t: "lโ "] +- "M": [t: "uโ "] +- "n": [t: "lโ "] +- "N": [t: "uโ "] +- "o": [t: "lโ •"] +- "O": [t: "uโ •"] +- "p": [t: "lโ "] +- "P": [t: "uโ "] +- "q": [t: "lโ Ÿ"] +- "Q": [t: "uโ Ÿ"] +- "r": [t: "lโ —"] +- "R": [t: "uโ —"] +- "s": [t: "lโ Ž"] +- "S": [t: "uโ Ž"] +- "t": [t: "lโ ž"] +- "T": [t: "uโ ž"] +- "u": [t: "lโ ฅ"] +- "U": [t: "uโ ฅ"] +- "v": [t: "lโ ง"] +- "V": [t: "uโ ง"] +- "w": [t: "lโ บ"] +- "W": [t: "uโ บ"] +- "x": [t: "lโ ญ"] +- "X": [t: "uโ ญ"] +- "y": [t: "lโ ฝ"] +- "Y": [t: "uโ ฝ"] +- "z": [t: "lโ ต"] +- "Z": [t: "uโ ต"] +- "0": [t: "Nโ š"] +- "1": [t: "Nโ "] +- "2": [t: "Nโ ƒ"] +- "3": [t: "Nโ ‰"] +- "4": [t: "Nโ ™"] +- "5": [t: "Nโ ‘"] +- "6": [t: "Nโ ‹"] +- "7": [t: "Nโ ›"] +- "8": [t: "Nโ “"] +- "9": [t: "Nโ Š"] + +# Lowered digits used in denominators and integer scripts. +- "\ue000": [t: "โ ด"] +- "\ue001": [t: "โ ‚"] +- "\ue002": [t: "โ †"] +- "\ue003": [t: "โ ’"] +- "\ue004": [t: "โ ฒ"] +- "\ue005": [t: "โ ข"] +- "\ue006": [t: "โ –"] +- "\ue007": [t: "โ ถ"] +- "\ue008": [t: "โ ฆ"] +- "\ue009": [t: "โ ”"] + +# Russian literary braille letters for mtext and Cyrillic identifiers. +- "ะฐ": [t: "โ "] +- "ะ": [t: "Cโ "] +- "ะฑ": [t: "โ ƒ"] +- "ะ‘": [t: "Cโ ƒ"] +- "ะฒ": [t: "โ บ"] +- "ะ’": [t: "Cโ บ"] +- "ะณ": [t: "โ ›"] +- "ะ“": [t: "Cโ ›"] +- "ะด": [t: "โ ™"] +- "ะ”": [t: "Cโ ™"] +- "ะต": [t: "โ ‘"] +- "ะ•": [t: "Cโ ‘"] +- "ั‘": [t: "โ ก"] +- "ะ": [t: "Cโ ก"] +- "ะถ": [t: "โ š"] +- "ะ–": [t: "Cโ š"] +- "ะท": [t: "โ ต"] +- "ะ—": [t: "Cโ ต"] +- "ะธ": [t: "โ Š"] +- "ะ˜": [t: "Cโ Š"] +- "ะน": [t: "โ ฏ"] +- "ะ™": [t: "Cโ ฏ"] +- "ะบ": [t: "โ …"] +- "ะš": [t: "Cโ …"] +- "ะป": [t: "โ ‡"] +- "ะ›": [t: "Cโ ‡"] +- "ะผ": [t: "โ "] +- "ะœ": [t: "Cโ "] +- "ะฝ": [t: "โ "] +- "ะ": [t: "Cโ "] +- "ะพ": [t: "โ •"] +- "ะž": [t: "Cโ •"] +- "ะฟ": [t: "โ "] +- "ะŸ": [t: "Cโ "] +- "ั€": [t: "โ —"] +- "ะ ": [t: "Cโ —"] +- "ั": [t: "โ Ž"] +- "ะก": [t: "Cโ Ž"] +- "ั‚": [t: "โ ž"] +- "ะข": [t: "Cโ ž"] +- "ัƒ": [t: "โ ฅ"] +- "ะฃ": [t: "Cโ ฅ"] +- "ั„": [t: "โ ‹"] +- "ะค": [t: "Cโ ‹"] +- "ั…": [t: "โ “"] +- "ะฅ": [t: "Cโ “"] +- "ั†": [t: "โ ‰"] +- "ะฆ": [t: "Cโ ‰"] +- "ั‡": [t: "โ Ÿ"] +- "ะง": [t: "Cโ Ÿ"] +- "ัˆ": [t: "โ ฑ"] +- "ะจ": [t: "Cโ ฑ"] +- "ั‰": [t: "โ ญ"] +- "ะฉ": [t: "Cโ ญ"] +- "ัŠ": [t: "โ ท"] +- "ะช": [t: "Cโ ท"] +- "ั‹": [t: "โ ฎ"] +- "ะซ": [t: "Cโ ฎ"] +- "ัŒ": [t: "โ พ"] +- "ะฌ": [t: "Cโ พ"] +- "ั": [t: "โ ช"] +- "ะญ": [t: "Cโ ช"] +- "ัŽ": [t: "โ ณ"] +- "ะฎ": [t: "Cโ ณ"] +- "ั": [t: "โ ซ"] +- "ะฏ": [t: "Cโ ซ"] diff --git a/Rules/Braille/UEB/unicode-full.yaml b/Rules/Braille/UEB/unicode-full.yaml index f78feac35..373900be3 100644 --- a/Rules/Braille/UEB/unicode-full.yaml +++ b/Rules/Braille/UEB/unicode-full.yaml @@ -294,7 +294,7 @@ - "๐Ÿข-๐Ÿซ": # 0x1d7e2 - 0x1d7eb - tc: "S" - - spell: "translate('.', '๐Ÿถ๐Ÿท๐Ÿธ๐Ÿน๐Ÿบ๐Ÿป๐Ÿผ๐Ÿฝ๐Ÿพ๐Ÿฟ', '0123456789')" + - spell: "translate('.', '๐Ÿข๐Ÿฃ๐Ÿค๐Ÿฅ๐Ÿฆ๐Ÿง๐Ÿจ๐Ÿฉ๐Ÿช๐Ÿซ', '0123456789')" - "๐Ÿถ-๐Ÿฟ": # 0x1d7f6 - 0x1d7ff - spell: "translate('.', '๐Ÿถ๐Ÿท๐Ÿธ๐Ÿน๐Ÿบ๐Ÿป๐Ÿผ๐Ÿฝ๐Ÿพ๐Ÿฟ', '0123456789')" diff --git a/Rules/Intent/general.yaml b/Rules/Intent/general.yaml index ccba41c1f..8e0708940 100644 --- a/Rules/Intent/general.yaml +++ b/Rules/Intent/general.yaml @@ -42,11 +42,18 @@ - name: roman_numeral tag: [mi, mn, mtext] - match: "@data-number" - replace: - - intent: - name: mn - children: [x: "@data-number"] + match: "@data-roman-numeral" + replace: + - test: + if: "../@data-chem-formula" + then: + - intent: + name: mn + children: [x: "@data-number"] + else: + - intent: + name: mi + children: [x: "text()"] - name: positive-or-negative diff --git a/Rules/Languages/de/unicode-full.yaml b/Rules/Languages/de/unicode-full.yaml index 6c9b5e320..636b825dc 100644 --- a/Rules/Languages/de/unicode-full.yaml +++ b/Rules/Languages/de/unicode-full.yaml @@ -3587,10 +3587,10 @@ - "๏”‰": [T: "mutiger nabla"] # 0xf509 (en: 'bold nabla', google translation) - "๐žฉ": [T: "mutiger nabla"] # 0x1d7a9 (en: 'bold nabla', google translation) - - "๏”ฎ": [T: "bold null"] # 0xf52e (en: 'bold zero', google translation) - - "๐ŸŽ": [T: "bold null"] # 0x1d7ce (en: 'bold zero', google translation) - - "๏”ฏ": [T: "mutig"] # 0xf52f (en: 'bold one', google translation) - - "๐Ÿ": [T: "mutig"] # 0x1d7cf (en: 'bold one', google translation) + - "๏”ฎ": [T: "fett null"] # 0xf52e (en: 'bold zero', google translation) + - "๐ŸŽ": [T: "fett null"] # 0x1d7ce (en: 'bold zero', google translation) + - "๏”ฏ": [T: "fett eins"] # 0xf52f (en: 'bold one', google translation) + - "๐Ÿ": [T: "fett eins"] # 0x1d7cf (en: 'bold one', google translation) - "๏”ฐ": [T: "fett zwei"] # 0xf530 (en: 'bold two', google translation) - "๐Ÿ": [T: "fett zwei"] # 0x1d7d0 (en: 'bold two', google translation) - "๏”ฑ": [T: "fett drei"] # 0xf531 (en: 'bold three', google translation) @@ -3599,12 +3599,12 @@ - "๐Ÿ’": [T: "fett vier"] # 0x1d7d2 (en: 'bold four', google translation) - "๏”ณ": [T: "fett fรผnf"] # 0xf533 (en: 'bold five', google translation) - "๐Ÿ“": [T: "fett fรผnf"] # 0x1d7d3 (en: 'bold five', google translation) - - "๏”ด": [T: "mutige sechs"] # 0xf534 (en: 'bold six', google translation) - - "๐Ÿ”": [T: "mutige sechs"] # 0x1d7d4 (en: 'bold six', google translation) + - "๏”ด": [T: "fett sechs"] # 0xf534 (en: 'bold six', google translation) + - "๐Ÿ”": [T: "fett sechs"] # 0x1d7d4 (en: 'bold six', google translation) - "๏”ต": [T: "fett sieben"] # 0xf535 (en: 'bold seven', google translation) - "๐Ÿ•": [T: "fett sieben"] # 0x1d7d5 (en: 'bold seven', google translation) - - "๏”ถ": [T: "mutig bei"] # 0xf536 (en: 'bold eight', google translation) - - "๐Ÿ–": [T: "mutig bei"] # 0x1d7d6 (en: 'bold eight', google translation) + - "๏”ถ": [T: "fett acht"] # 0xf536 (en: 'bold eight', google translation) + - "๐Ÿ–": [T: "fett acht"] # 0x1d7d6 (en: 'bold eight', google translation) - "๏”ท": [T: "fett neun"] # 0xf537 (en: 'bold nine', google translation) - "๐Ÿ—": [T: "fett neun"] # 0x1d7d7 (en: 'bold nine', google translation) - "๏•‚": [T: "null"] # 0xf542 (en: 'zero', google translation) @@ -3623,14 +3623,14 @@ - "๐Ÿจ": [T: "sechs"] # 0x1d7e8 (en: 'six', google translation) - "๏•‰": [T: "sieben"] # 0xf549 (en: 'seven', google translation) - "๐Ÿฉ": [T: "sieben"] # 0x1d7e9 (en: 'seven', google translation) - - "๏•Š": [T: "bei"] # 0xf54a (en: 'eight', google translation) - - "๐Ÿช": [T: "bei"] # 0x1d7ea (en: 'eight', google translation) + - "๏•Š": [T: "acht"] # 0xf54a (en: 'eight', google translation) + - "๐Ÿช": [T: "acht"] # 0x1d7ea (en: 'eight', google translation) - "๏•‹": [T: "neun"] # 0xf54b (en: 'nine', google translation) - "๐Ÿซ": [T: "neun"] # 0x1d7eb (en: 'nine', google translation) - - "๏•Œ": [T: "bold null"] # 0xf54c (en: 'bold zero', google translation) - - "๐Ÿฌ": [T: "bold null"] # 0x1d7ec (en: 'bold zero', google translation) - - "๏•": [T: "mutig"] # 0xf54d (en: 'bold one', google translation) - - "๐Ÿญ": [T: "mutig"] # 0x1d7ed (en: 'bold one', google translation) + - "๏•Œ": [T: "fett null"] # 0xf54c (en: 'bold zero', google translation) + - "๐Ÿฌ": [T: "fett null"] # 0x1d7ec (en: 'bold zero', google translation) + - "๏•": [T: "fett eins"] # 0xf54d (en: 'bold one', google translation) + - "๐Ÿญ": [T: "fett eins"] # 0x1d7ed (en: 'bold one', google translation) - "๏•Ž": [T: "fett zwei"] # 0xf54e (en: 'bold two', google translation) - "๐Ÿฎ": [T: "fett zwei"] # 0x1d7ee (en: 'bold two', google translation) - "๏•": [T: "fett drei"] # 0xf54f (en: 'bold three', google translation) @@ -3639,12 +3639,12 @@ - "๐Ÿฐ": [T: "fett vier"] # 0x1d7f0 (en: 'bold four', google translation) - "๏•‘": [T: "fett fรผnf"] # 0xf551 (en: 'bold five', google translation) - "๐Ÿฑ": [T: "fett fรผnf"] # 0x1d7f1 (en: 'bold five', google translation) - - "๏•’": [T: "mutige sechs"] # 0xf552 (en: 'bold six', google translation) - - "๐Ÿฒ": [T: "mutige sechs"] # 0x1d7f2 (en: 'bold six', google translation) + - "๏•’": [T: "fett sechs"] # 0xf552 (en: 'bold six', google translation) + - "๐Ÿฒ": [T: "fett sechs"] # 0x1d7f2 (en: 'bold six', google translation) - "๏•“": [T: "fett sieben"] # 0xf553 (en: 'bold seven', google translation) - "๐Ÿณ": [T: "fett sieben"] # 0x1d7f3 (en: 'bold seven', google translation) - - "๏•”": [T: "mutig bei"] # 0xf554 (en: 'bold eight', google translation) - - "๐Ÿด": [T: "mutig bei"] # 0x1d7f4 (en: 'bold eight', google translation) + - "๏•”": [T: "fett acht"] # 0xf554 (en: 'bold eight', google translation) + - "๐Ÿด": [T: "fett acht"] # 0x1d7f4 (en: 'bold eight', google translation) - "๏••": [T: "fett neun"] # 0xf555 (en: 'bold nine', google translation) - "๐Ÿต": [T: "fett neun"] # 0x1d7f5 (en: 'bold nine', google translation) - "๏•–": [T: "null"] # 0xf556 (en: 'zero', google translation) @@ -3663,8 +3663,8 @@ - "๐Ÿผ": [T: "sechs"] # 0x1d7fc (en: 'six', google translation) - "๏•": [T: "sieben"] # 0xf55d (en: 'seven', google translation) - "๐Ÿฝ": [T: "sieben"] # 0x1d7fd (en: 'seven', google translation) - - "๏•ž": [T: "bei"] # 0xf55e (en: 'eight', google translation) - - "๐Ÿพ": [T: "bei"] # 0x1d7fe (en: 'eight', google translation) + - "๏•ž": [T: "acht"] # 0xf55e (en: 'eight', google translation) + - "๐Ÿพ": [T: "acht"] # 0x1d7fe (en: 'eight', google translation) - "๏•Ÿ": [T: "neun"] # 0xf55f (en: 'nine', google translation) - "๐Ÿฟ": [T: "neun"] # 0x1d7ff (en: 'nine', google translation) - "๏œ€": [T: "unbekannter charakter"] # 0xf700 (en: 'unknown character', google translation) diff --git a/Rules/Languages/en/SharedRules/default.yaml b/Rules/Languages/en/SharedRules/default.yaml index 56cef80c2..c1f07ec7d 100644 --- a/Rules/Languages/en/SharedRules/default.yaml +++ b/Rules/Languages/en/SharedRules/default.yaml @@ -42,7 +42,10 @@ match: "." replace: - bookmark: "@id" - - x: "translate(., $BlockSeparators, '')" # remove digit block separators + - test: + - if: "@data-roman-numeral" + then: [spell: "text()", pause: "short"] + else: [x: "translate(., $BlockSeparators, '')"] # remove digit block separators - name: default tag: [mo, mtext] @@ -59,7 +62,7 @@ - test: - if: "string-length(.) = 1 and text() != '_'" # need unicode.tdl to kick in for single letter tokens then: [x: "text()"] - - else_if: "@data-chem-element" # NavMode=Character needs this + - else_if: "@data-chem-element or @data-roman-numeral" # NavMode=Character needs this then: [spell: "text()", pause: "short"] else: [x: "translate(., '-_\u00A0', ' ')"] # from intent literals or from extra spaces added (which get deleted) @@ -661,7 +664,7 @@ else: [pause: auto] - name: postfix-intent - # uncaught intent -- the args have been inserted in the order of speech + # uncaught intent -- the args have been inserted in the order of speech tag: "*" match: "count(*)>0 and contains(@data-intent-property, ':postfix:')" replace: diff --git a/Rules/Languages/en/SharedRules/general.yaml b/Rules/Languages/en/SharedRules/general.yaml index 6ff1a604b..57ddcb5c6 100644 --- a/Rules/Languages/en/SharedRules/general.yaml +++ b/Rules/Languages/en/SharedRules/general.yaml @@ -744,7 +744,11 @@ - test: if: "self::m:determinant" then: [t: "determinant"] # phrase(the 2 by 2 'determinant') - else: [t: "matrix"] # phrase(the 2 by 2 'matrix') + else: + - test: + if: "@columnlines and (contains(normalize-space(@columnlines), 'solid') or contains(normalize-space(@columnlines), 'dashed'))" + then: [t: "augmented matrix"] # phrase(the 2 by 2 'augmented matrix') + else: [t: "matrix"] # phrase(the 2 by 2 'matrix') - pause: long - x: "*" - test: @@ -768,7 +772,11 @@ - test: if: "self::m:determinant" then: [t: "determinant"] # phrase(the 2 by 2 'determinant') - else: [t: "matrix"] # phrase(the 2 by 2 'matrix') + else: + - test: + if: "@columnlines and (contains(normalize-space(@columnlines), 'solid') or contains(normalize-space(@columnlines), 'dashed'))" + then: [t: "augmented matrix"] # phrase(the 2 by 2 'augmented matrix') + else: [t: "matrix"] # phrase(the 2 by 2 'matrix') - pause: long - x: "*" - test: diff --git a/Rules/Languages/en/definitions.yaml b/Rules/Languages/en/definitions.yaml index 8bb43d7f3..0945f9395 100644 --- a/Rules/Languages/en/definitions.yaml +++ b/Rules/Languages/en/definitions.yaml @@ -1,7 +1,7 @@ --- - include: "../../definitions.yaml" -# If an "intent" is used, the 'terse:medium:verbose' speech for the intent name is given here for a prefix||infix||postfix||function fixity +# If an "intent" is used, the 'terse:medium:verbose' speech for the intent name is given here for a prefix||infix||postfix||function||nofix||silent fixity # If only one ":" is used, the first part is used for 'terse' and the second part is used for 'medium' and 'verbose' # If no ":"s are used, the same speech is used for all forms # If bracketing words make sense, they are separated with ";"s @@ -10,51 +10,309 @@ # for readability, spaces can be used around any of the delimiter characters # Note: if there are multiple fixities, the first one is used if the fixity is not given in the intent - IntentMappings: { - "indexed-by": "infix= ; sub; end sub: end sub: end subscript", - "modified-variable": "silent= ", - "say-super": "infix=super: superscript: superscript", # used with 'mo' for superscripts (e.g, "<") - "skip-super": "silent=", # used with 'mo' for superscripts (e.g, "*") - - "absolute-value": "function= ; absolute value: the absolute value: the absolute value; end absolute value", "binomial": "infix=binomial; choose; end binomial", - "dimension-product": "infix=by", + + ### Functions and Inverses # "closed-interval": "other=closed-interval; from,to; end closed-interval", + # "closed-interval":"function=closed interval between; and", #NOTE: Check test, does not follow this pattern + #"closed-open-interval":"function=interval between; included and", + #"open-closed-interval":"function=interval between; and included", + #"open-interval":"function=open interval between; and", + "inverse":"function=inverse || postfix=inverse", + + "domain": "function= ; domain", + "codomain": "function= ; codomain", + + "image":"function=image", + #"fraction":"function=fraction; over; end fraction", # NOTE: Fails + "mixed-fraction":"infix=and", # NOTE: in website says function, but follow infix speech pattern. + "quotient":"function=integer part; divided by", # NOTE: Logic somewhere here failing, becomes "divided by of x comma, y" instead of "integer part of x divided by y" + "evaluated-at":"infix=evaluated at", + "remainder":"function=the remainder; divided by", + + "max":"function=max", + "min":"function=min", + + "power":"infix=to the power", + "root":"function=root", + "greatest-common-divisor": "function=gcd: the gcd: the greatest common divisor", + "least-common-multiple":"function=lcm: the lcm: the least common multiple", # In webpage typo "lest common" + + "absolute-value": "function= ; absolute value: the absolute value: the absolute value; end absolute value", + "complex-conjugate":"function=complex conjugate", + "complex-arg":"function=arg", + "real-part": "function=the real part", "imaginary-part": "function=imaginary part: the imaginary part: the imaginary part", - "least-common-multiple": "function=lcm: the lcm: the least common multiple", + + "polar-coordinate":"function=polar coordinate; comma", + "spherical-coordinate":"function=spherical coordinate; comma; comma", + "cartesian-coordinate":"function=cartesian coordinate; comma", + "coordinate":"function=coordinate; comma", + "floor":"function=floor", + "ceiling":"function=ceiling", + "round":"function=rounded-value", + "fractional-part":"function=fractional part", + + + ### Calculus + # "definite-integral":"function=integral over || function=integral from; to", # Property ??? + # "derivative":"function=the derivative; with respect to", # Property ??? + # "partial-derivative":"function=partial", ## Note, included with infix, but separately under calculus tab has ??? for functionality + + "limit": "prefix=limit as:the limit as", + "tends-to":"infix=tends to", + "tends-to-from-above":"infix=tends to from above", + "tends-to-from-below":"infix=tends to from below", + + + ### Sets + "set": "function= ; set: the set", + "set-difference":"function=set difference; and || infix=minus", # NOTE: not tested + "complement":"function=complement", + #"empty-set":"nofix=empty set", + "cardinality":"function=cardinality", # NOTE: does not have a defined speech template in website + "list":"function=list", + "tuple": "function= ; tuple: the tuple", + + + ### Sequence and Series + "sum":"function= ; sum over : sum ; ", #: sum over : sum from; to", + "product":"function=product || function=product over || function=product from; to", + + + ### Elementary classical functions + "sine":"function=sin: sine", + "cosine":"function=cos: cosine", + "tangent":"function=tan: tangent", + "secant":"function=seech: secant", + "cosecant":"function=co-seech: cosecant", + "cotangent":"function=co-tan: cotangent", + + "arcsine":"function=arcsine", + "arccosine":"function=arccosine", + "arctangent":"function=arctangent", + "arcsecant":"function=arcsecant", + "arccosecant":"function=arc-cosecant", + "arccotangent":"function=arc-cotangent", + + "hyperbolic-sine":"function=shine", + "hyperbolic-cosine":"function=cosh", + "hyperbolic-tangent":"function=tanch", + "hyperbolic-secant":"function=sech", + "hyperbolic-cosecant":"function=cosech", + "hyperbolic-cotangent":"function=coth", + + "arc-hyperbolic-sine":"function=arc shine", + "arc-hyperbolic-cosine":"function=arc cosh", + "arc-hyperbolic-tangent":"function=arc tanch", + "arc-hyperbolic-secant":"function=arc sech", + "arc-hyperbolic-cosecant":"function=arc cosech", + "arc-hyperbolic-cotangent":"function=arc coth", + + "exponential":"function=exponential", + "natural-logarithm": "function=l n: natural log: natural log", + "logarithm":"function=log", ##Check arity 2 + + + ### Statistics and Probability + "mean":"function=mean", + "standard-deviation":"function=standard deviation", + "variance":"function=variance", + "median":"function=median", + "mode":"function=mode", + + "conditional-probability":"function=probability; given", # NOTE: Check test + + + ### Linear Algebra + "vector": "function= ; vector || prefix=vector", # prefix not tested, also prefix not on webpage + "matrix":"function=matrix", # NOTE: Failing test, recheck + "determinant":"function=determinant", + "adjugate":"function=adjugate", + "magnitude":"function=magnitude", + "norm": "function=; norm: norm: norm; end norm", + "span":"function=span", + + "unit-vector":"prefix=unit vector", + + "identity-matrix":"nofix=identity matrix", # NOTE: no function specified + "transpose":"function=transpose || postfix=transpose", # postfix needs testing + "dimensional-product":"infix=by", # INFIX + + + ### Constants and Sets + "set-of-integers":"nofix=โ„ค: set of all integers", + "set-of-reals":"nofix=โ„: set of all real numbers", + "set-of-rationals":"nofix=โ„š: set of all rational numbers", + "set-of-natural-numbers":"nofix=โ„•: set of all natural numbers", + "set-of-complex-numbers":"nofix=โ„‚: set of all complex numbers", + "set-of-primes":"nofix=โ„™: set of all prime numbers", + + + ### Geometry + "line-segment":"prefix=line segment", + "directed-line-segment":"prefix=directed line segment", + "line":"prefix=line", + "ray":"prefix=ray", + "arc":"prefix=arc", + + "length":"function=length", + "area":"function=area", + + "point":"prefix=point", ## NOTE: Has ??? for property in site. Should it be prefix? Or something else. + + ### Separators + "time-separator":"infix=", + + ### General Concepts + "fenced-group":"function=fenced-group", # appears both under general concepts and grouping + # NOTE: in site mentions "the pair x and y", due to being defined as function, needs the "of" keyword + "ordered-pair": "function= ; the pair; and", # Needs to be tested, test converts "and" to "comma," + "indexed-by": "infix= ; sub; end sub: end sub: end subscript", + # "indexed-by": "infix= ; indexed by; ", + + "highlight":"postfix=highlighted", + "least-common-denominator":"function=least common denominator", + "rate":"infix=per", + "translation":"function= translation by; comma", # NOTE: not tested, changes "translation" -> "comma" in test + "constraint":"infix= ; with constraint; ", + + "binomial-coefficient":"infix=choose", + "pochhammer":"function=permutation", + "permutation-cycle":"function=permutation cycle", + "embellished-name":"infix=with annotation", + + ### Grouping + "annotation":"infix= ; which is ;", # NOTE: Follows the same order as indexed-by, in site listed as function. Should it be infix? + "braced-group":"function=grouped; end grouped", # NOTE: not tested, site is missing "of" keyword function introduces + #"repeating-decimal":"function=repeating decimal", # NOTE: BREAKS TEST. Check again. Site is missing "of" keyword function introduces. + + + ### Other + ## Default fixity function + "curl": "function=curl", + "divergence": "function=div:divergence", + "gradient": "function=del:gradient", + "laplacian": "function=laplacian", + + ## Default fixity prefix + "angle": "prefix=angle", + "angle-measure": "prefix=angle measure", + "change": "prefix=change in", + "for-all": "prefix=for all", + "measured-angle": "prefix=measured angle", + "not": "prefix=not", + "number-of": "prefix=number of", + "partial-derivative": "prefix=partial", + "right-angle": "prefix=right angle", + "square-root-of": "prefix=square root of", + "there-does-not-exist": "prefix=there does not exist", + "there-exists": "prefix=there exists", + + + ## Default fixity infix + "and": "infix=and", + "applied-to": "infix=applied to", + "approximately": "infix=approximately", + "congruent": "infix=congruent to", + "cartesian-product": "infix=cartesian product", + "composed-with": "infix=composed with", + "cross-product": "infix=cross: cross product: cross product", + "defined-as": "infix=defined as", + "divided-by": "infix=divided by", + "divides": "infix=divides", + "does-not-belong-to": "infix=does not belong to", + "does-not-divide": "infix=does not divide", + "dot-product": "infix=dot product", + "downwards-diagonal-ellipsis": "infix=downwards diagonal ellipsis", + "direct-product": "infix=direct product", + "element-of": "infix=element of", + "ellipsis": "infix=ellipsis", + "equals": "infix=equals", + "equivalent-to": "infix=equivalent to", + "evaluates-to": "infix=evaluates to", + "given": "infix=given", + "greater-than": "infix=greater than", + "greater-than-or-equal-to": "infix=greater than or equal to", + "identically-equals": "infix=identically equals", + "if-and-only-if": "infix=if and only if", + "implies": "infix=implies", + "inner-product": "infix=inner product", + "intersection": "infix=intersection", + "less-than": "infix=less than", + "less-than-or-equal-to": "infix=less than or equal to", + "list-separator": "infix=comma", + "maps-to": "infix=maps to", + "member-of": "infix=member of", + "minus-or-plus": "infix=minus or plus", + "not-subset": "infix=not subset of", + "not-superset": "infix=not superset of", + "not-equal-to": "infix=not equal to", + "not-member-of": "infix=not member of", + "not-parallel-to": "infix=not parallel to", + "obtained-from": "infix=obtained from", + "or": "infix=or", + "outer-product": "infix=outer product", + "parallel-to": "infix=parallel to", + "perpendicular": "infix=perpendicular to", + "plus": "infix=plus || prefix=positive", # Prefix not tested + "minus": "infix=minus || prefix=negative", # Prefix not tested + "plus-or-minus": "infix=plus or minus", + "precedes": "infix=precedes", + "proportional": "infix=proportional to", + "range-separator": "infix=through", + "ratio": "infix=ratio", + "similar": "infix=similar to", + "subset": "infix=subset of", + "subset-or-equal": "infix=subset or equal to", + "succeeds": "infix=succeeds", + "such-that": "infix=such that", + "superset": "infix=superset of", + "superset-or-equal": "infix=superset or equal to", + "tilde": "infix=tilde", + "times": "infix=times", + "union": "infix=union", + "upwards-diagonal-ellipsis": "infix=upwards diagonal ellipsis", + "vertical-ellipsis": "infix=vertical ellipsis", + "xor": "infix=exclusive or", + + ## Default fixity postfix + "factorial": "postfix=factorial", + "percent": "postfix=percent", + + ## Default fixity nofix + "diameter":"nofix=d: diameter", + "distance":"nofix=d; D: distance", + "probability":"nofix=P: probability", + "radius":"nofix=r: radius", + "volume":"nofix=V: volume || function=volume", + "exponential-e":"nofix=e", + "imaginary-i":"nofix=i", + "differential-d":"nofix=d", + "golden-ratio":"nofix=golden ratio", + + + ## Other : Not tested, don't appear in https://w3c.github.io/mathml-docs/intent-core-concepts/ + "modified-variable": "silent= ", + "say-super": "infix=super: superscript: superscript", # used with 'mo' for superscripts (e.g, "<") + "skip-super": "silent=", # used with 'mo' for superscripts (e.g, "*") # "large-op": "infix=over || other=from,to", - "limit": "prefix=limit as: the limit as: the limit as", "lim-sup": "prefix=lim sup as: the limit superior as: the limit superior as", "lim-inf": "prefix=lim inf as: the limit inferior as : the limit inferior as", "logarithm-with-base": "prefix=log base: the log base: the log base", - "natural-logarithm": "function=l n: natural log: natural log", - "minus": "infix=minus || prefix=negative", - "plus": "infix=plus || prefix=positive", # "pochhammer": "infix=permutations of", # arguments are in reverse order, so can't work here - "real-part": "function=the real part", - "set-of-integers": "nofix=set of all integers", - - "transpose": "postfix=transpose || function=transpose", - "norm": "function=; norm: norm: norm; end norm", "trace": "function= ; trace : trace: the trace; end trace", "dimension": "function=; dimension : dimension: the dimension; end dimension", "homomorphism": "function= ; homomorphism : homomorphism: the homomorphism; end homomorphism", "kernel": "function= ; kernel : kernel: the kernel; end kernel", - "vector": "function= ; vector || prefix=vector", - "cross-product": "infix=cross: cross product: cross product", - "dot-product": "infix=dot: dot product: dot: dot product", - - "divergence": "function= ; dihv: divergence: divergence; end divergence", - "curl": "function= ; curl; end curl", - "gradient": "function= ; del: gradient: gradient; end gradient", - "laplacian": "function=lahplahsian", # speech engines don't do a good job with "laplacian" - + "chemistry-concentration": "function= ; concentration: concentration of: the concentration of; end concentration", } # Names of functions that in terse mode don't say "of" (or it's equivalent in other languages) - TerseFunctionNames: { - "divergence", "gradient", "curl" + "divergence", "del:gradient", "curl" } - NavigationParts: { diff --git a/Rules/Languages/en/unicode-full.yaml b/Rules/Languages/en/unicode-full.yaml index beb3e8009..737625b21 100644 --- a/Rules/Languages/en/unicode-full.yaml +++ b/Rules/Languages/en/unicode-full.yaml @@ -3682,7 +3682,8 @@ - spell: "translate('.', '๏•–๏•—๏•˜๏•™๏•š๏•›๏•œ๏•๏•ž๏•Ÿ', '0123456789')" - "๐Ÿข-๐Ÿซ": # 0x1d7e2 - 0x1d7eb - - spell: "translate('.', '๐Ÿถ๐Ÿท๐Ÿธ๐Ÿน๐Ÿบ๐Ÿป๐Ÿผ๐Ÿฝ๐Ÿพ๐Ÿฟ', '0123456789')" + - spell: "translate('.', '๐Ÿข๐Ÿฃ๐Ÿค๐Ÿฅ๐Ÿฆ๐Ÿง๐Ÿจ๐Ÿฉ๐Ÿช๐Ÿซ', '0123456789')" + - "๐Ÿถ-๐Ÿฟ": # 0x1d7f6 - 0x1d7ff - spell: "translate('.', '๐Ÿถ๐Ÿท๐Ÿธ๐Ÿน๐Ÿบ๐Ÿป๐Ÿผ๐Ÿฝ๐Ÿพ๐Ÿฟ', '0123456789')" diff --git a/Rules/Languages/fr/unicode-full.yaml b/Rules/Languages/fr/unicode-full.yaml index 569463afa..dc8ab9db3 100644 --- a/Rules/Languages/fr/unicode-full.yaml +++ b/Rules/Languages/fr/unicode-full.yaml @@ -3686,7 +3686,7 @@ - spell: "translate('.', '๏•–๏•—๏•˜๏•™๏•š๏•›๏•œ๏•๏•ž๏•Ÿ', '0123456789')" - "๐Ÿข-๐Ÿซ": # 0x1d7e2 - 0x1d7eb - - spell: "translate('.', '๐Ÿถ๐Ÿท๐Ÿธ๐Ÿน๐Ÿบ๐Ÿป๐Ÿผ๐Ÿฝ๐Ÿพ๐Ÿฟ', '0123456789')" + - spell: "translate('.', '๐Ÿข๐Ÿฃ๐Ÿค๐Ÿฅ๐Ÿฆ๐Ÿง๐Ÿจ๐Ÿฉ๐Ÿช๐Ÿซ', '0123456789')" - "๐Ÿถ-๐Ÿฟ": # 0x1d7f6 - 0x1d7ff - spell: "translate('.', '๐Ÿถ๐Ÿท๐Ÿธ๐Ÿน๐Ÿบ๐Ÿป๐Ÿผ๐Ÿฝ๐Ÿพ๐Ÿฟ', '0123456789')" diff --git a/Rules/Languages/ru/unicode-full.yaml b/Rules/Languages/ru/unicode-full.yaml index 37967e6c7..ae0f67f09 100644 --- a/Rules/Languages/ru/unicode-full.yaml +++ b/Rules/Languages/ru/unicode-full.yaml @@ -3703,7 +3703,7 @@ - spell: "translate('.', '๏•–๏•—๏•˜๏•™๏•š๏•›๏•œ๏•๏•ž๏•Ÿ', '0123456789')" - "๐Ÿข-๐Ÿซ": # 0x1d7e2 - 0x1d7eb - - spell: "translate('.', '๐Ÿถ๐Ÿท๐Ÿธ๐Ÿน๐Ÿบ๐Ÿป๐Ÿผ๐Ÿฝ๐Ÿพ๐Ÿฟ', '0123456789')" + - spell: "translate('.', '๐Ÿข๐Ÿฃ๐Ÿค๐Ÿฅ๐Ÿฆ๐Ÿง๐Ÿจ๐Ÿฉ๐Ÿช๐Ÿซ', '0123456789')" - "๐Ÿถ-๐Ÿฟ": # 0x1d7f6 - 0x1d7ff - spell: "translate('.', '๐Ÿถ๐Ÿท๐Ÿธ๐Ÿน๐Ÿบ๐Ÿป๐Ÿผ๐Ÿฝ๐Ÿพ๐Ÿฟ', '0123456789')" diff --git a/Rules/Languages/vi/SharedRules/default.yaml b/Rules/Languages/vi/SharedRules/default.yaml index 314e63344..9eeb6267f 100644 --- a/Rules/Languages/vi/SharedRules/default.yaml +++ b/Rules/Languages/vi/SharedRules/default.yaml @@ -44,15 +44,15 @@ if: "@data-roman-numeral" then: - test: - if: "parent::*[1][self::m:chemical-formula]" + if: "../self::m:chemical-formula" then: - t: "hรณa trแป‹" - x: "@data-number" + - test: + if: "$Verbosity = 'Verbose'" + then: [t: "la mรฃ"] else: - - x: "@data-number" - - test: - if: "$Verbosity = 'Verbose'" - then: [t: "la mรฃ"] + - x: "text()" else: # FIX: removing the digit block separators is likely locale dependent - x: "translate(., ' `', '')" # remove digit block separators diff --git a/Rules/Languages/zh/tw/SharedRules/default.yaml b/Rules/Languages/zh/tw/SharedRules/default.yaml index 4b7cae70f..b127189d8 100644 --- a/Rules/Languages/zh/tw/SharedRules/default.yaml +++ b/Rules/Languages/zh/tw/SharedRules/default.yaml @@ -131,17 +131,17 @@ - test: if: "$Verbosity!='Terse'" then: [T: ""] # phrase("'the' root of x") + - T: "ๆ นๆŒ‡ๆ•ธ" # phrase("the root of x 'with index' 5") + - x: "*[2]" - T: "ๆ น่™Ÿ" - - T: "้–‹ๆ–นๆฌกๆ•ธ" # phrase("the root of x 'with index' 5") - - x: "*[1]" - pause: short - test: if: "$Verbosity!='Terse'" then: [T: ""] # phrase("the root 'of' x") - - x: "*[2]" + - x: "*[1]" - pause: short - test: - if: "not(IsNode(*[2],'leaf'))" + if: "not(IsNode(*[1],'leaf'))" then: [T: "็ตๆŸๆ น่™Ÿ"] # phrase("root of x 'end root symbol'") @@ -406,7 +406,7 @@ - NumColumns: "count(*[1]/*) - IfThenElse(*/self::m:mlabeledtr, 1, 0)" match: "." replace: - - T: "่กจ" # phrase(the 'table with' 3 rows) + - T: "่กจๆ ผๆœ‰" # phrase(the 'table with' 3 rows) - x: count(*) - test: if: count(*)=1 diff --git a/Rules/Languages/zh/tw/SharedRules/geometry.yaml b/Rules/Languages/zh/tw/SharedRules/geometry.yaml index e4241c0f4..85a6c6ba4 100644 --- a/Rules/Languages/zh/tw/SharedRules/geometry.yaml +++ b/Rules/Languages/zh/tw/SharedRules/geometry.yaml @@ -23,12 +23,12 @@ - test: if: "$Verbosity='Verbose'" then: - - T: "ๅ‘้‡" # phrase('the ray from' A to B) + - T: "ๅฐ„็ทš" # phrase('the ray from' A to B) - x: "*[1]" - T: "ๅˆฐ" # phrase(the ray from A 'to' B) - x: "*[2]" else: - - T: "ๅ‘้‡" # phrase(the 'ray'A B) + - T: "ๅฐ„็ทš" # phrase(the 'ray'A B) - x: "*[1]" - x: "*[2]" diff --git a/Rules/Languages/zh/tw/SimpleSpeak_Rules.yaml b/Rules/Languages/zh/tw/SimpleSpeak_Rules.yaml index 10a487480..7877cb2e3 100644 --- a/Rules/Languages/zh/tw/SimpleSpeak_Rules.yaml +++ b/Rules/Languages/zh/tw/SimpleSpeak_Rules.yaml @@ -36,7 +36,7 @@ tag: root match: "." replace: - - T: "ๆ น่™Ÿ" + - T: "" - x: "*[1]" - test: if: "$Verbosity!='Terse'" diff --git a/Rules/Languages/zh/tw/definitions.yaml b/Rules/Languages/zh/tw/definitions.yaml index 93460509a..280ec6039 100644 --- a/Rules/Languages/zh/tw/definitions.yaml +++ b/Rules/Languages/zh/tw/definitions.yaml @@ -48,28 +48,28 @@ } - NavigationParts: { - "large-op": "base; lower limit; upper limit", - "mfrac": "numerator;denominator", - "fraction": "numerator;denominator", - "msqrt": "root", - "square-root": "root", - "mroot": "root;root index", - "root": "root;root index", - "msub": "base;subscript", - "sub": "base;subscript", - "msup": "base;superscript", - "say-super": "base;superscript", - "skip-super": "base;superscript", - "power": "base;exponent", - "msubsup": "base;subscript;superscript", - "munder": "base;under limit", - "mover": "base;upper limit", - "munderover": "base;under limit;upper limit", + "large-op": "ๅŸบๅบ•; ไธ‹้™; ไธŠ้™", + "mfrac": "ๅˆ†ๅญ;ๅˆ†ๆฏ", + "fraction": "ๅˆ†ๅญ;ๅˆ†ๆฏ", + "msqrt": "ๆ น่™Ÿ", + "square-root": "ๆ น่™Ÿ", + "mroot": "ๆ น่™Ÿ;ๆ นๆŒ‡ๆ•ธ", + "root": "ๆ น่™Ÿ;ๆ นๆŒ‡ๆ•ธ", + "msub": "ๅŸบๅบ•;ไธ‹ๆจ™", + "sub": "ๅŸบๅบ•;ไธ‹ๆจ™", + "msup": "ๅŸบๅบ•;ไธŠๆจ™", + "say-super": "ๅŸบๅบ•;ไธŠๆจ™", + "skip-super": "ๅŸบๅบ•;ไธŠๆจ™", + "power": "ๅŸบๅบ•;ๆŒ‡ๆ•ธ", + "msubsup": "ๅŸบๅบ•;ไธ‹ๆจ™;ไธŠๆจ™", + "munder": "ๅŸบๅบ•;ไธ‹้™", + "mover": "ๅŸบๅบ•;ไธŠ้™", + "munderover": "ๅŸบๅบ•;ไธ‹้™;ไธŠ้™", # words for moving into and out of one of the parts (e.g., "move right 'out of' numerator, 'in' denominator") # it's a hack to put them here, but at least they are grouped with the other navigation parts - "in": "in", - "out": "out of", + "in": "้€ฒๅ…ฅ", + "out": "้›ข้–‹", } @@ -90,7 +90,7 @@ "g": "ๅ…‹", "m": "็ฑณ", # British spelling works for US also "mol": "่Žซ่€ณ", - "s": "็ง’", "โ€ณ": "็ง’", "\"": "็ง’", "sec": "็ง’", # "sec" not actually legal + "s": "็ง’", "sec": "็ง’", # "sec" not actually legal # derived units "Bq": "่ฒๅ…‹", diff --git a/Rules/Languages/zh/tw/navigate.yaml b/Rules/Languages/zh/tw/navigate.yaml index a41067957..0e94a5350 100644 --- a/Rules/Languages/zh/tw/navigate.yaml +++ b/Rules/Languages/zh/tw/navigate.yaml @@ -3,9 +3,9 @@ # # The general form for many rules is: # 1. Say the command if this is first rule to fire (MatchCounter) and depending upon "NavVerbosity"s value +# This will increment MatchCounter so that the command won't be spoken again # 2. Say info about moving into/out of 2D structures # 3. Set some variables and possibly recurse. -# If recursing, "MatchCounter" should be incremented. # If stopping, "NavNode" should be set. # # The meaning of NavVerbosity: @@ -33,119 +33,86 @@ # ReadZoomLevel -- -1 for Enhanced, otherwise the distance from leaf the rules should maintain # PlaceMarkerIndex +# Note: the rules for saying a command and announcing what is said when moving in/out of a 2d exprs are hacks +# They depend upon special variables "SayCommand" and "Move2D" being set and if they are, the rules are activated. +# If/when functions can be defined in a rules file, it is likely these would be much better done via those functions +# as they would likely be much more efficient and also cleaner. -# Rules for speaking what happens when moving into or out of a notation -- name: into-or-out-of - tag: mfrac - match: "$Move2D != ''" +# Rules for announcing the command +- name: say-command + tag: "!*" + match: "$SayCommand != ''" # value should be '', 'true', or 'false' + variables: [Prefix: "''"] replace: - - x: "$Move2D" - test: - if: "count($Child2D/preceding-sibling::*)=0" - then: - test: - if: "$Child2D/..[@linethickness='0']" - then: [T: "ๅ…จ"] # phrase(the 'numerator' of a fraction) - else: [T: "ๅˆ†ๅญ"] - else: - test: - if: "$Child2D/..[@linethickness='0']" - then: [T: "้ธ"] - else: [T: "ๅˆ†ๆฏ"] # phrase(the 'denominator' of a fraction) - - pause: "medium" - -- name: into-or-out-of - tag: msqrt - match: "$Move2D != ''" - replace: - - x: "$Move2D" - - T: "ๅนณๆ–นๆ นๅ…ง" # phrase(the 'square root' of x) - - pause: "medium" - -- name: into-or-out-of - tag: mroot - match: "$Move2D != ''" - replace: - - x: "$Move2D" - - test: - if: "count($Child2D/preceding-sibling::*)=0" - then: [T: "ๆ น่™Ÿๅ…ง"] # phrase(the cube 'root' of x) - else: [T: "้–‹ๆ–นๆฌกๆ•ธ"] # phrase(the 'root index' of x is 3) - - pause: "medium" - -- name: into-or-out-of - tag: msub - match: "$Move2D != ''" - replace: - - x: "$Move2D" - - test: - if: "count($Child2D/preceding-sibling::*)=0" - then: [T: "ๅŸบๆœฌ"] # phrase(the 'base' of the power) - else: [T: "ไธ‹ๆจ™"] # phrase(x with 'subscript' 2) - - pause: "medium" - -- name: into-or-out-of - tag: msup - match: "$Move2D != ''" - replace: - - x: "$Move2D" - - test: - if: "count($Child2D/preceding-sibling::*)=0" - then: [T: "ๅŸบๆœฌ"] # phrase(the 'base' of the power) - else: [T: "ไธŠๆจ™"] # phrase(x with 'superscript' 2) # FIX: it would be better to use the word used when reading (power, exponent, ...) - - pause: "medium" - -- name: into-or-out-of - tag: msubsup - match: "$Move2D != ''" - replace: - - x: "$Move2D" - - test: - - if: "count($Child2D/preceding-sibling::*)=0" - then: [T: "ๅŸบๆœฌ"] # phrase(the 'base' of the power) - - else_if: "count($Child2D/preceding-sibling::*)=1" - then: [T: "ไธ‹ๆจ™"] # phrase(x with 'subscript' 2) - else: [T: "ไธŠๆจ™"] # phrase(x with 'superscript' 2) # FIX: it would be better to use the word used when reading (power, exponent, ...) - - pause: "medium" - -- name: into-or-out-of - tag: munder - match: "$Move2D != ''" - replace: - - x: "$Move2D" - - test: - if: "count($Child2D/preceding-sibling::*)=0" - then: [T: "ๅŸบๆœฌ"] # phrase(the 'base' of the power) - else: [T: "ไธ‹ๅฑค"] # phrase(the 'lower limit' of the function is zero) - - pause: "medium" - -- name: into-or-out-of - tag: mover - match: "$Move2D != ''" - replace: - - x: "$Move2D" - - test: - if: "count($Child2D/preceding-sibling::*)=0" - then: [T: "ๅŸบๆœฌ"] # phrase(the 'base' of the power) - else: [T: "ไธŠๅฑค"] # phrase(the 'upper limit' of the function is zero) - - pause: "medium" + - if: "$MatchCounter = 0 and $SayCommand = 'true'" + then_test: + - if: "self::m:math and starts-with($NavCommand, 'ZoomOut')" + then: [T: "ๅทฒๅฎŒๅ…จ็ธฎๅฐ", pause: "medium"] + - else_if: "IsNode(., 'leaf') and starts-with($NavCommand, 'ZoomIn')" + then: [T: "ๅทฒๅฎŒๅ…จๆ”พๅคง", pause: "medium"] + else: + - test: + - if: "starts-with($NavCommand, 'Zoom')" + then: [set_variables: [Prefix: "' '"]] # phrase('zoom' in to see more details) #hjy -- 'zoom' is a bit weird in Chinese, so skip it. + - else_if: "starts-with($NavCommand, 'Move')" + then: [set_variables: [Prefix: "'็งปๅˆฐ'"]] # phrase('move' to next entry in table) + - else_if: "starts-with($NavCommand, 'Read')" + then: [set_variables: [Prefix: "'่ฎ€ๅ‡บ'"]] # phrase('read' to next entry in table) + - else_if: "starts-with($NavCommand, 'Describe')" + then: [set_variables: [Prefix: "'ๆ่ฟฐ'"]] # phrase('describe' to next entry in table) + - test: + if: "$Prefix != ''" + then: + - x: "$Prefix" + - test: + - if: "substring($NavCommand, 5) = 'In'" + then: [T: "ๆ”พๅคง"] # phrase(zoom 'in' to see more details) + - else_if: "substring($NavCommand, 5) = 'InAll'" + # HACK: '\uF8FE' is used internally for the concatenation char by 'ct' -- this gets "ed" concatenated to "zoom" + then: [T: "ๅฎŒๅ…จๆ”พๅคง"] # phrase(zoom 'out all the way' to see more details) + - else_if: "substring($NavCommand, 5) = 'Out'" + then: [T: "็ธฎๅฐ"] # phrase(zoom 'out' to see more details) + - else_if: "substring($NavCommand, 5) = 'OutAll'" + # HACK: '\uF8FE' is used internally for the concatenation char by 'ct' -- this gets "ed" concatenated to "zoom" + then: [T: "ๅฎŒๅ…จ็ธฎๅฐ"] # phrase(zoom 'out all the way' to see more details) + - else_if: "substring($NavCommand, 5) = 'Next'" # string-length($Prefix)+1 ###fix by hjy + then: [T: "ไธ‹ไธ€้ …"] # phrase(move to the 'right') + - else_if: "substring($NavCommand, 9) = 'Next'" # string-length($Prefix)+1 ###fix by hjy for describe + then: [T: "ไธ‹ไธ€้ …"] # phrase(move to the 'right') + - else_if: "substring($NavCommand, 5) = 'Previous'" #string-length($Prefix)+1 ###fix by hjy + then: [T: "ไธŠไธ€้ …"] # phrase(move to the 'left') + - else_if: "substring($NavCommand, 9) = 'Previous'" #string-length($Prefix)+1 ###fix by hjy for describe + then: [T: "ไธŠไธ€้ …"] # phrase(move to the 'left') + - else_if: "substring($NavCommand, 5) = 'Current'" + then: [T: "็›ฎๅ‰"] # phrase(who is the 'current' president) + - else_if: "substring($NavCommand, 9) = 'Current'" + then: [T: "็›ฎๅ‰"] # phrase(who is the 'current' president) + - else_if: "substring($NavCommand, 5) = 'LineStart'" + then: [T: "ๅˆฐ่กŒ้ฆ–"] # phrase(move 'to start of line') + - else_if: "substring($NavCommand, 5) = 'LineEnd'" + then: [T: "ๅˆฐ่กŒๅฐพ"] # phrase(move 'to end of line') + - pause: "medium" + - set_variables: [MatchCounter: "$MatchCounter + 1"] + +- name: into-or-out-of-silent + tag: "*" + # saying "out of row n" is not very useful, so skip it + match: "$Move2D != '' and (not(@data-from-mathml) or @data-from-mathml = name(.)) and + (name(.)='mrow' or name(.) = 'mtr' or name(.) = 'mlabeledtr' or @data-from-mathml = 'mtable')" + replace: [] -- name: into-or-out-of - tag: munderover - match: "$Move2D != ''" +- name: into-or-out-of-mtr + tag: [mtr, mlabeledtr] + match: "$Move2D = '้€ฒๅ…ฅ'" replace: - - x: "$Move2D" - - test: - - if: "count($Child2D/preceding-sibling::*)=0" - then: [T: "ๅŸบๆœฌ"] # phrase(the 'base' of the power) - - else_if: "count($Child2D/preceding-sibling::*)=1" - then: [T: "ไธ‹ๅฑค"] # phrase(the 'lower limit' of the function is zero) - else: [T: "ไธŠๅฑค"] # phrase(the 'upper limit' of the function is zero) + - T: "่กŒ" + - x: "count($Child2D/preceding-sibling::*)+1" - pause: "medium" -- name: into-or-out-of - tag: mmultiscripts - match: "$Move2D != ''" +- name: into-or-out-of-mmultiscripts + tag: "*" + match: "$Move2D != '' and (@data-from-mathml='mmultiscripts' or self::m:mmultiscripts)" replace: - test: if: "name($Child2D)!='none'" @@ -157,36 +124,45 @@ - x: "$Move2D" - test: - if: "$NumPrecedingSiblings=0" - then: [T: "ๅŸบๆœฌ"] # phrase(the 'base' of the power) + then: [T: "ๅŸบๅบ•"] # phrase(the 'base' of the power) - else_if: "$Child2D/preceding-sibling::*[self::m:mprescripts]" # are we before mprescripts and hence are postscripts then: - test: # in postscripts -- base shifts by one - if: "$NumPrecedingSiblings mod 2 = 0" - then: [T: "ไธ‹ๆจ™"] # phrase(x with 'subscript' 2) - else: [T: "ไธŠๆจ™"] # phrase(x with 'superscript' 2) + if: "$NumPrecedingSiblings mod 2 = 0" + then: [T: "ๅ‰ไธ‹ๆจ™"] # phrase(x with 'subscript' 2) + else: [T: "ๅ‰ไธŠๆจ™"] # phrase(x with 'superscript' 2) else: - test: if: "$NumPrecedingSiblings mod 2 = 0" - then: [T: "ไธŠๆจ™"] # phrase(x with 'superscript' 2) - else: [T: "ไธ‹ๆจ™"] # phrase(x with 'subscript' 2) + then: [T: "ไธŠๆจ™"] # phrase(x with 'pre-superscript' 2) + else: [T: "ไธ‹ๆจ™"] # phrase(x with 'pre-subscript' 2) - pause: "medium" -- name: into-or-out-of - tag: mtd - match: "$Move2D = '้€ฒๅ…ฅ'" - replace: - - x: "$Move2D" - - T: "่กŒ" # phrase(the first 'column' in the table) - - x: "count($Child2D/preceding-sibling::*)+1" - - pause: "medium" - -- name: into-or-out-of - tag: [mtr, mlabeledtr] - match: "$Move2D = '้€ฒๅ…ฅ'" +# Rules for speaking what happens when moving into or out of a notation +- name: into-or-out-of-default + tag: "*" + # saying "out of row n" is not very useful, so skip it + # match: "$Move2D != '' and @data-from-mathml and @data-from-mathml != name(.) and count(*)>1 and @data-from-mathml != 'mtable'" + match: "$Move2D != '' and not(self::m:math or @data-from-mathml = 'mtable' or @data-from-mathml = 'mtd') " replace: - - x: "$Move2D" - - x: "count($Child2D/preceding-sibling::*)+1" - - pause: "medium" + - with: + variables: + - PartNumber: "count($Child2D/preceding-sibling::*)" + - PartName: "GetNavigationPartName(name(.), $PartNumber)" + replace: + - x: "$Move2D" + - test: + - if: "$PartName != ''" + then: [x: "$PartName"] + - else_if: "count(*) = 1" + then_test: + if: "$NavVerbosity = 'Verbose'" + then: [x: "translate(name(.), '-_', ' ')"] # e.g., "in absolute value" + else: + - T: "็ฌฌ" # phrase(the 'part' of the expression) + - x: "count($Child2D/preceding-sibling::*) + 1" + - T: "้ƒจๅˆ†" # phrase(the 'part' of the expression) + - pause: "medium" - name: default-move # nothing to do (not 2D) -- need to catch $Move2D though so rules based on NavCommand don't trigger @@ -207,20 +183,20 @@ then: - test: - if: "$PreviousNavCommand = 'ZoomIn'" - then: [T: "ๆ’คๆถˆๆ”พๅคง"] # phrase('undo zoom in') + then: [T: "ๅพฉๅŽŸๆ”พๅคง"] # phrase('undo zoom in') - else_if: "$PreviousNavCommand = 'ZoomOut'" - then: [T: "ๆ’คๆถˆ็ธฎๅฐ"] # phrase('undo zoom out') + then: [T: "ๅพฉๅŽŸ็ธฎๅฐ"] # phrase('undo zoom out') - else_if: "$PreviousNavCommand = 'ZoomInAll'" - then: [T: "ไธ€่ทฏๆ’คๆถˆๆ”พๅคง"] # phrase('undo zooming in all the way') + then: [T: "ๅพฉๅŽŸๅฎŒๅ…จๆ”พๅคง"] # phrase('undo zooming in all the way') - else_if: "$PreviousNavCommand = 'ZoomOutAll'" - then: [T: "ไธ€่ทฏๆ’คๆถˆ็ธฎๅฐ"] # phrase('undo zooming out all the way') + then: [T: "ๅพฉๅŽŸๅฎŒๅ…จ็ธฎๅฐ"] # phrase('undo zooming out all the way') - else_if: "$PreviousNavCommand = 'MovePrevious' or $PreviousNavCommand = 'MovePreviousZoom'" - then: [T: "ๆ’คๆถˆๅ‘ๅทฆ็งปๅ‹•"] # phrase('undo move left') + then: [T: "ๅพฉๅŽŸ็งปๅˆฐไธŠไธ€้ …"] # phrase('undo move left') - else_if: "$PreviousNavCommand = 'MoveNext' or $PreviousNavCommand = 'MoveNextZoom'" - then: [T: "ๆ’คๆถˆๅ‘ๅณ็งปๅ‹•"] # phrase('undo move right') + then: [T: "ๅพฉๅŽŸ็งปๅˆฐไธ‹ไธ€้ …"] # phrase('undo move right') - else_if: "$PreviousNavCommand = 'None'" - then: [T: "ๆฒ’ๆœ‰ไปฅๅ‰็š„ๅ‘ฝไปค"] # phrase('no previous command') - - pause: "long" + then: [T: "ๆฒ’ๆœ‰ๅ‰ไธ€ๆŒ‡ไปค"] # phrase('no previous command') + - pause: "medium" - set_variables: [NavNode: "@id"] # many times, for typographic reasons, people include punctuation at the end of a math expr @@ -242,40 +218,32 @@ replace: - test: if: "$MatchCounter = 0 and $NavVerbosity != 'Terse'" - then: [T: "ไธ€่ทฏๆ”พๅคง", pause: "long"] # phrase('zoomed in all of the way') + then: [T: "ๅทฒๅฎŒๅ…จๆ”พๅคง", pause: "long"] # phrase('zoomed in all of the way') - test: if: "$ReadZoomLevel!=-1" then: - set_variables: [ReadZoomLevel: "0"] - set_variables: [NavNode: "@id"] -# special case of zooming into a matrix or determinant -- move to the first row -- name: zoom-in-matrix - - tag: mrow - match: - - "$NavCommand = 'ZoomIn' and count(*)=3 and " - - "*[2][self::m:mtable and (IsBracketed(., '(', ')') or IsBracketed(., '[', ']') or IsBracketed(., '|', '|'))]" - replace: - - test: - if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" - then: [T: "ๆ”พๅคง", pause: "long"] # phrase('zoom in') - - set_variables: [NavNode: "*[2]/*[1]/@id"] - -# special case of zooming into a table -- move to the first row +# special case of zooming into a table -- move to the first row (if only one row, first column) - name: zoom-in-table - tag: mtable - match: "$NavCommand = 'ZoomIn'" + tag: "*" + match: "$NavCommand = 'ZoomIn' and (name(.) = 'mtable' or (count(*)=1 and *[1][@data-from-mathml='mtable']))" replace: + - with: + variables: [SayCommand: "string($NavVerbosity = 'Verbose')"] + replace: [x: "."] - test: - if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" - then: [T: "ๆ”พๅคง", pause: "long"] # phrase('zoom in') - - set_variables: [NavNode: "*[1]/@id"] + if: "count(*)=1" + then: + - set_variables: [NavNode: "*[1]/*[1]/@id"] + else: + - set_variables: [NavNode: "*[1]/@id"] - name: zoom-in-mrow-in-math - # Moving to first or last is meaningless the 'math' has only an 'mrow' inside -- dig inside and do it again + # zooming in only once is meaningless because 'math' has only a single child and it was spoken at the math level -- dig inside and do it again tag: math - match: "count(*)=1 and ($NavCommand = 'ZoomIn' or $NavCommand = 'MoveNextZoom' or $NavCommand = 'MovePreviousZoom')" + match: "$NavCommand = 'ZoomIn' or $NavCommand = 'MoveNextZoom' or $NavCommand = 'MovePreviousZoom'" replace: - test: if: "$NavCommand = 'MovePreviousZoom'" @@ -289,117 +257,119 @@ match: - "($NavCommand = 'ZoomIn' or " - " ($NavCommand = 'MoveNextZoom' or $NavCommand = 'MovePreviousZoom') and $NavMode='Enhanced') and " - - "count(*)=1 and (*[1][self::m:mrow] and not(self::m:msqrt or self::m:menclose))" + - "count(*)=1 and + (*[1][self::m:mrow or @data-from-mathml='mrow'] and + not(@data-from-mathml='msqrt' or self::m:msqrt or @data-from-mathml='menclose' or self::m:menclose))" replace: - - test: - if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" - then: [T: "ๆ”พๅคง", pause: "long"] # phrase('zoom in') - with: - variables: [MatchCounter: "$MatchCounter + 1"] - replace: - - test: - if: "$NavCommand = 'MovePreviousZoom'" - then: [x: "*[last()]"] - else: [x: "*[1]"] + variables: [SayCommand: "string($NavVerbosity = 'Verbose')"] + replace: [x: "."] + - test: + if: "name(*[1]) != 'mrow'" + then: + - with: + variables: [Move2D: "'้€ฒๅ…ฅ'", Child2D: "IfThenElse(count(*)=0, $Move2D, $Move2D)"] # phrase('in' the denominator) + replace: [x: "IfThenElse($NavCommand = 'MovePreviousZoom', 1, $Child2D)"] + - test: + if: "$NavCommand = 'MovePreviousZoom'" + then: [x: "*[last()]"] + else: [x: "*[1]"] - name: zoom-in-enhanced - tag: "*" match: "$NavCommand = 'ZoomIn' and $NavMode='Enhanced'" replace: - - test: - if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" - then: [T: "ๆ”พๅคง", pause: "long"] # phrase('zoom in') + - with: + variables: [SayCommand: "string($NavVerbosity = 'Verbose')"] + replace: [x: "."] - test: - if: "self::m:mtr or self::m:mlabeledtr" then: - with: - variables: [Move2D: "'ๅœจ'", Child2D: "*[1]/*[1]"] # phrase('in' the denominator) + variables: [Move2D: "'้€ฒๅ…ฅ'", Child2D: "*[1]/*[1]"] # phrase('in' the denominator) replace: [x: "."] - set_variables: [NavNode: "*[1]/*[1]/@id"] # skip mtd - - else_if: "*[1][self::m:mrow and IsBracketed(., '(', ')', false) or IsBracketed(., '[', ']', false)]" # auto zoom + - else_if: "*[1][self::m:mrow and (IsBracketed(., '(', ')', false) or IsBracketed(., '[', ']', false))]" # auto zoom then: - with: - variables: [Move2D: "'ๅœจ'", Child2D: "*[1]"] # phrase('in' the denominator) + variables: [Move2D: "'้€ฒๅ…ฅ'", Child2D: "*[1]"] # phrase('in' the denominator) replace: [x: "."] - set_variables: [NavNode: "*[1]/*[2]/@id"] # skip parens/brackets else: - with: - variables: [Move2D: "'ๅœจ'", Child2D: "*[1]"] # phrase('in' the denominator) + variables: [Move2D: "'้€ฒๅ…ฅ'", Child2D: "*[1]"] # phrase('in' the denominator) replace: [x: "."] - set_variables: [NavNode: "*[1]/@id"] -- name: zoom-in-2D-not-enhanced + +- name: zoom-in-simple tag: "*" - match: "$NavCommand = 'ZoomIn' and $NavMode!='Enhanced' and IsNode(., '2D')" + match: "$NavCommand = 'ZoomIn' and $NavMode='Simple'" replace: - - test: - if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" - then: [T: "ๆ”พๅคง", pause: "long"] # phrase('zoom in') - with: - variables: [Move2D: "'ๅœจ'", Child2D: "*[1]"] # phrase('in' the denominator) + variables: [SayCommand: "string($NavVerbosity = 'Verbose')"] replace: [x: "."] - - with: - variables: [MatchCounter: "$MatchCounter + 1", NavCommand: "'MoveNextZoom'"] - replace: [x: "*[1]"] + - test: + if: "DEBUG($MatchCounter) > 1 and IsNode(., '2D') " + then: [set_variables: [NavNode: "@id"]] # time to stop, not going "in" to next thing, so before "Move2D" + else: + - with: + variables: [Move2D: "'้€ฒๅ…ฅ'", Child2D: "*[1]"] # phrase('in' the denominator) + replace: [x: "."] + - x: "*[1]" -- name: zoom-in-default + # At this point, we are zooming in on a non-2D element, non-leaf in Character mode +- name: zoom-in-2D-character tag: "*" - match: "$NavCommand = 'ZoomIn'" + match: "$NavCommand = 'ZoomIn' and (IsNode(., '2D') or not(IsNode(., 'mathml')))" replace: - - test: - if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" - then: [T: "ๆ”พๅคง", pause: "long"] # phrase('zoom in') - with: - variables: [Move2D: "'ๅœจ'", Child2D: "*[1]"] # phrase('in' the denominator) + variables: [SayCommand: "string($NavVerbosity = 'Verbose')"] + replace: [x: "."] + - with: + variables: [Move2D: "'้€ฒๅ…ฅ'", Child2D: "*[1]"] # phrase('in' the denominator) replace: [x: "."] - test: - if: "$NavMode='Character'" + if: "$NavMode = 'Simple'" then: + - set_variables: [NavNode: "*[1]/@id"] + else: - with: - variables: [MatchCounter: "$MatchCounter + 1"] + variables: [NavCommand: "'MoveNextZoom'"] replace: [x: "*[1]"] - else_test: - if: "self::m:mtd" - then: [x: "*[1]"] - else: - - test: - if: "$ReadZoomLevel!=-1" - then: - - set_variables: [ReadZoomLevel: "DistanceFromLeaf(*[1], true, $NavMode!='Character')"] - - set_variables: [NavNode: "*[1]/@id"] + + # At this point, we are zooming in on a non-2D element, non-leaf in Character mode +- name: zoom-in-default + tag: "*" + match: "$NavCommand = 'ZoomIn'" + replace: + - with: + variables: [SayCommand: "string($NavVerbosity = 'Verbose')"] + replace: [x: "."] + - x: "*[1]" + - name: zoom-in-all-default tag: "*" match: "$NavCommand = 'ZoomInAll'" replace: - - test: - if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" - then: [T: "ไธ€่ทฏๆ”พๅคง", pause: "medium"] # phrase('zoom in all the way') - with: - variables: [Move2D: "'ๅœจ'", Child2D: "*[1]"] # phrase('in' the denominator) + variables: [SayCommand: "string($NavVerbosity = 'Verbose')"] replace: [x: "."] - with: - variables: [MatchCounter: "$MatchCounter + 1"] - replace: [x: "*[1]"] + variables: [Move2D: "'้€ฒๅ…ฅ'", Child2D: "*[1]"] # phrase('in' the denominator) + replace: [x: "."] + - x: "*[1]" - name: zoom-out tag: math match: "$NavCommand = 'ZoomOut' or $NavCommand = 'ZoomOutAll'" replace: - - test: - if: "$MatchCounter = 0 and $NavVerbosity != 'Terse'" - then: [T: "ไธ€่ทฏ็ธฎๅฐ", pause: "long"] # phrase('zoomed out all the the way') + - with: + variables: [SayCommand: "string($NavVerbosity = 'Verbose')"] + replace: [x: "."] - set_variables: [NavNode: "*[1]/@id"] # no-op for $NavCommand = 'ZoomOut' -- name: zoom-out-top - tag: "*" - match: - - "($NavCommand = 'ZoomOut' or $NavCommand = 'ZoomOutAll') and" - - "parent::m:math " - replace: - - x: ".." # let math rule deal with it - - name: skip-punct-at-end-zoom-out tag: mrow match: @@ -409,19 +379,25 @@ replace: - x: ".." +- name: zoom-out-top + tag: "*" + match: + - "($NavCommand = 'ZoomOut' or $NavCommand = 'ZoomOutAll') and" + - "parent::m:math " + replace: + - x: ".." # let math rule deal with it + - name: zoom-out-all-default tag: "*" match: "$NavCommand = 'ZoomOutAll'" replace: - - test: - if: "$MatchCounter = 0 and $NavVerbosity != 'Terse'" - then: [T: "ไธ€่ทฏ็ธฎๅฐ", pause: "medium"] # phrase('zoomed out all the the way') - with: - variables: [Move2D: "'้›ข้–‹'", Child2D: "."] - replace: [x: ".."] + variables: [SayCommand: "string($NavVerbosity = 'Verbose')"] + replace: [x: "."] - with: - variables: [MatchCounter: "$MatchCounter + 1"] + variables: [Move2D: "'้›ข้–‹'", Child2D: "."] replace: [x: ".."] + - x: ".." # deal with internal zooming: MoveNextZoom and MovePreviousZoom @@ -432,12 +408,12 @@ - "($NavCommand = 'MoveNextZoom' or $NavCommand = 'MovePreviousZoom') and " - "$NavMode = 'Enhanced'" replace: - # don't bother with MatchCounter since we only get here if > 1 - with: - variables: [Move2D: "'ๅœจ'", Child2D: "*[1]"] # phrase('in' the denominator) + variables: [Move2D: "'้€ฒๅ…ฅ'", Child2D: "*[1]"] # phrase('in' the denominator) replace: [x: "."] - test: - - if: "count(*)> 1 or IsNode(., 'leaf') or self::m:msqrt or self::m:menclose" + - if: "count(*)> 1 or IsNode(., 'leaf') or + @data-from-mathml='msqrt' or self::m:msqrt or @data-from-mathml='menclose' or self::m:menclose" then: [set_variables: [NavNode: "@id"]] else: [x: "*[1]"] @@ -448,7 +424,7 @@ replace: #don't bother with MatchCounter since we only get here if > 1 - test: - if: "$ReadZoomLevel >= DistanceFromLeaf(., false, $NavMode!='Character')" + if: "IsNode(., 'leaf') or $ReadZoomLevel >= DistanceFromLeaf(., false, $NavMode!='Character')" then: # - with: # variables: [Move2D: "'in'", Child2D: "following-sibling::*[1]"] # phrase('in' the denominator) @@ -456,7 +432,7 @@ - set_variables: [NavNode: "@id"] else: - with: - variables: [Move2D: "'ๅœจ'", Child2D: "*[1]"] # phrase('in' the denominator) + variables: [Move2D: "'้€ฒๅ…ฅ'", Child2D: "*[1]"] # phrase('in' the denominator) replace: [x: "."] - x: "*[1]" @@ -475,7 +451,7 @@ - set_variables: [NavNode: "@id"] else: - with: - variables: [Move2D: "'ๅœจ'", Child2D: "*[last()]"] # phrase('in' the denominator) + variables: [Move2D: "'้€ฒๅ…ฅ'", Child2D: "*[last()]"] # phrase('in' the denominator) replace: [x: "."] - x: "*[last()]" @@ -486,14 +462,14 @@ tag: mtd match: "$Move2D = '' and ($NavCommand = 'ZoomOut')" replace: - - test: - if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" - then: [T: "็ธฎๅฐ", pause: "medium"] # phrase('zoom out' of expression) + - with: + variables: [SayCommand: "string($NavVerbosity = 'Verbose')"] + replace: [x: "."] # we need to speak it here - - T: "ๅˆ—" # phrase(the first 'row' of the matrix) - # if we let the speech rules speak the row, it is given just the MathML for the row, so the row # will always be '1' - - x: "count(../preceding-sibling::*)+1" - - pause: medium + # - t: "row" # phrase(the first 'row' of the matrix) + # # if we let the speech rules speak the row, it is given just the MathML for the row, so the row # will always be '1' + # - x: "count(../preceding-sibling::*)+1" + # - pause: medium - set_variables: [NavNode: "../@id"] - name: zoom-out @@ -502,26 +478,23 @@ match: "$NavCommand = 'ZoomOut'" replace: - with: - variables: [MatchCounter: "$MatchCounter + 1"] - replace: - - test: - if: "$MatchCounter = 1 and $NavVerbosity = 'Verbose'" - then: [T: "็ธฎๅฐ", pause: "medium"] # phrase('zoom out' of the expression) + variables: [SayCommand: "string($NavVerbosity = 'Verbose')"] + replace: [x: "."] + - test: + if: "$NavMode='Enhanced' and parent::*[self::m:mrow and (IsBracketed(., '(', ')', false) or IsBracketed(., '[', ']', false))]" + then: [x: ".."] # auto-zoom: move out a level and retry + else: + - with: + variables: [Move2D: "'้›ข้–‹'", Child2D: "."] + replace: [x: ".."] - test: - if: "$NavMode='Enhanced' and parent::*[self::m:mrow and IsBracketed(., '(', ')', false) or IsBracketed(., '[', ']', false)]" - then: [x: ".."] # auto-zoom: move out a level and retry + if: "parent::m:mtd" + then: [x: ".."] else: - - with: - variables: [Move2D: "'้›ข้–‹'", Child2D: "."] - replace: [x: ".."] - test: - if: "parent::m:mtd" - then: [x: ".."] - else: - - test: - if: "$ReadZoomLevel!=-1" - then: [set_variables: [ReadZoomLevel: "DistanceFromLeaf(.., true, $NavMode!='Character')"]] - - set_variables: [NavNode: "../@id"] + if: "$ReadZoomLevel!=-1" + then: [set_variables: [ReadZoomLevel: "DistanceFromLeaf(.., true, $NavMode!='Character')"]] + - set_variables: [NavNode: "../@id"] # ********* MoveStart/End *************** - name: math-move-to-start-or-end @@ -536,42 +509,56 @@ then: - test: - if: "$NavCommand = 'MoveStart'" - then: [T: "็งป่‡ณๆ•ธๅญธ้–‹้ ญ"] # phrase('move to start of math') + then: [T: "็งปๅˆฐๆ•ธๅญธ้–‹้ ญ"] # phrase('move to start of math') - else_if: "$NavCommand = 'MoveLineStart'" - then: [T: "็งป่‡ณๅˆ—้ ญ"] # phrase('move to start of line') + then: [T: "็งปๅˆฐ่กŒ้ฆ–"] # phrase('move to start of line') - else_if: "$NavCommand = 'MoveEnd'" - then: [T: "็งป่‡ณๆ•ธๅญธ็ตๆŸ"] # phrase('move to end of math') - else: [T: "็งป่‡ณๅˆ—ๅฐพ"] # "$NavCommand = 'MoveLineEnd'" # phrase('move to end of line') + then: [T: "็งปๅˆฐๆ•ธๅญธ็ตๅฐพ"] # phrase('move to end of math') + else: [T: "็งปๅˆฐ่กŒๅฐพ"] # "$NavCommand = 'MoveLineEnd'" # phrase('move to end of line') - pause: "medium" - test: if: "$NavCommand = 'MoveStart' or $NavCommand = 'MoveLineStart'" then: # move inside of the mrow inside of 'math' or inside the fraction, etc (hence two levels down) + # Note: an apparent bug in the xpath code doesn't let me use IfThenElse for the 2 if: then: below - with: variables: [NavCommand: "'MoveNextZoom'"] - replace: [x: "*[1]/*[1]"] + replace: + - test: + if: "*[1]/*[1]" # could be a x, so no grandchild + then: [x: "*[1]/*[1]"] + else: [x: "*[1]"] else: - with: variables: [NavCommand: "'MovePreviousZoom'"] - replace: [x: "*[last()]/*[last()]"] + replace: + - test: + if: "*[last()]/*[last()]" # could be a x, so no grandchild + then: [x: "*[last()]/*[last()]"] + else: [x: "*[last()]"] # We stop when the parent is 2d (e.g., frac), but not if in leaf base of msub/msup/msubsup/mmultiscripts because that's really on the same line - name: move-to-start-or-end-2d tag: "*" match: - "($NavCommand = 'MoveLineStart' or $NavCommand = 'MoveLineEnd') and IsNode(.., '2D') and" - - "not( IsNode(., 'leaf') and (parent::m:msub or parent::m:msup or parent::m:msubsup or parent::m:mmultiscripts) )" + - "not( IsNode(., 'leaf') and" + - " parent::*[1][self::m:msub or self::m:msup or self::m:msubsup or self::m:mmultiscripts or" + - " @data-from-mathml and" + - " (@data-from-mathml='msub' or @data-from-mathml='msup' or" + - " @data-from-mathml='msubsup' or @data-from-mathml='mmultiscripts')" + - " ] )" replace: - test: if: "$NavVerbosity = 'Verbose'" then: - test: if: "$NavCommand = 'MoveLineStart'" - then: [T: "็งป่‡ณๅˆ—้ ญ"] # phrase('move to start of line') - else: [T: "็งป่‡ณๅˆ—ๅฐพ"] # "$NavCommand = 'MoveLineEnd'" # phrase('move to end of line') + then: [T: "็งปๅˆฐ่กŒ้ฆ–"] # phrase('move to start of line') + else: [T: "็งปๅˆฐ่กŒๅฐพ"] # "$NavCommand = 'MoveLineEnd'" # phrase('move to end of line') - pause: "medium" - test: - if: "self::m:mrow" + if: "self::m:mrow or @data-from-mathml = 'mrow'" then_test: if: "$NavCommand = 'MoveLineStart'" then: @@ -604,7 +591,7 @@ - "$NavCommand='MoveColumnStart' or $NavCommand='MoveColumnEnd' or" - "$NavCommand='ReadCellCurrent'" replace: - - T: "ไธๅœจ่กจไธญ" # phrase('not in table') + - T: "ไธๅœจ่กจๆ ผๅ…ง" # phrase('not in table') - pause: long - set_variables: [SpeakExpression: "'false'"] @@ -618,7 +605,7 @@ - test: if: "$NavVerbosity = 'Verbose'" then: - - T: "ๅ‘ๅทฆ็งป" # phrase('move left') + - T: "็งปๅˆฐไธŠไธ€้ …" # phrase('move left') - pause: short - test: if: "$NavVerbosity != 'Terse'" @@ -635,7 +622,7 @@ else: - set_variables: [NavNode: "preceding-sibling::*[1]/*[1]/@id"] else: - - T: "ๆฒ’ๆœ‰ๅ‰ไธ€่กŒ" # phrase('no previous column' in the table) + - T: "ๆฒ’ๆœ‰ๅทฆไธ€่กŒ" # phrase('no previous column' in the table) - set_variables: [SpeakExpression: "'false'"] - name: move-cell-next @@ -648,7 +635,7 @@ - test: if: "$NavVerbosity = 'Verbose'" then: - - T: "ๅ‘ๅณ็งป" # phrase('move right') + - T: "็งปๅˆฐไธ‹ไธ€้ …" # phrase('move right') - pause: short - test: if: "$NavVerbosity != 'Terse'" @@ -665,7 +652,7 @@ else: - set_variables: [NavNode: "following-sibling::*[1]/*[1]/@id"] else: - - T: "ๆฒ’ๆœ‰ไธ‹ไธ€่กŒ" # phrase('no next column' in the table) + - T: "ๆฒ’ๆœ‰ๅณไธ€่กŒ" # phrase('no next column' in the table) - set_variables: [SpeakExpression: "'false'"] - name: move-cell-up @@ -681,7 +668,7 @@ - test: if: "$NavVerbosity = 'Verbose'" then: - - T: "ๅ‘ไธŠ็งปๅ‹•" # phrase('move up' to previous row in the table) + - T: "ๅพ€ไธŠไธ€ๆ ผ" # phrase('move up' to previous row in the table) - pause: short - test: if: "$NavVerbosity != 'Terse'" @@ -701,7 +688,7 @@ else: - set_variables: [NavNode: "../preceding-sibling::*[1]/*[$Column]/*[1]/@id"] else: - - T: "ๆฒ’ๆœ‰ๅ‰ไธ€ๅˆ—" # phrase('no previous row' in the table) + - T: "ๆฒ’ๆœ‰ไธŠไธ€ๅˆ—" # phrase('no previous row' in the table) - set_variables: [SpeakExpression: "'false'"] - name: move-cell-down @@ -717,7 +704,7 @@ - test: if: "$NavVerbosity = 'Verbose'" then: - - T: "ๅ‘ไธ‹็งปๅ‹•" # phrase('move down to the next row in the table) + - T: "ๅพ€ไธ‹ไธ€ๆ ผ" # phrase('move down to the next row in the table) - pause: short - test: if: "$NavVerbosity != 'Terse'" @@ -744,20 +731,14 @@ tag: [mtr, mlabeledtr] match: "$NavCommand='MoveCellUp'" replace: + - test: + if: "$NavVerbosity = 'Verbose'" + then: + - T: "็งปๅˆฐไธŠไธ€ๅˆ—" # phrase('move to previous row' to the previous row in the table) + - pause: medium - test: if: "preceding-sibling::*" then: - - test: - if: "$NavVerbosity = 'Verbose'" - then: - - T: "ๅ‘ไธŠ็งปๅ‹•" # phrase('move up' to the previous row in the table) - - pause: medium - - test: - if: "$NavVerbosity != 'Terse'" - then: - - T: "ๅˆ—" # phrase(the previous 'row' in the table) - - x: "count(preceding-sibling::*)" - - pause: medium - test: if: "$NavMode='Character'" then: @@ -767,27 +748,21 @@ else: - set_variables: [NavNode: "preceding-sibling::*[1]/@id"] else: - - T: "ๆฒ’ๆœ‰ๅ‰ไธ€ๅˆ—" # phrase('no previous row' in the table) + - T: "ๆฒ’ๆœ‰ไธŠไธ€ๅˆ—" # phrase('no previous row' in the table) - set_variables: [SpeakExpression: "'false'"] - name: move-cell-down tag: [mtr, mlabeledtr] match: "$NavCommand='MoveCellDown'" replace: + - test: + if: "$NavVerbosity = 'Verbose'" + then: + - T: "็งปๅˆฐไธ‹ไธ€ๅˆ—" # phrase('move to next row' to the next row in the table) + - pause: medium - test: if: "following-sibling::*" then: - - test: - if: "$NavVerbosity = 'Verbose'" - then: - - T: "ๅ‘ไธ‹็งปๅ‹•" # phrase('move down' to the next row in the table) - - pause: medium - - test: - if: "$NavVerbosity != 'Terse'" - then: - - T: "ๅˆ—" # phrase(the previous 'row' in the table) - - x: "count(preceding-sibling::*)+2" - - pause: medium - test: if: "$NavMode='Character'" then: @@ -800,6 +775,32 @@ - T: "ๆฒ’ๆœ‰ไธ‹ไธ€ๅˆ—" # phrase('no next row' in the table) - set_variables: [SpeakExpression: "'false'"] +- name: move-cell-previous + # if a row is selected, there is no previous/next column, so this is trivial + tag: [mtr, mlabeledtr] + match: "$NavCommand='MoveCellPrevious'" + replace: + - test: + if: "$NavVerbosity = 'Verbose'" + then: + - T: "็งปๅˆฐๅทฆไธ€่กŒ" # phrase('move to previous column' to the previous row in the table) + - pause: medium + - T: "ๆฒ’ๆœ‰ๅทฆไธ€่กŒ" # phrase('no previous column' in the table) + - set_variables: [SpeakExpression: "'false'"] + +- name: move-cell-next + # if a row is selected, there is no previous/next column, so this is trivial + tag: [mtr, mlabeledtr] + match: "$NavCommand='MoveCellNext'" + replace: + - test: + if: "$NavVerbosity = 'Verbose'" + then: + - T: "็งปๅˆฐๅณไธ€่กŒ" # phrase('move to next column' to the next row in the table) + - pause: medium + - T: "ๆฒ’ๆœ‰ๅณไธ€่กŒ" # phrase('no next column' in the table) + - set_variables: [SpeakExpression: "'false'"] + - name: default-read-cell tag: "*" match: "$NavCommand='ReadCellCurrent'" @@ -813,19 +814,20 @@ - test: if: "$NavVerbosity = 'Verbose'" then: - - T: "้–ฑ่ฎ€็•ถๅ‰้ …็›ฎ" # phrase('read current entry' in the table) + - T: "่ฎ€ๅ‡บ็›ฎๅ‰้ …็›ฎ" # phrase('read current entry' in the table) - pause: medium - test: if: "$NavVerbosity != 'Terse'" then: - T: "ๅˆ—" # phrase(the previous 'row' in the table) - x: "count($MTD[1]/../preceding-sibling::*)+1" + - pause: short - T: "่กŒ" # phrase(the previous 'column' in the table) - x: "count($MTD[1]/preceding-sibling::*)+1" - pause: short - set_variables: [NavNode: "$MTD[1]/*[1]/@id"] else: - - T: "ไธๅœจ่กจไธญ" # phrase('not in table' or matrix) + - T: "ไธๅœจ่กจๆ ผๅ…ง" # phrase('not in table' or matrix) - pause: long - set_variables: [SpeakExpression: "'false'"] @@ -1065,7 +1067,7 @@ then: - x: "ancestor::m:mtd[1]" # try again on an mtd node else: - - T: "ไธๅœจ่กจไธญ" # phrase('not in table' or matrix) + - T: "ไธๅœจ่กจๆ ผๅ…ง" # phrase('not in table' or matrix) - pause: long - set_variables: [SpeakExpression: "'false'"] @@ -1087,7 +1089,7 @@ then: [x: "$Following"] else: - with: - variables: [Move2D: "'ๅœจ'", Child2D: "$Following"] # phrase('in' the denominator) + variables: [Move2D: "'้€ฒๅ…ฅ'", Child2D: "$Following"] # phrase('in' the denominator) replace: [x: ".."] - with: variables: [NavCommand: "'MoveNextZoom'"] @@ -1109,7 +1111,7 @@ then: [x: "$Preceding"] else: - with: - variables: [Move2D: "'ๅœจ'", Child2D: "$Preceding"] # phrase('in' the denominator) + variables: [Move2D: "'้€ฒๅ…ฅ'", Child2D: "$Preceding"] # phrase('in' the denominator) replace: [x: ".."] - with: variables: [NavCommand: "'MovePreviousZoom'"] @@ -1124,24 +1126,14 @@ - "($NavCommand = 'MoveNext' or $NavCommand = 'ReadNext' or $NavCommand = 'DescribeNext') and" - "following-sibling::*[1][name(.)='mo' and translate(., '\u2061\u2062\u2063\u2064', '')='']" replace: - - test: - if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" - then: - - test: - - if: "$NavCommand = 'MoveNext'" - then: [T: "็งปๅ‹•"] # phrase('move' to next entry in table) - - else_if: "$NavCommand = 'ReadNext'" - then: [T: "่ฎ€"] # phrase('read' next entry in table) - else: [T: "ๆ่ฟฐ"] # phrase('describe' next entry in table) - - T: "ๅพ€ๅณ" # phrase(move 'right') # phrase(move 'right') - - pause: short - with: - variables: [MatchCounter: "$MatchCounter + 1"] - replace: - - test: - if: "following-sibling::*[1][.='\u2062' or .='\u2064'] and $NavMode='Enhanced'" # invisible times and plus - then: [set_variables: [NavNode: "following-sibling::*[1]/@id"]] - else: [x: "following-sibling::*[1]"] + variables: [SayCommand: "string($NavVerbosity = 'Verbose')"] + replace: [x: "."] + - test: + if: "following-sibling::*[1][.='\u2062' or .='\u2064'] and + ($NavMode='Enhanced' or ($NavMode='Simple' and following-sibling::*[2][not(IsNode(., 'mathml'))]))" # invisible times and plus + then: [set_variables: [NavNode: "following-sibling::*[1]/@id"]] + else: [x: "following-sibling::*[1]"] - name: move-next-no-auto-zoom-at-edge # at edge of 2D and in a mode where moving right isn't an option @@ -1150,11 +1142,15 @@ match: "$NavCommand = 'MoveNext' and $NavMode!='Character' and not($AutoZoomOut) and $EdgeNode/@id!=@id" replace: - test: - if: "$MatchCounter = 0 and $NavVerbosity != 'Terse' and $NavCommand = 'MoveNext'" + if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" then: - - T: "็„กๆณ•ๅพ€ๅณ็งปๅ‹•" # phrase('cannot move right') + - T: "็„กๆณ•็งปๅˆฐไธ‹ไธ€้ …" # phrase('cannot move right') + - pause: medium - with: - variables: [Move2D: "'็ตๆŸ'", Child2D: "$EdgeNode/*[last()]"] + variables: + - Move2D: "'end of'" + - Child2D: "$EdgeNode/*[last()]" + - MatchCounter: $MatchCounter + 1 replace: [x: "$EdgeNode"] - pause: long - set_variables: [SpeakExpression: "'false'"] @@ -1167,17 +1163,19 @@ - "(self::m:math or name(EdgeNode(., 'right', 'math'))='math')" # at edge of math replace: - test: - if: "$MatchCounter = 0 and $NavVerbosity != 'Terse'" + if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" then: - - T: "ไธ่ƒฝ" # phrase('cannot' move right in expression) + - T: "็„กๆณ•" # phrase('cannot' move right in expression) - test: - if: "$NavCommand = 'MoveNext'" - then: [T: "็งปๅ‹•"] # phrase('move' to next entry in table) + then: [T: "็งปๅˆฐ"] # phrase('move' to next entry in table) - else_if: "$NavCommand = 'ReadNext'" - then: [T: "่ฎ€"] # phrase('read' next entry in table) + then: [T: "่ฎ€ๅ‡บ"] # phrase('read' next entry in table) else: [T: "ๆ่ฟฐ"] # phrase('describe' next entry in table) - - T: "ๅพ€ๅณ๏ผŒๆ•ธๅญธ็ตๆŸ" # phrase(move 'right, end of math') - - pause: long + - T: "ไธ‹ไธ€้ …" # phrase(move 'right') + - pause: short + - T: "ๆ•ธๅญธ็ตๅฐพ" # phrase(move 'end of math') + - pause: long - set_variables: [SpeakExpression: "'false'"] - name: move-next-auto-zoom-up-one-level @@ -1192,48 +1190,34 @@ - " )" - ")" replace: + - with: + variables: [SayCommand: "string($NavVerbosity = 'Verbose')"] + replace: [x: "."] - test: - if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" + if: "following-sibling::*" then: - - test: - - if: "$NavCommand = 'MoveNext'" - then: [T: "็งปๅ‹•"] # phrase('move' to next entry in table) - - else_if: "$NavCommand = 'ReadNext'" - then: [T: "่ฎ€"] # phrase('read' next entry in table) - else: [T: "ๆ่ฟฐ"] # phrase('describe' next entry in table) - - T: "ๅพ€ๅณ" # phrase(move 'right') # phrase(move 'right') - - pause: short - - with: - variables: [MatchCounter: "$MatchCounter + 1", NavCommand: "'MoveNext'"] - replace: - - test: - if: "following-sibling::*" - then: - - with: - variables: [Move2D: "'ๅœจ'", Child2D: "."] # phrase('in' the denominator) - replace: [x: ".."] - else: - - with: - variables: [Move2D: "'้›ข้–‹'", Child2D: "."] - replace: [x: ".."] - - test: - if: "following-sibling::*" - then: - - x: ".." # move out of parens - else: - - x: ".." + - with: + variables: [Move2D: "'้€ฒๅ…ฅ'", Child2D: "."] # phrase('in' the denominator) + replace: [x: ".."] + else: + - with: + variables: [Move2D: "'้›ข้–‹'", Child2D: "."] + replace: [x: ".."] + - x: ".." # At this point, if XXXNext, then we know there is must be a right sibling - name: move-next-default tag: mtd match: "$Move2D = '' and ($NavCommand = 'MoveNext' or $NavCommand = 'ReadNext' or $NavCommand = 'DescribeNext')" replace: + - with: + variables: [SayCommand: "string($NavVerbosity = 'Verbose')"] + replace: [x: "."] - test: - # can't get here with MatchCounter=0, so no need to echo command if: "following-sibling::*" then: - test: - if: "$NavVerbosity != 'Terse'" + if: "$NavVerbosity = 'Verbose'" then: - T: "่กŒ" # phrase(the previous 'column' in the table) - x: "count(preceding-sibling::*)+2" @@ -1250,25 +1234,21 @@ - name: move-next-default tag: [mtr, mlabeledtr] - match: "$Move2D = '' and ($NavCommand = 'MoveNext' or $NavCommand = 'ReadNext' or $NavCommand = 'DescribeNext')" + match: "$Move2D = '' and + ($NavCommand = 'MoveNext' or $NavCommand = 'ReadNext' or $NavCommand = 'DescribeNext') and + following-sibling::*" replace: + - with: + variables: [SayCommand: "string($NavVerbosity = 'Verbose')"] + replace: [x: "."] - test: - # can't get here with MatchCounter=0, so no need to echo command - if: "following-sibling::*" + if: "$NavMode = 'Character'" then: - - T: "ๅˆ—" # phrase(the previous 'row' in the table) - - x: "count(preceding-sibling::*)+2" - - T: "็ฌฌ 1 ่กŒ" # phrase('column 1' in the table) - - pause: medium - - test: - if: "$NavMode = 'Character'" - then: - - with: - variables: [NavCommand: "'MoveNextZoom'"] - replace: [x: "following-sibling::*[1]"] - else: - - set_variables: [NavNode: "following-sibling::*[1]/*[1]/*[1]/@id"] - else: [x: ".."] # try again for after + - with: + variables: [NavCommand: "'MoveNextZoom'"] + replace: [x: "following-sibling::*[1]"] + else: + - set_variables: [NavNode: "following-sibling::*[1]/@id"] - name: move-next-auto-zoom-parens # auto-zoom into next child if next child is parenthesized expr @@ -1278,20 +1258,12 @@ - "$NavMode='Enhanced' and" - "parent::m:mrow and following-sibling::* and" - "following-sibling::*[1][self::m:mrow and count(*)=3 and " #exclude empty parens - - " (IsBracketed(., '(', ')') or IsBracketed(., '[', ']'))" - - " ]" + - " (IsBracketed(., '(', ')') or IsBracketed(., '[', ']'))" + - " ]" replace: - - test: - if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" - then: - - test: - - if: "$NavCommand = 'MoveNext'" - then: [T: "็งปๅ‹•"] # phrase('move' to next entry in table) - - else_if: "$NavCommand = 'ReadNext'" - then: [T: "่ฎ€"] # phrase('read' next entry in table) - else: [T: "ๆ่ฟฐ"] # phrase('describe' next entry in table) - - T: "ๅพ€ๅณ" # phrase(move 'right') # phrase(move 'right') - - pause: short + - with: + variables: [SayCommand: "string($NavVerbosity = 'Verbose')"] + replace: [x: "."] - set_variables: [NavNode: "following-sibling::*[1]/*[2]/@id"] # normal cases for MoveNext @@ -1302,17 +1274,9 @@ - "($NavCommand = 'MoveNext' or $NavCommand = 'ReadNext' or $NavCommand = 'DescribeNext') and" - "$ReadZoomLevel>=0" replace: - - test: - if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" - then: - - test: - - if: "$NavCommand = 'MoveNext'" - then: [T: "็งปๅ‹•"] # phrase('move' to next entry in table) - - else_if: "$NavCommand = 'ReadNext'" - then: [T: "่ฎ€"] # phrase('read' next entry in table) - else: [T: "ๆ่ฟฐ"] # phrase('describe' next entry in table) - - T: "ๅพ€ๅณ" # phrase(move 'right') # phrase(move 'right') - - pause: short + - with: + variables: [SayCommand: "string($NavVerbosity = 'Verbose')"] + replace: [x: "."] - test: # if in base (nothing before), we must be moving to a script, so "in" will be said if: "preceding-sibling::* and following-sibling::*[1][name(.)='none']" @@ -1320,39 +1284,33 @@ - with: variables: [Move2D: "'้›ข้–‹'", Child2D: "."] replace: [x: ".."] - - with: - variables: [MatchCounter: "$MatchCounter + 1"] - replace: [x: "following-sibling::*[1]"] # skip over 'none' + - x: "following-sibling::*[1]" else: - with: - variables: [Move2D: "'ๅœจ'", Child2D: "following-sibling::*[1]"] # phrase('in' the denominator) + variables: [Move2D: "'้€ฒๅ…ฅ'", Child2D: "following-sibling::*[1]"] # phrase('in' the denominator) replace: [x: ".."] - with: - variables: [MatchCounter: "$MatchCounter + 1", NavCommand: "'MoveNextZoom'"] + variables: [NavCommand: "'MoveNextZoom'"] replace: [x: "following-sibling::*[1]"] - name: move-next-default tag: "*" match: "$NavCommand = 'MoveNext' or $NavCommand = 'ReadNext' or $NavCommand = 'DescribeNext'" replace: + - with: + variables: [SayCommand: "string($NavVerbosity = 'Verbose')"] + replace: [x: "."] - test: - if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" - then: + if: "following-sibling::*[1][@data-from-mathml='none' or @data-from-mathml='mprescripts']" + then: [x: "following-sibling::*[1]"] + else: - test: - - if: "$NavCommand = 'MoveNext'" - then: [T: "็งปๅ‹•"] # phrase('move' to next entry in table) - - else_if: "$NavCommand = 'ReadNext'" - then: [T: "่ฎ€"] # phrase('read' next entry in table) - else: [T: "ๆ่ฟฐ"] # phrase('describe' next entry in table) - - T: "ๅพ€ๅณ" # phrase(move 'right') # phrase(move 'right') - - pause: short - - test: - if: "IsNode(.., '2D')" - then: - - with: - variables: [Move2D: "'ๅœจ'", Child2D: "following-sibling::*[1]"] # phrase('in' the denominator) - replace: [x: ".."] - - set_variables: [NavNode: "following-sibling::*[1]/@id"] + if: "IsNode(.., '2D') or not(IsNode(.., 'mathml'))" + then: + - with: + variables: [Move2D: "'้€ฒๅ…ฅ'", Child2D: "following-sibling::*[1]"] # phrase('in' the denominator) + replace: [x: ".."] + - set_variables: [NavNode: "following-sibling::*[1]/@id"] # ======== Move/Read/Describe Previous rules ================= @@ -1363,38 +1321,31 @@ - "($NavCommand = 'MovePrevious' or $NavCommand = 'ReadPrevious' or $NavCommand = 'DescribePrevious') and" - "preceding-sibling::*[1][name(.)='mo' and translate(., '\u2061\u2062\u2063\u2064', '')='']" replace: - - test: - if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" - then: - - test: - - if: "$NavCommand = 'MovePrevious'" - then: [T: "็งปๅ‹•"] # phrase('move' to next entry in table) - - else_if: "$NavCommand = 'ReadPrevious'" - then: [T: "่ฎ€"] # phrase('read' next entry in table) - else: [T: "ๆ่ฟฐ"] # phrase('describe' next entry in table) - - T: "ๅพ€ๅทฆ" # phrase(move 'left') - - pause: short - with: - variables: [MatchCounter: "$MatchCounter + 1"] - replace: - - test: - if: "preceding-sibling::*[1][.='\u2062' or .='\u2064'] and $NavMode='Enhanced'" # invisible times and plus - then: [set_variables: [NavNode: "preceding-sibling::*[1]/@id"]] - else: [x: "preceding-sibling::*[1]"] + variables: [SayCommand: "string($NavVerbosity = 'Verbose')"] + replace: [x: "."] + - test: + if: "preceding-sibling::*[1][.='\u2062' or .='\u2064'] and $NavMode='Enhanced'" # invisible times and plus + then: [set_variables: [NavNode: "preceding-sibling::*[1]/@id"]] + else: [x: "preceding-sibling::*[1]"] -# two rules for when can't move right +# two rules for when can't move left - name: move-previous-no-auto-zoom-at-edge - # at edge of 2D and in a mode where moving right isn't an option + # at edge of 2D and in a mode where moving left isn't an option tag: "*" variables: [EdgeNode: "EdgeNode(., 'left', '2D')"] match: "$NavCommand = 'MovePrevious' and $NavMode!='Character' and not($AutoZoomOut) and $EdgeNode/@id!=@id" replace: - test: - if: "$MatchCounter = 0 and $NavVerbosity != 'Terse' and $NavCommand = 'MovePrevious'" + if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose' and $NavCommand = 'MovePrevious'" then: - - T: "็„กๆณ•ๅ‘ๅทฆ็งปๅ‹•" # phrase('cannot move left' in expression) + - T: "็„กๆณ•็งปๅˆฐไธŠไธ€้ …" # phrase('cannot move left' in expression) + - pause: medium - with: - variables: [Move2D: "'้›ข้–‹'", Child2D: "$EdgeNode/*[1]"] + variables: + - Move2D: "'end of'" + - Child2D: "$EdgeNode/*[1]" + - MatchCounter: $MatchCounter + 1 replace: [x: "$EdgeNode"] - pause: long @@ -1405,7 +1356,7 @@ - "($NavCommand = 'MovePrevious' or $NavCommand = 'ReadPrevious' or $NavCommand = 'DescribePrevious') and" - "(self::m:math or name(EdgeNode(., 'left', 'math'))='math')" replace: - - T: "้–‹ๅง‹ๆ•ธๅญธ" # phrase('start of math') + - T: "ๆ•ธๅญธ้–‹้ ญ" # phrase('start of math') - pause: long - set_variables: [SpeakExpression: "'false'"] @@ -1416,10 +1367,14 @@ - "name(EdgeNode(., 'left', 'math'))='math'" # at edge of math replace: - test: - if: "$MatchCounter = 0 and $NavVerbosity != 'Terse'" + if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" then: - - T: "็„กๆณ•ๅ‘ๅทฆ็งปๅ‹•๏ผŒๆ•ธๅญธ้–‹ๅง‹" # phrase('cannot move left, start of math') - - pause: long + - T: "็„กๆณ•็งปๅˆฐไธŠไธ€้ …" # phrase('cannot move left') + - pause: short + - with: + variables: [Move2D: "'start of'", Child2D: "."] + replace: [x: "."] + - pause: long - set_variables: [SpeakExpression: "'false'"] - name: move-previous-auto-zoom-up-one-level @@ -1434,36 +1389,20 @@ - " )" - ")" replace: + - with: + variables: [SayCommand: "string($NavVerbosity = 'Verbose')"] + replace: [x: "."] - test: - if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" + if: "preceding-sibling::*" then: - - test: - - if: "$NavCommand = 'MovePrevious'" - then: [T: "็งปๅ‹•"] # phrase('move' to next entry in table) - - else_if: "$NavCommand = 'ReadPrevious'" - then: [T: "่ฎ€"] # phrase('read' next entry in table) - else: [T: "ๆ่ฟฐ"] # phrase('describe' next entry in table) - - T: "ๅพ€ๅทฆ" # phrase(move 'left') - - pause: short - - with: - variables: [MatchCounter: "$MatchCounter + 1", NavCommand: "'MovePrevious'"] - replace: - - test: - if: "preceding-sibling::*" - then: - - with: - variables: [Move2D: "'ๅœจ'", Child2D: "."] # phrase('in' the denominator) - replace: [x: ".."] - else: - - with: - variables: [Move2D: "'้›ข้–‹'", Child2D: "."] - replace: [x: ".."] - - test: - if: "preceding-sibling::*" - then: - - x: .. # move out of parens - else: - - x: ".." + - with: + variables: [Move2D: "'้€ฒๅ…ฅ'", Child2D: "."] # phrase('in' the denominator) + replace: [x: ".."] + else: + - with: + variables: [Move2D: "'้›ข้–‹'", Child2D: "."] + replace: [x: ".."] + - x: ".." - name: move-previous-auto-zoom-parens # auto-zoom into previous child if previous child is parenthesized expr @@ -1480,22 +1419,14 @@ - " (IsBracketed(., '(', ')') or IsBracketed(., '[', ']'))" - " ]" replace: - - test: - if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" - then: - - test: - - if: "$NavCommand = 'MovePrevious'" - then: [T: "็งปๅ‹•"] # phrase('move' to next entry in table) - - else_if: "$NavCommand = 'ReadPrevious'" - then: [T: "่ฎ€"] # phrase('read' next entry in table) - else: [T: "ๆ่ฟฐ"] # phrase('describe' next entry in table) - - T: "ๅพ€ๅทฆ" # phrase(move 'left') - - pause: short + - with: + variables: [SayCommand: "string($NavVerbosity = 'Verbose')"] + replace: [x: "."] - test: if: "not(parent::m:mrow)" then: - with: - variables: [Move2D: "'ๅœจ'", Child2D: "preceding-sibling::*[1]"] # phrase('in' the denominator) + variables: [Move2D: "'้€ฒๅ…ฅ'", Child2D: "preceding-sibling::*[1]"] # phrase('in' the denominator) replace: [x: ".."] - set_variables: [NavNode: "preceding-sibling::*[1]/*[2]/@id"] @@ -1503,44 +1434,37 @@ - name: move-previous-default tag: mtd - match: "$Move2D = '' and ($NavCommand = 'MovePrevious' or $NavCommand = 'ReadPrevious' or $NavCommand = 'DescribePrevious')" + match: "$Move2D = '' and + ($NavCommand = 'MovePrevious' or $NavCommand = 'ReadPrevious' or $NavCommand = 'DescribePrevious') and + preceding-sibling::*" replace: + - with: + variables: [SayCommand: "string($NavVerbosity = 'Verbose')"] + replace: [x: "."] - test: - # can't get here with MatchCounter=0, so no need to echo command - if: "preceding-sibling::*" + if: "$NavVerbosity = 'Verbose'" then: - - test: - if: "$NavVerbosity != 'Terse'" - then: - - T: "่กŒ" # phrase(the first 'column' in the table) - - x: "count(preceding-sibling::*)" - - pause: short - - test: - if: "$NavMode = 'Character'" - then: - - with: - variables: [NavCommand: "'MovePreviousZoom'"] - replace: [x: "preceding-sibling::*[1]"] - else: [set_variables: [NavNode: "preceding-sibling::*[1]/*[last()]/@id"]] - else: - - x: ".." # try again at the row level + - T: "่กŒ" # phrase(the first 'column' in the table) + - x: "count(preceding-sibling::*)" + - pause: short + - test: + if: "$NavMode = 'Character'" + then: + - with: + variables: [NavCommand: "'MovePreviousZoom'"] + replace: [x: "preceding-sibling::*[1]"] + else: [set_variables: [NavNode: "preceding-sibling::*[1]/*[last()]/@id"]] - name: move-previous-default tag: [mtr, mlabeledtr] match: "$Move2D = '' and ($NavCommand = 'MovePrevious' or $NavCommand = 'ReadPrevious' or $NavCommand = 'DescribePrevious')" replace: + - with: + variables: [SayCommand: "string($NavVerbosity = 'Verbose')"] + replace: [x: "."] - test: - # can't get here with MatchCounter=0, so no need to echo command if: "preceding-sibling::*" then: - - test: - if: "$NavVerbosity != 'Terse'" - then: - - T: "ๅˆ—" # phrase('row' five in table) - - x: "count(preceding-sibling::*)" - - T: "่กŒ" # phrase('column' five in table) - - x: "count(*)" - - pause: medium - test: if: "$NavMode = 'Character'" then: @@ -1548,7 +1472,7 @@ variables: [NavCommand: "'MovePreviousZoom'"] replace: [x: "preceding-sibling::*[1]"] else: - - set_variables: [NavNode: "preceding-sibling::*[1]/*[last()]/*[last()]/@id"] + - set_variables: [NavNode: "preceding-sibling::*[1]/@id"] else: [x: ".."] # try again for after - name: move-previous-locked-zoom-level @@ -1558,6 +1482,9 @@ - "($NavCommand = 'MovePrevious' or $NavCommand = 'ReadPrevious' or $NavCommand = 'DescribePrevious') and" - "$ReadZoomLevel>=0" replace: + - with: + variables: [SayCommand: "string($NavVerbosity = 'Verbose')"] + replace: [x: "."] - test: # if moving into base (nothing before), we must be moving to the base, so "in" will be said if: "count(preceding-sibling::*) > 2 and preceding-sibling::*[1][name(.)='none']" @@ -1565,50 +1492,33 @@ - with: variables: [Move2D: "'้›ข้–‹'", Child2D: "."] replace: [x: ".."] - - with: - variables: [MatchCounter: "$MatchCounter + 1"] - replace: [x: "preceding-sibling::*[1]"] # skip over 'none' + - x: "preceding-sibling::*[1]" # skip over 'none' else: - - test: - if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" - then: - - test: - - if: "$NavCommand = 'MovePrevious'" - then: [T: "็งปๅ‹•"] # phrase('move' to next entry in table) - - else_if: "$NavCommand = 'ReadPrevious'" - then: [T: "่ฎ€"] # phrase('read' next entry in table) - else: [T: "ๆ่ฟฐ"] # phrase('describe' next entry in table) - - T: "ๅพ€ๅทฆ" # phrase(move 'left') - - pause: short - with: - variables: [Move2D: "'ๅœจ'", Child2D: "preceding-sibling::*[1]"] # phrase('in' the denominator) + variables: [Move2D: "'้€ฒๅ…ฅ'", Child2D: "preceding-sibling::*[1]"] # phrase('in' the denominator) replace: [x: ".."] - with: - variables: [MatchCounter: "$MatchCounter + 1", NavCommand: "'MovePreviousZoom'"] + variables: [NavCommand: "'MovePreviousZoom'"] replace: [x: "preceding-sibling::*[1]"] - name: move-previous-default tag: "*" match: "$NavCommand = 'MovePrevious' or $NavCommand = 'ReadPrevious' or $NavCommand = 'DescribePrevious'" replace: + - with: + variables: [SayCommand: "string($NavVerbosity = 'Verbose')"] + replace: [x: "."] - test: - if: "$MatchCounter = 0 and $NavVerbosity = 'Verbose'" - then: + if: "preceding-sibling::*[1][@data-from-mathml='none' or @data-from-mathml='mprescripts']" + then: [x: "preceding-sibling::*[1]"] + else: - test: - - if: "$NavCommand = 'MovePrevious'" - then: [T: "็งปๅ‹•"] # phrase('move' to next entry in table) - - else_if: "$NavCommand = 'ReadPrevious'" - then: [T: "่ฎ€"] # phrase('read' next entry in table) - else: [T: "ๆ่ฟฐ"] # phrase('describe' next entry in table) - - T: "ๅพ€ๅทฆ" # phrase(move 'left') - - pause: short - - test: - if: "IsNode(.., '2D')" - then: - - with: - variables: [Move2D: "'ๅœจ'", Child2D: "preceding-sibling::*[1]"] # phrase('in' the denominator) - replace: [x: ".."] - - set_variables: [NavNode: "preceding-sibling::*[1]/@id"] + if: "IsNode(.., '2D') or not(IsNode(.., 'mathml'))" + then: + - with: + variables: [Move2D: "'้€ฒๅ…ฅ'", Child2D: "preceding-sibling::*[1]"] # phrase('in' the denominator) + replace: [x: ".."] + - set_variables: [NavNode: "preceding-sibling::*[1]/@id"] # ********* ReadZoomLevel toggle *************** # These set ::NavMode @@ -1624,7 +1534,7 @@ - set_variables: [NavMode: "'Character'", ReadZoomLevel: "1"] - else_if: "$NavMode = 'Character'" then: - - T: "็ฐกๅ–ฎ" # phrase(a 'simple' way to do something) + - T: "็ฐกๆ˜“" # phrase(a 'simple' way to do something) - set_variables: [NavMode: "'Simple'", ReadZoomLevel: "1"] - else: - T: "ๅขžๅผท" # phrase(an 'enhanced' way to do something) @@ -1645,7 +1555,7 @@ - test: - if: "$NavMode = 'Enhanced'" then: - - T: "็ฐกๅ–ฎ" # phrase(an 'simple' way to do something) + - T: "็ฐกๆ˜“" # phrase(a 'simple' way to do something) - set_variables: [NavMode: "'Simple'", ReadZoomLevel: "1"] - else_if: "$NavMode = 'Character'" then: @@ -1670,12 +1580,13 @@ - test: if: "$Overview = 'true'" then: - - T: "็งปๅ‹•ๅพŒๅ”ธๅ‡บๅผๅญ" # phrase('speak expression after move') + - T: "่ฎ€ๅ‡บๅผๅญ" # phrase('speak expression after move') + - pause: long - set_variables: [Overview: "'false'"] else: - - T: "็งปๅ‹•ๅพŒๆฆ‚่ฟฐๅผๅญ" # phrase('overview of expression after move') + - T: "ๆ่ฟฐๅผๅญ" # phrase('overview of expression after move') + - pause: long - set_variables: [Overview: "'true'"] - - pause: long - name: current tag: "*" @@ -1686,11 +1597,11 @@ then: - test: - if: "$NavCommand = 'ReadCurrent'" - then: [T: "่ฎ€"] # phrase('read' next entry in table) + then: [T: "่ฎ€ๅ‡บ"] # phrase('read' next entry in table) else: [T: "ๆ่ฟฐ"] # phrase('describe' next entry in table) - - T: "็•ถๅ‰็š„" # phrase('current' entry in table) + - T: "็›ฎๅ‰" # phrase('current' entry in table) + - pause: long - set_variables: [NavNode: "@id"] - - pause: long # this needs to be near the end because we only test for 'Describe', "Read", etc., and we don't want to get 'DescribeNext', etc. - name: placemarker @@ -1706,13 +1617,13 @@ then: - test: - if: "starts-with($NavCommand, 'Read')" - then: [T: "่ฎ€"] # phrase('read' next entry in table) + then: [T: "่ฎ€ๅ‡บ"] # phrase('read' next entry in table) - else_if: "starts-with($NavCommand, 'Describe')" then: [T: "ๆ่ฟฐ"] # phrase('describe' next entry in table) - else_if: "starts-with($NavCommand, 'MoveTo')" then: [T: "็งปๅˆฐ"] # phrase('move to' the next entry in table) else: [T: "่จญๅฎš"] # phrase('set' the value of the next entry in table) - - T: "ไฝ”ไฝ็ฌฆ" # phrase('placeholder' for the value) + - T: "ๆ›ธ็ฑค" # phrase('placeholder' for the value) - x: "$PlaceMarkerIndex" - pause: long - set_variables: [NavNode: "$PlaceMarker"] @@ -1724,7 +1635,7 @@ - test: if: "$NavVerbosity != 'Terse'" then: - - T: "่จญๅฎšไฝ”ไฝ็ฌฆ" # phrase('set placeholder' to the value) + - T: "่จญๅฎšๆ›ธ็ฑค" # phrase('set placeholder' to the value) - x: "$PlaceMarkerIndex" - pause: long - set_variables: [NavNode: "@id"] @@ -1735,8 +1646,6 @@ # Alternatively, it could insert a special token that Rust code does a "replace" on with the speech (e.g. SPEECH_AT{id}) # or a new command "speak" which takes a node id - name: where-am-i-start - - tag: "*" match: "($NavCommand = 'WhereAmI' or $NavCommand = 'WhereAmIAll') and $MatchCounter = 0" replace: @@ -1758,11 +1667,11 @@ - test: if: "$NavCommand = 'WhereAmI'" then: - - T: "ๅ…ง้ƒจๆฒ’ๆฑ่ฅฟ" # phrase('inside of nothing more') + - T: "ไธๅœจๅˆฅ็š„ๅผๅญ่ฃก้ข" # phrase('inside of nothing more') - pause: long - set_variables: [SpeakExpression: "'false'"] else: - - T: "่ฃก้ข" # phrase('inside' a big expression) + - T: "ๅœจๅพŒ้ขๅผๅญ่ฃก้ข" # phrase('inside' a big expression) - pause: medium - set_variables: [NavNode: "@id"] @@ -1770,10 +1679,10 @@ tag: "*" match: "$NavCommand = 'WhereAmI' or $NavCommand = 'WhereAmIAll'" replace: - - T: "่ฃก้ข" # phrase('inside' a big expression) + - T: "ๅœจๅพŒ้ขๅผๅญ่ฃก้ข" # phrase('inside' a big expression) - pause: medium - test: - - if: "$NavMode='Enhanced' and parent::*[self::m:mrow and IsBracketed(., '(', ')', false) or IsBracketed(., '[', ']', false)]" + - if: "$NavMode='Enhanced' and parent::*[self::m:mrow and (IsBracketed(., '(', ')', false) or IsBracketed(., '[', ']', false))]" then: [x: ".."] # auto-zoom up - else_if: "$NavCommand = 'WhereAmI'" then: [set_variables: [NavNode: "@id"]] diff --git a/Rules/Languages/zh/tw/overview.yaml b/Rules/Languages/zh/tw/overview.yaml index 78bdcd0eb..240fb45c6 100644 --- a/Rules/Languages/zh/tw/overview.yaml +++ b/Rules/Languages/zh/tw/overview.yaml @@ -44,7 +44,7 @@ tag: mroot match: "." replace: - - T: "ๆ น่™Ÿ" + - T: "" - x: "*[1]" - test: if: "IsNode(*[1], 'simple')" @@ -94,7 +94,7 @@ - x: count(*[2]/*) - T: "ไน˜" - x: count(*[2]/*[self::m:mtr][1]/*) - - T: "่กจ" + - T: "่กจๆ ผ" - name: short-mrow tag: mrow diff --git a/Rules/Languages/zh/tw/unicode-full.yaml b/Rules/Languages/zh/tw/unicode-full.yaml index 7e930e016..9e4e85087 100644 --- a/Rules/Languages/zh/tw/unicode-full.yaml +++ b/Rules/Languages/zh/tw/unicode-full.yaml @@ -2446,116 +2446,116 @@ - "ใŠฝ": [T: "ๅœˆๅœˆๅ…ง48"] # 0x32bd (en: 'circled number forty eight', GPT-5.4 translation) - "ใŠพ": [T: "ๅœˆๅœˆๅ…ง49"] # 0x32be (en: 'circled number forty nine', GPT-5.4 translation) - "ใŠฟ": [T: "ๅœˆๅœˆๅ…ง50"] # 0x32bf (en: 'circled number fifty', GPT-5.4 translation) - - "ใ‹Œ": [T: "ๆฑž"] # 0x32cc (en: 'mercury', google translation) - - "ใ‹": [t: "ergs"] # 0x32cd (google translation) + - "ใ‹Œ": [T: "ๆฑžๆŸฑ"] # 0x32cc (en: 'mercury', google translation) + - "ใ‹": [T: "่€ณๆ ผ"] # 0x32cd (google translation) - "ใ‹Ž": [T: "้›ปๅญไผ็‰น"] # 0x32ce (en: 'electron volts', google translation) - "ใ‹": [T: "ๆœ‰้™่ฒฌไปปๆจ™่ชŒ"] # 0x32cf (en: 'limited liability sign', google translation) - - "ใฑ": [t: "ๆตทๆฏ›"] # 0x3371 (en: 'hectopascals', google translation) - - "ใฒ": [t: "้”็ˆพ้ “"] # 0x3372 (en: 'daltons', google translation) + - "ใฑ": [T: "็™พๅธ•"] # 0x3371 (en: 'hectopascals', google translation) + - "ใฒ": [T: "้“็ˆพ้ “"] # 0x3372 (en: 'daltons', google translation) - "ใณ": [T: "ๅคฉๆ–‡ๅ–ฎไฝ"] # 0x3373 (en: 'astronomical units', google translation) - - "ใด": [t: "้…’ๅง"] # 0x3374 (en: 'bars', google translation) + - "ใด": [T: "ๅทด"] # 0x3374 (en: 'bars', google translation) - "ใต": [t: "o v"] # 0x3375 (google translation) - - "ใถ": [t: "parsecs"] # 0x3376 (google translation) - - "ใท": [T: "ๅ…ฌๅฏธ"] # 0x3377 (en: 'decimeters', google translation) - - "ใธ": [T: "ๅ…ฌๅฏธๅนณๆ–น"] # 0x3378 (en: 'decimeters squared', google translation) - - "ใน": [T: "ๅ…ฌๅฏธ็ซ‹ๆ–น"] # 0x3379 (en: 'decimeters cubed', google translation) + - "ใถ": [T: "็ง’ๅทฎ่ท"] # 0x3376 (google translation) + - "ใท": [T: "ๅˆ†็ฑณ"] # 0x3377 (en: 'decimeters', google translation) + - "ใธ": [T: "ๅนณๆ–นๅˆ†็ฑณ"] # 0x3378 (en: 'decimeters squared', google translation) + - "ใน": [T: "็ซ‹ๆ–นๅˆ†็ฑณ"] # 0x3379 (en: 'decimeters cubed', google translation) - "ใบ": [t: "ๆจ‚ๅ™จๅ–ฎๅ…ƒ"] # 0x337a (en: 'instrumental units', google translation) - - "ใŽ€": [t: "picoamps"] # 0x3380 (google translation) - - "ใށ": [t: "nanoamps"] # 0x3381 (en: 'nanoamps', google translation) - - "ใŽ‚": [t: "microamps"] # 0x3382 (en: 'microamps', google translation) - - "ใŽƒ": [t: "milliamps"] # 0x3383 (en: 'milliamps', google translation) - - "ใŽ„": [T: "kiloamps"] # 0x3384 (en: 'kiloamps', google translation) - - "ใŽ…": [T: "ๅƒไฝๅ…ƒ็ต„"] # 0x3385 (en: 'kilobytes', google translation) - - "ใކ": [T: "็™พ่ฌไฝๅ…ƒ็ต„"] # 0x3386 (en: 'megabytes', google translation) - - "ใއ": [T: "ๅๅ„„ไฝๅ…ƒ็ต„"] # 0x3387 (en: 'gigabytes', google translation) - - "ใŽˆ": [T: "ๅก่ทฏ้‡Œ"] # 0x3388 (en: 'calories', google translation) - - "ใމ": [T: "ๅƒๅก"] # 0x3389 (en: 'kilocalories', google translation) - - "ใŽŠ": [t: "picofarads"] # 0x338a (google translation) - - "ใŽ‹": [t: "nanofarads"] # 0x338b (en: 'nanofarads', google translation) - - "ใŽŒ": [t: "microfarads"] # 0x338c (en: 'microfarads', google translation) + - "ใŽ€": [t: "็šฎๅฎ‰ๅŸน"] # 0x3380 (google translation) + - "ใށ": [t: "ๅฅˆๅฎ‰ๅŸน"] # 0x3381 (en: 'nanoamps', google translation) + - "ใŽ‚": [t: "ๅพฎๅฎ‰ๅŸน"] # 0x3382 (en: 'microamps', google translation) + - "ใŽƒ": [t: "ๆฏซๅฎ‰ๅŸน"] # 0x3383 (en: 'milliamps', google translation) + - "ใŽ„": [T: "ๅƒๅฎ‰ๅŸน"] # 0x3384 (en: 'kiloamps', google translation) + - "ใŽ…": [T: "KB"] # 0x3385 (en: 'kilobytes', google translation) + - "ใކ": [T: "MB"] # 0x3386 (en: 'megabytes', google translation) + - "ใއ": [T: "GB"] # 0x3387 (en: 'gigabytes', google translation) + - "ใŽˆ": [T: "ๅก"] # 0x3388 (en: 'calories', google translation) + - "ใމ": [T: "ๅคงๅก"] # 0x3389 (en: 'kilocalories', google translation) + - "ใŽŠ": [t: "็šฎๆณ•ๆ‹‰"] # 0x338a (google translation) + - "ใŽ‹": [t: "ๅฅˆๆณ•ๆ‹‰"] # 0x338b (en: 'nanofarads', google translation) + - "ใŽŒ": [t: "ๅพฎๆณ•ๆ‹‰"] # 0x338c (en: 'microfarads', google translation) - "ใŽ": [T: "ๅพฎๅ…‹"] # 0x338d (en: 'micrograms', google translation) - "ใŽŽ": [T: "ๆฏซๅ…‹"] # 0x338e (en: 'milligrams', google translation) - "ใŽ": [T: "ๅ…ฌๆ–ค"] # 0x338f (en: 'kilograms', google translation) - "ใސ": [T: "่ตซ่Œฒ"] # 0x3390 (en: 'hertz', google translation) - "ใŽ‘": [T: "ๅƒ่ตซ"] # 0x3391 (en: 'kilohertz', google translation) - "ใŽ’": [T: "็™พ่ฌ่ตซ"] # 0x3392 (en: 'megahertz', google translation) - - "ใŽ“": [T: "ๅๅ„„่ตซ"] # 0x3393 (en: 'gigahertz', google translation) - - "ใŽ”": [t: "terahertz"] # 0x3394 (google translation) + - "ใŽ“": [T: "ๅ‰่ตซ"] # 0x3393 (en: 'gigahertz', google translation) + - "ใŽ”": [t: "ๅ…†่ตซ"] # 0x3394 (google translation) - "ใŽ•": [T: "ๅพฎๅ‡"] # 0x3395 (en: 'microliters', google translation) - "ใŽ–": [T: "ๆฏซๅ‡"] # 0x3396 (en: 'milliliters', google translation) - - "ใŽ—": [t: "deciliters"] # 0x3397 (en: 'deciliters', google translation) - - "ใŽ˜": [T: "ๅƒๅ‡"] # 0x3398 (en: 'kiloliters', google translation) - - "ใŽ™": [t: "femtometers"] # 0x3399 (google translation) + - "ใŽ—": [t: "ๅˆ†ๅ‡"] # 0x3397 (en: 'deciliters', google translation) + - "ใŽ˜": [T: "ๅ…ฌ็ง‰"] # 0x3398 (en: 'kiloliters', google translation) + - "ใŽ™": [t: "้ฃ›็ฑณ"] # 0x3399 (google translation) - "ใŽš": [T: "ๅฅˆ็ฑณ"] # 0x339a (en: 'nanometers', google translation) - "ใŽ›": [T: "ๅพฎ็ฑณ"] # 0x339b (en: 'micrometers', google translation) - "ใŽœ": [T: "ๆฏซ็ฑณ"] # 0x339c (en: 'millimeters', google translation) - - "ใŽ": [T: "ๅŽ˜็ฑณ"] # 0x339d (en: 'centimeters', google translation) + - "ใŽ": [T: "ๅ…ฌๅˆ†"] # 0x339d (en: 'centimeters', google translation) - "ใŽž": [T: "ๅ…ฌ้‡Œ"] # 0x339e (en: 'kilometers', google translation) - - "ใŽŸ": [T: "ๆฏซ็ฑณๅนณๆ–น"] # 0x339f (en: 'millimeters squared', google translation) - - "ใŽ ": [T: "ๅŽ˜็ฑณๅนณๆ–น"] # 0x33a0 (en: 'centimeters squared', google translation) - - "ใŽก": [T: "็ฑณๅนณๆ–น"] # 0x33a1 (en: 'meters squared', google translation) - - "ใŽข": [T: "ๅ…ฌ้‡Œๅนณๆ–น"] # 0x33a2 (en: 'kilometers squared', google translation) - - "ใŽฃ": [T: "ๆฏซ็ฑณ็ซ‹ๆ–น"] # 0x33a3 (en: 'millimeters cubed', google translation) - - "ใŽค": [T: "ๅŽ˜็ฑณ็ซ‹ๆ–น"] # 0x33a4 (en: 'centimeters cubed', google translation) - - "ใŽฅ": [T: "็ฑณ็ซ‹ๆ–น"] # 0x33a5 (en: 'meters cubed', google translation) - - "ใŽฆ": [T: "ๅ…ฌ้‡Œ็ซ‹ๆ–น"] # 0x33a6 (en: 'kilometers cubed', google translation) - - "ใŽง": [T: "ๆฏ็ง’็ฑณ"] # 0x33a7 (en: 'meters per second', google translation) - - "ใŽจ": [T: "ๆฏ็ง’ๅนณๆ–น็ฑณ"] # 0x33a8 (en: 'meters per second squared', google translation) - - "ใŽฉ": [t: "pascals"] # 0x33a9 (en: 'pascals', google translation) - - "ใŽช": [t: "kilopascals"] # 0x33aa (google translation) - - "ใŽซ": [t: "megapascals"] # 0x33ab (en: 'megapascals', google translation) - - "ใŽฌ": [t: "gigapascals"] # 0x33ac (google translation) + - "ใŽŸ": [T: "ๅนณๆ–นๆฏซ็ฑณ"] # 0x339f (en: 'millimeters squared', google translation) + - "ใŽ ": [T: "ๅนณๆ–นๅ…ฌๅˆ†"] # 0x33a0 (en: 'centimeters squared', google translation) + - "ใŽก": [T: "ๅนณๆ–นๅ…ฌๅฐบ"] # 0x33a1 (en: 'meters squared', google translation) + - "ใŽข": [T: "ๅนณๆ–นๅ…ฌ้‡Œ"] # 0x33a2 (en: 'kilometers squared', google translation) + - "ใŽฃ": [T: "็ซ‹ๆ–นๆฏซ็ฑณ"] # 0x33a3 (en: 'millimeters cubed', google translation) + - "ใŽค": [T: "็ซ‹ๆ–นๅ…ฌๅˆ†"] # 0x33a4 (en: 'centimeters cubed', google translation) + - "ใŽฅ": [T: "็ซ‹ๆ–นๅ…ฌๅฐบ"] # 0x33a5 (en: 'meters cubed', google translation) + - "ใŽฆ": [T: "็ซ‹ๆ–นๅ…ฌ้‡Œ"] # 0x33a6 (en: 'kilometers cubed', google translation) + - "ใŽง": [T: "ๅ…ฌๅฐบ/็ง’"] # 0x33a7 (en: 'meters per second', google translation) + - "ใŽจ": [T: "ๅ…ฌๅฐบ/ๅนณๆ–น็ง’"] # 0x33a8 (en: 'meters per second squared', google translation) + - "ใŽฉ": [t: "ๅธ•"] # 0x33a9 (en: 'pascals', google translation) + - "ใŽช": [t: "ๅƒๅธ•"] # 0x33aa (google translation) + - "ใŽซ": [t: "็™พ่ฌๅธ•"] # 0x33ab (en: 'megapascals', google translation) + - "ใŽฌ": [t: "ๅ‰ๅธ•"] # 0x33ac (google translation) - "ใŽญ": [T: "ๅผณ"] # 0x33ad (en: 'rads', google translation) - - "ใŽฎ": [T: "ๆฏ็ง’ๅผณ"] # 0x33ae (en: 'rads per second', google translation) - - "ใŽฏ": [T: "ๆฏ็ง’ๅนณๆ–นๅผณ"] # 0x33af (en: 'rads per second squared', google translation) - - "ใŽฐ": [t: "picseconds"] # 0x33b0 (en: 'picoseconds', google translation) - - "ใŽฑ": [t: "nanoseconds"] # 0x33b1 (en: 'nanoseconds', google translation) + - "ใŽฎ": [T: "ๅผณ/็ง’"] # 0x33ae (en: 'rads per second', google translation) + - "ใŽฏ": [T: "ๅผณ/ๅนณๆ–น็ง’"] # 0x33af (en: 'rads per second squared', google translation) + - "ใŽฐ": [t: "็šฎ็ง’"] # 0x33b0 (en: 'picoseconds', google translation) + - "ใŽฑ": [t: "ๅฅˆ็ง’"] # 0x33b1 (en: 'nanoseconds', google translation) - "ใŽฒ": [T: "ๅพฎ็ง’"] # 0x33b2 (en: 'microseconds', google translation) - "ใŽณ": [T: "ๆฏซ็ง’"] # 0x33b3 (en: 'milliseconds', google translation) - - "ใŽด": [t: "picovolts"] # 0x33b4 (google translation) - - "ใŽต": [t: "nanovolts"] # 0x33b5 (en: 'nanovolts', google translation) + - "ใŽด": [t: "็šฎไผ็‰น"] # 0x33b4 (google translation) + - "ใŽต": [t: "ๅฅˆไผ็‰น"] # 0x33b5 (en: 'nanovolts', google translation) - "ใŽถ": [T: "ๅพฎไผ็‰น"] # 0x33b6 (en: 'microvolts', google translation) - "ใŽท": [T: "ๆฏซไผ็‰น"] # 0x33b7 (en: 'millivolts', google translation) - "ใŽธ": [T: "ๅƒไผ็‰น"] # 0x33b8 (en: 'kilovolts', google translation) - - "ใŽน": [t: "megavolts"] # 0x33b9 (google translation) - - "ใŽบ": [t: "picowatts"] # 0x33ba (google translation) - - "ใŽป": [t: "nanowatts"] # 0x33bb (en: 'nanowatts', google translation) - - "ใŽผ": [t: "microwatts"] # 0x33bc (google translation) + - "ใŽน": [t: "็™พ่ฌไผ็‰น"] # 0x33b9 (google translation) + - "ใŽบ": [t: "็šฎ็“ฆ"] # 0x33ba (google translation) + - "ใŽป": [t: "ๅฅˆ็“ฆ"] # 0x33bb (en: 'nanowatts', google translation) + - "ใŽผ": [t: "ๅพฎ็“ฆ"] # 0x33bc (google translation) - "ใŽฝ": [T: "ๆฏซ็“ฆ"] # 0x33bd (en: 'milliwatts', google translation) - "ใŽพ": [T: "ๅƒ็“ฆ"] # 0x33be (en: 'kilowatts', google translation) - "ใŽฟ": [T: "็™พ่ฌ็“ฆ"] # 0x33bf (en: 'megawatts', google translation) - "ใ€": [T: "ๅƒๆญๅง†"] # 0x33c0 (en: 'kilo-ohms', google translation) - "ใ": [T: "็™พ่ฌๆญๅง†"] # 0x33c1 (google translation) - "ใ‚": [t: "attometers"] # 0x33c2 (google translation) - - "ใƒ": [t: "becquerels"] # 0x33c3 (en: 'becquerels', google translation) + - "ใƒ": [t: "่ฒๅ…‹"] # 0x33c3 (en: 'becquerels', google translation) - "ใ„": [T: "cc"] # 0x33c4 (en: 'cubic centimeters', google translation) - - "ใ…": [t: "candelas"] # 0x33c5 (en: 'candelas', google translation) - - "ใ†": [t: "coulombs per kilogram"] # 0x33c6 (en: 'coulombs per kilogram', google translation) + - "ใ…": [t: "็‡ญๅ…‰"] # 0x33c5 (en: 'candelas', google translation) + - "ใ†": [t: "ๅบซไพ–/ๅ…ฌๆ–ค"] # 0x33c6 (en: 'coulombs per kilogram', google translation) - "ใ‡": [t: "cardiac output"] # 0x33c7 (en: 'cardiac output', google translation) - "ใˆ": [T: "ๅˆ†่ฒ"] # 0x33c8 (en: 'decibels', google translation) - - "ใ‰": [t: "grays"] # 0x33c9 (en: 'grays', google translation) - - "ใŠ": [t: "hectares"] # 0x33ca (en: 'hectares', google translation) + - "ใ‰": [t: "ๆˆˆ้›ท"] # 0x33c9 (en: 'grays', google translation) + - "ใŠ": [t: "ๅ…ฌ้ ƒ"] # 0x33ca (en: 'hectares', google translation) - "ใ‹": [T: "้ฆฌๅŠ›"] # 0x33cb (en: 'horsepower', google translation) - "ใŒ": [T: "่‹ฑๅฏธ"] # 0x33cc (en: 'inches', google translation) - "ใ": [t: "kilokelvins"] # 0x33cd (google translation) - "ใŽ": [T: "ๅ…ฌ้‡Œ"] # 0x33ce (en: 'kilometers', google translation) - - "ใ": [t: "็ต"] # 0x33cf (en: 'knots', google translation) + - "ใ": [t: "็ฏ€"] # 0x33cf (en: 'knots', google translation) - "ใ": [T: "ๆตๆ˜Ž"] # 0x33d0 (en: 'lumens', google translation) - "ใ‘": [T: "่‡ช็„ถๅฐๆ•ธ"] # 0x33d1 (en: 'natural log', google translation) - "ใ’": [T: "ๅฐๆ•ธ"] # 0x33d2 (en: 'logarithm', google translation) - "ใ“": [t: "ๅ‹’ๅ…‹ๆ–ฏ"] # 0x33d3 (en: 'lux', google translation) - - "ใ”": [t: "millibarns"] # 0x33d4 (google translation) - - "ใ•": [t: "mills"] # 0x33d5 (en: 'mills', google translation) - - "ใ–": [t: "moles"] # 0x33d6 (en: 'moles', google translation) - - "ใ—": [T: "p h"] # 0x33d7 (google translation) + - "ใ”": [t: "ๆฏซ้‚ฆ"] # 0x33d4 (google translation) + - "ใ•": [t: "ๅฏ†่€ณ"] # 0x33d5 (en: 'mills', google translation) + - "ใ–": [t: "่Žซ่€ณ"] # 0x33d6 (en: 'moles', google translation) + - "ใ—": [T: "pH"] # 0x33d7 (google translation) - "ใ˜": [t: "picometers"] # 0x33d8 (en: 'picometers', google translation) - - "ใ™": [T: "p p m"] # 0x33d9 (en: 'parts per million', google translation) - - "ใš": [t: "petaroentgens"] # 0x33da (google translation) - - "ใ›": [t: "steradians"] # 0x33db (en: 'steradians', google translation) - - "ใœ": [t: "sieverts"] # 0x33dc (google translation) - - "ใ": [t: "webers"] # 0x33dd (en: 'webers', google translation) - - "ใž": [T: "ๆฏ็ฑณไผ"] # 0x33de (en: 'volts per meter', google translation) - - "ใŸ": [T: "ๆฏ็ฑณๅฎ‰"] # 0x33df (en: 'amps per meter', google translation) + - "ใ™": [T: "PPM"] # 0x33d9 (en: 'parts per million', google translation) + - "ใš": [t: "ๆ‹ไพ–็ด"] # 0x33da (google translation) + - "ใ›": [t: "็ซ‹ๅผณ"] # 0x33db (en: 'steradians', google translation) + - "ใœ": [t: "่ฅฟๅผ—"] # 0x33dc (google translation) + - "ใ": [t: "้Ÿ‹ไผฏ"] # 0x33dd (en: 'webers', google translation) + - "ใž": [T: "ไผ็‰น/ๅ…ฌๅฐบ"] # 0x33de (en: 'volts per meter', google translation) + - "ใŸ": [T: "ๅฎ‰ๅŸน/ๅ…ฌๅฐบ"] # 0x33df (en: 'amps per meter', google translation) - "ใฟ": [T: "ๅŠ ไพ–"] # 0x33ff (en: 'gallons', google translation) - "๎ค€": [t: "็ญ‰ๆ–ผไธ‹้ข็š„ๅธฝๅญ"] # 0xe900 (en: 'equals with hat below', google translation) - "๎ค": [t: "็ญ‰ๆ–ผไธŠ้ข"] # 0xe901 (en: 'equals with plus above', google translation) diff --git a/docs/User_guide_for_MathCAT_en.md b/docs/User_guide_for_MathCAT_en.md index c63431a81..80e19314d 100644 --- a/docs/User_guide_for_MathCAT_en.md +++ b/docs/User_guide_for_MathCAT_en.md @@ -39,6 +39,7 @@ You can choose between the following settings for speech. Below each setting you - \[English (en)\] - Spanish (es) - Indonesian (id) + - Russian (ru) - Swedish (sv) - Vietnamese (vi) - Chinese, traditional (zh-tw) diff --git a/docs/_data/languages.yml b/docs/_data/languages.yml index 704563890..4b69c28f5 100644 --- a/docs/_data/languages.yml +++ b/docs/_data/languages.yml @@ -2,3 +2,5 @@ en: name: English fi: # Finnish name: Suomi +ru: # Russian + name: ะ ัƒััะบะธะน diff --git a/docs/index.md b/docs/index.md index c4c713172..64b82251d 100644 --- a/docs/index.md +++ b/docs/index.md @@ -33,7 +33,7 @@ MathCAT uses a number of heuristics that try to repair poor MathML and put it in MathCAT is under active development. DAISY is actively participating in the development effort, and contributions are welcome. MathCAT is open source, and the [GitHub repository is available here](https://github.com/daisy/MathCAT). [NVDA-specific problems with the MathCAT add-on can be reported here](https://github.com/daisy/MathCATForPython/issues). * MathCAT currently supports speech and navigation for -English, German, Spanish, Finnish, Indonesian, Norwegian, Swedish, Vietnamese, and Chinese (Traditional). +English, German, Spanish, Finnish, Indonesian, Norwegian, Russian, Swedish, Vietnamese, and Chinese (Traditional). * MathCAT's braille support includes Nemeth, UEB, CMU, Vietnamese, German/Austrian LaTeX and ASCIIMath. * An [NVDA add-on](https://addons.nvda-project.org/addons/MathCAT.en.html) exists. It should be usable as a MathPlayer replacement for those using the English version or one of the supported translations. As of NVDA 2026.1, MathCAT is built into NVDA and no download is needed. diff --git a/docs/ru/README.md b/docs/ru/README.md new file mode 100644 index 000000000..7d47b36be --- /dev/null +++ b/docs/ru/README.md @@ -0,0 +1,33 @@ +# ะ”ะพะบัƒะผะตะฝั‚ะฐั†ะธั MathCAT + +ะ”ะพะบัƒะผะตะฝั‚ะฐั†ะธั ัะพะฑะธั€ะฐะตั‚ัั ั ะฟะพะผะพั‰ัŒัŽ [Jekyll](https://jekyllrb.com/) ั ั‚ะตะผะพะน Cayman ะธ ะฟัƒะฑะปะธะบัƒะตั‚ัั ะฝะฐ GitHub Pages. + +## ะŸะพะดะดะตั€ะถะบะฐ ะฝะตัะบะพะปัŒะบะธั… ัะทั‹ะบะพะฒ + +ะŸะตั€ะตะฒะพะดั‹ ะฝะฐั…ะพะดัั‚ัั ะฒ ะฟะพะดะบะฐั‚ะฐะปะพะณะฐั… ัะทั‹ะบะพะฒ (ะฝะฐะฟั€ะธะผะตั€, `ru/` ะดะปั ั€ัƒััะบะพะณะพ ัะทั‹ะบะฐ). ะšะฐะถะดะฐั ะฟะตั€ะตะฒะตะดั‘ะฝะฝะฐั ัั‚ั€ะฐะฝะธั†ะฐ ะดะพะปะถะฝะฐ ัะพะดะตั€ะถะฐั‚ัŒ front matter ั ะฟะพะปัะผะธ `lang` ะธ `ref`: + +```yaml +--- +layout: default +lang: ru +ref: users +title: ะ ัƒะบะพะฒะพะดัั‚ะฒะพ ะฟะพะปัŒะทะพะฒะฐั‚ะตะปั MathCat +--- +``` + +- `lang` โ€” ะบะพะด ัะทั‹ะบะฐ ัั‚ั€ะฐะฝะธั†ั‹; +- `ref` โ€” ะพะฑั‰ะธะน ะธะดะตะฝั‚ะธั„ะธะบะฐั‚ะพั€, ัะฒัะทั‹ะฒะฐัŽั‰ะธะน ะฟะตั€ะตะฒะพะดั‹ ะพะดะฝะพะน ะธ ั‚ะพะน ะถะต ัั‚ั€ะฐะฝะธั†ั‹ (ะฝะฐะฟั€ะธะผะตั€, ะฟะพะปะต `ref: users` ะดะพะปะถะฝะพ ะฑั‹ั‚ัŒ ะธ ะฒ `users.md`, ะธ ะฒ `ru/users.md`). + +ะŸะตั€ะตะบะปัŽั‡ะฐั‚ะตะปัŒ ัะทั‹ะบะพะฒ ะฒ `_layouts/default.html` ะธัะฟะพะปัŒะทัƒะตั‚ ัั‚ะธ ะฟะพะปั ะดะปั ัะพะทะดะฐะฝะธั ััั‹ะปะพะบ ะผะตะถะดัƒ ะฟะตั€ะตะฒะพะดะฐะผะธ. ะžะฝ ะพั‚ะพะฑั€ะฐะถะฐะตั‚ัั ั‚ะพะปัŒะบะพ ะฝะฐ ัั‚ั€ะฐะฝะธั†ะฐั…, ัƒ ะบะพั‚ะพั€ั‹ั… ะทะฐะดะฐะฝะพ ะฟะพะปะต `ref`. + +ะงั‚ะพะฑั‹ ะทะฐั€ะตะณะธัั‚ั€ะธั€ะพะฒะฐั‚ัŒ ะฝะพะฒั‹ะน ัะทั‹ะบ, ะดะพะฑะฐะฒัŒั‚ะต ะตะณะพ ะฒ `_data/languages.yml`. + +## ะ›ะพะบะฐะปัŒะฝะฐั ั€ะฐะทั€ะฐะฑะพั‚ะบะฐ + +ะ—ะฐะฟัƒัั‚ะธั‚ะต _Jekyll_ ะธะท ะบะพั€ะฝะตะฒะพะณะพ ะบะฐั‚ะฐะปะพะณะฐ ั€ะตะฟะพะทะธั‚ะพั€ะธั: + +``` +docker run --rm -v "${PWD}/docs:/srv/jekyll" -p 4000:4000 jekyll/jekyll bash -c "bundle install && bundle exec jekyll serve --host 0.0.0.0" +``` + +ะ—ะฐั‚ะตะผ ะพั‚ะบั€ะพะนั‚ะต http://localhost:4000, http://localhost:4000/fi/users ะธ ั‚. ะด. diff --git a/docs/ru/User_guide_for_MathCAT_ru.md b/docs/ru/User_guide_for_MathCAT_ru.md new file mode 100644 index 000000000..fec001990 --- /dev/null +++ b/docs/ru/User_guide_for_MathCAT_ru.md @@ -0,0 +1,131 @@ +--- +layout: default +lang: ru +ref: user-guide +title: ะ ัƒะบะพะฒะพะดัั‚ะฒะพ ะฟะพะปัŒะทะพะฒะฐั‚ะตะปั MathCAT +--- +# ะ ัƒะบะพะฒะพะดัั‚ะฒะพ ะฟะพะปัŒะทะพะฒะฐั‚ะตะปั MathCAT + +MathCAT โ€” ะธะฝัั‚ั€ัƒะผะตะฝั‚, ะบะพั‚ะพั€ั‹ะน ะธัะฟะพะปัŒะทัƒะตั‚ัั ะฒะผะตัั‚ะต ั ะฟั€ะพะณั€ะฐะผะผะพะน ัะบั€ะฐะฝะฝะพะณะพ ะดะพัั‚ัƒะฟะฐ. ะก ะฟะพะผะพั‰ัŒัŽ MathCAT ะผะฐั‚ะตะผะฐั‚ะธั‡ะตัะบะธะต ะฒั‹ั€ะฐะถะตะฝะธั ะผะพะถะฝะพ ะพะทะฒัƒั‡ะธะฒะฐั‚ัŒ ะธ ั‡ะธั‚ะฐั‚ัŒ ะฝะฐ ะดะธัะฟะปะตะต ะ‘ั€ะฐะนะปั. + + +ะ•ัะปะธ ะฒั‹ ะธัะฟะพะปัŒะทัƒะตั‚ะต ะฟั€ะพะณั€ะฐะผะผัƒ ัะบั€ะฐะฝะฝะพะณะพ ะดะพัั‚ัƒะฟะฐ NVDA, ัƒัั‚ะฐะฝะพะฒะธั‚ะต MathCAT ะบะฐะบ ะดะพะฟะพะปะฝะตะฝะธะต. [ะกะบะฐั‡ะฐั‚ัŒ ะดะพะฟะพะปะฝะตะฝะธะต MathCAT ะดะปั NVDA ะผะพะถะฝะพ ะทะดะตััŒ.](https://nvda-addons.org/) + +ะ•ัะปะธ ะฒั‹ ะธัะฟะพะปัŒะทัƒะตั‚ะต JAWS, MathCAT ัƒะถะต ะฒัั‚ั€ะพะตะฝ ะฒ ะฟั€ะพะณั€ะฐะผะผัƒ, ะฟะพัั‚ะพะผัƒ ัƒัั‚ะฐะฝะฐะฒะปะธะฒะฐั‚ัŒ ะตะณะพ ะบะฐะบ ะดะพะฟะพะปะฝะตะฝะธะต ะฝะต ะฝัƒะถะฝะพ. + +## ะะฐั‡ะฐะปะพ ั€ะฐะฑะพั‚ั‹ ั MathCAT + +ะ˜ัะฟะพะปัŒะทัƒะนั‚ะต ะฟั€ะพะณั€ะฐะผะผัƒ ัะบั€ะฐะฝะฝะพะณะพ ะดะพัั‚ัƒะฟะฐ ะฝะฐ ะฒะตะฑ-ัั‚ั€ะฐะฝะธั†ะต ะธะปะธ ะฒ ัะปะตะบั‚ั€ะพะฝะฝะพะน ะบะฝะธะณะต ะบะฐะบ ะพะฑั‹ั‡ะฝะพ. ะšะพะณะดะฐ ะฒั‹ ะดะพะนะดั‘ั‚ะต ะดะพ ะผะฐั‚ะตะผะฐั‚ะธั‡ะตัะบะพะณะพ ะฒั‹ั€ะฐะถะตะฝะธั, ะฟั€ะพะณั€ะฐะผะผะฐ ัะบั€ะฐะฝะฝะพะณะพ ะดะพัั‚ัƒะฟะฐ ะฐะฒั‚ะพะผะฐั‚ะธั‡ะตัะบะธ ะฟั€ะพั‡ะธั‚ะฐะตั‚ ะตะณะพ. ะงั‚ะพะฑั‹ ะธะทัƒั‡ะธั‚ัŒ ะฒั‹ั€ะฐะถะตะฝะธะต ะฟะพะดั€ะพะฑะฝะตะต, ะฒะบะปัŽั‡ะธั‚ะต ั€ะตะถะธะผ ะฝะฐะฒะธะณะฐั†ะธะธ, ะฝะฐะถะฐะฒ ะฟั€ะพะฑะตะป. ะ’ NVDA ะดะปั ัั‚ะพะณะพ ั‚ะฐะบะถะต ะผะพะถะฝะพ ะฝะฐะถะฐั‚ัŒ NVDA+Alt+M. ะงั‚ะพะฑั‹ ะฒั‹ะนั‚ะธ ะธะท ั€ะตะถะธะผะฐ ะฝะฐะฒะธะณะฐั†ะธะธ, ะฝะฐะถะผะธั‚ะต Escape. + +### ะะฐะธะฑะพะปะตะต ั€ะฐัะฟั€ะพัั‚ั€ะฐะฝั‘ะฝะฝั‹ะต ัะพั‡ะตั‚ะฐะฝะธั ะบะปะฐะฒะธัˆ + +- ะ”ะปั ะฟะตั€ะตะผะตั‰ะตะฝะธั ะฒะปะตะฒะพ, ะฒะฟั€ะฐะฒะพ, ะฒะฒะตั€ั… ะธะปะธ ะฒะฝะธะท ะฒะฝัƒั‚ั€ะธ ะผะฐั‚ะตะผะฐั‚ะธั‡ะตัะบะพะณะพ ะฒั‹ั€ะฐะถะตะฝะธั ะธัะฟะพะปัŒะทัƒะนั‚ะต ะบะปะฐะฒะธัˆะธ-ัั‚ั€ะตะปะบะธ. +- ะ”ะปั ะฟะตั€ะตะผะตั‰ะตะฝะธั ะผะตะถะดัƒ ัั‡ะตะนะบะฐะผะธ ั‚ะฐะฑะปะธั†ั‹ ะธัะฟะพะปัŒะทัƒะนั‚ะต Ctrl+ัั‚ั€ะตะปะบะฐ. +- ะงั‚ะพะฑั‹ ะฟะตั€ะตะนั‚ะธ ะบ ะฝะฐั‡ะฐะปัƒ ะฒั‹ั€ะฐะถะตะฝะธั, ะฝะฐะถะผะธั‚ะต Home, ะฐ ั‡ั‚ะพะฑั‹ ะฟะตั€ะตะนั‚ะธ ะบ ะบะพะฝั†ัƒ โ€” End. +- ะงั‚ะพะฑั‹ ัƒัะปั‹ัˆะฐั‚ัŒ ั‚ะตะบัƒั‰ัƒัŽ ะฟะพะทะธั†ะธัŽ, ะฝะฐะถะผะธั‚ะต ะฟั€ะพะฑะตะป. +- ะงั‚ะพะฑั‹ ะธะทะผะตะฝะธั‚ัŒ ั€ะตะถะธะผ ะฝะฐะฒะธะณะฐั†ะธะธ, ะฝะฐะถะผะธั‚ะต Shift+ัั‚ั€ะตะปะบะฐ ะฒะฒะตั€ั… ะธะปะธ Shift+ัั‚ั€ะตะปะบะฐ ะฒะฝะธะท. ะ ะตะถะธะผั‹ ะฝะฐะฒะธะณะฐั†ะธะธ ะพะฟะธัะฐะฝั‹ ะฒ ั€ะฐะทะดะตะปะต ยซะะฐะฒะธะณะฐั†ะธัยป. + +ะŸั€ะธ ะฝะฐะฒะธะณะฐั†ะธะธ ะฟะพ ะฒั‹ั€ะฐะถะตะฝะธัŽ ะผะพะถะฝะพ ะฝะฐะถะฐั‚ัŒ Ctrl+C, ั‡ั‚ะพะฑั‹ ัะบะพะฟะธั€ะพะฒะฐั‚ัŒ ะบะพะด MathML ั‚ะตะบัƒั‰ะตะณะพ ัƒะทะปะฐ ะฒั‹ั€ะฐะถะตะฝะธั. + +ะ’ ะผะฐั‚ะตะผะฐั‚ะธั‡ะตัะบะธั… ะฒั‹ั€ะฐะถะตะฝะธัั… ะดะพัั‚ัƒะฟะฝะพ ะณะพั€ะฐะทะดะพ ะฑะพะปัŒัˆะต ะฒะพะทะผะพะถะฝะพัั‚ะตะน ะฝะฐะฒะธะณะฐั†ะธะธ. ะ’ัะต ั„ัƒะฝะบั†ะธะธ ะพะฟะธัะฐะฝั‹ ะฒ ั€ะฐะทะดะตะปะต ยซะ’ัะต ะบะพะผะฐะฝะดั‹ ะฝะฐะฒะธะณะฐั†ะธะธยป. + +## ะะฐัั‚ั€ะพะนะบะฐ MathCAT + +MathCAT ะผะพะถะฝะพ ะฝะฐัั‚ั€ะพะธั‚ัŒ ะฒ ัะพะพั‚ะฒะตั‚ัั‚ะฒะธะธ ั ะฒะฐัˆะธะผะธ ะฟะพั‚ั€ะตะฑะฝะพัั‚ัะผะธ. ะงั‚ะพะฑั‹ ะฝะฐะนั‚ะธ ะฟะฐั€ะฐะผะตั‚ั€ั‹, ะฝะฐะถะผะธั‚ะต NVDA+N, ะทะฐั‚ะตะผ ะฒั‹ะฑะตั€ะธั‚ะต ยซะŸะฐั€ะฐะผะตั‚ั€ั‹ยป, ะฐ ะฟะพัะปะต ัั‚ะพะณะพ โ€” ยซะะฐัั‚ั€ะพะนะบะธ MathCATยป. ะ’ ัะฟะธัะบะต ะบะฐั‚ะตะณะพั€ะธะน ะตัั‚ัŒ ั‚ั€ะธ ะฟัƒะฝะบั‚ะฐ: ยซะ ะตั‡ัŒยป, ยซะะฐะฒะธะณะฐั†ะธัยป ะธ ยซะ‘ั€ะฐะนะปัŒยป. + +### ะ ะตั‡ัŒ + +ะะธะถะต ะฟะตั€ะตั‡ะธัะปะตะฝั‹ ะฟะฐั€ะฐะผะตั‚ั€ั‹ ั€ะตั‡ะธ ะธ ะดะพัั‚ัƒะฟะฝั‹ะต ะดะปั ะฝะธั… ะทะฝะฐั‡ะตะฝะธั ั ะบั€ะฐั‚ะบะธะผะธ ะพะฟะธัะฐะฝะธัะผะธ. ะ—ะฝะฐั‡ะตะฝะธะต ะฟะพ ัƒะผะพะปั‡ะฐะฝะธัŽ, ะบะพั‚ะพั€ะพะต ะธัะฟะพะปัŒะทัƒะตั‚ัั, ะตัะปะธ ะฒั‹ ะฝะธั‡ะตะณะพ ะฝะต ะฒั‹ะฑั€ะฐะปะธ, ัƒะบะฐะทะฐะฝะพ ะฒ ะบะฒะฐะดั€ะฐั‚ะฝั‹ั… ัะบะพะฑะบะฐั…. + +- ะžัะพะฑั‹ะต ะฟะพั‚ั€ะตะฑะฝะพัั‚ะธ: + - \[ะะตะทั€ัั‡ะธะต.\] ะžะดะฝะพะทะฝะฐั‡ะฝะพะต ะพะทะฒัƒั‡ะธะฒะฐะฝะธะต. + - ะกะปะฐะฑะพะฒะธะดัั‰ะธะต. ะ‘ะพะปะตะต ะบั€ะฐั‚ะบะพะต ะพะทะฒัƒั‡ะธะฒะฐะฝะธะต. + - ะขั€ัƒะดะฝะพัั‚ะธ ะฒ ะพะฑัƒั‡ะตะฝะธะธ. ะ‘ะพะปะตะต ะบั€ะฐั‚ะบะพะต ะพะทะฒัƒั‡ะธะฒะฐะฝะธะต. +- ะฏะทั‹ะบ: (ะฟะพ ัƒะผะพะปั‡ะฐะฝะธัŽ ะธัะฟะพะปัŒะทัƒะตั‚ัั ัะทั‹ะบ ะฟั€ะพะณั€ะฐะผะผั‹ ัะบั€ะฐะฝะฝะพะณะพ ะดะพัั‚ัƒะฟะฐ) + - \[ะะฝะณะปะธะนัะบะธะน (en)\] + - ะ’ัŒะตั‚ะฝะฐะผัะบะธะน (vi) + - ะ˜ะฝะดะพะฝะตะทะธะนัะบะธะน (id) + - ะ˜ัะฟะฐะฝัะบะธะน (es) + - ะšะธั‚ะฐะนัะบะธะน, ั‚ั€ะฐะดะธั†ะธะพะฝะฝะพะต ะฟะธััŒะผะพ (zh-tw) + - ะ ัƒััะบะธะน (ru) + - ะจะฒะตะดัะบะธะน (sv) +- ะกั‚ะธะปัŒ ั€ะตั‡ะธ: + - \[ClearSpeak.\] ะ’ั‹ั€ะฐะถะตะฝะธั ะพะทะฒัƒั‡ะธะฒะฐัŽั‚ัั ะฟั€ะธะผะตั€ะฝะพ ั‚ะฐะบ, ะบะฐะบ ะธั… ะฟั€ะพะธะทะฝั‘ั ะฑั‹ ัƒั‡ะธั‚ะตะปัŒ ะฝะฐ ัƒั€ะพะบะต. + - SimpleSpeak. ะ’ั‹ั€ะฐะถะตะฝะธั ะพะทะฒัƒั‡ะธะฒะฐัŽั‚ัั ะฑะพะปะตะต ะบั€ะฐั‚ะบะพ. ะ˜ะฝะพะณะดะฐ ั‚ะฐะบะพะต ั‡ั‚ะตะฝะธะต ะผะพะถะตั‚ ะฑั‹ั‚ัŒ ะฝะตะพะดะฝะพะทะฝะฐั‡ะฝั‹ะผ. +- ะŸะพะดั€ะพะฑะฝะพัั‚ัŒ: + - ะšั€ะฐั‚ะบะพ. ะžะฟัƒัะบะฐัŽั‚ัั ะดะพะฟะพะปะฝะธั‚ะตะปัŒะฝั‹ะต ัะปะพะฒะฐ, ะฝะฐะฟั€ะธะผะตั€ ะฐั€ั‚ะธะบะปะธ ะธ ะฟั€ะตะดะปะพะณะธ ะฒ ะฐะฝะณะปะธะนัะบะพะน ั„ั€ะฐะทะต ยซthe square root of xยป. + - \[ะกั€ะตะดะฝะต.\] ะšะพะผะฟั€ะพะผะธัั ะผะตะถะดัƒ ะบั€ะฐั‚ะบะธะผ ะธ ะฟะพะดั€ะพะฑะฝั‹ะผ ั€ะตะถะธะผะฐะผะธ. + - ะŸะพะดั€ะพะฑะฝะพ. ะžะทะฒัƒั‡ะธะฒะฐัŽั‚ัั ะฒัะต ัะปะพะฒะฐ. ะงั‚ะตะฝะธะต ัะฒะปัะตั‚ัั ะพะดะฝะพะทะฝะฐั‡ะฝั‹ะผ. +- ะกะบะพั€ะพัั‚ัŒ ั‡ั‚ะตะฝะธั ะผะฐั‚ะตะผะฐั‚ะธั‡ะตัะบะธั… ะฒั‹ั€ะฐะถะตะฝะธะน (MathRate): + - \[100\], ะผะพะถะฝะพ ะทะฐะดะฐั‚ัŒ ะทะฝะฐั‡ะตะฝะธะต ะพั‚ 1 ะดะพ 1000. ะžะฟั€ะตะดะตะปัะตั‚ ัะบะพั€ะพัั‚ัŒ ั‡ั‚ะตะฝะธั ะผะฐั‚ะตะผะฐั‚ะธั‡ะตัะบะธั… ะฒั‹ั€ะฐะถะตะฝะธะน ะพั‚ะฝะพัะธั‚ะตะปัŒะฝะพ ัะบะพั€ะพัั‚ะธ ะฟั€ะพะณั€ะฐะผะผั‹ ัะบั€ะฐะฝะฝะพะณะพ ะดะพัั‚ัƒะฟะฐ. ะ—ะฝะฐั‡ะตะฝะธะต ะทะฐะดะฐั‘ั‚ัั ะฒ ะฟั€ะพั†ะตะฝั‚ะฐั…: 100 ัะพะพั‚ะฒะตั‚ัั‚ะฒัƒะตั‚ ั‚ะพะน ะถะต ัะบะพั€ะพัั‚ะธ, ะผะตะฝัŒัˆะตะต ะทะฝะฐั‡ะตะฝะธะต ะทะฐะผะตะดะปัะตั‚ ั‡ั‚ะตะฝะธะต, ะฐ ะฑะพะปัŒัˆะตะต โ€” ัƒัะบะพั€ัะตั‚. +- ะšะพัั„ั„ะธั†ะธะตะฝั‚ ะดะปะธั‚ะตะปัŒะฝะพัั‚ะธ ะฟะฐัƒะท: + - \[1\], ะผะพะถะฝะพ ะทะฐะดะฐั‚ัŒ ะทะฝะฐั‡ะตะฝะธะต ะพั‚ 0 ะดะพ 10. ะžะฟั€ะตะดะตะปัะตั‚ ะดะปะธั‚ะตะปัŒะฝะพัั‚ัŒ ะฟะฐัƒะท ะฟั€ะธ ั‡ั‚ะตะฝะธะธ ะผะฐั‚ะตะผะฐั‚ะธั‡ะตัะบะธั… ะฒั‹ั€ะฐะถะตะฝะธะน. +- ะ—ะฒัƒะบะพะฒะพะน ัะธะณะฝะฐะป ะดะปั ะผะฐั‚ะตะผะฐั‚ะธั‡ะตัะบะธั… ะฒั‹ั€ะฐะถะตะฝะธะน: + - \[ะะตั‚.\] + - ะ—ะฒัƒะบะพะฒะพะน ัะธะณะฝะฐะป. ะŸะตั€ะตะด ะบะฐะถะดั‹ะผ ะผะฐั‚ะตะผะฐั‚ะธั‡ะตัะบะธะผ ะฒั‹ั€ะฐะถะตะฝะธะตะผ ะธ ะฟะพัะปะต ะฝะตะณะพ ะฒะพัะฟั€ะพะธะทะฒะพะดะธั‚ัั ะทะฒัƒะบะพะฒะพะน ัะธะณะฝะฐะป. +- ะฅะธะผะธั: + - \[ะงะธั‚ะฐั‚ัŒ.\] ะฅะธะผะธั‡ะตัะบะธะต ั„ะพั€ะผัƒะปั‹ ะพะทะฒัƒั‡ะธะฒะฐัŽั‚ัั, ะฝะฐะฟั€ะธะผะตั€ $H_2O$ ั‡ะธั‚ะฐะตั‚ัั ะบะฐะบ ยซะฐัˆ ะดะฒะฐ ะพยป. + +### ะะฐะฒะธะณะฐั†ะธั + +MathCAT ะฟะพะทะฒะพะปัะตั‚ ะฟะพะดั€ะพะฑะฝะพ ะธะทัƒั‡ะฐั‚ัŒ ะฒั‹ั€ะฐะถะตะฝะธะต ั ะฟะพะผะพั‰ัŒัŽ ะฝะฐะฒะธะณะฐั†ะธะธ, ั‚ะพ ะตัั‚ัŒ ะฟะตั€ะตะผะตั‰ะฐั‚ัŒัั ะฟะพ ะฝะตะผัƒ ะธ ั‡ะธั‚ะฐั‚ัŒ ะตะณะพ ะฟะพ ั‡ะฐัั‚ัะผ. ะ’ ะฝะฐัั‚ั€ะพะนะบะฐั… ะฝะฐะฒะธะณะฐั†ะธะธ ะผะพะถะฝะพ ะฒั‹ะฑั€ะฐั‚ัŒ ัะฟะพัะพะฑ ะฟะตั€ะตะผะตั‰ะตะฝะธั ะธ ั‚ั€ะตะฑัƒะตะผัƒัŽ ัั‚ะตะฟะตะฝัŒ ะดะตั‚ะฐะปะธะทะฐั†ะธะธ. + +ะะธะถะต ะฟะตั€ะตั‡ะธัะปะตะฝั‹ ะฟะฐั€ะฐะผะตั‚ั€ั‹ ะธ ะดะพัั‚ัƒะฟะฝั‹ะต ะดะปั ะฝะธั… ะทะฝะฐั‡ะตะฝะธั ั ะบั€ะฐั‚ะบะธะผะธ ะพะฟะธัะฐะฝะธัะผะธ. ะ—ะฝะฐั‡ะตะฝะธะต ะฟะพ ัƒะผะพะปั‡ะฐะฝะธัŽ, ะบะพั‚ะพั€ะพะต ะธัะฟะพะปัŒะทัƒะตั‚ัั, ะตัะปะธ ะฒั‹ ะฝะธั‡ะตะณะพ ะฝะต ะฒั‹ะฑั€ะฐะปะธ, ัƒะบะฐะทะฐะฝะพ ะฒ ะบะฒะฐะดั€ะฐั‚ะฝั‹ั… ัะบะพะฑะบะฐั…. + +- ะ ะตะถะธะผ ะฝะฐะฒะธะณะฐั†ะธะธ ะฟั€ะธ ะฒั…ะพะดะต ะฒ ะฒั‹ั€ะฐะถะตะฝะธะต: + - \[ะ ะฐััˆะธั€ะตะฝะฝั‹ะน ั€ะตะถะธะผ.\] ะŸะตั€ะตะผะตั‰ะตะฝะธะต ะผะตะถะดัƒ ะผะฐั‚ะตะผะฐั‚ะธั‡ะตัะบะธ ะทะฝะฐั‡ะธะผั‹ะผะธ ั‡ะฐัั‚ัะผะธ ะฒั‹ั€ะฐะถะตะฝะธั, ะฝะฐะฟั€ะธะผะตั€ ั‡ะธัะปะธั‚ะตะปะตะผ, ะทะฝะฐะผะตะฝะฐั‚ะตะปะตะผ, ัั‚ะตะฟะตะฝัะผะธ ะธ ะฒั‹ั€ะฐะถะตะฝะธัะผะธ ะฒ ัะบะพะฑะบะฐั…. + - ะŸั€ะพัั‚ะพะน ั€ะตะถะธะผ. ะŸะตั€ะตะผะตั‰ะตะฝะธะต ะผะตะถะดัƒ ัะปะพะฒะฐะผะธ, ะบั€ะพะผะต ัะปัƒั‡ะฐะตะฒ, ะบะพะณะดะฐ ะฒัั‚ั€ะตั‡ะฐะตั‚ัั ะพะฟั€ะตะดะตะปั‘ะฝะฝะพะต ะฒั‹ั€ะฐะถะตะฝะธะต, ะฝะฐะฟั€ะธะผะตั€ ะบะฒะฐะดั€ะฐั‚ะฝั‹ะน ะบะพั€ะตะฝัŒ. ะขะพะณะดะฐ ะพะฝะพ ั‡ะธั‚ะฐะตั‚ัั ั†ะตะปะธะบะพะผ. + - ะŸะพัะธะผะฒะพะปัŒะฝั‹ะน ั€ะตะถะธะผ. ะŸะตั€ะตะผะตั‰ะตะฝะธะต ะผะตะถะดัƒ ัะปะพะฒะฐะผะธ ะธะปะธ ั‡ะธัะปะฐะผะธ. ะฃะฒะตะปะธั‡ัŒั‚ะต ะดะตั‚ะฐะปะธะทะฐั†ะธัŽ, ั‡ั‚ะพะฑั‹ ั‡ะธั‚ะฐั‚ัŒ ะบะฐะถะดัƒัŽ ะฑัƒะบะฒัƒ ะธะปะธ ั†ะธั„ั€ัƒ ะพั‚ะดะตะปัŒะฝะพ. + +ะงั‚ะพะฑั‹ ะธะทะผะตะฝะธั‚ัŒ ั€ะตะถะธะผ ะฝะฐะฒะธะณะฐั†ะธะธ ะฟั€ะธ ะฟะตั€ะตะผะตั‰ะตะฝะธะธ ะฟะพ ะฒั‹ั€ะฐะถะตะฝะธัŽ, ะธัะฟะพะปัŒะทัƒะนั‚ะต Shift+ัั‚ั€ะตะปะบะฐ ะฒะฒะตั€ั… ะดะปั ะฟะตั€ะตั…ะพะดะฐ ะพั‚ ะฟั€ะพัั‚ะพะณะพ ั€ะตะถะธะผะฐ ะบ ั€ะฐััˆะธั€ะตะฝะฝะพะผัƒ ะธะปะธ ะพั‚ ะฟะพัะธะผะฒะพะปัŒะฝะพะณะพ ะบ ะฟั€ะพัั‚ะพะผัƒ. ะะฐะถะฐั‚ะธะต Shift+ัั‚ั€ะตะปะบะฐ ะฒะฝะธะท ะฟะตั€ะตะฒะพะดะธั‚ ะธะท ั€ะฐััˆะธั€ะตะฝะฝะพะณะพ ั€ะตะถะธะผะฐ ะฒ ะฟั€ะพัั‚ะพะน ะธะปะธ ะธะท ะฟั€ะพัั‚ะพะณะพ ะฒ ะฟะพัะธะผะฒะพะปัŒะฝั‹ะน. ะขะฐะบะธะผ ะพะฑั€ะฐะทะพะผ, ะฟะตั€ะตะผะตั‰ะตะฝะธะต ะฒะฒะตั€ั… ะดะฐั‘ั‚ ะฑะพะปะตะต ะพะฑั‰ะธะน ะพะฑะทะพั€, ะฐ ะฒะฝะธะท โ€” ะฑะพะปะตะต ะฟะพะดั€ะพะฑะฝะพะต ะฟั€ะตะดัั‚ะฐะฒะปะตะฝะธะต. + +ะœะพะถะฝะพ ัƒัั‚ะฐะฝะพะฒะธั‚ัŒ ั„ะปะฐะถะพะบ, ั‡ั‚ะพะฑั‹ ั€ะตะถะธะผ ะฝะฐะฒะธะณะฐั†ะธะธ ัะฑั€ะฐัั‹ะฒะฐะปัั ะฟั€ะธ ะบะฐะถะดะพะผ ะฒั…ะพะดะต ะฒ ะฒั‹ั€ะฐะถะตะฝะธะต. ะŸะพ ัƒะผะพะปั‡ะฐะฝะธัŽ ั„ะปะฐะถะพะบ ัะฝัั‚. + +- ะžะทะฒัƒั‡ะธะฒะฐะฝะธะต ะฟะพัะปะต ะฟะตั€ะตะผะตั‰ะตะฝะธั: + - \[ะงะธั‚ะฐั‚ัŒ.\] ะงะธั‚ะฐะตั‚ ั‡ะฐัั‚ัŒ ะฒั‹ั€ะฐะถะตะฝะธั, ะฒ ะบะพั‚ะพั€ะพะน ะฒั‹ ะฝะฐั…ะพะดะธั‚ะตััŒ. + - ะžะฟะธัั‹ะฒะฐั‚ัŒ. ะ”ะฐั‘ั‚ ะพะฑะทะพั€ ะฒั‹ะฑั€ะฐะฝะฝะพะณะพ ะฒั‹ั€ะฐะถะตะฝะธั. + +ะœะพะถะฝะพ ัƒัั‚ะฐะฝะพะฒะธั‚ัŒ ั„ะปะฐะถะพะบ, ั‡ั‚ะพะฑั‹ ั€ะตะถะธะผ ะพะทะฒัƒั‡ะธะฒะฐะฝะธั ะฟะพัะปะต ะฟะตั€ะตะผะตั‰ะตะฝะธั ัะฑั€ะฐัั‹ะฒะฐะปัั ะฟั€ะธ ะบะฐะถะดะพะผ ะฒั…ะพะดะต ะฒ ะฒั‹ั€ะฐะถะตะฝะธะต. ะŸะพ ัƒะผะพะปั‡ะฐะฝะธัŽ ั„ะปะฐะถะพะบ ัƒัั‚ะฐะฝะพะฒะปะตะฝ. + +- ะะฒั‚ะพะผะฐั‚ะธั‡ะตัะบะธ ัƒะผะตะฝัŒัˆะฐั‚ัŒ ะดะตั‚ะฐะปะธะทะฐั†ะธัŽ ะฟะพัะปะต ั‡ั‚ะตะฝะธั ั‡ะฐัั‚ะธ ะฒั‹ั€ะฐะถะตะฝะธั, ะฝะฐะฟั€ะธะผะตั€ ะบะพั€ะฝั: + - \[ะ’ะบะปัŽั‡ะตะฝะพ.\] ะคะปะฐะถะพะบ ัƒัั‚ะฐะฝะพะฒะปะตะฝ. + - ะ’ั‹ะบะปัŽั‡ะตะฝะพ. ะคะปะฐะถะพะบ ัะฝัั‚. +- ะŸะพะดั€ะพะฑะฝะพัั‚ัŒ ะฝะฐะฒะธะณะฐั†ะธะธ: + - ะšั€ะฐั‚ะบะพ. ะžะฟัƒัะบะฐัŽั‚ัั ะดะพะฟะพะปะฝะธั‚ะตะปัŒะฝั‹ะต ัะปะพะฒะฐ, ะฝะฐะฟั€ะธะผะตั€ ะฐั€ั‚ะธะบะปะธ ะธ ะฟั€ะตะดะปะพะณะธ ะฒ ะฐะฝะณะปะธะนัะบะพะน ั„ั€ะฐะทะต ยซthe square root of xยป. + - \[ะกั€ะตะดะฝะต.\] ะšะพะผะฟั€ะพะผะธัั ะผะตะถะดัƒ ะบั€ะฐั‚ะบะธะผ ะธ ะฟะพะดั€ะพะฑะฝั‹ะผ ั€ะตะถะธะผะฐะผะธ. + - ะŸะพะดั€ะพะฑะฝะพ. ะžะทะฒัƒั‡ะธะฒะฐัŽั‚ัั ะฒัะต ัะปะพะฒะฐ. ะงั‚ะตะฝะธะต ัะฒะปัะตั‚ัั ะพะดะฝะพะทะฝะฐั‡ะฝั‹ะผ. + +### ะ‘ั€ะฐะนะปัŒ + +ะะธะถะต ะฟะตั€ะตั‡ะธัะปะตะฝั‹ ะฟะฐั€ะฐะผะตั‚ั€ั‹ ะ‘ั€ะฐะนะปั ะธ ะดะพัั‚ัƒะฟะฝั‹ะต ะดะปั ะฝะธั… ะทะฝะฐั‡ะตะฝะธั. ะ—ะฝะฐั‡ะตะฝะธะต ะฟะพ ัƒะผะพะปั‡ะฐะฝะธัŽ, ะบะพั‚ะพั€ะพะต ะธัะฟะพะปัŒะทัƒะตั‚ัั, ะตัะปะธ ะฒั‹ ะฝะธั‡ะตะณะพ ะฝะต ะฒั‹ะฑั€ะฐะปะธ, ัƒะบะฐะทะฐะฝะพ ะฒ ะบะฒะฐะดั€ะฐั‚ะฝั‹ั… ัะบะพะฑะบะฐั…. + +- ะœะฐั‚ะตะผะฐั‚ะธั‡ะตัะบะฐั ะฝะพั‚ะฐั†ะธั ะดะปั ะพั‚ะพะฑั€ะฐะถะตะฝะธั ะฝะฐ ะดะธัะฟะปะตะต ะ‘ั€ะฐะนะปั: + - \[ะะตะผะตั‚.\] + - ะจะฒะตะดัะบะฐั. + - ะ’ัŒะตั‚ะฝะฐะผัะบะฐั. +- ะขะพั‡ะบะธ 7 ะธ 8 ะพะฑะพะทะฝะฐั‡ะฐัŽั‚ ั‚ะตะบัƒั‰ัƒัŽ ะฟะพะทะธั†ะธัŽ ะฒ ั€ะตะถะธะผะต ะฝะฐะฒะธะณะฐั†ะธะธ: + - ะŸะตั€ะฒั‹ะต ัะธะผะฒะพะปั‹. + - \[ะšะพะฝะตั‡ะฝั‹ะต ั‚ะพั‡ะบะธ.\] + +## ะ’ัะต ะบะพะผะฐะฝะดั‹ ะฝะฐะฒะธะณะฐั†ะธะธ + +ะ’ ั‚ะฐะฑะปะธั†ะต ะฟะตั€ะตั‡ะธัะปะตะฝั‹ ะบะพะผะฐะฝะดั‹ ะดะปั ะฝะฐะฒะธะณะฐั†ะธะธ ะฟะพ ะผะฐั‚ะตะผะฐั‚ะธั‡ะตัะบะพะผัƒ ะฒั‹ั€ะฐะถะตะฝะธัŽ. ะ’ ะฟะตั€ะฒะพะผ ัั‚ะพะปะฑั†ะต ัƒะบะฐะทะฐะฝะฐ ะบะปะฐะฒะธัˆะฐ. ะ’ ะพัั‚ะฐะปัŒะฝั‹ั… ัั‚ะพะปะฑั†ะฐั… ะพะฟะธัะฐะฝะพ ะดะตะนัั‚ะฒะธะต ะฟั€ะธ ะฝะฐะถะฐั‚ะธะธ ัะฐะผะพะน ะบะปะฐะฒะธัˆะธ, Ctrl+ะบะปะฐะฒะธัˆะฐ, Shift+ะบะปะฐะฒะธัˆะฐ ะธ Ctrl+Shift+ะบะปะฐะฒะธัˆะฐ. + +ะŸั€ะธะผะตั‡ะฐะฝะธะต: ั‚ะฐะฑะปะธั‡ะฝะฐั ะผะฐั‚ะตะผะฐั‚ะธะบะฐ โ€” ัั‚ะพ ะผะฐั‚ะตะผะฐั‚ะธั‡ะตัะบะพะต ัะพะดะตั€ะถะธะผะพะต ั ั‚ะฐะฑะปะธั‡ะฝะพะน ัั‚ั€ัƒะบั‚ัƒั€ะพะน, ะฝะฐะฟั€ะธะผะตั€ ะผะฐั‚ั€ะธั†ะฐ ะธะปะธ ัะธัั‚ะตะผะฐ ัƒั€ะฐะฒะฝะตะฝะธะน. ะŸะพ ั‚ะฐะบะธะผ ะฒั‹ั€ะฐะถะตะฝะธัะผ ะผะพะถะฝะพ ะฟะตั€ะตะผะตั‰ะฐั‚ัŒัั ะบะฐะบ ะฟะพ ั‚ะฐะฑะปะธั†ะต. + +| ะšะปะฐะฒะธัˆะฐ | ะ‘ะตะท ะผะพะดะธั„ะธะบะฐั‚ะพั€ะฐ | \+ Ctrl | \+ Shift | + Ctrl + Shift | +| :--- | :--- | :--- | :--- | :--- | +| ะกั‚ั€ะตะปะบะฐ ะฒะปะตะฒะพ | ะŸะตั€ะตะนั‚ะธ ะบ ะฟั€ะตะดั‹ะดัƒั‰ะตะผัƒ ัะปะตะผะตะฝั‚ัƒ | ะ’ ั‚ะฐะฑะปะธั†ะต: ะฟะตั€ะตะนั‚ะธ ะบ ะฟั€ะตะดั‹ะดัƒั‰ะตะน ัั‡ะตะนะบะต.
ะ’ ั‚ะฐะฑะปะธั‡ะฝะพะผ ะฒั‹ั€ะฐะถะตะฝะธะธ: ะฟะตั€ะตะนั‚ะธ ะบ ะฟั€ะตะดั‹ะดัƒั‰ะตะผัƒ ัะปะตะผะตะฝั‚ัƒ.
ะŸั€ะธะผะตั‡ะฐะฝะธะต: ั‚ะฐะบะถะต ะผะพะถะฝะพ ะธัะฟะพะปัŒะทะพะฒะฐั‚ัŒ Ctrl+Alt+ัั‚ั€ะตะปะบะฐ ะฒะปะตะฒะพ. | ะŸั€ะพั‡ะธั‚ะฐั‚ัŒ ะฟั€ะตะดั‹ะดัƒั‰ะธะน ัะปะตะผะตะฝั‚ | ะžะฟะธัะฐั‚ัŒ ะฟั€ะตะดั‹ะดัƒั‰ะธะน ัะปะตะผะตะฝั‚ | +| ะกั‚ั€ะตะปะบะฐ ะฒะฟั€ะฐะฒะพ | ะŸะตั€ะตะนั‚ะธ ะบ ัะปะตะดัƒัŽั‰ะตะผัƒ ัะปะตะผะตะฝั‚ัƒ | ะ’ ั‚ะฐะฑะปะธั†ะต: ะฟะตั€ะตะนั‚ะธ ะบ ัะปะตะดัƒัŽั‰ะตะน ัั‡ะตะนะบะต.
ะ’ ั‚ะฐะฑะปะธั‡ะฝะพะผ ะฒั‹ั€ะฐะถะตะฝะธะธ: ะฟะตั€ะตะนั‚ะธ ะบ ัะปะตะดัƒัŽั‰ะตะผัƒ ัะปะตะผะตะฝั‚ัƒ.
ะŸั€ะธะผะตั‡ะฐะฝะธะต: ั‚ะฐะบะถะต ะผะพะถะฝะพ ะธัะฟะพะปัŒะทะพะฒะฐั‚ัŒ Ctrl+Alt+ัั‚ั€ะตะปะบะฐ ะฒะฟั€ะฐะฒะพ. | ะŸั€ะพั‡ะธั‚ะฐั‚ัŒ ัะปะตะดัƒัŽั‰ะธะน ัะปะตะผะตะฝั‚ | ะžะฟะธัะฐั‚ัŒ ัะปะตะดัƒัŽั‰ะธะน ัะปะตะผะตะฝั‚ | +| ะกั‚ั€ะตะปะบะฐ ะฒะฒะตั€ั… | ะฃะผะตะฝัŒัˆะธั‚ัŒ ะดะตั‚ะฐะปะธะทะฐั†ะธัŽ | ะ’ ั‚ะฐะฑะปะธั†ะต: ะฟะตั€ะตะนั‚ะธ ะบ ัั‡ะตะนะบะต ะฒั‹ัˆะต.
ะ’ ั‚ะฐะฑะปะธั‡ะฝะพะผ ะฒั‹ั€ะฐะถะตะฝะธะธ: ะฟะตั€ะตะนั‚ะธ ะบ ัะปะตะผะตะฝั‚ัƒ ะฒั‹ัˆะต.
ะŸั€ะธะผะตั‡ะฐะฝะธะต: ั‚ะฐะบะถะต ะผะพะถะฝะพ ะธัะฟะพะปัŒะทะพะฒะฐั‚ัŒ Ctrl+Alt+ัั‚ั€ะตะปะบะฐ ะฒะฒะตั€ั…. | ะŸะตั€ะตะนั‚ะธ ะบ ะฑะพะปะตะต ะพะฑั‰ะตะผัƒ ั€ะตะถะธะผัƒ ะฝะฐะฒะธะณะฐั†ะธะธ: ั€ะฐััˆะธั€ะตะฝะฝะพะผัƒ, ะฟั€ะพัั‚ะพะผัƒ ะธะปะธ ะฟะพัะธะผะฒะพะปัŒะฝะพะผัƒ | ะฃะผะตะฝัŒัˆะธั‚ัŒ ะดะตั‚ะฐะปะธะทะฐั†ะธัŽ ะดะพ ะผะธะฝะธะผะฐะปัŒะฝะพะน | +| ะกั‚ั€ะตะปะบะฐ ะฒะฝะธะท | ะฃะฒะตะปะธั‡ะธั‚ัŒ ะดะตั‚ะฐะปะธะทะฐั†ะธัŽ | ะ’ ั‚ะฐะฑะปะธั†ะต: ะฟะตั€ะตะนั‚ะธ ะบ ัั‡ะตะนะบะต ะฝะธะถะต.
ะ’ ั‚ะฐะฑะปะธั‡ะฝะพะผ ะฒั‹ั€ะฐะถะตะฝะธะธ: ะฟะตั€ะตะนั‚ะธ ะบ ัะปะตะผะตะฝั‚ัƒ ะฝะธะถะต.
ะŸั€ะธะผะตั‡ะฐะฝะธะต: ั‚ะฐะบะถะต ะผะพะถะฝะพ ะธัะฟะพะปัŒะทะพะฒะฐั‚ัŒ Ctrl+Alt+ัั‚ั€ะตะปะบะฐ ะฒะฝะธะท. | ะŸะตั€ะตะนั‚ะธ ะบ ะฑะพะปะตะต ะฟะพะดั€ะพะฑะฝะพะผัƒ ั€ะตะถะธะผัƒ ะฝะฐะฒะธะณะฐั†ะธะธ: ั€ะฐััˆะธั€ะตะฝะฝะพะผัƒ, ะฟั€ะพัั‚ะพะผัƒ ะธะปะธ ะฟะพัะธะผะฒะพะปัŒะฝะพะผัƒ | ะฃะฒะตะปะธั‡ะธั‚ัŒ ะดะตั‚ะฐะปะธะทะฐั†ะธัŽ ะดะพ ะผะฐะบัะธะผะฐะปัŒะฝะพะน | +| Enter | ะกะพะพะฑั‰ะธั‚ัŒ ั‚ะตะบัƒั‰ัƒัŽ ะฟะพะทะธั†ะธัŽ | ะกะพะพะฑั‰ะธั‚ัŒ ะฟะพะปะฝัƒัŽ ั‚ะตะบัƒั‰ัƒัŽ ะฟะพะทะธั†ะธัŽ |   |   | +| ะฆะธั„ั€ั‹
1โ€“10 (0 ะพะทะฝะฐั‡ะฐะตั‚ 10) | ะŸะตั€ะตะนั‚ะธ ะบ ะผะตั‚ะบะต ะฟะพะทะธั†ะธะธ | ะฃัั‚ะฐะฝะพะฒะธั‚ัŒ ะผะตั‚ะบัƒ ะฟะพะทะธั†ะธะธ | ะŸั€ะพั‡ะธั‚ะฐั‚ัŒ ัะพะดะตั€ะถะธะผะพะต ะผะตั‚ะบะธ ะฟะพะทะธั†ะธะธ | ะžะฟะธัะฐั‚ัŒ ัะพะดะตั€ะถะธะผะพะต ะผะตั‚ะบะธ ะฟะพะทะธั†ะธะธ | +| ะŸั€ะพะฑะตะป | ะŸั€ะพั‡ะธั‚ะฐั‚ัŒ ั‚ะตะบัƒั‰ะธะน ัะปะตะผะตะฝั‚ | ะŸั€ะพั‡ะธั‚ะฐั‚ัŒ ั‚ะตะบัƒั‰ัƒัŽ ัั‡ะตะนะบัƒ | ะŸะตั€ะตะบะปัŽั‡ะธั‚ัŒ ั€ะตะถะธะผ ั€ะตั‡ะธ ะผะตะถะดัƒ ั‡ั‚ะตะฝะธะตะผ ะธ ะพะฟะธัะฐะฝะธะตะผ | ะžะฟะธัะฐั‚ัŒ ั‚ะตะบัƒั‰ะธะน ัะปะตะผะตะฝั‚ | +| Home | ะŸะตั€ะตะนั‚ะธ ะบ ะฝะฐั‡ะฐะปัƒ ะฒั‹ั€ะฐะถะตะฝะธั | ะŸะตั€ะตะนั‚ะธ ะบ ะฝะฐั‡ะฐะปัƒ ัั‚ั€ะพะบะธ | ะ’ ั‚ะฐะฑะปะธั‡ะฝะพะผ ะฒั‹ั€ะฐะถะตะฝะธะธ: ะฟะตั€ะตะนั‚ะธ ะบ ะฝะฐั‡ะฐะปัƒ ัั‚ะพะปะฑั†ะฐ.

ะ’ ัั‚ะพะปะฑั†ะต: ะฟะตั€ะตะนั‚ะธ ะบ ะฒะตั€ั…ะฝะตะผัƒ ัะปะตะผะตะฝั‚ัƒ | | +| End | ะŸะตั€ะตะนั‚ะธ ะบ ะบะพะฝั†ัƒ ะฒั‹ั€ะฐะถะตะฝะธั | ะŸะตั€ะตะนั‚ะธ ะบ ะบะพะฝั†ัƒ ัั‚ั€ะพะบะธ | ะ’ ั‚ะฐะฑะปะธั‡ะฝะพะผ ะฒั‹ั€ะฐะถะตะฝะธะธ: ะฟะตั€ะตะนั‚ะธ ะบ ะบะพะฝั†ัƒ ัั‚ะพะปะฑั†ะฐ.

ะ’ ัั‚ะพะปะฑั†ะต: ะฟะตั€ะตะนั‚ะธ ะบ ะฝะธะถะฝะตะผัƒ ัะปะตะผะตะฝั‚ัƒ | | +| Backspace | ะ’ะตั€ะฝัƒั‚ัŒัั ะบ ะฟั€ะตะดั‹ะดัƒั‰ะตะน ะฟะพะทะธั†ะธะธ | | | | + +## ะ•ัั‚ัŒ ะทะฐะผะตั‡ะฐะฝะธั ะธะปะธ ะฟั€ะตะดะปะพะถะตะฝะธั ะฟะพ MathCAT? + + diff --git a/docs/ru/callers.md b/docs/ru/callers.md new file mode 100644 index 000000000..c189234e3 --- /dev/null +++ b/docs/ru/callers.md @@ -0,0 +1,186 @@ +--- +layout: default +lang: ru +ref: callers +title: ะ˜ะฝั‚ะตะณั€ะฐั†ะธั MathCAT +--- +# MathCAT: ัั€ะตะดัั‚ะฒะพ ะพะฑะตัะฟะตั‡ะตะฝะธั ะดะพัั‚ัƒะฟะฝะพัั‚ะธ ะผะฐั‚ะตะผะฐั‚ะธะบะธ + + +## ะ˜ะฝั„ะพั€ะผะฐั†ะธั ะดะปั ั€ะฐะทั€ะฐะฑะพั‚ั‡ะธะบะพะฒ ะฐััะธัั‚ะธะฒะฝั‹ั… ั‚ะตั…ะฝะพะปะพะณะธะน ะธ ะฟะพะปัŒะทะพะฒะฐั‚ะตะปะตะน ะฑะธะฑะปะธะพั‚ะตะบะธ + +ะŸั€ะธ ะธัะฟะพะปัŒะทะพะฒะฐะฝะธะธ MathCAT ะฒั‹ะทะพะฒั‹ ะพะฑั‹ั‡ะฝะพ ะฒั‹ะฟะพะปะฝััŽั‚ัั ะฒ ัะปะตะดัƒัŽั‰ะตะผ ะฟะพั€ัะดะบะต: +1. ะ—ะฐะดะฐั‘ั‚ัั ั€ะฐัะฟะพะปะพะถะตะฝะธะต ะบะฐั‚ะฐะปะพะณะฐ `Rules` MathCAT ั ะฟะพะผะพั‰ัŒัŽ [SetRulesDir]. +2. ะก ะฟะพะผะพั‰ัŒัŽ ะฒั‹ะทะพะฒะพะฒ [`SetPreference`] ะทะฐะดะฐัŽั‚ัั ะฝะตะพะฑั…ะพะดะธะผั‹ะต ะฐััะธัั‚ะธะฒะฝะพะน ั‚ะตั…ะฝะพะปะพะณะธะธ ะฝะฐัั‚ั€ะพะนะบะธ. ะžะฑั‹ั‡ะฝะพ ัƒะบะฐะทั‹ะฒะฐัŽั‚ัั `Language` ะธ ะธัะฟะพะปัŒะทัƒะตะผั‹ะน ะดะฒะธะถะพะบ `TTS`, ะตัะปะธ ะพะฝ ะตัั‚ัŒ. ะะฐัั‚ะพัั‚ะตะปัŒะฝะพ ั€ะตะบะพะผะตะฝะดัƒะตั‚ัั ะทะฐะดะฐั‚ัŒ ะดะฒะธะถะพะบ. +3. MathML ะฟะตั€ะตะดะฐั‘ั‚ัั ั ะฟะพะผะพั‰ัŒัŽ [`SetMathML`]. +4. ะััะธัั‚ะธะฒะฝะฐั ั‚ะตั…ะฝะพะปะพะณะธั ะฒั‹ะทั‹ะฒะฐะตั‚ [`GetSpokenText`] ะดะปั ะฟะพะปัƒั‡ะตะฝะธั ั‚ะตะบัั‚ะฐ ะดะปั ะพะทะฒัƒั‡ะธะฒะฐะฝะธั ะธ [`GetBraille`] ะดะปั ะฟะพะปัƒั‡ะตะฝะธั ะ‘ั€ะฐะนะปั ะฒ Unicode. ะ•ัะปะธ ัƒะบะฐะทะฐะฝ ะธะดะตะฝั‚ะธั„ะธะบะฐั‚ะพั€ ัƒะทะปะฐ, ัะพะพั‚ะฒะตั‚ัั‚ะฒัƒัŽั‰ะธะต ัั‡ะตะนะบะธ ะ‘ั€ะฐะนะปั ะฑัƒะดัƒั‚ ะฒั‹ะดะตะปะตะฝั‹. + +ะ”ะปั ะฝะฐะฒะธะณะฐั†ะธะธ ะผะพะถะฝะพ ะฒั‹ะทั‹ะฒะฐั‚ัŒ: +* [`DoNavigateKeyPress`] โ€” ะฟั€ะธะฝะธะผะฐะตั‚ ัะพะฑั‹ั‚ะธั ะบะปะฐะฒะธะฐั‚ัƒั€ั‹; +* [`DoNavigateCommand`] โ€” ะฟั€ะธะฝะธะผะฐะตั‚ ะบะพะผะฐะฝะดั‹, ะฒ ะบะพั‚ะพั€ั‹ะต ะฒะฝัƒั‚ั€ะธ ะฟั€ะพะณั€ะฐะผะผั‹ ะฟั€ะตะพะฑั€ะฐะทัƒัŽั‚ัั ัะพะฑั‹ั‚ะธั ะบะปะฐะฒะธะฐั‚ัƒั€ั‹. + +ะžะฑะฐ ะฒั‹ะทะพะฒะฐ ะฒะพะทะฒั€ะฐั‰ะฐัŽั‚ ัั‚ั€ะพะบัƒ ะดะปั ะพะทะฒัƒั‡ะธะฒะฐะฝะธั. +ะ”ะปั ะฒั‹ะดะตะปะตะฝะธั ั‚ะตะบัƒั‰ะตะณะพ ัƒะทะปะฐ ะฝะฐะฒะธะณะฐั†ะธะธ ะธัะฟะพะปัŒะทัƒัŽั‚ัั ะฐั‚ั€ะธะฑัƒั‚ั‹ `id`. ะ•ัะปะธ ะพะฝะธ ะตั‰ั‘ ะฝะต ะทะฐะดะฐะฝั‹, +[`SetMathML`] ะฒะพะทะฒั€ะฐั‰ะฐะตั‚ ัั‚ั€ะพะบัƒ MathML ั ะฐั‚ั€ะธะฑัƒั‚ะฐะผะธ `id` ัƒ ะฒัะตั… ัƒะทะปะพะฒ, ะดะปั ะบะพั‚ะพั€ั‹ั… ั‚ะฐะบะธะต ะฐั‚ั€ะธะฑัƒั‚ั‹ ะพั‚ััƒั‚ัั‚ะฒะพะฒะฐะปะธ. +ะขะตะบัƒั‰ะธะน ัƒะทะตะป ะผะพะถะฝะพ ะฟะพะปัƒั‡ะธั‚ัŒ ั ะฟะพะผะพั‰ัŒัŽ: +* [`GetNavigationMathMLId`]; +* [`GetNavigationMathML`] โ€” ะฒะพะทะฒั€ะฐั‰ะฐะตั‚ ัั‚ั€ะพะบัƒ MathML ะฒั‹ะฑั€ะฐะฝะฝะพะณะพ ัƒะทะปะฐ. + +ะŸั€ะธะผะตั‡ะฐะฝะธะต: ะพะฑะฐ ะฒั‹ะทะพะฒะฐ ั‚ะฐะบะถะต ะฒะพะทะฒั€ะฐั‰ะฐัŽั‚ ะฒั‚ะพั€ะพะต ั†ะตะปะพะต ั‡ะธัะปะพ. ะญั‚ะพ ัะผะตั‰ะตะฝะธะต ัะธะผะฒะพะปะฐ ะฒ ะปะธัั‚ะพะฒะพะผ ัƒะทะปะต. +ะžะฝะพ ะฝะตะพะฑั…ะพะดะธะผะพ ะดะปั ะฟะพัะธะผะฒะพะปัŒะฝะพะน ะฝะฐะฒะธะณะฐั†ะธะธ ะฟะพ ะปะธัั‚ะพะฒั‹ะผ ัƒะทะปะฐะผ ะธะท ะฝะตัะบะพะปัŒะบะธั… ัะธะผะฒะพะปะพะฒ, ะฝะฐะฟั€ะธะผะตั€ `sin` ะธ `1234`. +ะกะตะนั‡ะฐั ะทะฝะฐั‡ะตะฝะธะต ะฒัะตะณะดะฐ ั€ะฐะฒะฝะพ `0`: ัั‚ะฐ ั„ัƒะฝะบั†ะธั ั‚ั€ะตะฑัƒะตั‚ ะดะฐะปัŒะฝะตะนัˆะตะน ั€ะฐะทั€ะฐะฑะพั‚ะบะธ. + +ะขะตะบัƒั‰ะธะต ะทะฝะฐั‡ะตะฝะธั ะฝะฐัั‚ั€ะพะตะบ ะผะพะถะฝะพ ะฟะพะปัƒั‡ะธั‚ัŒ ั ะฟะพะผะพั‰ัŒัŽ ะฒั‹ะทะพะฒะฐ [`GetPreference`]. + +ะ’ัะต ั„ัƒะฝะบั†ะธะธ ะผะพะณัƒั‚ ะฒะพะทะฒั€ะฐั‰ะฐั‚ัŒ ะบะพะด ะพัˆะธะฑะบะธ. + +ะŸั€ะธะผะตั‡ะฐะฝะธะต: MathCAT ะฒั‹ะฟะพะปะฝัะตั‚ ะทะฝะฐั‡ะธั‚ะตะปัŒะฝัƒัŽ ั€ะฐะฑะพั‚ัƒ ะฟะพ ะธัะฟั€ะฐะฒะปะตะฝะธัŽ ะฝะตะบะฐั‡ะตัั‚ะฒะตะฝะฝะพะณะพ MathML. ะ’ ั‡ะฐัั‚ะฝะพัั‚ะธ, ะณะตะฝะตั€ะฐั‚ะพั€ั‹ MathML ั‡ะฐัั‚ะพ ั€ะฐะทะดะตะปััŽั‚ ะฝะฐ ั‡ะฐัั‚ะธ ั‡ะธัะปะฐ ั ะทะฐะฟัั‚ั‹ะผะธ ะธ ั‚ะพั‡ะบะฐะผะธ. MathCAT ะฟั‹ั‚ะฐะตั‚ัั ัะพะฑั€ะฐั‚ัŒ ะธั… ะพะฑั€ะฐั‚ะฝะพ, ะฝะพ ะดะปั ัั‚ะพะณะพ ะดะพะปะถะตะฝ ะทะฝะฐั‚ัŒ ั€ะตะณะธะพะฝะฐะปัŒะฝั‹ะต ะฟั€ะฐะฒะธะปะฐ ะธัะฟะพะปัŒะทะพะฒะฐะฝะธั ั€ะฐะทะดะตะปะธั‚ะตะปะตะน ะณั€ัƒะฟะฟ ั†ะธั„ั€ ะธ ะดะตััั‚ะธั‡ะฝั‹ั… ั€ะฐะทะดะตะปะธั‚ะตะปะตะน. ะะฐะฟั€ะธะผะตั€, ะฒ ะกะจะ ะทะฐะฟะธััŒ `1,234.0` ัะฒะปัะตั‚ัั ะดะพะฟัƒัั‚ะธะผั‹ะผ ั‡ะธัะปะพะผ, ะฐ ะฒ ะ•ะฒั€ะพะฟะต โ€” ะฝะตั‚, ะฟะพัะบะพะปัŒะบัƒ ะทะฐะฟัั‚ะฐั ะธัะฟะพะปัŒะทัƒะตั‚ัั ะบะฐะบ ะดะตััั‚ะธั‡ะฝั‹ะน ั€ะฐะทะดะตะปะธั‚ะตะปัŒ. ะ ะตะณะธะพะฝะฐะปัŒะฝั‹ะต ะฝะฐัั‚ั€ะพะนะบะธ ะพะฟั€ะตะดะตะปััŽั‚ัั ัั‚ั€ะฐะฝะพะน, ะดะปั ะบะพั‚ะพั€ะพะน ัะพะทะดะฐะฝ ะดะพะบัƒะผะตะฝั‚, ะฐ ะฝะต ัะทั‹ะบะพะผ ะพะทะฒัƒั‡ะธะฒะฐะฝะธั ะผะฐั‚ะตะผะฐั‚ะธั‡ะตัะบะธั… ะฒั‹ั€ะฐะถะตะฝะธะน. ะ”ะพะฟัƒัั‚ะธะผั‹ะน ะฒะธะด ั‡ะธัะปะฐ ะทะฐะดะฐัŽั‚ ะฝะฐัั‚ั€ะพะนะบะธ `BlockSeparators` ะธ `DecimalSeparators`. ะ’ั‹ะทั‹ะฒะฐัŽั‰ะฐั ะฟั€ะพะณั€ะฐะผะผะฐ ะดะพะปะถะฝะฐ ัƒัั‚ะฐะฝะฐะฒะปะธะฒะฐั‚ัŒ ัั‚ะธ ะทะฝะฐั‡ะตะฝะธั, ะตัะปะธ ะพะฝะธ ะธะทะฒะตัั‚ะฝั‹. ะŸะพ ัƒะผะพะปั‡ะฐะฝะธัŽ ะธัะฟะพะปัŒะทัƒะตั‚ัั ะฐะผะตั€ะธะบะฐะฝัะบะธะน ั„ะพั€ะผะฐั‚ ั‡ะธัะตะป. + +## ะ”ะปั ะฟะพะปัŒะทะพะฒะฐั‚ะตะปะตะน Rust +MathCAT ะฝะฐะฟะธัะฐะฝ ะฝะฐ Rust. ะ”ะพัั‚ะฐั‚ะพั‡ะฝะพ ัะพะฑั€ะฐั‚ัŒ MathCAT ะธ ะดะพะฑะฐะฒะธั‚ัŒ ะฒ ั„ะฐะนะป `Cargo.toml` ัะฒะพะตะณะพ ะฟั€ะพะตะบั‚ะฐ ะทะฐะฟะธััŒ ะฝะฐะฟะพะดะพะฑะธะต ัะปะตะดัƒัŽั‰ะตะน: +``` +[dependencies.MathCAT] +mathcat = 0.2.0 # ะฟั€ะพะฒะตั€ัŒั‚ะต ะฐะบั‚ัƒะฐะปัŒะฝัƒัŽ ะฒะตั€ัะธัŽ ะธ ะธัะฟะพะปัŒะทัƒะนั‚ะต ะตั‘ +``` + +ะขะพั‡ะฝั‹ะต ัะธะณะฝะฐั‚ัƒั€ั‹ ั„ัƒะฝะบั†ะธะน ั ะบะพะผะผะตะฝั‚ะฐั€ะธัะผะธ: +``` +/// ะ—ะฐะดะฐั‘ั‚ ะบะฐั‚ะฐะปะพะณ Rules. +/// ะ’ะะ–ะะž: ัั‚ะพ ะดะพะปะถะตะฝ ะฑั‹ั‚ัŒ ัะฐะผั‹ะน ะฟะตั€ะฒั‹ะน ะฒั‹ะทะพะฒ MathCAT, ะตัะปะธ ั‚ะพะปัŒะบะพ ะฝะต ะทะฐะดะฐะฝะฐ ะฟะตั€ะตะผะตะฝะฝะฐั ัั€ะตะดั‹ MathCATRulesDir. +pub fn set_rules_dir(dir: String) -> Result<()> + +/// ะ’ะพะทะฒั€ะฐั‰ะฐะตั‚ ะฝะพะผะตั€ ะฒะตั€ัะธะธ ัะฑะพั€ะบะธ ะธะท Cargo.toml. +pub fn get_version() -> String + +/// ะ—ะฐะผะตะฝัะตั‚ ั€ะฐะฝะตะต ะทะฐะดะฐะฝะฝั‹ะน MathML. +/// ะ’ะพะทะฒั€ะฐั‰ะฐะตั‚ ะบะฐะฝะพะฝะธั‡ะตัะบะธะน MathML ั ะฐั‚ั€ะธะฑัƒั‚ะฐะผะธ 'id' ัƒ ะฒัะตั… ัƒะทะปะพะฒ, ัƒ ะบะพั‚ะพั€ั‹ั… ะฝะต ะฑั‹ะปะพ ะธะดะตะฝั‚ะธั„ะธะบะฐั‚ะพั€ะฐ. +/// ะ˜ะดะตะฝั‚ะธั„ะธะบะฐั‚ะพั€ั‹ ะผะพะถะฝะพ ะธัะฟะพะปัŒะทะพะฒะฐั‚ัŒ ะดะปั ัะธะฝั…ั€ะพะฝะฝะพะณะพ ะฒั‹ะดะตะปะตะฝะธั, ะตัะปะธ ะฝะฐัั‚ั€ะพะนะบะฐ API `Bookmark` ั€ะฐะฒะฝะฐ true. +pub fn set_mathml(mathml_str: String) -> Result + +/// ะ’ะพะทะฒั€ะฐั‰ะฐะตั‚ ั‚ะตะบัั‚ ะดะปั ะพะทะฒัƒั‡ะธะฒะฐะฝะธั ั€ะฐะฝะตะต ะทะฐะดะฐะฝะฝะพะณะพ MathML. +/// ะŸั€ะธ ะพะทะฒัƒั‡ะธะฒะฐะฝะธะธ ัƒั‡ะธั‚ั‹ะฒะฐัŽั‚ัั ะฝะฐัั‚ั€ะพะนะบะธ ะฐััะธัั‚ะธะฒะฝะพะน ั‚ะตั…ะฝะพะปะพะณะธะธ ะธ ะฟะพะปัŒะทะพะฒะฐั‚ะตะปั. +pub fn get_spoken_text() -> Result + +/// ะ’ะพะทะฒั€ะฐั‰ะฐะตั‚ ั‚ะตะบัั‚ ะดะปั ะพะทะฒัƒั‡ะธะฒะฐะฝะธั ะพะฑะทะพั€ะฐ ั€ะฐะฝะตะต ะทะฐะดะฐะฝะฝะพะณะพ MathML. +/// ะŸั€ะธ ะพะทะฒัƒั‡ะธะฒะฐะฝะธะธ ัƒั‡ะธั‚ั‹ะฒะฐัŽั‚ัั ะฝะฐัั‚ั€ะพะนะบะธ ะฐััะธัั‚ะธะฒะฝะพะน ั‚ะตั…ะฝะพะปะพะณะธะธ ะธ ะฟะพะปัŒะทะพะฒะฐั‚ะตะปั. +/// ะŸั€ะธะผะตั‡ะฐะฝะธะต: ัะตะนั‡ะฐั ั€ะตะฐะปะธะทะฐั†ะธั ะผะธะฝะธะผะฐะปัŒะฝะฐ, ะธ ะธัะฟะพะปัŒะทะพะฒะฐั‚ัŒ ะตั‘ ะฝะต ัะปะตะดัƒะตั‚. +pub fn get_overview_text() -> Result + +/// ะ’ะพะทะฒั€ะฐั‰ะฐะตั‚ ะทะฝะฐั‡ะตะฝะธะต ัƒะบะฐะทะฐะฝะฝะพะน ะฝะฐัั‚ั€ะพะนะบะธ. +/// ะ•ัะปะธ `name` ะฝะต ัะฒะปัะตั‚ัั ะธะทะฒะตัั‚ะฝะพะน ะฝะฐัั‚ั€ะพะนะบะพะน, ะฒะพะทะฒั€ะฐั‰ะฐะตั‚ัั None. +pub fn get_preference(name: impl AsRef) -> Result + +/// ะ—ะฐะดะฐั‘ั‚ ะฝะฐัั‚ั€ะพะนะบัƒ MathCAT. ะ˜ะผั ะฝะฐัั‚ั€ะพะนะบะธ ะดะพะปะถะฝะพ ะฑั‹ั‚ัŒ ะธะทะฒะตัั‚ะฝั‹ะผ MathCAT ะธะผะตะฝะตะผ. +/// ะ’ ะทะฐะฒะธัะธะผะพัั‚ะธ ะพั‚ ะฝะฐัั‚ั€ะพะนะบะธ ะทะฝะฐั‡ะตะฝะธะตะผ ะดะพะปะถะฝะฐ ะฑั‹ั‚ัŒ ัั‚ั€ะพะบะฐ ะธะปะธ ั‡ะธัะปะพ. +/// ะกะฟะธัะพะบ ะธะทะฒะตัั‚ะฝั‹ั… ะฟะพะปัŒะทะพะฒะฐั‚ะตะปัŒัะบะธั… ะฝะฐัั‚ั€ะพะตะบ ะฟั€ะธะฒะตะดั‘ะฝ ะฒ ะฟะพะปัŒะทะพะฒะฐั‚ะตะปัŒัะบะพะน ะดะพะบัƒะผะตะฝั‚ะฐั†ะธะธ MathCAT. +/// ะะธะถะต ะฟะตั€ะตั‡ะธัะปะตะฝั‹ ั€ะฐัะฟั€ะพัั‚ั€ะฐะฝั‘ะฝะฝั‹ะต ะฝะฐัั‚ั€ะพะนะบะธ, ะบะพั‚ะพั€ั‹ะต ะทะฐะดะฐัŽั‚ัั ะฟั€ะพะณั€ะฐะผะผะฐะผะธ ะธ ะฝะตะดะพัั‚ัƒะฟะฝั‹ ะฟะพะปัŒะทะพะฒะฐั‚ะตะปัŽ: +/// * TTS -- SSML, SAPI5, None +/// * Pitch -- ะฝะพั€ะผะฐะปะธะทะพะฒะฐะฝะพ ะพั‚ะฝะพัะธั‚ะตะปัŒะฝะพ '1.0' +/// * Rate -- ัะปะพะฒ ะฒ ะผะธะฝัƒั‚ัƒ; ะดะพะปะถะฝะพ ัะพะพั‚ะฒะตั‚ัั‚ะฒะพะฒะฐั‚ัŒ ั‚ะตะบัƒั‰ะตะน ัะบะพั€ะพัั‚ะธ ั€ะตั‡ะธ. +/// ะžั‚ะดะตะปัŒะฝะฐั ะฟะพะปัŒะทะพะฒะฐั‚ะตะปัŒัะบะฐั ะฝะฐัั‚ั€ะพะนะบะฐ "MathRate" ะทะฐะดะฐั‘ั‚ ะพั‚ะฝะพัะธั‚ะตะปัŒะฝะพะต ะธะทะผะตะฝะตะฝะธะต ัั‚ะพะน ัะบะพั€ะพัั‚ะธ ะฒ ะฟั€ะพั†ะตะฝั‚ะฐั…. +/// * Volume -- ะฟะพ ัƒะผะพะปั‡ะฐะฝะธัŽ 100 +/// * Voice -- ะธัะฟะพะปัŒะทัƒะตะผั‹ะน ะณะพะปะพั (ะฝะต ั€ะตะฐะปะธะทะพะฒะฐะฝะพ) +/// * Gender -- ะฒั‹ะฑะพั€ ะปัŽะฑะพะณะพ ะณะพะปะพัะฐ ัƒะบะฐะทะฐะฝะฝะพะณะพ ะฟะพะปะฐ (ะฝะต ั€ะตะฐะปะธะทะพะฒะฐะฝะพ) +/// * Bookmark -- ะทะฐะดะฐะนั‚ะต `true`, ะตัะปะธ ะฒะพะทะฒั€ะฐั‰ะฐะตะผะฐั ั€ะตั‡ัŒ ะดะพะปะถะฝะฐ ัะพะดะตั€ะถะฐั‚ัŒ `mark`/`bookmark` +/// ะดะปั ัะธะฝั…ั€ะพะฝะฝะพะณะพ ะฒั‹ะดะตะปะตะฝะธั +/// * CheckRuleFiles -- ะฟั€ะพะฒะตั€ัะตั‚, ะธะทะผะตะฝะธะปะธััŒ ะปะธ ั„ะฐะนะปั‹ ะฟั€ะฐะฒะธะป ะฟะพัะปะต ะฟั€ะตะดั‹ะดัƒั‰ะตะณะพ ะฒั‹ะทะพะฒะฐ. ะ’ะพะทะผะพะถะฝั‹ะต ะทะฝะฐั‡ะตะฝะธั: +/// "All", "Prefs" (ะฟะพ ัƒะผะพะปั‡ะฐะฝะธัŽ; ั‚ะพะปัŒะบะพ ัะธัั‚ะตะผะฝั‹ะน ะธ ะฟะพะปัŒะทะพะฒะฐั‚ะตะปัŒัะบะธะน ั„ะฐะนะปั‹ prefs.yaml) +/// ะธ "None". ะŸะตั€ะตั…ะพะด ะพั‚ "All" ะบ "None" ัƒัะบะพั€ัะตั‚ ั€ะฐะฑะพั‚ัƒ ะฟั€ะธะผะตั€ะฝะพ ะฝะฐ 40 %, +/// ะฐ ะฟะตั€ะตั…ะพะด ะพั‚ "Prefs" ะบ "None" -- ะฟั€ะธะผะตั€ะฝะพ ะฝะฐ 10 %. +/// +/// ะญั‚ะธ ะฝะฐัั‚ั€ะพะนะบะธ ัƒะฟั€ะฐะฒะปััŽั‚ ะพะทะฒัƒั‡ะธะฒะฐะฝะธะตะผ ะธ ะธะทะผะตะฝะตะฝะธะตะผ ะฒั‹ัะพั‚ั‹ ั‚ะพะฝะฐ ะดะปั ะฟั€ะพะฟะธัะฝั‹ั… ะฑัƒะบะฒ: +/// * CapitalLetters_UseWord -- ะฟั€ะพะธะทะฝะพัะธั‚ัŒ "cap" ะธะปะธ ะฟะพะดั…ะพะดัั‰ะธะน ะดะปั ัะทั‹ะบะฐ ะฐะฝะฐะปะพะณ [ะฟะพ ัƒะผะพะปั‡ะฐะฝะธัŽ: true] +/// * CapitalLetters_Pitch -- ะธะทะผะตะฝัั‚ัŒ ะฒั‹ัะพั‚ัƒ ั‚ะพะฝะฐ ะฒะพะบั€ัƒะณ ะฟั€ะพะฟะธัะฝะพะน ะฑัƒะบะฒั‹ +/// (ะฝะพั€ะผะฐะปะธะทะพะฒะฐะฝะพ ะพั‚ะฝะพัะธั‚ะตะปัŒะฝะพ '1.0'; ะทะฝะฐั‡ะตะฝะธะต '1.0' ะฟะพ ัƒะผะพะปั‡ะฐะฝะธัŽ ะฝะธั‡ะตะณะพ ะฝะต ะผะตะฝัะตั‚) +/// * CapitalLetters_Beep -- ัะพะทะดะฐั‘ั‚ ั„ะธะบั‚ะธะฒะฝั‹ะน ั‚ะตะณ SSML audio ั audio src='beep.mp4'; +/// ะฒ NVDA ะพะฝ ัะปัƒะถะธั‚ ะฟั€ะธะทะฝะฐะบะพะผ ะดะปั ะฒะพัะฟั€ะพะธะทะฒะตะดะตะฝะธั ัะธะณะฝะฐะปะฐ +/// +/// * IntentErrorRecovery -- ะพะฟั€ะตะดะตะปัะตั‚ ะฟะพะฒะตะดะตะฝะธะต ะฟั€ะธ ะฝะตะดะพะฟัƒัั‚ะธะผั‹ั… ะทะฝะฐั‡ะตะฝะธัั… `intent` ะฒ MathML. +/// ะ’ะพะทะผะพะถะฝั‹ะต ะทะฝะฐั‡ะตะฝะธั: "Error" ะธ "IgnoreIntent" (ะฟะพ ัƒะผะพะปั‡ะฐะฝะธัŽ) +/// +/// ะ’ะฐะถะฝะพ: ะธะผะตะฝะฐ ะธ ะทะฝะฐั‡ะตะฝะธั ะฝะฐัั‚ั€ะพะตะบ ั‡ัƒะฒัั‚ะฒะธั‚ะตะปัŒะฝั‹ ะบ ั€ะตะณะธัั‚ั€ัƒ. +/// +/// ะญั‚ัƒ ั„ัƒะฝะบั†ะธัŽ ะผะพะถะฝะพ ะฒั‹ะทั‹ะฒะฐั‚ัŒ ะฝะตัะบะพะปัŒะบะพ ั€ะฐะท, ั‡ั‚ะพะฑั‹ ะทะฐะดะฐั‚ัŒ ั€ะฐะทะฝั‹ะต ะทะฝะฐั‡ะตะฝะธั. +/// ะ—ะฝะฐั‡ะตะฝะธั ัะพั…ั€ะฐะฝััŽั‚ัั ะธ ะดะตะนัั‚ะฒัƒัŽั‚ ะฟะพัะปะต ะฒั‹ะทะพะฒะพะฒ [`set_mathml`]. +/// ะ—ะฝะฐั‡ะตะฝะธะต ะผะพะถะฝะพ ะฟะตั€ะตะทะฐะฟะธัะฐั‚ัŒ, ะฟะพะฒั‚ะพั€ะฝะพ ะฒั‹ะทะฒะฐะฒ ั„ัƒะฝะบั†ะธัŽ ั ะดั€ัƒะณะธะผ ะฐั€ะณัƒะผะตะฝั‚ะพะผ. +/// +/// FIXME: ะะตะบะพั‚ะพั€ั‹ะต ะฝะฐัั‚ั€ะพะนะบะธ ะพั‚ะฝะพััั‚ัั ะธ ะบ API, ะธ ะบ ะฟะพะปัŒะทะพะฒะฐั‚ะตะปัŽ. ะ”ะปั ะฟะตั€ะตะพะฟั€ะตะดะตะปะตะฝะธั ัะปะตะดัƒะตั‚ +/// ะธัะฟะพะปัŒะทะพะฒะฐั‚ัŒ ั‡ั‚ะพ-ั‚ะพ ะฝะฐะฟะพะดะพะฑะธะต '!name'. ะŸะพะบะฐ ะฝะต ั€ะตะฐะปะธะทะพะฒะฐะฝะพ. +pub fn set_preference(name: impl AsRef, value: impl AsRef) -> Result<()> + +/// ะŸะตั€ะตะผะตั‰ะฐะตั‚ ั‚ะตะบัƒั‰ะธะน ัƒะทะตะป ะฒ ัะพะพั‚ะฒะตั‚ัั‚ะฒะธะธ ั ะบะพะดะพะผ ะบะปะฐะฒะธัˆะธ ะธ ะบะปะฐะฒะธัˆะฐะผะธ-ะผะพะดะธั„ะธะบะฐั‚ะพั€ะฐะผะธ +/// ะธะปะธ ะฒ ะฝะตะบะพั‚ะพั€ั‹ั… ัะปัƒั‡ะฐัั… ัะพะพะฑั‰ะฐะตั‚ ะทะฝะฐั‡ะตะฝะธะต. +/// `key` -- [ะบะพะด ะบะปะฐะฒะธัˆะธ](https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode#constants_for_keycode_value) +/// ะดะปั ะบะปะฐะฒะธัˆะธ (ะฒ JavaScript -- `ev.key_code`). +/// ะ’ะพะทะฒั€ะฐั‰ะฐะตั‚ ั‚ะตะบัั‚ ะดะปั ะพะทะฒัƒั‡ะธะฒะฐะฝะธั ะฝะพะฒะพะณะพ ั‚ะตะบัƒั‰ะตะณะพ ัƒะทะปะฐ. +pub fn do_navigate_keypress(key: usize, shift_key: bool, control_key: bool, alt_key: bool, meta_key: bool) -> Result + +/// ะŸะตั€ะตะผะตั‰ะฐะตั‚ ั‚ะตะบัƒั‰ะธะน ัƒะทะตะป ะฒ ัะพะพั‚ะฒะตั‚ัั‚ะฒะธะธ ั ะบะพะผะฐะฝะดะพะน ะฝะฐะฒะธะณะฐั†ะธะธ. +/// ะญั‚ะพ ะฑะพะปะตะต ะฒั‹ัะพะบะพัƒั€ะพะฒะฝะตะฒั‹ะน ะธะฝั‚ะตั€ั„ะตะนั, ั‡ะตะผ `do_navigate_keypress`, ะฟั€ะตะดะฝะฐะทะฝะฐั‡ะตะฝะฝั‹ะน ะดะปั ะฟั€ะธะปะพะถะตะฝะธะน, +/// ะบะพั‚ะพั€ั‹ะต ัะฐะผะพัั‚ะพัั‚ะตะปัŒะฝะพ ะธะฝั‚ะตั€ะฟั€ะตั‚ะธั€ัƒัŽั‚ ะฝะฐะถะฐั‚ะธั ะบะปะฐะฒะธัˆ. +/// ะ”ะพะฟัƒัั‚ะธะผั‹ะต ะบะพะผะฐะฝะดั‹: +/// * ะกั‚ะฐะฝะดะฐั€ั‚ะฝั‹ะต ะบะพะผะฐะฝะดั‹ ะฟะตั€ะตะผะตั‰ะตะฝะธั: +/// `MovePrevious`, `MoveNext`, `MoveStart`, `MoveEnd`, `MoveLineStart`, `MoveLineEnd` +/// * ะŸะตั€ะตะผะตั‰ะตะฝะธะต ะฒ ั‚ะฐะฑะปะธั†ะต ะธะปะธ ัะปะตะผะตะฝั‚ะฐั€ะฝั‹ั… ะผะฐั‚ะตะผะฐั‚ะธั‡ะตัะบะธั… ะฒั‹ั€ะฐะถะตะฝะธัั…: +/// `MoveCellPrevious`, `MoveCellNext`, `MoveCellUp`, `MoveCellDown`, `MoveColumnStart`, `MoveColumnEnd` +/// * ะŸะตั€ะตั…ะพะด ะบ ะดะพั‡ะตั€ะฝะธะผ ัƒะทะปะฐะผ ะธะปะธ ะฒั‹ั…ะพะด ะบ ั€ะพะดะธั‚ะตะปัŒัะบะธะผ: +/// `ZoomIn`, `ZoomOut`, `ZoomOutAll`, `ZoomInAll` +/// * ะžั‚ะผะตะฝะฐ ะฟะพัะปะตะดะฝะตะน ะบะพะผะฐะฝะดั‹ ะฟะตั€ะตะผะตั‰ะตะฝะธั: +/// `MoveLastLocation` +/// * ะšะพะผะฐะฝะดั‹ ั‡ั‚ะตะฝะธั (ัั‚ะฐะฝะดะฐั€ั‚ะฝะพะต ะพะทะฒัƒั‡ะธะฒะฐะฝะธะต): +/// `ReadPrevious`, `ReadNext`, `ReadCurrent`, `ReadCellCurrent`, `ReadStart`, `ReadEnd`, `ReadLineStart`, `ReadLineEnd` +/// * ะšะพะผะฐะฝะดั‹ ะพะฟะธัะฐะฝะธั (ะพะฑะทะพั€): +/// `DescribePrevious`, `DescribeNext`, `DescribeCurrent` +/// * ะ˜ะฝั„ะพั€ะผะฐั†ะธั ะพ ะฟะพะทะธั†ะธะธ: +/// `WhereAmI`, `WhereAmIAll` +/// * ะ˜ะทะผะตะฝะตะฝะธะต ั€ะตะถะธะผะฐ ะฝะฐะฒะธะณะฐั†ะธะธ ั ั†ะธะบะปะธั‡ะตัะบะธะผ ะฟะตั€ะตั…ะพะดะพะผ ะฒะฒะตั€ั… ะธะปะธ ะฒะฝะธะท: +/// `ToggleZoomLockUp`, `ToggleZoomLockDown` +/// * ะžะทะฒัƒั‡ะธะฒะฐะฝะธะต ั‚ะตะบัƒั‰ะตะณะพ ั€ะตะถะธะผะฐ ะฝะฐะฒะธะณะฐั†ะธะธ: +/// `ToggleSpeakMode` +/// +/// ะ”ะพัั‚ัƒะฟะฝั‹ 10 ะผะตั‚ะพะบ ะฟะพะทะธั†ะธะธ, ะบะพั‚ะพั€ั‹ะต ะผะพะถะฝะพ ัƒัั‚ะฐะฝะฐะฒะปะธะฒะฐั‚ัŒ, ั‡ะธั‚ะฐั‚ัŒ, ะพะฟะธัั‹ะฒะฐั‚ัŒ ะธ ะธัะฟะพะปัŒะทะพะฒะฐั‚ัŒ ะดะปั ะฟะตั€ะตั…ะพะดะฐ. +/// * ะฃัั‚ะฐะฝะพะฒะบะฐ: +/// `SetPlacemarker0`, `SetPlacemarker1`, `SetPlacemarker2`, `SetPlacemarker3`, `SetPlacemarker4`, `SetPlacemarker5`, `SetPlacemarker6`, `SetPlacemarker7`, `SetPlacemarker8`, `SetPlacemarker9` +/// * ะงั‚ะตะฝะธะต: +/// `Read0`, `Read1`, `Read2`, `Read3`, `Read4`, `Read5`, `Read6`, `Read7`, `Read8`, `Read9` +/// * ะžะฟะธัะฐะฝะธะต: +/// `Describe0`, `Describe1`, `Describe2`, `Describe3`, `Describe4`, `Describe5`, `Describe6`, `Describe7`, `Describe8`, `Describe9` +/// * ะŸะตั€ะตั…ะพะด: +/// `MoveTo0`, `MoveTo1`, `MoveTo2`, `MoveTo3`, `MoveTo4`, `MoveTo5`, `MoveTo6`, `MoveTo7`, `MoveTo8`, `MoveTo9` +/// +/// ะŸะพัะปะต ะทะฐะฒะตั€ัˆะตะฝะธั ะฝะฐะฒะธะณะฐั†ะธะธ ะฒั‹ะทะพะฒะธั‚ะต ั„ัƒะฝะบั†ะธัŽ ั ะบะพะผะฐะฝะดะพะน `Exit`. +pub fn do_navigate_command(command: impl AsRef) -> Result + +/// ะ’ะพะทะฒั€ะฐั‰ะฐะตั‚ MathML, ัะฒัะทะฐะฝะฝั‹ะน ั ั‚ะตะบัƒั‰ะธะผ ัƒะทะปะพะผ ะฝะฐะฒะธะณะฐั†ะธะธ. +/// ะ ะตะทัƒะปัŒั‚ะฐั‚ ัะพะดะตั€ะถะธั‚ `id` ัƒะทะปะฐ ะธ ัะผะตั‰ะตะฝะธะต ะพั‚ะฝะพัะธั‚ะตะปัŒะฝะพ ัั‚ะพะณะพ ัƒะทะปะฐ, ะฝะฐั‡ะธะฝะฐั ั ะฝัƒะปั (ะฟะพะบะฐ ะฝะต ั€ะตะฐะปะธะทะพะฒะฐะฝะพ). +/// ะกะผะตั‰ะตะฝะธะต ั‚ั€ะตะฑัƒะตั‚ัั ะดะปั ั‚ะพะบะตะฝะพะฒ ะธะท ะฝะตัะบะพะปัŒะบะธั… ัะธะผะฒะพะปะพะฒ. +pub fn get_navigation_mathml() -> Result<(String, usize)> + +/// ะ’ะพะทะฒั€ะฐั‰ะฐะตั‚ `id` ะธ ัะผะตั‰ะตะฝะธะต, ะฝะฐั‡ะธะฝะฐั ั ะฝัƒะปั, ัะฒัะทะฐะฝะฝั‹ะต ั ั‚ะตะบัƒั‰ะธะผ ัƒะทะปะพะผ ะฝะฐะฒะธะณะฐั†ะธะธ. +/// `offset` ะฟะพะบะฐ ะฝะต ั€ะตะฐะปะธะทะพะฒะฐะฝะพ. +/// ะกะผะตั‰ะตะฝะธะต ั‚ั€ะตะฑัƒะตั‚ัั ะดะปั ั‚ะพะบะตะฝะพะฒ ะธะท ะฝะตัะบะพะปัŒะบะธั… ัะธะผะฒะพะปะพะฒ. +pub fn get_navigation_mathml_id() -> Result<(String, usize)> + + +/// ะŸั€ะตะพะฑั€ะฐะทัƒะตั‚ ะพัˆะธะฑะบัƒ, ะฒะพะทะฒั€ะฐั‰ั‘ะฝะฝัƒัŽ set_mathml ะธ ะดั€ัƒะณะธะผะธ ั„ัƒะฝะบั†ะธัะผะธ, ะฒ ะฟะพะปะตะทะฝัƒัŽ ะดะปั ะพั‚ะพะฑั€ะฐะถะตะฝะธั ัั‚ั€ะพะบัƒ. +pub fn errors_to_string(e:&Error) -> String + +``` + +## ะ”ะปั ะฟะพะปัŒะทะพะฒะฐั‚ะตะปะตะน Python +ะœะพะถะฝะพ ัะพะทะดะฐั‚ัŒ ัะพะฑัั‚ะฒะตะฝะฝั‹ะน ะธะฝั‚ะตั€ั„ะตะนั Python ะธะปะธ ะฒะพัะฟะพะปัŒะทะพะฒะฐั‚ัŒัั ะธะฝั‚ะตั€ั„ะตะนัะพะผ ะธะท ัะฒัะทะฐะฝะฝะพะณะพ ะฟั€ะพะตะบั‚ะฐ [MathCATForPython](https://github.com/NSoiffer/MathCATForPython). ะ’ ะฝั‘ะผ ะธัะฟะพะปัŒะทัƒะตั‚ัั ะฟะฐะบะตั‚ Rust pyo3. + +ะ˜ะฝั‚ะตั€ั„ะตะนั Python ะฒ ั†ะตะปะพะผ ะฐะฝะฐะปะพะณะธั‡ะตะฝ ะธะฝั‚ะตั€ั„ะตะนััƒ Rust. ะ’ Python ะธัะฟะพะปัŒะทัƒะตั‚ัั CamelCase, ะฐ ะฝะต ะฟั€ะธะฝัั‚ั‹ะน ะฒ Rust snake_case. ะะฐะฟั€ะธะผะตั€, ั„ัƒะฝะบั†ะธั `set_rules_dir` ะฒ ะธะฝั‚ะตั€ั„ะตะนัะต Python ะฝะฐะทั‹ะฒะฐะตั‚ัั `SetRulesDir`. ะ’ั‹ะทะพะฒ ั„ัƒะฝะบั†ะธะธ ัะปะตะดัƒะตั‚ ะพะฑะพั€ะฐั‡ะธะฒะฐั‚ัŒ ะฒ ะบะพะฝัั‚ั€ัƒะบั†ะธัŽ: +``` +try: + ... +except Exception as e: + ... # ะทะฐั€ะตะณะธัั‚ั€ะธั€ะพะฒะฐั‚ัŒ ะพัˆะธะฑะบัƒ 'e' ะฒ ะถัƒั€ะฝะฐะปะต +``` + + +## ะ”ะปั ะฒะตะฑ-ั€ะฐะทั€ะฐะฑะพั‚ั‡ะธะบะพะฒ +ะฏ ัะพะฑั€ะฐะป ะฒะตั€ัะธัŽ WebAssembly. ะ’ ะฝะตะน ะตัั‚ัŒ ะฝะตัะบะพะปัŒะบะพ ะบะพะผะฟั€ะพะผะธััะพะฒ, ะฐ ะฒ ะฟั€ะพั†ะตััะต ัะฑะพั€ะบะธ ั‚ั€ะตะฑัƒะตั‚ัั ะฒั€ัƒั‡ะฝัƒัŽ ะฒะฝะพัะธั‚ัŒ ะฝะตะบะพั‚ะพั€ั‹ะต ะธะทะผะตะฝะตะฝะธั. ะญั‚ะพั‚ ะฟั€ะพั†ะตัั ะฝะตะพะฑั…ะพะดะธะผะพ ะฐะฒั‚ะพะผะฐั‚ะธะทะธั€ะพะฒะฐั‚ัŒ. ะ’ะตั€ัะธั ะฝะฐั…ะพะดะธั‚ัั ะฒ ะฟั€ะพะตะบั‚ะต [MathCatDemo](https://github.com/NSoiffer/MathCATDemo). ะŸั€ะพะตะบั‚ ัะพะฑะธั€ะฐะตั‚ ะฒะตะฑ-ัั‚ั€ะฐะฝะธั†ัƒ ะดะปั ะดะตะผะพะฝัั‚ั€ะฐั†ะธะพะฝะฝั‹ั… ั†ะตะปะตะน, ะฟะพัั‚ะพะผัƒ ัั‚ะพ ะฝะต ั‡ะธัั‚ะฐั ัะฑะพั€ะบะฐ ะดะปั ะฒะตะฑะฐ. ะขะตะผ ะฝะต ะผะตะฝะตะต ะพะฝ ะฟะพะบะฐะทั‹ะฒะฐะตั‚, ะบะฐะบ ะผะพะถะฝะพ ั€ะตะฐะปะธะทะพะฒะฐั‚ัŒ ั‚ะฐะบัƒัŽ ัะฑะพั€ะบัƒ. + +## ะ”ะปั ะฟะพะปัŒะทะพะฒะฐั‚ะตะปะตะน C/C++ +ะ˜ะฝั‚ะตั€ั„ะตะนั C/C++ ะฝะฐั…ะพะดะธั‚ัั ะฒ ัะฒัะทะฐะฝะฝะพะผ ะฟั€ะพะตะบั‚ะต [MathCatForC](https://github.com/NSoiffer/MathCATForC). ะฃ Rust ะธ C ั€ะฐะทะฝั‹ะต ะผะตะฝะตะดะถะตั€ั‹ ะฟะฐะผัั‚ะธ, ะฟะพัั‚ะพะผัƒ ะธะฝั‚ะตั€ั„ะตะนั ะฝะตัะบะพะปัŒะบะพ ะฝะตัƒะดะพะฑะตะฝ: ะฟะฐะผัั‚ัŒ ะฝะตะพะฑั…ะพะดะธะผะพ ะพัะฒะพะฑะพะถะดะฐั‚ัŒ. ะญั‚ัƒ ะพัะพะฑะตะฝะฝะพัั‚ัŒ ะผะพะถะฝะพ ัะบั€ั‹ั‚ัŒ, ะพะฑะตั€ะฝัƒะฒ ะฒั‹ะทะพะฒั‹ ะฝะตะฑะพะปัŒัˆะพะน ั„ัƒะฝะบั†ะธะตะน, ะบะฐะบ ัั‚ะพ ัะดะตะปะฐะฝะพ ะดะปั `SetMathCatPreference` ะฒ [ะฟั€ะธะผะตั€ะต ะบะพะดะฐ](https://github.com/NSoiffer/MathCATForC/blob/main/c-example/test.cpp). ะ’ ะพัั‚ะฐะปัŒะฝะพะผ ะฟะพะปัŒะทะพะฒะฐั‚ัŒัั ะธะฝั‚ะตั€ั„ะตะนัะพะผ ะฟั€ะพัั‚ะพ. ะ•ัะปะธ ะฒั‹ ะทะฝะฐะตั‚ะต ะฑะพะปะตะต ัƒะดะฐั‡ะฝั‹ะน ัะฟะพัะพะฑ ั€ะตัˆะธั‚ัŒ ะฟั€ะพะฑะปะตะผัƒ ั ะฟะฐะผัั‚ัŒัŽ, ัะพะพะฑั‰ะธั‚ะต ะผะฝะต ะธะปะธ ะพั‚ะฟั€ะฐะฒัŒั‚ะต pull request. ะ”ะปั ะผะตะฝั ะบะฐะบ ะฟั€ะพะณั€ะฐะผะผะธัั‚ะฐ Rust ัั‚ะพ ะฝะพะฒะฐั ะพะฑะปะฐัั‚ัŒ. diff --git a/docs/ru/developers.md b/docs/ru/developers.md new file mode 100644 index 000000000..57749a3d3 --- /dev/null +++ b/docs/ru/developers.md @@ -0,0 +1,130 @@ +--- +layout: default +lang: ru +ref: developers +title: ะ ัƒะบะพะฒะพะดัั‚ะฒะพ ั€ะฐะทั€ะฐะฑะพั‚ั‡ะธะบะฐ +--- +# ะ ัƒะบะพะฒะพะดัั‚ะฒะพ ั€ะฐะทั€ะฐะฑะพั‚ั‡ะธะบะฐ + +ะ’ ัั‚ะพะผ ั€ัƒะบะพะฒะพะดัั‚ะฒะต ะฟั€ะธะฒะตะดะตะฝะฐ ั‚ะตั…ะฝะธั‡ะตัะบะฐั ะธะฝั„ะพั€ะผะฐั†ะธั ะดะปั ั€ะฐะทั€ะฐะฑะพั‚ั‡ะธะบะพะฒ, ั€ะฐะฑะพั‚ะฐัŽั‰ะธั… ั ะบะพะดะพะฒะพะน ะฑะฐะทะพะน MathCAT. + +## ะŸั€ะตะดะฒะฐั€ะธั‚ะตะปัŒะฝั‹ะต ั‚ั€ะตะฑะพะฒะฐะฝะธั + +ะ”ะปั ั€ะฐะทั€ะฐะฑะพั‚ะบะธ MathCAT ะฝะตะพะฑั…ะพะดะธะผะพ ัƒัั‚ะฐะฝะพะฒะธั‚ัŒ Rust. ะ•ัะปะธ ะฒั‹ ะตั‰ั‘ ัั‚ะพะณะพ ะฝะต ัะดะตะปะฐะปะธ: + +1. [ะกะบะฐั‡ะฐะนั‚ะต ะธ ัƒัั‚ะฐะฝะพะฒะธั‚ะต Rust](https://www.rust-lang.org/tools/install). +2. ะšะปะพะฝะธั€ัƒะนั‚ะต ั€ะตะฟะพะทะธั‚ะพั€ะธะน MathCAT. +3. ะžั‚ะบั€ะพะนั‚ะต ะบะฐั‚ะฐะปะพะณ ะฟั€ะพะตะบั‚ะฐ ะฒ ะธะฝั‚ะตะณั€ะธั€ะพะฒะฐะฝะฝะพะน ัั€ะตะดะต ั€ะฐะทั€ะฐะฑะพั‚ะบะธ (IDE). + +## ะ ะฐะฑะพั‚ะฐ ั Cargo + +Cargo โ€” ัะธัั‚ะตะผะฐ ัะฑะพั€ะบะธ ะธ ะผะตะฝะตะดะถะตั€ ะฟะฐะบะตั‚ะพะฒ Rust. ะะธะถะต ะฟั€ะธะฒะตะดะตะฝั‹ ะพัะฝะพะฒะฝั‹ะต ะบะพะผะฐะฝะดั‹. + +### ะกะฑะพั€ะบะฐ ะฟั€ะพะตะบั‚ะฐ + +```bash +# ะกะพะฑั€ะฐั‚ัŒ ะฟั€ะพะตะบั‚ ะฒ ั€ะตะถะธะผะต ะพั‚ะปะฐะดะบะธ +cargo build + +# ะกะพะฑั€ะฐั‚ัŒ ะฟั€ะพะตะบั‚ ะฒ ั€ะตะถะธะผะต ะฒั‹ะฟัƒัะบะฐ (ั ะพะฟั‚ะธะผะธะทะฐั†ะธะตะน) +cargo build --release +``` + +### ะ—ะฐะฟัƒัะบ ะฟั€ะพะตะบั‚ะฐ + +```bash +# ะ—ะฐะฟัƒัั‚ะธั‚ัŒ ะพัะฝะพะฒะฝะพะน ะธัะฟะพะปะฝัะตะผั‹ะน ั„ะฐะนะป +cargo run + +# ะ—ะฐะฟัƒัั‚ะธั‚ัŒ ั ัƒะบะฐะทะฐะฝะฝั‹ะผะธ ะฐั€ะณัƒะผะตะฝั‚ะฐะผะธ +cargo run -- +``` + +### ะฃะฟั€ะฐะฒะปะตะฝะธะต ะทะฐะฒะธัะธะผะพัั‚ัะผะธ + +ะ—ะฐะฒะธัะธะผะพัั‚ะธ ะทะฐะดะฐัŽั‚ัั ะฒ `Cargo.toml`. Cargo ะฐะฒั‚ะพะผะฐั‚ะธั‡ะตัะบะธ ัะบะฐั‡ะธะฒะฐะตั‚ ะธั… ะธ ัƒะฟั€ะฐะฒะปัะตั‚ ะธะผะธ. + +```bash +# ะžะฑะฝะพะฒะธั‚ัŒ ะทะฐะฒะธัะธะผะพัั‚ะธ ะดะพ ะฟะพัะปะตะดะฝะธั… ัะพะฒะผะตัั‚ะธะผั‹ั… ะฒะตั€ัะธะน +cargo update +``` + +## ะขะตัั‚ะธั€ะพะฒะฐะฝะธะต + +ะขะตัั‚ะธั€ะพะฒะฐะฝะธะต ะฝะตะพะฑั…ะพะดะธะผะพ ะดะปั ะฟะพะดะดะตั€ะถะฐะฝะธั ะบะฐั‡ะตัั‚ะฒะฐ ะบะพะดะฐ ะธ ะฟั€ะตะดะพั‚ะฒั€ะฐั‰ะตะฝะธั ะพัˆะธะฑะพะบ ะฒ ััƒั‰ะตัั‚ะฒัƒัŽั‰ะตะน ั„ัƒะฝะบั†ะธะพะฝะฐะปัŒะฝะพัั‚ะธ ะฟะพัะปะต ะฒะฝะตัะตะฝะธั ะธะทะผะตะฝะตะฝะธะน. + +### ะ—ะฐะฟัƒัะบ ั‚ะตัั‚ะพะฒ + +```bash +# ะ—ะฐะฟัƒัั‚ะธั‚ัŒ ะฒัะต ั‚ะตัั‚ั‹ +cargo test + +# ะ—ะฐะฟัƒัั‚ะธั‚ัŒ ัƒะบะฐะทะฐะฝะฝั‹ะน ั‚ะตัั‚ +cargo test test_name +``` + +### ะะฐะฟะธัะฐะฝะธะต ั‚ะตัั‚ะพะฒ + +ะขะตัั‚ั‹ MathCAT ะฟั€ะพะฒะตั€ััŽั‚, ั‡ั‚ะพ ะฒั‹ั€ะฐะถะตะฝะธั MathML ะฟั€ะตะพะฑั€ะฐะทัƒัŽั‚ัั ะฒ ะพะถะธะดะฐะตะผั‹ะน ั‚ะตะบัั‚ ะดะปั ะพะทะฒัƒั‡ะธะฒะฐะฝะธั. ะŸั€ะธะผะตั€: + +```rust +#[test] +fn test_simple_fraction() { + let expr = " + + 1 + 2 + + "; + test("en", "SimpleSpeak", expr, "1 half"); +} +``` + +### ะŸะพะบั€ั‹ั‚ะธะต ั‚ะตัั‚ะฐะผะธ + +ะŸะพะบั€ั‹ั‚ะธะต ั‚ะตัั‚ะฐะผะธ ะฟะพะผะพะณะฐะตั‚ ะพะฟั€ะตะดะตะปะธั‚ัŒ, ะบะฐะบะธะต ั‡ะฐัั‚ะธ ะบะพะดะฐ ะฟั€ะพะฒะตั€ััŽั‚ัั ั‚ะตัั‚ะฐะผะธ, ะฐ ะดะปั ะบะฐะบะธั… ั‡ะฐัั‚ะตะน ะฝะตะพะฑั…ะพะดะธะผะพ ะดะพะฑะฐะฒะธั‚ัŒ ะฟั€ะพะฒะตั€ะบะธ. + +
+ะ˜ัะฟะพะปัŒะทะพะฒะฐะฝะธะต grcov ะฒ macOS + +ะ’ ัั‚ะพะผ ะฟะพะดั…ะพะดะต ะดะปั ัะพะทะดะฐะฝะธั ะพั‚ั‡ั‘ั‚ะพะฒ ะพ ะฟะพะบั€ั‹ั‚ะธะธ ั‚ะตัั‚ะฐะผะธ ะธัะฟะพะปัŒะทัƒัŽั‚ัั `llvm-cov` ะธ `grcov`. [grcov](https://github.com/mozilla/grcov) ะดะพะปะถะตะฝ ั€ะฐะฑะพั‚ะฐั‚ัŒ ะธ ะฒ ะดั€ัƒะณะธั… ะพะฟะตั€ะฐั†ะธะพะฝะฝั‹ั… ัะธัั‚ะตะผะฐั…, ะฝะพ ะผะพะถะตั‚ ะฟะพั‚ั€ะตะฑะพะฒะฐั‚ัŒ ะฝะตะบะพั‚ะพั€ั‹ั… ะธะทะผะตะฝะตะฝะธะน ะฟัƒั‚ะตะน LLVM ะธ ะบะพะฝั„ะธะณัƒั€ะฐั†ะธะธ. + +**ะžะดะฝะพะบั€ะฐั‚ะฝะฐั ะฝะฐัั‚ั€ะพะนะบะฐ:** + +```bash +# ะฃัั‚ะฐะฝะพะฒะธั‚ัŒ ะฝะตะพะฑั…ะพะดะธะผั‹ะต ะบะพะผะฟะพะฝะตะฝั‚ั‹ +rustup component add llvm-tools-preview +cargo install grcov +``` + +**ะกะพะทะดะฐะฝะธะต ะพั‚ั‡ั‘ั‚ะฐ ะพ ะฟะพะบั€ั‹ั‚ะธะธ:** + +```bash +# ะ—ะฐะดะฐั‚ัŒ ะฟะตั€ะตะผะตะฝะฝัƒัŽ ัั€ะตะดั‹ ะดะปั ะดะฐะฝะฝั‹ั… ะฟั€ะพั„ะธะปะธั€ะพะฒะฐะฝะธั +export LLVM_PROFILE_FILE="target/coverage/%p-%m.profraw" + +# ะ—ะฐะฟัƒัั‚ะธั‚ัŒ ั‚ะตัั‚ั‹ ัะพ ัะฑะพั€ะพะผ ะดะฐะฝะฝั‹ั… ะพ ะฟะพะบั€ั‹ั‚ะธะธ +RUSTFLAGS="-Cinstrument-coverage" cargo test + +# ะŸั€ะธะผะตั€: ะทะฐะฟัƒัั‚ะธั‚ัŒ ะพะดะธะฝ ั‚ะตัั‚ +# RUSTFLAGS="-Cinstrument-coverage" cargo test Languages::zh::tw::units::without_prefix_powers_of_2 + +# ะกะพะทะดะฐั‚ัŒ HTML-ะพั‚ั‡ั‘ั‚ +grcov . \ + --source-dir . \ + --binary-path ./target/debug/deps \ + -t html \ + --branch \ + --ignore-not-existing \ + --ignore "target/*" \ + -o target/coverage/html + +# ะžั‚ะบั€ั‹ั‚ัŒ ะพั‚ั‡ั‘ั‚ ะฒ ะฑั€ะฐัƒะทะตั€ะต +open target/coverage/html/index.html +``` + +
+ +**ะะปัŒั‚ะตั€ะฝะฐั‚ะธะฒะฐ: ะธะฝั‚ะตะณั€ะฐั†ะธั ั IDE** + +ะ’ะพ ะผะฝะพะณะธั… IDE ะดะปั Rust, ะฝะฐะฟั€ะธะผะตั€ RustRover ะธะปะธ VS Code, ะตัั‚ัŒ ะฒัั‚ั€ะพะตะฝะฝะฐั ะฟะพะดะดะตั€ะถะบะฐ ะฐะฝะฐะปะธะทะฐ ะฟะพะบั€ั‹ั‚ะธั ั‚ะตัั‚ะฐะผะธ. diff --git a/docs/ru/helpers.md b/docs/ru/helpers.md new file mode 100644 index 000000000..be36a6116 --- /dev/null +++ b/docs/ru/helpers.md @@ -0,0 +1,494 @@ +--- +layout: default +lang: ru +ref: helpers +title: ะ ัƒะบะพะฒะพะดัั‚ะฒะพ ะฟะตั€ะตะฒะพะดั‡ะธะบะฐ ะธ ั€ะฐะทั€ะฐะฑะพั‚ั‡ะธะบะฐ ะฟั€ะฐะฒะธะป +--- +# ะ ัƒะบะพะฒะพะดัั‚ะฒะพ ะฟะตั€ะตะฒะพะดั‡ะธะบะฐ ะธ ั€ะฐะทั€ะฐะฑะพั‚ั‡ะธะบะฐ ะฟั€ะฐะฒะธะป + +## ะ˜ะฝั„ะพั€ะผะฐั†ะธั ะดะปั ั€ะฐะทั€ะฐะฑะพั‚ั‡ะธะบะพะฒ ะฟั€ะฐะฒะธะป ะธ ะฟะตั€ะตะฒะพะดั‡ะธะบะพะฒ MathCAT +ะญั‚ะฐ ัั‚ั€ะฐะฝะธั†ะฐ ะฝะฐั…ะพะดะธั‚ัั ะฒ ะฟั€ะพั†ะตััะต ะฟะพะดะณะพั‚ะพะฒะบะธ. + +## ะะฐั‡ะฐะปะพ ั€ะฐะฑะพั‚ั‹ +ะ•ัะปะธ ะฒั‹ ะฟะปะฐะฝะธั€ัƒะตั‚ะต ัƒั‡ะฐัั‚ะฒะพะฒะฐั‚ัŒ ะฒ ั€ะฐะทั€ะฐะฑะพั‚ะบะต MathCAT, ะธัะฟะพะปัŒะทัƒะนั‚ะต GitHub: +1. ะกะพะทะดะฐะนั‚ะต ั„ะพั€ะบ ั€ะตะฟะพะทะธั‚ะพั€ะธั MathCAT `github.com/NSoiffer/MathCAT`. +2. ะšะปะพะฝะธั€ัƒะนั‚ะต ั„ะพั€ะบ, ั‡ั‚ะพะฑั‹ ะฟะพะปัƒั‡ะธั‚ัŒ ะปะพะบะฐะปัŒะฝัƒัŽ ะบะพะฟะธัŽ ะดะปั ั€ะฐะฑะพั‚ั‹. +3. ะŸะตั€ะตะบะปัŽั‡ะธั‚ะตััŒ ะฝะฐ ัะพะทะดะฐะฝะฝัƒัŽ ะดะปั ะฒะฐัˆะตะน ั€ะฐะฑะพั‚ั‹ ะฒะตั‚ะบัƒ, ะพะฑั‹ั‡ะฝะพ ะฝะฐะทะฒะฐะฝะฝัƒัŽ ะบะพะดะพะผ ัะทั‹ะบะฐ ะฟะตั€ะตะฒะพะดะฐ, ะธ ั€ะฐะฑะพั‚ะฐะนั‚ะต ะฒ ะฝะตะน. + +ะ•ัะปะธ ะฒั‹ ะตั‰ั‘ ะฝะต ะทะฝะฐะบะพะผั‹ ั ัั‚ะธะผะธ ะดะตะนัั‚ะฒะธัะผะธ, ะฝะฐะนะดะธั‚ะต ะพะดะฝะพ ะธะท ะผะฝะพะณะพั‡ะธัะปะตะฝะฝั‹ั… ั€ัƒะบะพะฒะพะดัั‚ะฒ. ะžะฝะธ ะดะพัั‚ะฐั‚ะพั‡ะฝะพ ะฟั€ะพัั‚ั‹, ะฟะพัั‚ะพะผัƒ ะพั‚ััƒั‚ัั‚ะฒะธะต ะพะฟั‹ั‚ะฐ ะฝะต ะดะพะปะถะฝะพ ะฒะฐั ะพัั‚ะฐะฝะฐะฒะปะธะฒะฐั‚ัŒ. + + +## ะŸะตั€ะตะฒะพะดั‡ะธะบะฐะผ ะฝะฐ ะดั€ัƒะณะธะต ัะทั‹ะบะธ +ะ•ัะปะธ ะฒั‹ ั…ะพั‚ะธั‚ะต ะฟะตั€ะตะฒะตัั‚ะธ MathCAT, ัะฒัะถะธั‚ะตััŒ ั @NSoiffer. ะžะฝ ะฟะพะดะณะพั‚ะพะฒะธั‚ ะฝะฐั‡ะฐะปัŒะฝั‹ะน ะฒะฐั€ะธะฐะฝั‚ ะฟะตั€ะตะฒะพะดะฐ, ะบะพั‚ะพั€ั‹ะน ะผะพะถะตั‚ ะทะฝะฐั‡ะธั‚ะตะปัŒะฝะพ ััะบะพะฝะพะผะธั‚ัŒ ะฒั€ะตะผั. ะ’ ั€ะตะทัƒะปัŒั‚ะฐั‚ะต ะฑัƒะดัƒั‚ ัะพะทะดะฐะฝั‹ ั„ะฐะนะปั‹ ะฒ ะบะฐั‚ะฐะปะพะณะต `Rules/Languages/xx`, ะณะดะต `xx` โ€” ะบะพะด ัะทั‹ะบะฐ, ะฝะฐะฟั€ะธะผะตั€ `fr`, `de` ะธะปะธ `el`. ะŸะตั€ะตะฒะพะด ะฒั‹ะฟะพะปะฝัะตั‚ัั ะฒ ัั‚ะพะผ ะบะฐั‚ะฐะปะพะณะต. ะะตะพะฑั…ะพะดะธะผะพ ะพั‚ั€ะตะดะฐะบั‚ะธั€ะพะฒะฐั‚ัŒ ั‡ะตั‚ั‹ั€ะต ะบะฐั‚ะตะณะพั€ะธะธ ั„ะฐะนะปะพะฒ: +1. `definitions.yaml`: ัะพะดะตั€ะถะธั‚ ะฟะตั€ะตะฒะพะดั‹ ั‡ะธัะปะธั‚ะตะปัŒะฝั‹ั…, ะฒ ั‚ะพะผ ั‡ะธัะปะต ะบะพะปะธั‡ะตัั‚ะฒะตะฝะฝั‹ั… ะธ ะฟะพั€ัะดะบะพะฒั‹ั…. ะŸั€ะพะฒะตั€ัŒั‚ะต ะฝะฐั‡ะฐะปัŒะฝั‹ะน ะฟะตั€ะตะฒะพะด ะธ ะฒะฝะตัะธั‚ะต ะฝะตะพะฑั…ะพะดะธะผั‹ะต ะธัะฟั€ะฐะฒะปะตะฝะธั. ะญั‚ะธ ั‡ะธัะปะธั‚ะตะปัŒะฝั‹ะต ะธัะฟะพะปัŒะทัƒัŽั‚ัั, ะฝะฐะฟั€ะธะผะตั€, ะฟั€ะธ ะพะทะฒัƒั‡ะธะฒะฐะฝะธะธ ั„ั€ะฐะทั‹ ยซั‚ั€ะธ ะฟัั‚ั‹ั…ยป. ะะฐ ะฝะตะบะพั‚ะพั€ะพะผ ัั‚ะฐะฟะต ะพะฑั€ะฐะทะพะฒะฐะฝะธะต ั‡ะธัะปะธั‚ะตะปัŒะฝั‹ั… ะฒ ัะทั‹ะบะฐั… ัั‚ะฐะฝะพะฒะธั‚ัั ั€ะตะณัƒะปัั€ะฝั‹ะผ, ะฟะพัั‚ะพะผัƒ ะฝะตะบะพั‚ะพั€ั‹ะต ัะฟะธัะบะธ ะฒ ั„ะฐะนะปะต ะผะพะถะฝะพ ัะพะบั€ะฐั‚ะธั‚ัŒ, ะฐ ะฝะตะบะพั‚ะพั€ั‹ะต ัะปะตะดัƒะตั‚ ะดะพะฟะพะปะฝะธั‚ัŒ. ะŸะพะดั€ะพะฑะฝะตะต ะพะฑ ัั‚ะพะผ ะผะพะถะฝะพ ัƒะทะฝะฐั‚ัŒ ะธะท ะฐะฝะณะปะธะนัะบะธั… ะบะพะผะผะตะฝั‚ะฐั€ะธะตะฒ ะฒ ั„ะฐะนะปะต. +2. ะคะฐะนะปั‹ `xxx_Rules.yaml`, ัะตะนั‡ะฐั ัั‚ะพ `ClearSpeak_Rules.yaml` ะธ `SimpleSpeak_Rules.yaml`. ะžะฝะธ ัะพะพั‚ะฒะตั‚ัั‚ะฒัƒัŽั‚ ั€ะฐะทะฝั‹ะผ ัั‚ะธะปัะผ ั€ะตั‡ะธ. ะะฐัั‚ะพัั‚ะตะปัŒะฝะพ ั€ะตะบะพะผะตะฝะดัƒะตั‚ัั ัะฝะฐั‡ะฐะปะฐ ะฒั‹ะฑั€ะฐั‚ัŒ ั‚ะพะปัŒะบะพ ะพะดะธะฝ ัั‚ะธะปัŒ. ะญั‚ะธ ั„ะฐะนะปั‹ ะพะฑั‹ั‡ะฝะพ ัะพะดะตั€ะถะฐั‚ ัะปะพะฒะฐ, ะพะฟะธัั‹ะฒะฐัŽั‰ะธะต ัั‚ั€ัƒะบั‚ัƒั€ัƒ ะฒั‹ั€ะฐะถะตะฝะธั, ะฝะฐะฟั€ะธะผะตั€ ยซะดั€ะพะฑัŒยป ะธ ยซัั‚ะตะฟะตะฝัŒยป, ะฐ ั‚ะฐะบะถะต ัะฒัะทัƒัŽั‰ะธะต ัะปะพะฒะฐ. ะŸะพัะบะพะปัŒะบัƒ ัั‚ะธะปะธ ั€ะตั‡ะธ ะฒะพ ะผะฝะพะณะพะผ ะฟะพั…ะพะถะธ, ััƒั‰ะตัั‚ะฒัƒะตั‚ ั‚ะฐะบะถะต ะบะฐั‚ะฐะปะพะณ `SharedRules` ั ะพะฑั‰ะธะผะธ ั„ะฐะนะปะฐะผะธ ะฟั€ะฐะฒะธะป. ะžะฝะธ ะฟะพะดะบะปัŽั‡ะฐัŽั‚ัั ะฒ `ClearSpeak_Rules.yaml` ะธ `SimpleSpeak_Rules.yaml` ั ะฟะพะผะพั‰ัŒัŽ ะฟั€ะฐะฒะธะป `- include: file_name`. ะ˜ั… ั‚ะพะถะต ะฝะตะพะฑั…ะพะดะธะผะพ ะฟะตั€ะตะฒะตัั‚ะธ. +
+
+ะŸั€ะธะผะตั‡ะฐะฝะธะต: ะดะธะฐะปะพะณ ะฝะฐัั‚ั€ะพะตะบ MathCAT ะธั‰ะตั‚ ั„ะฐะนะปั‹ ั ะธะผะตะฝะฐะผะธ ะฒะธะดะฐ `XXX_Rules.yaml` ะธ ะดะพะฑะฐะฒะปัะตั‚ ะธั… ะฒ ะบะพะผะฑะธะฝะธั€ะพะฒะฐะฝะฝั‹ะน ัะฟะธัะพะบ ะดะปั ัะทั‹ะบะฐ. ะ˜ัะฟะพะปัŒะทะพะฒะฐั‚ัŒ ะธะผะตะฝะฐ SimpleSpeak ะธ ClearSpeak ะฝะตะพะฑัะทะฐั‚ะตะปัŒะฝะพ. ะ•ัะปะธ ะฒั‹ ั…ะพั‚ะธั‚ะต ะฟะตั€ะตะฒะตัั‚ะธ ั‚ะพะปัŒะบะพ ะพะดะธะฝ ัั‚ะธะปัŒ, ะฝะฐะฟั€ะธะผะตั€ SimpleSpeak, ะฝะพ ะฝะต ั…ะพั‚ะธั‚ะต ัƒะดะฐะปัั‚ัŒ `ClearSpeak_Rules.yaml`, ะฟะตั€ะตะธะผะตะฝัƒะนั‚ะต ะตะณะพ, ะฝะฐะฟั€ะธะผะตั€, ะฒ `ClearSpeak_Rules.yaml.untranslated`. +
+
+ะญั‚ะธ ั„ะฐะนะปั‹ ัะพะดะตั€ะถะฐั‚ ะฐะฒั‚ะพะผะฐั‚ะธั‡ะตัะบะธ ัะพะทะดะฐะฝะฝั‹ะต ะฝะฐั‡ะฐะปัŒะฝั‹ะต ะฟะตั€ะตะฒะพะดั‹. ะฅะพั‚ั ั‚ะตะบัั‚ ัƒะถะต ะฟะตั€ะตะฒะตะดั‘ะฝ, ะธัะฟะพะปัŒะทัƒะตั‚ัั ะบะปัŽั‡ `t:`, ะฐ ะฝะต `T:` ั ะฟั€ะพะฟะธัะฝะพะน ะฑัƒะบะฒั‹. ะšะฐะถะดั‹ะน ะฟะตั€ะตะฒะพะด ะฝะตะพะฑั…ะพะดะธะผะพ ะฟั€ะพะฒะตั€ะธั‚ัŒ ะธ ั‚ะพะปัŒะบะพ ะฟะพัะปะต ัั‚ะพะณะพ ะธะทะผะตะฝะธั‚ัŒ ะบะปัŽั‡ ะฝะฐ ะฒะฐั€ะธะฐะฝั‚ ั ะฟั€ะพะฟะธัะฝะพะน ะฑัƒะบะฒั‹. ะŸะพะดั€ะพะฑะฝะตะต ะพะฑ ะฐะฒั‚ะพะผะฐั‚ะธั‡ะตัะบะพะผ ะฟะตั€ะตะฒะพะดะต ัะผ. ะฝะธะถะต. + + * ะ’ ะฝะตะบะพั‚ะพั€ั‹ั… ัะทั‹ะบะฐั… ะฝะตั‚ ัะผั‹ัะปะฐ ะฟั€ะพะธะทะฝะพัะธั‚ัŒ ัะบะฒะธะฒะฐะปะตะฝั‚ั‹ ัะปะพะฒ ยซtheยป ะธ, ะฒะพะทะผะพะถะฝะพ, ยซofยป ะฒะพ ั„ั€ะฐะทะต ยซthe square root of xยป. ะ’ ั‚ะฐะบะพะผ ัะปัƒั‡ะฐะต ะทะฐะผะตะฝะธั‚ะต ะธั… ะฟัƒัั‚ั‹ะผะธ ัั‚ั€ะพะบะฐะผะธ. + * ะ’ ะฝะตะบะพั‚ะพั€ั‹ั… ัะทั‹ะบะฐั… ะผะตะฝัะตั‚ัั ะฟะพั€ัะดะพะบ ัะปะพะฒ. ะŸะตั€ะตัั‚ะฐะฒะปัะนั‚ะต ัะปะพะฒะฐ ัะฒะพะฑะพะดะฝะพ, ะฝะพ ะฒะฝะธะผะฐั‚ะตะปัŒะฝะพ ัะปะตะดะธั‚ะต ะทะฐ ะพั‚ัั‚ัƒะฟะฐะผะธ: ะฒ YAML ะพะฝะธ ะธะผะตัŽั‚ ะทะฝะฐั‡ะตะฝะธะต. + * ะ’ ะฝะตะบะพั‚ะพั€ั‹ั… ัะทั‹ะบะฐั… ะผะพะณัƒั‚ ะฟะพั‚ั€ะตะฑะพะฒะฐั‚ัŒัั ัะปะพะฒะฐ, ะพั‚ััƒั‚ัั‚ะฒัƒัŽั‰ะธะต ะฒ ะฐะฝะณะปะธะนัะบะพะน ะฒะตั€ัะธะธ, ะดะพ ะธะปะธ ะฟะพัะปะต ััƒั‰ะตัั‚ะฒัƒัŽั‰ะธั… ั„ั€ะฐะท. ะ”ะพะฑะฐะฒะปัะนั‚ะต ะธั… ะฟั€ะธ ะฝะตะพะฑั…ะพะดะธะผะพัั‚ะธ. ะฃัะปะพะฒะฝะพะต ะดะพะฑะฐะฒะปะตะฝะธะต ะฒั‹ะฟะพะปะฝัะตั‚ัั ั ะฟะพะผะพั‰ัŒัŽ `test`. ะ•ัะปะธ ะฝัƒะถะฝะฐ ะฟะพะผะพั‰ัŒ, ัะฒัะถะธั‚ะตััŒ ั @NSoiffer. + * ะŸะฐัƒะทั‹ ะผะตะถะดัƒ ัะปะพะฒะฐะผะธ ะธ ั„ั€ะฐะทะฐะผะธ ะผะพะณัƒั‚ ะทะฝะฐั‡ะธั‚ะตะปัŒะฝะพ ัƒะปัƒั‡ัˆะธั‚ัŒ ะฟะพะฝัั‚ะฝะพัั‚ัŒ ั€ะตั‡ะธ. ะ˜ัั…ะพะดะฝั‹ะต ะฟะฐัƒะทั‹ ะฒั‹ะฑั€ะฐะฝั‹ ะดะปั ะฐะฝะณะปะธะนัะบะพะณะพ ัะทั‹ะบะฐ. ะะฐัั‚ั€ะพะนั‚ะต ะธั… ะฒ ัะพะพั‚ะฒะตั‚ัั‚ะฒะธะธ ัะพ ะทะฒัƒั‡ะฐะฝะธะตะผ ัะธะฝั‚ะตะทะฐั‚ะพั€ะพะฒ ั€ะตั‡ะธ ะฒะฐัˆะตะณะพ ัะทั‹ะบะฐ. ะŸะฐัƒะทั‹ ะปะตะณะบะพ ะดะพะฑะฐะฒะปัั‚ัŒ, ัƒะดะฐะปัั‚ัŒ ะธ ะธะทะผะตะฝัั‚ัŒ. ะ˜ั… ะดะปะธั‚ะตะปัŒะฝะพัั‚ัŒ ะผะฐััˆั‚ะฐะฑะธั€ัƒะตั‚ัั ะฒ ัะพะพั‚ะฒะตั‚ัั‚ะฒะธะธ ั ั‚ะตะบัƒั‰ะตะน ัะบะพั€ะพัั‚ัŒัŽ ั€ะตั‡ะธ. +3. ะคะฐะนะปั‹ Unicode: `unicode.yaml` ะธ `unicode-full.yaml`. ะžะฝะธ ัะพะดะตั€ะถะฐั‚ ั‚ะฐะบะธะต ัะธะผะฒะพะปั‹, ะบะฐะบ `<` ะธ `โˆซ`. + * ะะฐั‡ะฝะธั‚ะต ั ะฟะตั€ะตะฒะพะดะฐ `unicode.yaml`. ะ’ ะฝั‘ะผ ะฝะฐั…ะพะดะธั‚ัั ะฟะพะดะฐะฒะปััŽั‰ะตะต ะฑะพะปัŒัˆะธะฝัั‚ะฒะพ ะธัะฟะพะปัŒะทัƒะตะผั‹ั… ะผะฐั‚ะตะผะฐั‚ะธั‡ะตัะบะธั… ัะธะผะฒะพะปะพะฒ. ะกะตะนั‡ะฐั ัะฟะธัะพะบ ะพัะฝะพะฒะฐะฝ ะฝะฐ ะฟั€ะฐะบั‚ะธั‡ะตัะบะพะผ ะพะฟั‹ั‚ะต, ะฝะพ ะฒ ะดะฐะปัŒะฝะตะนัˆะตะผ ะฟะปะฐะฝะธั€ัƒะตั‚ัั ัƒั‚ะพั‡ะฝะธั‚ัŒ ะตะณะพ ะฟะพ ัั‚ะฐั‚ะธัั‚ะธะบะต ะธะท ั€ะตะฐะปัŒะฝั‹ั… ะบะฝะธะณ. ะ’ `unicode.yaml` ะพะบะพะปะพ 270 ัะธะผะฒะพะปะพะฒ, ะฟั€ะธะผะตั€ะฝะพ 50 ะธะท ะบะพั‚ะพั€ั‹ั… โ€” ะณั€ะตั‡ะตัะบะธะต ะฑัƒะบะฒั‹. ะšะฐะบ ะธ ะฒ ั„ะฐะนะปะฐั… ะฟั€ะฐะฒะธะป ั€ะตั‡ะธ, ะทะดะตััŒ ะตัั‚ัŒ ะฐะฒั‚ะพะผะฐั‚ะธั‡ะตัะบะธ ัะพะทะดะฐะฝะฝั‹ะต ะฝะฐั‡ะฐะปัŒะฝั‹ะต ะฟะตั€ะตะฒะพะดั‹. ะŸั€ะพะฒะตั€ัŒั‚ะต ะธั… ะธ ะธะทะผะตะฝะธั‚ะต `t:` ะฝะฐ `T:`. ะŸะพะดั€ะพะฑะฝะตะต ะพะฑ ะฐะฒั‚ะพะผะฐั‚ะธั‡ะตัะบะพะผ ะฟะตั€ะตะฒะพะดะต ัะผ. ะฝะธะถะต. + * ะ’ `unicode-full.yaml` ั‚ั‹ััั‡ะธ ัั‚ั€ะพะบ. ะ’ะตั€ะฝะธั‚ะตััŒ ะบ ะฝะตะผัƒ ะฟะพัะปะต ะทะฐะฒะตั€ัˆะตะฝะธั ะพัั‚ะฐะปัŒะฝั‹ั… ะฟะตั€ะตะฒะพะดะพะฒ ะธ ั€ะฐะฑะพั‚ะฐะนั‚ะต ัั‚ะพะปัŒะบะพ, ัะบะพะปัŒะบะพ ัะผะพะถะตั‚ะต: ะฑะพะปัŒัˆะธะฝัั‚ะฒะพ ัั‚ะธั… ัะธะผะฒะพะปะพะฒ ะฒัั‚ั€ะตั‡ะฐัŽั‚ัั ั‚ะพะปัŒะบะพ ะฒ ัะปะพะถะฝะพะน ะผะฐั‚ะตะผะฐั‚ะธะบะต ะธ ะดะฐะถะต ั‚ะฐะผ ะธัะฟะพะปัŒะทัƒัŽั‚ัั ั€ะตะดะบะพ. ะะฐะธะฑะพะปะตะต ะฒะฐะถะฝั‹: + * ะฝะตะบะพั‚ะพั€ั‹ะต ัั‚ั€ะตะปะบะธ, ะฝะฐั‡ะธะฝะฐั ั 0x2190; + * ัะธะผะฒะพะปั‹ ะธะท ะฑะปะพะบะฐ ะผะฐั‚ะตะผะฐั‚ะธั‡ะตัะบะธั… ะพะฟะตั€ะฐั‚ะพั€ะพะฒ 0x2200โ€“0x22ff; + * ะฝะตะบะพั‚ะพั€ั‹ะต ะดะธะฐะบั€ะธั‚ะธั‡ะตัะบะธะต ะทะฝะฐะบะธ 0x2d8โ€“0x2dd; + * ะฝะตะบะพั‚ะพั€ั‹ะต ะฟั€ะพัั‚ั‹ะต ั‡ั‘ั€ะฝั‹ะต ะธ ะฑะตะปั‹ะต ั„ะธะณัƒั€ั‹, ะฝะฐั‡ะธะฝะฐั ั 0x25a0 ะธ 0x2b1a. +4. ะคะฐะนะปั‹ ะฝะฐะฒะธะณะฐั†ะธะธ `navigate.yaml` ะธ `overview.yaml`. ะŸะตั€ะตะฒะพะดะธั‚ะต ั‚ะพะปัŒะบะพ `navigate.yaml`: `overview.yaml` ะตั‰ั‘ ะฝะต ะณะพั‚ะพะฒ ะบ ะธัะฟะพะปัŒะทะพะฒะฐะฝะธัŽ. ะœะฝะพะณะธะต ัะปะพะฒะฐ ะฒ `navigate.yaml` ะผะฝะพะณะพะบั€ะฐั‚ะฝะพ ะฟะพะฒั‚ะพั€ััŽั‚ัั, ะฟะพัั‚ะพะผัƒ ัƒะดะพะฑะฝะพ ะฟั€ะธะผะตะฝัั‚ัŒ ะณะปะพะฑะฐะปัŒะฝั‹ะน ะฟะพะธัะบ ะธ ะทะฐะผะตะฝัƒ. ะ’ ะดะฐะปัŒะฝะตะนัˆะตะผ ั„ะฐะนะป ะฟะปะฐะฝะธั€ัƒะตั‚ัั ะฟะตั€ะตั€ะฐะฑะพั‚ะฐั‚ัŒ ะธ ะฒั‹ะดะตะปะธั‚ัŒ ะฟะพะฒั‚ะพั€ััŽั‰ะธะตัั ัะปะพะฒะฐ. + +__ะŸะ ะ˜ะœะ•ะงะะะ˜ะ•__: ะกะตะนั‡ะฐั ะฟะพั‡ั‚ะธ ะทะฐะฒะตั€ัˆั‘ะฝ ะฟะตั€ะตั…ะพะด ะฟั€ะฐะฒะธะป ะฝะฐ ะธัะฟะพะปัŒะทะพะฒะฐะฝะธะต `intent`. ะกะปะพะถะฝะฐั ะปะพะณะธะบะฐ ั€ะฐัะฟะพะทะฝะฐะฒะฐะฝะธั ะฐะฑัะพะปัŽั‚ะฝั‹ั… ะฒะตะปะธั‡ะธะฝ, ะพะฟั€ะตะดะตะปะธั‚ะตะปะตะน ะธ ะดั€ัƒะณะธั… ะบะพะฝัั‚ั€ัƒะบั†ะธะน ะฑัƒะดะตั‚ ะฟะตั€ะตะฝะตัะตะฝะฐ ะฒ ะฝะตะทะฐะฒะธัะธะผั‹ะน ะพั‚ ัะทั‹ะบะฐ ะบะฐั‚ะฐะปะพะณ `intent`. ะญั‚ะพ ัƒะฟั€ะพัั‚ะธั‚ ะฟะตั€ะตะฒะพะด, ะฟะพัะบะพะปัŒะบัƒ ะฟั€ะฐะฒะธะปัƒ ะฟะพั‚ั€ะตะฑัƒะตั‚ัั ัะพะฟะพัั‚ะฐะฒะปัั‚ัŒ ั‚ะพะปัŒะบะพ ั‚ะตะณ `absolute-value` ะธะปะธ `determinant`. ะขะตัั‚ั‹ ั‚ะฐะบะถะต ัะปะตะดัƒะตั‚ ะฒั‹ะฝะตัั‚ะธ ะฒ ะฝะตะทะฐะฒะธัะธะผั‹ะน ะพั‚ ัะทั‹ะบะฐ ะบะฐั‚ะฐะปะพะณ `intent`. + +### ะŸะพะผะตั‚ะบะฐ ะฟะตั€ะตะฒะตะดั‘ะฝะฝะพะณะพ ั‚ะตะบัั‚ะฐ +ะญั‚ะธ ั„ะฐะนะปั‹ ะธะผะตัŽั‚ ั„ะพั€ะผะฐั‚ YAML, ะพะฟะธัะฐะฝะฝั‹ะน ะฝะธะถะต. +ะ’ะพ ะฒัะตั… ัั‚ะธั… ั„ะฐะนะปะฐั… ะฟะตั€ะตะฒะพะดะธะผั‹ะน ั‚ะตะบัั‚ ะทะฐะดะฐั‘ั‚ัั ะบะปัŽั‡ะพะผ YAML `t`, ะฐ ะฒ ั€ะตะดะบะธั… ัะปัƒั‡ะฐัั… โ€” `ot`, `ct`, `spell`, `pronounce` ะธ `IfThenElse`. ะŸะพัะปะต ะฟั€ะพะฒะตั€ะบะธ ะฟะตั€ะตะฒะพะดะฐ ะทะฐะฟะธัˆะธั‚ะต ะบะปัŽั‡ ะฟั€ะพะฟะธัะฝั‹ะผะธ ะฑัƒะบะฒะฐะผะธ, ะฝะฐะฟั€ะธะผะตั€ `T` ะธะปะธ `IFTHENELSE`, ั‡ั‚ะพะฑั‹ ะพะฑะพะทะฝะฐั‡ะธั‚ัŒ ะฟะตั€ะตะฒะตะดั‘ะฝะฝั‹ะน ั„ั€ะฐะณะผะตะฝั‚. + +ะะฐะฟั€ะธะผะตั€, ะฒ `unicode.yaml` ะตัั‚ัŒ ะดะฒะฐ ะฟั€ะฐะฒะธะปะฐ: +``` + - "=": [t: "equals"] # 0x3d + - ">": # 0x3e + - test: + if: "$Verbosity!='Terse'" + then: [t: "is"] + - t: "greater than" +``` +ะŸั€ะธ ะฟะตั€ะตะฒะพะดะต ะฝะฐ ั€ัƒััะบะธะน ัะทั‹ะบ ัะปะพะฒะฐ ะฟะพัะปะต `t:` ะทะฐะผะตะฝััŽั‚ัั ะฟั€ะธะผะตั€ะฝะพ ั‚ะฐะบ: +``` + - "=": [T: "ั€ะฐะฒะฝะพ"] # 0x3d + + - ">": # 0x3e + - test: + if: "$Verbosity!='Terse'" + then: [T: ""] + - T: "ะฑะพะปัŒัˆะต" +``` + +ะŸั€ะธะผะตั‡ะฐะฝะธะต: ะธะฝะพะณะดะฐ ะทะฝะฐั‡ะตะฝะธะต `IfThenElse` ะฝะต ั‚ั€ะตะฑัƒะตั‚ ะฟะตั€ะตะฒะพะดะฐ, ะฝะพ ะบะปัŽั‡ ะฒัั‘ ั€ะฐะฒะฝะพ ัะปะตะดัƒะตั‚ ะธะทะผะตะฝะธั‚ัŒ, ั‡ั‚ะพะฑั‹ ะฑั‹ะปะพ ะฒะธะดะฝะพ, ั‡ั‚ะพ ัั‚ั€ะพะบะฐ ะฟั€ะพะฒะตั€ะตะฝะฐ. ะ’ ัะปะตะดัƒัŽั‰ะตะผ ะฟั€ะธะผะตั€ะต ะฟะตั€ะตะฒะพะด ะฝะต ะฝัƒะถะตะฝ, ะฟะพัะบะพะปัŒะบัƒ ั‡ะฐัั‚ะธ `then` ะธ `else`, ัะพะพั‚ะฒะตั‚ัั‚ะฒะตะฝะฝะพ `count(*/*[1])` ะธ `$LineCountTry`, ะฝะต ัะฒะปััŽั‚ัั ัะปะพะฒะฐะผะธ: +``` + - LineCount: "IfThenElse($LineCountTry=0, count(*/*[1]), $LineCountTry)" +``` + +ะŸะพะดั€ะพะฑะฝะตะต ะพ ัะพะดะตั€ะถะธะผะพะผ ั„ะฐะนะปะพะฒ ะฟั€ะฐะฒะธะป ัะผ. ะฝะธะถะต. + +### ะŸั€ะธะผะตั‡ะฐะฝะธะต ะพ ะฟะตั€ะตะฒะตะดั‘ะฝะฝั‹ั… ั„ะฐะนะปะฐั… +ะ”ะปั ะฟะพะปัƒั‡ะตะฝะธั ะฝะฐั‡ะฐะปัŒะฝะพะณะพ ะฟะตั€ะตะฒะพะดะฐ ั„ะฐะนะปะพะฒ Unicode ะธัะฟะพะปัŒะทัƒัŽั‚ัั ะฟะตั€ะตะฒะพะดั‹ MathPlayer ะธ SRE, ะฐ ั‚ะฐะบะถะต Google Translate. +ะ•ัะปะธ ะฟะตั€ะตะฒะพะดั‹ SRE ะธ MathPlayer ัะพะฒะฟะฐะดะฐัŽั‚ ะปะธะฑะพ ะฟะตั€ะตะฒะพะด ะตัั‚ัŒ ั‚ะพะปัŒะบะพ ะฒ ะพะดะฝะพะผ ะธะท ะฝะธั… ะธ ัะพะฒะฟะฐะดะฐะตั‚ ั Google Translate, ะฒ ะบะพะผะผะตะฝั‚ะฐั€ะธะน ะฒ ะบะพะฝั†ะต ัั‚ั€ะพะบะธ ะดะพะฑะฐะฒะปัะตั‚ัั ั‚ะพะปัŒะบะพ ะธัั…ะพะดะฝั‹ะน ะฐะฝะณะปะธะนัะบะธะน ะฒะฐั€ะธะฐะฝั‚. ะะฐะฟั€ะธะผะตั€: +``` + - "!": [t: "factorielle"] # 0x21 (en: 'factorial') +``` + +ะ•ัะปะธ ะฟะตั€ะตะฒะพะดั‹ MathPlayer ะธ SRE ั€ะฐะทะปะธั‡ะฐัŽั‚ัั, ะฒั‹ะฑะธั€ะฐะตั‚ัั ะฒะฐั€ะธะฐะฝั‚, ัะพะฒะฟะฐะดะฐัŽั‰ะธะน ั Google Translate, ะฐ ะดั€ัƒะณะพะน ะฒะฐั€ะธะฐะฝั‚ ะฒะบะปัŽั‡ะฐะตั‚ัั ะฒ ะบะพะผะผะตะฝั‚ะฐั€ะธะน. ะะฐะฟั€ะธะผะตั€: +``` + else: [t: "ะปะตะฒะฐั ะบั€ัƒะณะปะฐั ัะบะพะฑะบะฐ"] # (en: 'left paren', MathPlayer: 'ะพั‚ะบั€ั‹ะฒะฐัŽั‰ะฐั ะบั€ัƒะณะปะฐั ัะบะพะฑะบะฐ') +``` +ะ•ัะปะธ ะฝะต ัะพะฒะฟะฐะดะฐะตั‚ ะฝะธ ะพะดะธะฝ ะฟะตั€ะตะฒะพะด, ะฒั‹ะฑะธั€ะฐะตั‚ัั ะพะดะธะฝ ะธะท ะฒะฐั€ะธะฐะฝั‚ะพะฒ, ะฐ ะพัั‚ะฐะปัŒะฝั‹ะต ะฟั€ะธะฒะพะดัั‚ัั ะฒ ะบะพะผะผะตะฝั‚ะฐั€ะธะธ. ะะฐะฟั€ะธะผะตั€: +``` + else: [t: "ะปะตะฒะฐั ะบั€ัƒะณะปะฐั ัะบะพะฑะบะฐ"] # (en: 'open paren', MathPlayer: 'ะพั‚ะบั€ั‹ะฒะฐัŽั‰ะฐั ะบั€ัƒะณะปะฐั ัะบะพะฑะบะฐ', google: 'ะพั‚ะบั€ั‹ั‚ะฐั ัะบะพะฑะบะฐ') +``` +ะะฐะบะพะฝะตั†, ะตัะปะธ ะฟะตั€ะตะฒะพะด ะพั‚ััƒั‚ัั‚ะฒัƒะตั‚, ะธัะฟะพะปัŒะทัƒะตั‚ัั Google Translate ะธ ะดะพะฑะฐะฒะปัะตั‚ัั ะบะพะผะผะตะฝั‚ะฐั€ะธะน `google translation`. ะ’ะตั€ะพัั‚ะฝะพัั‚ัŒ ะฝะตัƒะดะฐั‡ะฝะพะณะพ ะฟะตั€ะตะฒะพะดะฐ ะฒ ั‚ะฐะบะพะผ ัะปัƒั‡ะฐะต ะทะฐะผะตั‚ะฝะพ ะฒั‹ัˆะต, ะฟะพัั‚ะพะผัƒ ะฒะฝะธะผะฐั‚ะตะปัŒะฝะพ ะฟั€ะพะฒะตั€ัะนั‚ะต ัั‚ะธ ัั‚ั€ะพะบะธ. ะŸั€ะธะผะตั€, ะณะดะต ะดะพัั‚ัƒะฟะตะฝ ั‚ะพะปัŒะบะพ Google Translate: +``` + then: [t: "ะฒะตั€ั‚ะธะบะฐะปัŒะฝะฐั ะปะธะฝะธั"] # (en: 'vertical line', google translation) +``` + + +### ะŸั€ะพะฒะตั€ะบะฐ ะฟะตั€ะตะฒะพะดะฐ +ะ•ัะปะธ ะฒั‹ ะธัะฟะพะปัŒะทัƒะตั‚ะต NVDA, ะฝะฐั‡ะฐั‚ั‹ะน ะฟะตั€ะตะฒะพะด ะผะพะถะฝะพ ัั€ะฐะทัƒ ะฟั€ะพะฒะตั€ะธั‚ัŒ. ะŸั€ะตะดะฟะพะปะฐะณะฐะตั‚ัั, ั‡ั‚ะพ ะดะพะฟะพะปะฝะตะฝะธะต MathCAT ัƒะถะต ัƒัั‚ะฐะฝะพะฒะปะตะฝะพ: +1. ะกะบะพะฟะธั€ัƒะนั‚ะต ะฝะพะฒั‹ะน ะบะฐั‚ะฐะปะพะณ ะฟะตั€ะตะฒะพะดะฐ ะฒ `%AppData%\nvda\addons\MathCAT\globalPlugins\MathCAT\Rules\Languages`. +2. ะ—ะฐะฟัƒัั‚ะธั‚ะต NVDA ะธ ะพั‚ะบั€ะพะนั‚ะต ะผะตะฝัŽ ะฝะฐัั‚ั€ะพะตะบ MathCAT: ะฟะฐั€ะฐะผะตั‚ั€ั‹ NVDA, ะทะฐั‚ะตะผ ยซะะฐัั‚ั€ะพะนะบะธ MathCAT...ยป. +3. ะ’ั‹ะฑะตั€ะธั‚ะต ะฝะพะฒั‹ะน ัะทั‹ะบ ะฒ ะบะพะผะฑะธะฝะธั€ะพะฒะฐะฝะฝะพะผ ัะฟะธัะบะต `Languages`. +4. ะŸั€ะพะฒะตั€ัŒั‚ะต ะพะทะฒัƒั‡ะธะฒะฐะฝะธะต. ะฅะพั€ะพัˆะธะผ ะธัั‚ะพั‡ะฝะธะบะพะผ ะฟั€ะธะผะตั€ะพะฒ ัะปัƒะถะฐั‚ ัั‚ั€ะฐะฝะธั†ั‹ ะ’ะธะบะธะฟะตะดะธะธ. +5. ะ•ัะปะธ ะฟั€ะพะธะทะพัˆะปะฐ ะพัˆะธะฑะบะฐ, ั‡ะฐัั‚ะพ ะฒั‹ั€ะฐะถะฐัŽั‰ะฐััั ะฒ ะพั‚ััƒั‚ัั‚ะฒะธะธ ั€ะตั‡ะธ, ะพั‚ะบั€ะพะนั‚ะต ะถัƒั€ะฝะฐะป NVDA ะธะท ะฟะพะดะผะตะฝัŽ ยซะกะตั€ะฒะธัยป. ะžัˆะธะฑะบะฐ ะดะพะปะถะฝะฐ ะฑั‹ั‚ัŒ ัƒะบะฐะทะฐะฝะฐ ั‚ะฐะผ. ะžะฑัŠััะฝะตะฝะธะต ัะพะพะฑั‰ะตะฝะธะน ะพะฑ ะพัˆะธะฑะบะฐั… ะฟั€ะธะฒะตะดะตะฝะพ ะฝะธะถะต. +6. MathCAT ะดะพะปะถะตะฝ ะทะฐะผะตั‚ะธั‚ัŒ ะธะทะผะตะฝะตะฝะธะต ั„ะฐะนะปะฐ ะธ ะฟะตั€ะตะทะฐะณั€ัƒะทะธั‚ัŒ ะตะณะพ. ะกะตะนั‡ะฐั ัั‚ะพ ะฝะต ั€ะฐะฑะพั‚ะฐะตั‚ ะดะปั ั„ะฐะนะปะพะฒ, ะฟะพะดะบะปัŽั‡ั‘ะฝะฝั‹ั… ั ะฟะพะผะพั‰ัŒัŽ `include`, ะฝะฐะฟั€ะธะผะตั€ ะดะปั ั„ะฐะนะปะพะฒ ะบะฐั‚ะฐะปะพะณะฐ `Shared`. ะŸะพัะปะต ะธะทะผะตะฝะตะฝะธั ั‚ะฐะบะพะณะพ ั„ะฐะนะปะฐ ะฟะตั€ะตะทะฐะณั€ัƒะทะธั‚ะต MathCAT ั‡ะตั€ะตะท ยซะกะตั€ะฒะธั: ะŸะตั€ะตะทะฐะณั€ัƒะทะธั‚ัŒ ะฟะปะฐะณะธะฝั‹ยป ะฒ NVDA ะธะปะธ ะฟะตั€ะตะทะฐะฟัƒัั‚ะธั‚ะต NVDA. + +ะŸะตั€ะตะฒะพะด ะดะธะฐะปะพะณะฐ ะฝะฐัั‚ั€ะพะตะบ ะฒั‹ะฟะพะปะฝัะตั‚ัั ะพั‚ะดะตะปัŒะฝะพ ะพั‚ ะฟะตั€ะตะฒะพะดะฐ ั€ะตั‡ะธ. ะ˜ะผ ะทะฐะฝะธะผะฐัŽั‚ัั ะดะพะฑั€ะพะฒะพะปัŒั†ั‹, ะบะพั‚ะพั€ั‹ะต ะฟะตั€ะตะฒะพะดัั‚ ะธ ะดั€ัƒะณะธะต ะดะพะฟะพะปะฝะตะฝะธั. ะŸะพะดั€ะพะฑะฝะตะต ัะผ. [ัั‚ัƒ ั€ะฐััั‹ะปะบัƒ](https://groups.io/g/nvda-translations). + +### ะะฒั‚ะพะผะฐั‚ะธั‡ะตัะบะธะต ั‚ะตัั‚ั‹ ะฟะตั€ะตะฒะพะดะฐ +ะขะตัั‚ะธั€ะพะฒะฐะฝะธะต ะพั‡ะตะฝัŒ ะฒะฐะถะฝะพ. MathCAT ะฝะฐะฟะธัะฐะฝ ะฝะฐ Rust ะธ ัะพะดะตั€ะถะธั‚ ะผะฝะพะถะตัั‚ะฒะพ ะฐะฒั‚ะพะผะฐั‚ะธั‡ะตัะบะธั… ั‚ะตัั‚ะพะฒ, ะธัะฟะพะปัŒะทัƒัŽั‰ะธั… ะฒัั‚ั€ะพะตะฝะฝัƒัŽ ัะธัั‚ะตะผัƒ ั‚ะตัั‚ะธั€ะพะฒะฐะฝะธั Rust. ะงั‚ะพะฑั‹ ะฟะธัะฐั‚ัŒ ะธ ะฟั€ะพะฒะตั€ัั‚ัŒ ัะพะฑัั‚ะฒะตะฝะฝั‹ะต ั‚ะตัั‚ั‹, [ัะบะฐั‡ะฐะนั‚ะต ะธ ัƒัั‚ะฐะฝะพะฒะธั‚ะต Rust](https://www.rust-lang.org/tools/install). ะ—ะฝะฐั‚ัŒ Rust ะฝะตะพะฑัะทะฐั‚ะตะปัŒะฝะพ: ะดะพัั‚ะฐั‚ะพั‡ะฝะพ ะทะฐะผะตะฝะธั‚ัŒ ะฝะตะบะพั‚ะพั€ั‹ะต ะฐะฝะณะปะธะนัะบะธะต ัั‚ั€ะพะบะธ ะพะถะธะดะฐะตะผั‹ะผะธ ัั‚ั€ะพะบะฐะผะธ ะฝะฐ ะฒะฐัˆะตะผ ัะทั‹ะบะต. + +ะŸั€ะตะดะฟะพะปะพะถะธะผ, ั‡ั‚ะพ ะฒั‹ ะฟะตั€ะตะฒะพะดะธั‚ะต ะฝะฐ ั€ัƒััะบะธะน ัะทั‹ะบ ั ะบะพะดะพะผ `ru`. + +ะกะฝะฐั‡ะฐะปะฐ ะพั‚ะบั€ะพะนั‚ะต ั„ะฐะนะป `languages.rs` ะฒ ะบะฐั‚ะฐะปะพะณะต ั‚ะตัั‚ะพะฒ ะธ ะดะพะฑะฐะฒัŒั‚ะต ัั‚ั€ะพะบัƒ `mod ru;` ะฟะพัะปะต `mod en;` ะธะปะธ ะฐะฝะฐะปะพะณะธั‡ะฝะพะน ัั‚ั€ะพะบะธ ะดั€ัƒะณะพะณะพ ัะทั‹ะบะฐ. + +ะ’ ะบะฐั‚ะฐะปะพะณะต `tests\Languages` ะฝะฐั…ะพะดัั‚ัั ั„ะฐะนะป `en.rs` ะธ ะบะฐั‚ะฐะปะพะณ `en`. +1. ะกะบะพะฟะธั€ัƒะนั‚ะต `en.rs` ะฒ `ru.rs`. +2. ะกะบะพะฟะธั€ัƒะนั‚ะต ะบะฐั‚ะฐะปะพะณ `en` ะฒ `ru`. +3. ะ•ัะปะธ ะฒั‹ ะฒั‹ะฑั€ะฐะปะธ ั‚ะพะปัŒะบะพ ะพะดะธะฝ ัั‚ะธะปัŒ ั€ะตั‡ะธ, ะฝะฐะฟั€ะธะผะตั€ SimpleSpeak, ะพั‚ั€ะตะดะฐะบั‚ะธั€ัƒะนั‚ะต `ru.rs`: ัƒะดะฐะปะธั‚ะต ัั‚ั€ะพะบะธ, ะฝะฐั‡ะธะฝะฐั ั `mod ClearSpeak {` ะธ ะทะฐะบะฐะฝั‡ะธะฒะฐั ัะพะพั‚ะฒะตั‚ัั‚ะฒัƒัŽั‰ะตะน ัั‚ั€ะพะบะพะน `}`. ะฃะดะฐะปะธั‚ะต ะฟะพะดะบะฐั‚ะฐะปะพะณ `ClearSpeak` ะธะท ะบะฐั‚ะฐะปะพะณะฐ `ru`. +4. ะ–ะตะปะฐั‚ะตะปัŒะฝะพ ะฟะตั€ะตะฒะตัั‚ะธ ะฒัะต ั„ะฐะนะปั‹, ะฝะพ ะฝะฐ ะฝะฐั‡ะฐะปัŒะฝะพะผ ัั‚ะฐะฟะต ะผะพะถะฝะพ ะพะณั€ะฐะฝะธั‡ะธั‚ัŒัั ะฝะตัะบะพะปัŒะบะธะผะธ. ะ’ `ru.rs` ะทะฐะบะพะผะผะตะฝั‚ะธั€ัƒะนั‚ะต ะบะฐะถะดั‹ะน ะฝะตะฟะตั€ะตะฒะตะดั‘ะฝะฝั‹ะน ั„ะฐะนะป, ะดะพะฑะฐะฒะธะฒ `//` ะฒ ะฝะฐั‡ะฐะปะพ ัั‚ั€ะพะบะธ. ะะฐะฟั€ะธะผะตั€, ะตัะปะธ ะฒั‹ ะฝะต ะฟะตั€ะตะฒะตะปะธ ั„ะฐะนะป SimpleSpeak `geometry.yaml`, ัั‚ั€ะพะบะฐ ะดะพะปะถะฝะฐ ะฒั‹ะณะปัะดะตั‚ัŒ ั‚ะฐะบ: `// mod geometry;`. +5. ะะฐั‡ะฝะธั‚ะต ั€ะตะดะฐะบั‚ะธั€ะพะฒะฐั‚ัŒ ั„ะฐะนะปั‹: ัะฝะฐั‡ะฐะปะฐ ะณะปะพะฑะฐะปัŒะฝะพ ะทะฐะผะตะฝะธั‚ะต `"en"` ะฝะฐ `"ru"`, ะฐ ะทะฐั‚ะตะผ ะทะฐะผะตะฝะธั‚ะต ะฐะฝะณะปะธะนัะบะธะต ัั‚ั€ะพะบะธ ะฟะพะดั…ะพะดัั‰ะธะผะธ ั€ัƒััะบะธะผะธ ะธะปะธ ะดั€ัƒะณะธะผะธ ัั‚ั€ะพะบะฐะผะธ. + +ะŸั€ะธะผะตั€ ั‚ะตัั‚ะฐ: +``` +#[test] +fn common_fraction_half() { + let expr = " + 1 2 + "; + test("en", "SimpleSpeak", expr, "1 half"); +} +``` +ะ”ะปั ั€ัƒััะบะพะณะพ ัะทั‹ะบะฐ ัั‚ั€ะพะบะฐ `test` ะฑัƒะดะตั‚ ะฒั‹ะณะปัะดะตั‚ัŒ ั‚ะฐะบ: +``` + test("fr", "SimpleSpeak", expr, "ะพะดะฝะฐ ะฒั‚ะพั€ะฐั"); +``` + +ะŸะพัะปะต ะฟะตั€ะตะฒะพะดะฐ ะฝะตัะบะพะปัŒะบะธั… ั‚ะตัั‚ะพะฒ ะทะฐะฟัƒัั‚ะธั‚ะต ะฐะฒั‚ะพะผะฐั‚ะธั‡ะตัะบัƒัŽ ะฟั€ะพะฒะตั€ะบัƒ. +ะกะฝะฐั‡ะฐะปะฐ ัƒะฑะตะดะธั‚ะตััŒ, ั‡ั‚ะพ ะฐะฝะณะปะธะนัะบะธะต ั‚ะตัั‚ั‹ ั€ะฐะฑะพั‚ะฐัŽั‚: +``` +cargo test Languages::en +``` +ะ—ะฐั‚ะตะผ ะทะฐะฟัƒัั‚ะธั‚ะต ัะฒะพะธ ั‚ะตัั‚ั‹. ะ’ ะฝะฐัˆะตะผ ะฟั€ะธะผะตั€ะต: +``` +cargo test Languages::ru +``` +MathCAT ะดะพะฑะฐะฒะปัะตั‚ ะฟะฐัƒะทั‹. ะ’ ะพะถะธะดะฐะตะผั‹ั… ัั‚ั€ะพะบะฐั… ั‚ะตัั‚ะพะฒ ะพะฝะธ ะทะฐะฟะธัั‹ะฒะฐัŽั‚ัั ัะธะผะฒะพะปะฐะผะธ `,` ะธ `;`. ะŸั€ะธ ะฝะตะพะฑั…ะพะดะธะผะพัั‚ะธ ะดะพะฑะฐะฒัŒั‚ะต ะธะปะธ ัƒะดะฐะปะธั‚ะต ัั‚ะธ ัะธะผะฒะพะปั‹ ะฒ ะพะถะธะดะฐะตะผะพะผ ั€ะตะทัƒะปัŒั‚ะฐั‚ะต. ะ•ัะปะธ ะฟะฐัƒะทั‹ ะทะฒัƒั‡ะฐั‚ ะฝะตัƒะผะตัั‚ะฝะพ, ะดะพะฑะฐะฒัŒั‚ะต ะธะปะธ ัƒะดะฐะปะธั‚ะต `pause: xxx` ะฒ ัะพะพั‚ะฒะตั‚ัั‚ะฒัƒัŽั‰ะตะผ ะผะตัั‚ะต ะพะดะฝะพะณะพ ะธะท ั„ะฐะนะปะพะฒ `Rules\ru`. + +__ะกะพะฒะตั‚__: ะฒะพะทะผะพะถะฝะพ, ะฑั‹ัั‚ั€ะตะต ะฒัะตะณะพ ัะฝะฐั‡ะฐะปะฐ ะทะฐะฟัƒัั‚ะธั‚ัŒ ั‚ะตัั‚ั‹ ะฝะฐ ัะฒะพั‘ะผ ัะทั‹ะบะต, ะฝะต ะผะตะฝัั ะพะถะธะดะฐะตะผั‹ะต ั€ะตะทัƒะปัŒั‚ะฐั‚ั‹. ะ’ัะต ั‚ะตัั‚ั‹ ะทะฐะฒะตั€ัˆะฐั‚ัั ั ะพัˆะธะฑะบะพะน, ะฝะพ ะฒ ัะพะพะฑั‰ะตะฝะธัั… ะฑัƒะดะตั‚ ะฟะพะบะฐะทะฐะฝะฐ ั€ะตั‡ัŒ, ัะพะทะดะฐะฝะฝะฐั MathCAT ะฝะฐ ะฒะฐัˆะตะผ ัะทั‹ะบะต. _ะ•ัะปะธ ะพะฝะฐ ะฒะตั€ะฝะฐ_, ะฟั€ะพัั‚ะพ ะทะฐะผะตะฝะธั‚ะต ะตะน ะฐะฝะณะปะธะนัะบะธะน ั‚ะตะบัั‚. ะŸะพัะปะต ะพะฑั€ะฐะฑะพั‚ะบะธ ะฒัะตั… ะพัˆะธะฑะพะบ ัะฝะพะฒะฐ ะทะฐะฟัƒัั‚ะธั‚ะต ั‚ะตัั‚ั‹. ะ’ ะธะดะตะฐะปัŒะฝะพะผ ัะปัƒั‡ะฐะต ะพัˆะธะฑะพะบ ะฑะพะปัŒัˆะต ะฝะต ะฑัƒะดะตั‚. + + +### ะŸะพะดะดะตั€ะถะฐะฝะธะต ะฟะตั€ะตะฒะพะดะฐ ะฒ ะฐะบั‚ัƒะฐะปัŒะฝะพะผ ัะพัั‚ะพัะฝะธะธ +ะ ะฐะทะดะตะป ะฟั€ะตะดัั‚ะพะธั‚ ะฝะฐะฟะธัะฐั‚ัŒ... + +ะกะพ ะฒั€ะตะผะตะฝะตะผ ะฟะปะฐะฝะธั€ัƒะตั‚ัั ัะพะทะดะฐั‚ัŒ ะธะฝัั‚ั€ัƒะผะตะฝั‚, ะบะพั‚ะพั€ั‹ะน ะฑัƒะดะตั‚: +1. ะฟั€ะตะดัƒะฟั€ะตะถะดะฐั‚ัŒ ะพะฑ ะพั‚ััƒั‚ัั‚ะฒัƒัŽั‰ะธั… ะฟะตั€ะตะฒะพะดะฐั…; +2. ะฟั€ะตะดัƒะฟั€ะตะถะดะฐั‚ัŒ ะพ ะฟั€ะฐะฒะธะปะฐั… ะธะท ะบะฐั‚ะฐะปะพะณะฐ `en`, ะบะพั‚ะพั€ั‹ะต ะฝะต ะฑั‹ะปะธ ัะบะพะฟะธั€ะพะฒะฐะฝั‹ ะฒ ะดั€ัƒะณะพะน ัะทั‹ะบ, ะฒะตั€ะพัั‚ะฝะพ ะธะท-ะทะฐ ะดะพะฑะฐะฒะปะตะฝะธั ะฝะพะฒั‹ั… ะฐะฝะณะปะธะนัะบะธั… ะฟั€ะฐะฒะธะป. + +ะขะฐะบะธะต ะธะฝัั‚ั€ัƒะผะตะฝั‚ั‹ ะฑัƒะดัƒั‚ ะธัะบะฐั‚ัŒ ะฟะตั€ะตะฒะตะดั‘ะฝะฝั‹ะน ะธ ะฝะตะฟะตั€ะตะฒะตะดั‘ะฝะฝั‹ะน ั‚ะตะบัั‚. + + +## ะŸะตั€ะตะฒะพะดั‡ะธะบะฐะผ ะ‘ั€ะฐะนะปั +ะ•ัะปะธ ะฒั‹ ั…ะพั‚ะธั‚ะต ะดะพะฑะฐะฒะธั‚ัŒ ะฟะพะดะดะตั€ะถะบัƒ ะฝะพะฒะพะน ัะธัั‚ะตะผั‹ ะทะฐะฟะธัะธ ะ‘ั€ะฐะนะปั, ัะบะพั€ะตะต ะฒัะตะณะพ, ะฟั€ะธะดั‘ั‚ัั ะฝะฐั‡ะฐั‚ัŒ ั ะฝัƒะปั, ะตัะปะธ ั‚ะพะปัŒะบะพ ะพะฝะฐ ะฝะต ะฟะพั…ะพะถะฐ ะฝะฐ ัƒะถะต ััƒั‰ะตัั‚ะฒัƒัŽั‰ัƒัŽ. +ะกะพะทะดะฐะนั‚ะต ั‚ั€ะธ ั„ะฐะนะปะฐ `.yaml` ะฒ ะบะฐั‚ะฐะปะพะณะต `Rules\Braille\your-braille-language` ะฟะพ ะพะฑั€ะฐะทั†ัƒ ั„ะฐะนะปะพะฒ ะธะท ะดั€ัƒะณะธั… ะบะฐั‚ะฐะปะพะณะพะฒ ะ‘ั€ะฐะนะปั: +1. `xxx_Rules.yaml`, ะณะดะต `xxx` โ€” ะธะผั ะฝะพะฒะพะน ัะธัั‚ะตะผั‹ ะทะฐะฟะธัะธ ะ‘ั€ะฐะนะปั. ะคะฐะนะป ัะพะดะตั€ะถะธั‚ ะฟั€ะฐะฒะธะปะฐ ะฟั€ะตะพะฑั€ะฐะทะพะฒะฐะฝะธั MathML ะฒ ะ‘ั€ะฐะนะปัŒ. +2. `unicode.yaml` โ€” ะฟะตั€ะตะฒะพะด ะฝะฐะธะฑะพะปะตะต ั€ะฐัะฟั€ะพัั‚ั€ะฐะฝั‘ะฝะฝั‹ั… ัะธะผะฒะพะปะพะฒ ะ‘ั€ะฐะนะปั. ะ˜ัะฟะพะปัŒะทัƒะนั‚ะต `Nemeth\unicode.yaml` ะบะฐะบ ะพั‚ะฟั€ะฐะฒะฝัƒัŽ ั‚ะพั‡ะบัƒ. ะ—ะฐะผะตะฝะธั‚ะต `t: xxx` ะฟะพะดั…ะพะดัั‰ะธะผะธ ะทะฝะฐั‡ะตะฝะธัะผะธ ะดะปั ะฒะฐัˆะตะน ัะธัั‚ะตะผั‹. ะ’ะตั€ะพัั‚ะฝะพ, ะดะปั ัะธะผะฒะพะปะพะฒ, ะทะฐะฒะธััั‰ะธั… ะพั‚ ะบะพะฝั‚ะตะบัั‚ะฐ, ะฟะพั‚ั€ะตะฑัƒะตั‚ัั ัƒะดะฐะปะธั‚ัŒ ั‡ะฐัั‚ัŒ ะปะพะณะธะบะธ ะธะปะธ ะดะพะฑะฐะฒะธั‚ัŒ ัะพะฑัั‚ะฒะตะฝะฝัƒัŽ. ะะฐะฟั€ะธะผะตั€, ะฒ ะบะพะดะต ะะตะผะตั‚ะฐ ะทะฐะฟัั‚ะฐั ะฟั€ะตะดัั‚ะฐะฒะปัะตั‚ัั ะฟะพ-ั€ะฐะทะฝะพะผัƒ ะฒะฝัƒั‚ั€ะธ ั‡ะธัะปะฐ ะธ ะฒะฝะต ะตะณะพ. +3. `unicode-full.yaml` โ€” ะฟะตั€ะตะฒะพะดั‹ ะพัั‚ะฐะปัŒะฝั‹ั… ัะธะผะฒะพะปะพะฒ. + +ะ”ะฒะฐ ะพั‚ะดะตะปัŒะฝั‹ั… ั„ะฐะนะปะฐ Unicode ะฝัƒะถะฝั‹ ะฟะพั‚ะพะผัƒ, ั‡ั‚ะพ ะฝะตะฑะพะปัŒัˆะพะน ั„ะฐะนะป ั ั€ะฐัะฟั€ะพัั‚ั€ะฐะฝั‘ะฝะฝั‹ะผะธ ัะธะผะฒะพะปะฐะผะธ ัƒัะบะพั€ัะตั‚ ะทะฐะฟัƒัะบ. ะฆะตะปัŒ ัั‚ะพะณะพ ั„ะฐะนะปะฐ โ€” ะพั…ะฒะฐั‚ะธั‚ัŒ 99,99 % ะธัะฟะพะปัŒะทัƒะตะผั‹ั… ัะธะผะฒะพะปะพะฒ. + +ะ”ะปั UEB ะธ ะบะพะดะฐ ะะตะผะตั‚ะฐ ะฟะพั‚ั€ะตะฑะพะฒะฐะปะพััŒ ะฝะฐะฟะธัะฐั‚ัŒ ะฝะฐ Rust ะบะพะด ะพั‡ะธัั‚ะบะธ. ะ•ัะปะธ ะดะปั ะฒะฐัˆะตะณะพ ะฟะตั€ะตะฒะพะดะฐ ะ‘ั€ะฐะนะปั ั‚ะพะถะต ะฝัƒะถะฝะฐ ะพั‡ะธัั‚ะบะฐ, ัะพะทะดะฐะนั‚ะต issue, ั‡ั‚ะพะฑั‹ ะผั‹ ะฒะผะตัั‚ะต ะผะพะณะปะธ ั€ะตะฐะปะธะทะพะฒะฐั‚ัŒ ะฝะตะพะฑั…ะพะดะธะผั‹ะน ะบะพะด. + +ะŸะตั€ะตะฒะพะด ะ‘ั€ะฐะนะปั ะผะพะถะฝะพ ัั€ะฐะทัƒ ะฟั€ะพะฒะตั€ะธั‚ัŒ. ะ˜ัะฟะพะปัŒะทัƒะนั‚ะต ะฟั€ะธะฒะตะดั‘ะฝะฝั‹ะต ะฒั‹ัˆะต ะธะฝัั‚ั€ัƒะบั†ะธะธ ะดะปั ะฟะตั€ะตะฒะพะดะฐ ัะทั‹ะบะฐ, ะณะดะต ะฟั€ะตะดะปะฐะณะฐะตั‚ัั ัะบะพะฟะธั€ะพะฒะฐั‚ัŒ ั„ะฐะนะปั‹ ะฒ `%AppData%\nvda\addons\MathCAT\globalPlugins\MathCAT\Rules\Languages`, ะฝะพ ะทะฐะผะตะฝะธั‚ะต `Languages` ะฝะฐ `Braille`. ะžัั‚ะฐะปัŒะฝั‹ะต ะดะตะนัั‚ะฒะธั ะฟะพั‡ั‚ะธ ะฝะต ะพั‚ะปะธั‡ะฐัŽั‚ัั. + +ะ”ะปั ะฐะฒั‚ะพะผะฐั‚ะธั‡ะตัะบะพะณะพ ั‚ะตัั‚ะธั€ะพะฒะฐะฝะธั ัะปะตะดัƒะนั‚ะต ะฟั€ะธะฒะตะดั‘ะฝะฝั‹ะผ ะฒั‹ัˆะต ะธะฝัั‚ั€ัƒะบั†ะธัะผ. ะขะตะบัƒั‰ะธะต ั‚ะตัั‚ั‹ ะฒะทัั‚ั‹ ะธะท ั€ัƒะบะพะฒะพะดัั‚ะฒ ะฟะพ ะบะพะดัƒ ะะตะผะตั‚ะฐ ะธ UEB. ะœะพะถะฝะพ ะฟะพัั‚ัƒะฟะธั‚ัŒ ั‚ะฐะบ ะถะต. ะŸั€ะธะผะตั€ั‹ ั‚ะตัั‚ะพะฒ ะ‘ั€ะฐะนะปั ะฝะฐั…ะพะดัั‚ัั ะฒ ะบะฐั‚ะฐะปะพะณะฐั… Nemeth ะธ UEB. + +## ะŸะพะฝะธะผะฐะฝะธะต ัะพะพะฑั‰ะตะฝะธะน ะพะฑ ะพัˆะธะฑะบะฐั… MathCAT +ะ•ัะปะธ ะพัˆะธะฑะบะฐ ะฒั‹ะทะฒะฐะฝะฐ ะฟั€ะพะฑะปะตะผะพะน ะฒ ะฟั€ะฐะฒะธะปะต, ะฟั€ะธ ะฝะตะฟะพัั€ะตะดัั‚ะฒะตะฝะฝะพะผ ะทะฐะฟัƒัะบะต MathCAT ัะพะพะฑั‰ะตะฝะธะต ะฒั‹ะฒะพะดะธั‚ัั ะฒ ะบะพะฝัะพะปัŒ ั‚ะตั€ะผะธะฝะฐะปะฐ, ะฐ ะฟั€ะธ ะธัะฟะพะปัŒะทะพะฒะฐะฝะธะธ NVDA โ€” ะฒ ะถัƒั€ะฝะฐะป NVDA. + +ะกะพะพะฑั‰ะตะฝะธั ะพะฑ ะพัˆะธะฑะบะฐั… ะผะพะณัƒั‚ ะฟะพะบะฐะทะฐั‚ัŒัั ัะปะพะถะฝั‹ะผะธ. ะะธะถะต ะฟั€ะธะฒะตะดะตะฝั‹ ะฟั€ะธะผะตั€ ะธ ะพะฑัŠััะฝะตะฝะธะต. + +ะ‘ะธะฑะปะธะพั‚ะตะบะฐ, ะบะพั‚ะพั€ัƒัŽ MathCAT ะธัะฟะพะปัŒะทัƒะตั‚ ะดะปั ั‡ั‚ะตะฝะธั ั„ะฐะนะปะพะฒ YAML, ะฝะต ัะพั…ั€ะฐะฝัะตั‚ ะฝะพะผะตั€ะฐ ัั‚ั€ะพะบ, ะฟะพัั‚ะพะผัƒ MathCAT ะฝะต ะผะพะถะตั‚ ัะพะพะฑั‰ะธั‚ัŒ ัั‚ั€ะพะบัƒ ั ะพัˆะธะฑะบะพะน. +ะ’ะผะตัั‚ะพ ัั‚ะพะณะพ ัƒะบะฐะทั‹ะฒะฐัŽั‚ัั ะธะผั ั„ะฐะนะปะฐ, ะฐ ั‚ะฐะบะถะต ะทะฝะฐั‡ะตะฝะธั `name` ะธ `tag` ะฟั€ะฐะฒะธะปะฐ ะฒ ัั‚ะพะผ ั„ะฐะนะปะต. +ะ—ะฐั‚ะตะผ ั€ะตะบัƒั€ัะธะฒะฝะพ ะฟะตั€ะตั‡ะธัะปััŽั‚ัั ั€ะฐะทะดะตะปั‹ ะฟั€ะฐะฒะธะปะฐ, ะฒ ะบะพั‚ะพั€ั‹ั… ะพะฑะฝะฐั€ัƒะถะตะฝะฐ ะพัˆะธะฑะบะฐ. + +ะะฐะฟั€ะธะผะตั€, ะฝะธะถะต ะฟั€ะธะฒะตะดะตะฝะพ ัะพะพะฑั‰ะตะฝะธะต ะพะฑ ะพัˆะธะฑะบะต, ัะพะทะดะฐะฝะฝะพะต ะฝะฐะผะตั€ะตะฝะฝะพะน ะทะฐะผะตะฝะพะน `test:` ะฝะฐ `textx:`: +``` +caused by: in file "...\\MathCAT\\Rules\\Languages\\en\\ClearSpeak_Rules.yaml" +caused by: value for 'replace' in rule (fraction: fraction-over-simple). Replacements: + - test: + if: "$ClearSpeak_Fractions='FracOver'" + then: + - testx: + if: "$Verbosity!='Terse'" + then: [ot: the] + - t: fraction + - x: "*[1]" + - t: over + - x: "*[2]" + - test: + if: "$ClearSpeak_Fractions='OverEndFrac' or ($ClearSpeak_Fractions='EndFrac' and not( ($ClearSpeak_Fractions='Auto' or $ClearSpeak_Fractions='Ordinal' or $ClearSpeak_Fractions='EndFrac') and *[1][*[1][self::m:mn][not(contains(., '.')) and ($ClearSpeak_Fractions='Ordinal' or text()<20)] and *[2][self::m:mn][not(contains(., '.')) and ($ClearSpeak_Fractions='Ordinal' or (2<= text() and text()<=10))] ] and *[2][*[1][self::m:mn][not(contains(., '.')) and ($ClearSpeak_Fractions='Ordinal' or text()<20)] and *[2][self::m:mn][not(contains(., '.')) and ($ClearSpeak_Fractions='Ordinal' or (2<= text() and text()<=10))] ] ) )" + then: + - pause: short + - t: end fraction + - pause: short +caused by: replacement #1 of 5 +caused by: replacement #1 of 2 +caused by: Unknown 'replace' command (testx) with value: if: "$Verbosity!='Terse'" then: [ot: the] +``` +ะŸะตั€ะฒั‹ะต ะดะฒะต ัั‚ั€ะพะบะธ ัะพะดะตั€ะถะฐั‚ ะธะผั ั„ะฐะนะปะฐ, ะฐ ั‚ะฐะบะถะต ะทะฝะฐั‡ะตะฝะธั `tag` ะธ `name`. ะกะพะพั‚ะฒะตั‚ัั‚ะฒัƒัŽั‰ะตะต ะฟั€ะฐะฒะธะปะพ: +``` +- name: fraction-over-simple + tag: fraction + match: + - "($ClearSpeak_Fractions='Over' or $ClearSpeak_Fractions='FracOver' or $ClearSpeak_Fractions='OverEndFrac') or" + - "( not($ClearSpeak_Fractions='General' or $ClearSpeak_Fractions='GeneralEndFrac') and" + - " (IsNode(*[1],'simple') and IsNode(*[2],'simple')) )" # simple fraction in ClearSpeak spec + replace: + - test: + if: "$ClearSpeak_Fractions='FracOver'" + then: + - testx: + if: "$Verbosity!='Terse'" + then: [{ot: "the"}] + - t: "fraction" + - x: "*[1]" + - t: "over" + - x: "*[2]" + - test: + # very ugly!!! -- replicate nested ordinal fraction as they are an exception + if: "$ClearSpeak_Fractions='OverEndFrac' or ($ClearSpeak_Fractions='EndFrac' and not( ($ClearSpeak_Fractions='Auto' or $ClearSpeak_Fractions='Ordinal' or $ClearSpeak_Fractions='EndFrac') and *[1][*[1][self::m:mn][not(contains(., '.')) and ($ClearSpeak_Fractions='Ordinal' or text()<20)] and *[2][self::m:mn][not(contains(., '.')) and ($ClearSpeak_Fractions='Ordinal' or (2<= text() and text()<=10))] ] and *[2][*[1][self::m:mn][not(contains(., '.')) and ($ClearSpeak_Fractions='Ordinal' or text()<20)] and *[2][self::m:mn][not(contains(., '.')) and ($ClearSpeak_Fractions='Ordinal' or (2<= text() and text()<=10))] ] ) )" + then: + - pause: short + - t: "end fraction" + - pause: short +``` + +ะกะปะตะดัƒัŽั‰ะฐั ั‡ะฐัั‚ัŒ ัะพะพะฑั‰ะตะฝะธั, `caused by: replacement #1 of 5`, ัƒะบะฐะทั‹ะฒะฐะตั‚, ั‡ั‚ะพ ะฟั€ะพะฑะปะตะผะฐ ะฝะฐั…ะพะดะธั‚ัั ะฒ ะฟะตั€ะฒะพะน ะทะฐะผะตะฝะต, ั‚ะพ ะตัั‚ัŒ ะฟะตั€ะฒะพะผ ัะปะตะผะตะฝั‚ะต ั `-`. +ะกั‚ั€ะพะบะฐ `caused by: replacement #1 of 2` ะพะทะฝะฐั‡ะฐะตั‚, ั‡ั‚ะพ ะพัˆะธะฑะบะฐ ะฝะฐั…ะพะดะธั‚ัั ะฒ ะฟะตั€ะฒะพะน ั‡ะฐัั‚ะธ ัั‚ะพะน ะทะฐะผะตะฝั‹. +ะŸะพัะปะตะดะฝัั ัั‚ั€ะพะบะฐ ัะพะพะฑั‰ะฐะตั‚ ะพ ะฝะตะธะทะฒะตัั‚ะฝะพะน ะบะพะผะฐะฝะดะต ะทะฐะผะตะฝั‹: `Unknown 'replace' command (testx) with value`. ะขะตะฟะตั€ัŒ ะฟั€ะพะฑะปะตะผัƒ ะผะพะถะฝะพ ะธัะฟั€ะฐะฒะธั‚ัŒ. +ะงะฐัั‚ะพ ัะพะพะฑั‰ะตะฝะธะต ะพะฑ ะพัˆะธะฑะบะต ัƒะดะพะฑะฝะตะต ั‡ะธั‚ะฐั‚ัŒ ัะฝะธะทัƒ ะฒะฒะตั€ั…. + + +## ะ ะฐะทั€ะฐะฑะพั‚ั‡ะธะบะฐะผ Rust +ะ ะฐะทะดะตะป ะฟั€ะตะดัั‚ะพะธั‚ ะฝะฐะฟะธัะฐั‚ัŒ... + +`build.rs` ะธ ั„ะฐะนะปั‹ ะฒ `src`. + +## ะขะตัั‚ะธั€ะพะฒะฐะฝะธะต +ะะตะทะฐะฒะธัะธะผะพ ะพั‚ ั‚ะพะณะพ, ั€ะฐะทั€ะฐะฑะฐั‚ั‹ะฒะฐะตั‚ะต ะฒั‹ ะบะพะด ะธะปะธ ะฟะธัˆะตั‚ะต ะฟั€ะฐะฒะธะปะฐ, ะบั€ะฐะนะฝะต ะฒะฐะถะฝะพ ะฟะธัะฐั‚ัŒ ะธ ะทะฐะฟัƒัะบะฐั‚ัŒ ั‚ะตัั‚ั‹. ะžะฝะธ ะฟะพะทะฒะพะปััŽั‚ ัƒะฑะตะดะธั‚ัŒัั, ั‡ั‚ะพ ะฝะพะฒั‹ะน ะบะพะด ั€ะฐะฑะพั‚ะฐะตั‚ ะธ ะฝะต ะฝะฐั€ัƒัˆะฐะตั‚ ััƒั‰ะตัั‚ะฒัƒัŽั‰ัƒัŽ ั„ัƒะฝะบั†ะธะพะฝะฐะปัŒะฝะพัั‚ัŒ. + +ะšะฐั‚ะฐะปะพะณ `tests` ะฟะพั…ะพะถ ะฝะฐ ะบะฐั‚ะฐะปะพะณ `Rules`. ะ•ัะปะธ ะฒั‹ ะฟะตั€ะตะฒะพะดั‡ะธะบ, ัะผ. ะธะฝัั‚ั€ัƒะบั†ะธะธ ะฒ ัะพะพั‚ะฒะตั‚ัั‚ะฒัƒัŽั‰ะตะผ ั€ะฐะทะดะตะปะต ะฒั‹ัˆะต. + +Rust ะฟะพะดะดะตั€ะถะธะฒะฐะตั‚ ั‚ะตัั‚ะธั€ะพะฒะฐะฝะธะต ั ะฟะพะผะพั‰ัŒัŽ ะบะพะผะฐะฝะดั‹ `cargo test`. ะŸะพะดั€ะพะฑะฝะตะต ะพ ั‚ะตัั‚ะฐั… ะธ ะฟะพะบั€ั‹ั‚ะธะธ ั‚ะตัั‚ะฐะผะธ ัะผ. ะฒ [ั€ัƒะบะพะฒะพะดัั‚ะฒะต ั€ะฐะทั€ะฐะฑะพั‚ั‡ะธะบะฐ](developers.md). + + +## ะคะฐะนะปั‹ +MathCAT ัั‡ะธั‚ั‹ะฒะฐะตั‚ ะฒะฐะถะฝัƒัŽ ะธะฝั„ะพั€ะผะฐั†ะธัŽ ะธะท ัะปะตะดัƒัŽั‰ะธั… ั„ะฐะนะปะพะฒ: +* Rules + * `intent.yaml` โ€” ะฟั€ะฐะฒะธะปะฐ, ะพะฟั€ะตะดะตะปััŽั‰ะธะต ะฝะฐะผะตั€ะตะฝะธะต ะฐะฒั‚ะพั€ะฐ ะฟะพ MathML. ะžะฝะธ ะธัะฟะพะปัŒะทัƒัŽั‚ัั ั€ะฐะทะฝั‹ะผะธ ัั‚ะธะปัะผะธ ั€ะตั‡ะธ ะฝะฐ ั€ะฐะทะฝั‹ั… ัะทั‹ะบะฐั…, ั‡ั‚ะพะฑั‹ ะฝะต ะดัƒะฑะปะธั€ะพะฒะฐั‚ัŒ ะฟั€ะพั†ะตัั ะพะฟั€ะตะดะตะปะตะฝะธั ัะผั‹ัะปะฐ, ะธ ะดะพะฑะฐะฒะปััŽั‚ ะบ MathML ะฐั‚ั€ะธะฑัƒั‚ `intent`. + * `definitions.yaml` โ€” ั€ะฐะทะปะธั‡ะฝั‹ะต ัะฟะธัะบะธ ะดะปั ะบะฐะฝะพะฝะธะทะฐั†ะธะธ MathCAT, ั‚ะพ ะตัั‚ัŒ ะพะฟั€ะตะดะตะปะตะฝะธั ะฟั€ะฐะฒะธะปัŒะฝะพะน ัั‚ั€ัƒะบั‚ัƒั€ั‹, ะธ ัะพะฟะพัั‚ะฐะฒะปะตะฝะธั ะฟั€ะฐะฒะธะป. ะะฐะฟั€ะธะผะตั€, `TrigFunctionNames` ัะพะดะตั€ะถะธั‚ ะธะผะตะฝะฐ ั‚ั€ะธะณะพะฝะพะผะตั‚ั€ะธั‡ะตัะบะธั… ั„ัƒะฝะบั†ะธะน, ั‚ะฐะบะธะต ะบะฐะบ `tan` ะธ `lim`. + * `prefs.yaml` โ€” ะทะฝะฐั‡ะตะฝะธั ะฟะพ ัƒะผะพะปั‡ะฐะฝะธัŽ ะดะปั ะดะพัั‚ัƒะฟะฝั‹ั… ะฝะฐัั‚ั€ะพะตะบ. MathCAT ั‚ะฐะบะถะต ะธั‰ะตั‚ ัั‚ะพั‚ ั„ะฐะนะป ะฒ ะทะฐะฒะธััั‰ะตะผ ะพั‚ ะฟะปะฐั‚ั„ะพั€ะผั‹ ะฟะพะปัŒะทะพะฒะฐั‚ะตะปัŒัะบะพะผ ะบะฐั‚ะฐะปะพะณะต, ั‡ั‚ะพะฑั‹ ะพั‚ะดะตะปัŒะฝั‹ะต ะฟะพะปัŒะทะพะฒะฐั‚ะตะปะธ ะผะพะณะปะธ ะทะฐะดะฐะฒะฐั‚ัŒ ัะพะฑัั‚ะฒะตะฝะฝั‹ะต ะทะฝะฐั‡ะตะฝะธั. + * Windows: `%AppData%\prefs.yaml`. + * Linux: `$XDG_CONFIG_HOME` ะธะปะธ `$HOME/.config`. + * `definitions.yaml` โ€” ะฝะตะทะฐะฒะธัะธะผั‹ะต ะพั‚ ัะทั‹ะบะฐ ะพะฟั€ะตะดะตะปะตะฝะธั, ะฝะฐะฟั€ะธะผะตั€ ะธะผะตะฝะฐ ั‚ั€ะธะณะพะฝะพะผะตั‚ั€ะธั‡ะตัะบะธั… ั„ัƒะฝะบั†ะธะน. +* Rules/[lang] + * `Unicode.yaml` โ€” ะดะปะธะฝะฝั‹ะน ัะฟะธัะพะบ ัะฟะพัะพะฑะพะฒ ะฟั€ะพะธะทะฝะตัะตะฝะธั ะฒัั‚ั€ะตั‡ะฐัŽั‰ะธั…ัั ัะธะผะฒะพะปะพะฒ Unicode. ะะต ะธัะฟะพะปัŒะทัƒะตั‚ัั ะดะปั ัั‚ั€ะพะบ ะธะท ะฝะตัะบะพะปัŒะบะธั… ัะธะผะฒะพะปะพะฒ. + * `XXX_rules.yaml` โ€” ะฟั€ะฐะฒะธะปะฐ ะพะทะฒัƒั‡ะธะฒะฐะฝะธั ะผะฐั‚ะตะผะฐั‚ะธั‡ะตัะบะธั… ะฒั‹ั€ะฐะถะตะฝะธะน. MathCAT ัะบะฐะฝะธั€ัƒะตั‚ ะบะฐะถะดั‹ะน ะฟะพะดะบะฐั‚ะฐะปะพะณ `Rules`, ะธั‰ะตั‚ ั„ะฐะนะปั‹ ั ััƒั„ั„ะธะบัะพะผ `_rules.yaml` ะธ ะดะพะฑะฐะฒะปัะตั‚ ะธั… ะฒ ัะฟะธัะพะบ ะดะพัั‚ัƒะฟะฝั‹ั… ะฟะพะปัŒะทะพะฒะฐั‚ะตะปัŽ ะฒะฐั€ะธะฐะฝั‚ะพะฒ. ะงะฐัั‚ัŒ `XXX` ะดะพะปะถะฝะฐ ัะพะพั‚ะฒะตั‚ัั‚ะฒะพะฒะฐั‚ัŒ ัั‚ะธะปัŽ ั€ะตั‡ะธ. ะะฐะฟั€ะธะผะตั€, `ClearSpeak_rules.yaml` ะธ `MathSpeak_rules.yaml` ะดะพะฑะฐะฒะปััŽั‚ ะฒะฐั€ะธะฐะฝั‚ั‹ ัั‚ะธะปั ั€ะตั‡ะธ ClearSpeak ะธ MathSpeak. + * `definitions.yaml` โ€” ะทะฐะฒะธััั‰ะธะต ะพั‚ ัะทั‹ะบะฐ ะพะฟั€ะตะดะตะปะตะฝะธั, ะฝะฐะฟั€ะธะผะตั€ ัะฟะพัะพะฑั‹ ะฟั€ะพะธะทะฝะตัะตะฝะธั ะฟะพั€ัะดะบะพะฒั‹ั… ั‡ะธัะปะธั‚ะตะปัŒะฝั‹ั…: ยซะฟะตั€ะฒั‹ะนยป, ยซะฟะพะปะพะฒะธะฝะฐยป ะธ ั‚. ะด. + * `navigate.yaml` โ€” ะฟั€ะฐะฒะธะปะฐ, ะพะฟั€ะตะดะตะปััŽั‰ะธะต ั€ะตะทัƒะปัŒั‚ะฐั‚ ะบะฐะถะดะพะน ะบะพะผะฐะฝะดั‹ ะฝะฐะฒะธะณะฐั†ะธะธ ะธ ัะพะพั‚ะฒะตั‚ัั‚ะฒัƒัŽั‰ะธะน ั‚ะตะบัั‚ ะดะปั ะพะทะฒัƒั‡ะธะฒะฐะฝะธั. + +ะŸะพะดะบะฐั‚ะฐะปะพะณ `lang` ะดะพะปะถะตะฝ ัะพะพั‚ะฒะตั‚ัั‚ะฒะพะฒะฐั‚ัŒ ะดะฒัƒั…ะฑัƒะบะฒะตะฝะฝะพะผัƒ ะบะพะดัƒ ัะทั‹ะบะฐ ะธะปะธ ะบะพะผะฑะธะฝะฐั†ะธะธ ัะทั‹ะบะฐ ะธ ั€ะตะณะธะพะฝะฐ ัะพะณะปะฐัะฝะพ [ัั‚ะฐะฝะดะฐั€ั‚ัƒ ISO](https://en.wikipedia.org/wiki/Language_localisation#Language_tags_and_codes). ะะฐะฟั€ะธะผะตั€, ะฒ ะบะฐั‚ะฐะปะพะณะต `Rules` ะตัั‚ัŒ ะฟะพะดะบะฐั‚ะฐะปะพะณ `en`. ะ•ัะปะธ ั‚ั€ะตะฑัƒะตั‚ัั ั€ะตะณะธะพะฝะฐะปัŒะฝั‹ะน ะฒะฐั€ะธะฐะฝั‚ ั€ะตั‡ะธ, ะผะพะถะฝะพ ะดะพะฑะฐะฒะธั‚ัŒ ะฟะพะดะบะฐั‚ะฐะปะพะณ ั€ะตะณะธะพะฝะฐ, ะฝะฐะฟั€ะธะผะตั€ `gb`, ะบะพั‚ะพั€ั‹ะน ะฑัƒะดะตั‚ ะธัะฟะพะปัŒะทะพะฒะฐั‚ัŒัั ะดะปั ัะทั‹ะบะฐ `en-gb`. + +MathCAT ัะฝะฐั‡ะฐะปะฐ ั‡ะธั‚ะฐะตั‚ ะฟั€ะฐะฒะธะปะฐ ะพัะฝะพะฒะฝะพะณะพ ัะทั‹ะบะฐ, ะฐ ะทะฐั‚ะตะผ ะฟั€ะฐะฒะธะปะฐ ั€ะตะณะธะพะฝะฐ. ะ ะตะณะธะพะฝะฐะปัŒะฝั‹ะต ะฟั€ะฐะฒะธะปะฐ ะทะฐะผะตะฝััŽั‚ ััƒั‰ะตัั‚ะฒัƒัŽั‰ะธะต ะฟั€ะฐะฒะธะปะฐ ะธะปะธ ะดะพะฑะฐะฒะปััŽั‚ัั ะบ ะฝะธะผ ะฒ ัะพะพั‚ะฒะตั‚ัั‚ะฒัƒัŽั‰ะธั… ัะทั‹ะบะพะฒั‹ั… ั„ะฐะนะปะฐั… `Unicode.yaml` ะธ `XXX_rules.yaml`. + +MathCAT ะธั‰ะตั‚ ะบะฐั‚ะฐะปะพะณ `Rules` ะฒ ัะปะตะดัƒัŽั‰ะธั… ะผะตัั‚ะฐั…: +1. ะ’ ะบะฐั‚ะฐะปะพะณะต, ะทะฐะดะฐะฝะฝะพะผ ะฟะตั€ะตะผะตะฝะฝะพะน ัั€ะตะดั‹ `MathCATRulesDir`. +2. ะ’ ัะพัะตะดะฝะตะผ ั ะธัะฟะพะปะฝัะตะผั‹ะผ ั„ะฐะนะปะพะผ ะฟะพะดะบะฐั‚ะฐะปะพะณะต Rules. ะ’ Windows ัั‚ะพ ะพะฑั‹ั‡ะฝะพ `C:\Program Files\MathCAT\Rules`. + +# ะคะพั€ะผะฐั‚ ั„ะฐะนะปะพะฒ +ะคะฐะนะปั‹, ะบะฐะบ ัะปะตะดัƒะตั‚ ะธะท ะธั… ััƒั„ั„ะธะบัะฐ, ะธะผะตัŽั‚ [ั„ะพั€ะผะฐั‚ YAML](https://lzone.de/cheat-sheet/YAML). ะ•ัะปะธ ะฒั‹ ะตั‰ั‘ ะฝะต ะทะฝะฐะบะพะผั‹ ั YAML, ัั‚ะพ ะฝะฐะดะผะฝะพะถะตัั‚ะฒะพ JSON ั ะฑะพะปะตะต ัƒะดะพะฑะฝั‹ะผะธ ะดะปั ั‡ั‚ะตะฝะธั ะธ ะทะฐะฟะธัะธ ะฒะฐั€ะธะฐะฝั‚ะฐะผะธ ัะธะฝั‚ะฐะบัะธัะฐ. + +## ะ’ะฒะตะดะตะฝะธะต ะฒ YAML +ะžัะฝะพะฒะฝั‹ะต ั‚ะธะฟั‹ YAML: +* ัะบะฐะปัั€ะฝั‹ะต ั‚ะธะฟั‹, ะฝะฐะฟั€ะธะผะตั€ ั†ะตะปั‹ะต ะธ ะฒะตั‰ะตัั‚ะฒะตะฝะฝั‹ะต ั‡ะธัะปะฐ, ะฐ ั‚ะฐะบะถะต ัั‚ั€ะพะบะธ. ะกั‚ั€ะพะบะธ ะผะพะถะฝะพ ะทะฐะบะปัŽั‡ะฐั‚ัŒ ะฒ ะพะดะธะฝะฐั€ะฝั‹ะต ะธะปะธ ะดะฒะพะนะฝั‹ะต ะบะฐะฒั‹ั‡ะบะธ, ะฐ ะฒ ะฝะตะบะพั‚ะพั€ั‹ั… ัะปัƒั‡ะฐัั… ะพัั‚ะฐะฒะปัั‚ัŒ ะฑะตะท ะบะฐะฒั‹ั‡ะตะบ; +* ะผะฐััะธะฒั‹, ะบะพั‚ะพั€ั‹ะต ะฒะฝัƒั‚ั€ะธ ัั‚ั€ะพะบะธ ะทะฐะฟะธัั‹ะฒะฐัŽั‚ัั ะบะฐะบ `["a", "b", "c"]`; +* ัะปะพะฒะฐั€ะธ ะธะปะธ ะพั‚ะพะฑั€ะฐะถะตะฝะธั, ะบะพั‚ะพั€ั‹ะต ะฒะฝัƒั‚ั€ะธ ัั‚ั€ะพะบะธ ะทะฐะฟะธัั‹ะฒะฐัŽั‚ัั ะบะฐะบ `{key: value, foo: bar}`. + +ะšะพะผะผะตะฝั‚ะฐั€ะธะธ ะฝะฐั‡ะธะฝะฐัŽั‚ัั ั ัะธะผะฒะพะปะฐ `#` ะธ ะฟั€ะพะดะพะปะถะฐัŽั‚ัั ะดะพ ะบะพะฝั†ะฐ ัั‚ั€ะพะบะธ. ะ‘ะปะพั‡ะฝั‹ั… ะบะพะผะผะตะฝั‚ะฐั€ะธะตะฒ ะฒ YAML ะฝะตั‚. + +ะ’ ะฑะพะปะตะต ะฟะพะดั€ะพะฑะฝะพะผ ัะธะฝั‚ะฐะบัะธัะต YAML ะดะปั ะผะฐััะธะฒะพะฒ ะฒะผะตัั‚ะพ ัะบะพะฑะพะบ ะธัะฟะพะปัŒะทัƒัŽั‚ัั ะพั‚ัั‚ัƒะฟั‹, ะฟะพัั‚ะพะผัƒ ะฟั€ะธะฒะตะดั‘ะฝะฝั‹ะน ะฒั‹ัˆะต ะผะฐััะธะฒ ะฒั‹ะณะปัะดะธั‚ ั‚ะฐะบ: +``` + - a + - b + - c +``` +ะžะฑั€ะฐั‚ะธั‚ะต ะฒะฝะธะผะฐะฝะธะต, ั‡ั‚ะพ ะฒ ั‚ะฐะบะพะน ั„ะพั€ะผะต ัั‚ั€ะพะบะธ ะฝะต ั‚ั€ะตะฑัƒะตั‚ัั ะทะฐะบะปัŽั‡ะฐั‚ัŒ ะฒ ะบะฐะฒั‹ั‡ะบะธ, ั…ะพั‚ั ะดะปั ะฝะตะบะพั‚ะพั€ั‹ั… ั‚ะตะบัั‚ะพะฒ ะบะฐะฒั‹ั‡ะบะธ ะฝะตะพะฑั…ะพะดะธะผั‹. + +ะกะปะพะฒะฐั€ัŒ ะฒ ะฟะพะดั€ะพะฑะฝะพะน ั„ะพั€ะผะต ะฒั‹ะณะปัะดะธั‚ ั‚ะฐะบ: +``` + key: value + foo: bar +``` + +ะะธะถะต ะฟั€ะธะฒะตะดั‘ะฝ ะฑะพะปะตะต ั€ะตะฐะปะธัั‚ะธั‡ะฝั‹ะน ะฟั€ะธะผะตั€ ะธะท ะพะฟั€ะตะดะตะปะตะฝะธะน Unicode ั ะฝะตัะบะพะปัŒะบะธะผะธ ะฒะฐั€ะธะฐะฝั‚ะฐะผะธ ะทะฐะฟะธัะธ. +ะžะฑั€ะฐั‚ะธั‚ะต ะฒะฝะธะผะฐะฝะธะต ะฝะฐ ะพั‚ัั‚ัƒะฟั‹: ะฒัะต ัะปะตะผะตะฝั‚ั‹, ัะดะฒะธะฝัƒั‚ั‹ะต ะฒะฟั€ะฐะฒะพ ะพั‚ะฝะพัะธั‚ะตะปัŒะฝะพ ะฟั€ะตะดั‹ะดัƒั‰ะตะน ัั‚ั€ะพะบะธ, ัะฒะปััŽั‚ัั ะฒะปะพะถะตะฝะฝั‹ะผะธ ัะปะตะผะตะฝั‚ะฐะผะธ ะผะฐััะธะฒะฐ ะธะปะธ ัะปะพะฒะฐั€ั. +``` +# ะ”ะฒะฐ ัะฟะพัะพะฑะฐ ะทะฐะดะฐั‚ัŒ ะฟั€ะพัั‚ัƒัŽ ะทะฐะผะตะฝัƒ ะดะปั ัะธะผะฒะพะปะฐ 'โˆž'. +# ะ”ะปั ะบั€ะฐั‚ะบะพัั‚ะธ ะธ ััะฝะพัั‚ะธ ะฟั€ะตะดะฟะพั‡ั‚ะธั‚ะตะปัŒะฝะฐ ะฟะตั€ะฒะฐั ั„ะพั€ะผะฐ. + - "โˆž": [t: "infinity"] # 0x221e + - 'โˆž': + - t: infinity # 0x222e + +# ะะตัะบะพะปัŒะบะพ ัะฟะพัะพะฑะพะฒ ะทะฐะดะฐั‚ัŒ ะฑะพะปะตะต ัะปะพะถะฝะพะต ะพะฟั€ะตะดะตะปะตะฝะธะต ั ะฟั€ะพะฒะตั€ะบะพะน. +# ะšะพะผะฟะฐะบั‚ะฝะฐั ั„ะพั€ะผะฐ ะธัะฟะพะปัŒะทัƒะตั‚ ัะธะฝั‚ะฐะบัะธั JSON ะดะปั ะทะฝะฐั‡ะตะฝะธั. +- 0x003C: [test: {if:Verbosity!='terse', then: [t: is]}, t: "less than"] + +# ะญั‚ะฐ ั„ะพั€ะผะฐ ะฟะพะดั‡ั‘ั€ะบะธะฒะฐะตั‚, ั‡ั‚ะพ ะฒั‹ะฟะพะปะฝััŽั‚ัั ะดะฒะฐ ะดะตะนัั‚ะฒะธั: ะฟั€ะพะฒะตั€ะบะฐ ะธ ะฒั‹ะฒะพะด "less than". +- 0x003C: + - test: [{if: Verbosity!='terse', then: {t: is}}] + - t: "less than" + +# ะญั‚ะฐ ั„ะพั€ะผะฐ ะฝะตะผะฝะพะณะพ ะฟะพะดั€ะพะฑะฝะตะต, ะฝะพ ััะฝะพ ะฟะพะบะฐะทั‹ะฒะฐะตั‚ ั‡ะฐัั‚ะธ ะฟั€ะพะฒะตั€ะบะธ. +- 0x003C: + - test: + if: Verbosity!='terse' + then: [t: is] + - t: less than + +# ะกะฐะผะฐั ะฟะพะดั€ะพะฑะฝะฐั ั„ะพั€ะผะฐ YAML. +- 0x003C: + - test: + if: Verbosity!='terse' + then: + - t: is + - t: less than +``` +ะ’ัะต ั„ะพั€ะผั‹ ะดะพะฟัƒัั‚ะธะผั‹, ะฝะพ ะฒั‚ะพั€ะพะน ะธ ั‚ั€ะตั‚ะธะน ะฒะฐั€ะธะฐะฝั‚ั‹ ะฟั€ะตะดะฟะพั‡ั‚ะธั‚ะตะปัŒะฝั‹ ะบะฐะบ ั…ะพั€ะพัˆะธะน ะบะพะผะฟั€ะพะผะธัั ะผะตะถะดัƒ ะบั€ะฐั‚ะบะพัั‚ัŒัŽ ะธ ััะฝะพัั‚ัŒัŽ. + +ะŸั€ะธะผะตั‡ะฐะฝะธะต: ะฒัะต ั„ะฐะนะปั‹ YAML ะฝะฐั‡ะธะฝะฐัŽั‚ัั ั `---`, ะพะฑะพะทะฝะฐั‡ะฐัŽั‰ะตะณะพ ะฝะฐั‡ะฐะปะพ ะดะพะบัƒะผะตะฝั‚ะฐ. + +## ะžัะฝะพะฒะฝั‹ะต ั‡ะฐัั‚ะธ ะฟั€ะฐะฒะธะปะฐ ั€ะตั‡ะธ + +``` +# rule: +# name: # ะธะผั ะฟั€ะฐะฒะธะปะฐ; ัะพั‡ะตั‚ะฐะฝะธะต name ะธ tag ะดะพะปะถะฝะพ ะฑั‹ั‚ัŒ ัƒะฝะธะบะฐะปัŒะฝั‹ะผ +# tag: +# variables: [{name: value}, ...] +# - name -- ัั‚ั€ะพะบะฐ; value -- ะฒั‹ั€ะฐะถะตะฝะธะต XPath, ะฒะพะทะฒั€ะฐั‰ะฐัŽั‰ะตะต ัั‚ั€ะพะบัƒ, ั‡ะธัะปะพ ะธะปะธ ะปะพะณะธั‡ะตัะบะพะต ะทะฝะฐั‡ะตะฝะธะต +# - ะฒะฝัƒั‚ั€ะธ ะฟั€ะฐะฒะธะปะฐ ะทะฝะฐั‡ะตะฝะธะต ะดะพัั‚ัƒะฟะฝะพ ะบะฐะบ $name +# - ะทะฝะฐั‡ะตะฝะธะต ะฟะตั€ะตะผะตะฝะฝะพะน ัƒัั‚ะฐะฝะฐะฒะปะธะฒะฐะตั‚ัั _ะดะพ_ ะฟั€ะพะฒะตั€ะบะธ "match", ะฟะพัั‚ะพะผัƒ ะตะณะพ ะผะพะถะฝะพ ะธัะฟะพะปัŒะทะพะฒะฐั‚ัŒ ะฒ match +# - ะฟะตั€ะตะผะตะฝะฝะฐั ะดะตะนัั‚ะฒัƒะตั‚ ะฒ ั‚ะตั‡ะตะฝะธะต ัะพะฟะพัั‚ะฐะฒะปะตะฝะธั +# match: # ะฒั‹ั€ะฐะถะตะฝะธะต XPath ะดะปั ัะพะฟะพัั‚ะฐะฒะปะตะฝะธั +# - ะผะพะถะตั‚ ะฑั‹ั‚ัŒ ะพะดะฝะพะน ัั‚ั€ะพะบะพะน ะธะปะธ +# - ะผะฐััะธะฒะพะผ ัั‚ั€ะพะบ, ะบะพั‚ะพั€ั‹ะต ะพะฑัŠะตะดะธะฝััŽั‚ัั ะดะปั ัƒะดะพะฑัั‚ะฒะฐ ั‡ั‚ะตะฝะธั +# replace: [replacements], ะณะดะต replacements ัะพะดะตั€ะถะธั‚ ะพะดะธะฝ ะธะท ัะปะตะดัƒัŽั‰ะธั… ะฒะฐั€ะธะฐะฝั‚ะพะฒ +# - t: ะฝะตะบะพั‚ะพั€ั‹ะน ั‚ะตะบัั‚ +# 'T' ะพะทะฝะฐั‡ะฐะตั‚, ั‡ั‚ะพ ั‚ะตะบัั‚ ะฟะตั€ะตะฒะตะดั‘ะฝ +# - ct: ะพะฑัŠะตะดะธะฝะธั‚ัŒ ั‚ะตะบัั‚ ะฑะตะท ะฟั€ะพะฑะตะปะฐ ะฟะตั€ะตะด ะฝะธะผ +# 'CT' ะพะทะฝะฐั‡ะฐะตั‚, ั‡ั‚ะพ ั‚ะตะบัั‚ ะฟะตั€ะตะฒะตะดั‘ะฝ +# - ot: ะฝะตะพะฑัะทะฐั‚ะตะปัŒะฝั‹ะน ั‚ะตะบัั‚; ะฝะต ะธัะฟะพะปัŒะทะพะฒะฐั‚ัŒ, ะตัะปะธ ั€ะตะทัƒะปัŒั‚ะฐั‚ ัะพะดะตั€ะถะธั‚ ะฟะพะฒั‚ะพั€ััŽั‰ะธะตัั ัะปะพะฒะฐ +# 'OT' ะพะทะฝะฐั‡ะฐะตั‚, ั‡ั‚ะพ ั‚ะตะบัั‚ ะฟะตั€ะตะฒะตะดั‘ะฝ +# ะะฐะฟั€ะธะผะตั€, ะฝะต ัะปะตะดัƒะตั‚ ะฟะพะปัƒั‡ะฐั‚ัŒ "t raised to the the fraction with ...." +# ะ•ัะปะธ ัะดะตะปะฐั‚ัŒ "the" ะฝะตะพะฑัะทะฐั‚ะตะปัŒะฝั‹ะผ ะฒ ะฟั€ะฐะฒะธะปะต ะดั€ะพะฑะธ, ะฟะพะฒั‚ะพั€ะตะฝะธั ะฝะต ะฑัƒะดะตั‚ +# - x: ะฝะตะบะพั‚ะพั€ะพะต ะฒั‹ั€ะฐะถะตะฝะธะต XPath ะฒ ะฒะธะดะต ัั‚ั€ะพะบะธ +# - test: ะพะฑั‹ั‡ะฝั‹ะต ะทะฝะฐั‡ะตะฝะธั if/then/else ั ะดะฒัƒะผั ะพัะพะฑะตะฝะฝะพัั‚ัะผะธ: +# ะฒะผะตัั‚ะพ 'then:' ะธ 'else:' ะผะพะถะฝะพ ะธัะฟะพะปัŒะทะพะฒะฐั‚ัŒ 'then_test:' ะธ 'else_test:' +# ะญั‚ะพ ะฟะพะทะฒะพะปัะตั‚ ะธะทะฑะตะถะฐั‚ัŒ ะดะพะฟะพะปะฝะธั‚ะตะปัŒะฝะพะณะพ ัƒั€ะพะฒะฝั 'test:' +# ะผะพะถะฝะพ ะทะฐะดะฐั‚ัŒ ะปัŽะฑะพะต ะบะพะปะธั‡ะตัั‚ะฒะพ ะฟะฐั€ if/else_if; +# ะพะฝะธ ะฟั€ะพะฒะตั€ััŽั‚ัั ะฟะพ ะฟะพั€ัะดะบัƒ ะดะพ ะฟะพะปัƒั‡ะตะฝะธั ะธัั‚ะธะฝะฝะพะณะพ ะทะฝะฐั‡ะตะฝะธั +# ะ—ะฝะฐั‡ะตะฝะธะต "test:" ะผะพะถะตั‚ ะฑั‹ั‚ัŒ ะผะฐััะธะฒะพะผ ะบะปัŽั‡ะตะน if/else_if/else +# ะธะปะธ ะดะปั ัƒะดะพะฑัั‚ะฒะฐ ะตะดะธะฝัั‚ะฒะตะฝะฝั‹ะผ ะฝะฐะฑะพั€ะพะผ if/then/else. +# ะ•ัะปะธ ะธัะฟะพะปัŒะทัƒะตั‚ัั ะผะฐััะธะฒ, ะฟะตั€ะฒั‹ะผ ัะปะตะผะตะฝั‚ะพะผ ะดะพะปะถะตะฝ ะฑั‹ั‚ัŒ 'if', +# ะฟั€ะพะผะตะถัƒั‚ะพั‡ะฝั‹ะผะธ ะธ ะธะฝะพะณะดะฐ ะฟะพัะปะตะดะฝะธะผ -- 'else_if', +# ะฐ ะฝะตะพะฑัะทะฐั‚ะตะปัŒะฝั‹ะผ ะฟะพัะปะตะดะฝะธะผ ัะปะตะผะตะฝั‚ะพะผ -- 'else' ะธะปะธ 'else_test' +# if: ะฝะตะบะพั‚ะพั€ะพะต ะฒั‹ั€ะฐะถะตะฝะธะต XPath +# then: [replacements] +# then_test: [replacements] ะธัะฟะพะปัŒะทัƒะตั‚ัั ะฒะผะตัั‚ะพ 'then:', ั‡ั‚ะพะฑั‹ ะฝะต ะดะพะฑะฐะฒะปัั‚ัŒ 'test:' ะฟะพัะปะต 'then:' +# else: [replacements] # ะฝะตะพะฑัะทะฐั‚ะตะปัŒะฝะพ +# else_test: # ะฝะตะพะฑัะทะฐั‚ะตะปัŒะฝะพ; ะธัะฟะพะปัŒะทัƒะตั‚ัั ะฒะผะตัั‚ะพ 'else:', ั‡ั‚ะพะฑั‹ ะฝะต ะดะพะฑะฐะฒะปัั‚ัŒ 'test:' ะฟะพัะปะต 'else:' +# - with: +# variables: [name: value, ...] ะทะฝะฐั‡ะตะฝะธั ะฟะตั€ะตะผะตะฝะฝั‹ั…, ะทะฐะดะฐะฝะฝั‹ะต ะฒะพ ะฒั€ะตะผั ะฒั‹ะฟะพะปะฝะตะฝะธั ัั‚ะพะณะพ ะฟั€ะตะดะปะพะถะตะฝะธั +# replace: [replacements] +# - intent: +# name: string ะธะผั ะฟั€ะฐะฒะธะปะฐ intent +# children: ะดะพั‡ะตั€ะฝะธะต ัƒะทะปั‹ ะฟั€ะฐะฒะธะปะฐ intent +# - insert: +# nodes: XPath, ะฒั‹ั‡ะธัะปัะตะผั‹ะน ะฒ ัƒะทะปั‹ +# replace: [replacements] ะทะฝะฐั‡ะตะฝะธั, ะฒัั‚ะฐะฒะปัะตะผั‹ะต ะผะตะถะดัƒ ะฒัะตะผะธ ัƒะทะปะฐะผะธ +# - translate: XPath ะฟะพะทะฒะพะปัะตั‚ ะพะทะฒัƒั‡ะธั‚ัŒ ะฒั‹ั€ะฐะถะตะฝะธะต ะฒ ัะตั€ะตะดะธะฝะต ะฟั€ะฐะฒะธะปะฐ; ะธัะฟะพะปัŒะทัƒะตั‚ัั WhereAmI ะดะปั ะฝะฐะฒะธะณะฐั†ะธะธ +# - set_variables: [var: value, ...] ะพะฟั€ะตะดะตะปะตะฝะธั ะณะปะพะฑะฐะปัŒะฝั‹ั… ะฟะตั€ะตะผะตะฝะฝั‹ั… +# ะžะฝะธ ะดะพัั‚ัƒะฟะฝั‹ ะฟั€ะพะณั€ะฐะผะผะต ะฟะพัะปะต ะฒั‹ะฟะพะปะฝะตะฝะธั ะฟั€ะฐะฒะธะป. ะกะตะนั‡ะฐั ะธัะฟะพะปัŒะทัƒัŽั‚ัั ะดะปั ะฝะฐะฒะธะณะฐั†ะธะธ, ะผะตะฝััŽั‰ะตะน ัะพัั‚ะพัะฝะธะต. +# - pause: ัั‚ั€ะพะบะฐ ะธะปะธ ั‡ะธัะปะพ # "short", "medium", "long", "auto" ะธะปะธ ั‡ะธัะปะพ ะผะธะปะปะธัะตะบัƒะฝะด +# - rate: ัั‚ั€ะพะบะฐ/ั‡ะธัะปะพ ะธะปะธ ัะปะพะฒะฐั€ัŒ ั ะพะดะฝะพะน ะธะปะธ ะดะฒัƒะผั ะทะฐะฟะธััะผะธ +# value: ะฒะตั‰ะตัั‚ะฒะตะฝะฝะพะต ั‡ะธัะปะพ ั ะฝะตะพะฑัะทะฐั‚ะตะปัŒะฝั‹ะผ % +# replace: [replacements] # ะทะฝะฐั‡ะตะฝะธั TTS ะดะพะปะถะฝั‹ ะพะณั€ะฐะฝะธั‡ะธะฒะฐั‚ัŒ ะพะฑะปะฐัั‚ัŒ ัะพะดะตั€ะถะธะผะพะณะพ +# - volume: ัั‚ั€ะพะบะฐ/ั‡ะธัะปะพ ะธะปะธ ัะปะพะฒะฐั€ัŒ ั ะพะดะฝะพะน ะธะปะธ ะดะฒัƒะผั ะทะฐะฟะธััะผะธ +# value: ะฒะตั‰ะตัั‚ะฒะตะฝะฝะพะต ั‡ะธัะปะพ ั ะฝะตะพะฑัะทะฐั‚ะตะปัŒะฝั‹ะผ % +# replace: [replacements] # ะทะฝะฐั‡ะตะฝะธั TTS ะดะพะปะถะฝั‹ ะพะณั€ะฐะฝะธั‡ะธะฒะฐั‚ัŒ ะพะฑะปะฐัั‚ัŒ ัะพะดะตั€ะถะธะผะพะณะพ +# - pitch: ัั‚ั€ะพะบะฐ/ั‡ะธัะปะพ ะธะปะธ ัะปะพะฒะฐั€ัŒ ั ะพะดะฝะพะน ะธะปะธ ะดะฒัƒะผั ะทะฐะฟะธััะผะธ +# value: ะฒะตั‰ะตัั‚ะฒะตะฝะฝะพะต ั‡ะธัะปะพ ั ะฝะตะพะฑัะทะฐั‚ะตะปัŒะฝั‹ะผ % +# replace: [replacements] # ะทะฝะฐั‡ะตะฝะธั TTS ะดะพะปะถะฝั‹ ะพะณั€ะฐะฝะธั‡ะธะฒะฐั‚ัŒ ะพะฑะปะฐัั‚ัŒ ัะพะดะตั€ะถะธะผะพะณะพ +# - gender: ัั‚ั€ะพะบะฐ/ั‡ะธัะปะพ ะธะปะธ ัะปะพะฒะฐั€ัŒ ั ะพะดะฝะพะน ะธะปะธ ะดะฒัƒะผั ะทะฐะฟะธััะผะธ +# value: "male" # ะธะปะธ "female" +# replace: [replacements] # ะทะฝะฐั‡ะตะฝะธั TTS ะดะพะปะถะฝั‹ ะพะณั€ะฐะฝะธั‡ะธะฒะฐั‚ัŒ ะพะฑะปะฐัั‚ัŒ ัะพะดะตั€ะถะธะผะพะณะพ +# - voice: ัั‚ั€ะพะบะฐ/ั‡ะธัะปะพ ะธะปะธ ัะปะพะฒะฐั€ัŒ ั ะพะดะฝะพะน ะธะปะธ ะดะฒัƒะผั ะทะฐะฟะธััะผะธ +# value: ัั‚ั€ะพะบะฐ +# replace: [replacements] # ะทะฝะฐั‡ะตะฝะธั TTS ะดะพะปะถะฝั‹ ะพะณั€ะฐะฝะธั‡ะธะฒะฐั‚ัŒ ะพะฑะปะฐัั‚ัŒ ัะพะดะตั€ะถะธะผะพะณะพ +# - spell: ัั‚ั€ะพะบะฐ ั XPath, ะพะฑั‹ั‡ะฝะพ ะพะดะฝะพะน ะฑัƒะบะฒะพะน, ะฟั€ะพะธะทะฝะพัะธะผะพะน ะบะฐะบ ะฑัƒะบะฒะฐ: `"'a'"` +# - bookmark: ะฝะตะบะพั‚ะพั€ั‹ะน XPath ะฒ ะฒะธะดะต ัั‚ั€ะพะบะธ; ะฒะพะทะฒั€ะฐั‰ะฐะตั‚ 'id' ะดะปั ัะธะฝั…ั€ะพะฝะฝะพะณะพ ะฒั‹ะดะตะปะตะฝะธั +``` + +ะŸั€ะธะผะตั‡ะฐะฝะธะต: ะดะปั `pause` ะทะฝะฐั‡ะตะฝะธะต `auto` ะฒั‹ั‡ะธัะปัะตั‚ ะดะปะธั‚ะตะปัŒะฝะพัั‚ัŒ ะฟะฐัƒะทั‹ ั ัƒั‡ั‘ั‚ะพะผ ัะปะพะถะฝะพัั‚ะธ ะพะบั€ัƒะถะฐัŽั‰ะธั… ั‡ะฐัั‚ะตะน. ะงะตะผ ะพะฝะธ ัะปะพะถะฝะตะต, ั‚ะตะผ ะดะปะธะฝะฝะตะต ะฟะฐัƒะทะฐ, ะฝะพ ะฝะต ะฑะพะปะตะต ัƒัั‚ะฐะฝะพะฒะปะตะฝะฝะพะณะพ ะฟั€ะตะดะตะปะฐ. ะกะปัƒัˆะฐั‚ะตะปัŽ ะฝะตะพะฑั…ะพะดะธะผะพ ะดะฐั‚ัŒ ะฒั€ะตะผั ะพัะผั‹ัะปะธั‚ัŒ ะธ ั€ะฐะทะดะตะปะธั‚ัŒ ะดะฒะต ั‡ะฐัั‚ะธ, ะตัะปะธ ะพะดะฝะฐ ะธะปะธ ะพะฑะต ะดะพัั‚ะฐั‚ะพั‡ะฝะพ ัะปะพะถะฝั‹. + +ะŸะพะผะธะผะพ ะธะผะตะฝะพะฒะฐะฝะฝั‹ั… ะฟั€ะฐะฒะธะป, ั„ะฐะนะป ะฟั€ะฐะฒะธะป ั€ะตั‡ะธ ะฟะพะดะดะตั€ะถะธะฒะฐะตั‚ ะฟะพะดะบะปัŽั‡ะตะฝะธะต ะดั€ัƒะณะธั… ั„ะฐะนะปะพะฒ ะฟั€ะฐะฒะธะป ั€ะตั‡ะธ. ะ‘ะปะฐะณะพะดะฐั€ั ัั‚ะพะผัƒ ั€ะฐะทะฝั‹ะต ัั‚ะธะปะธ ะผะพะณัƒั‚ ะธัะฟะพะปัŒะทะพะฒะฐั‚ัŒ ะพะฑั‰ัƒัŽ ั„ัƒะฝะบั†ะธะพะฝะฐะปัŒะฝะพัั‚ัŒ. ะŸะพะดะบะปัŽั‡ะตะฝะธะต ะทะฐะฟะธัั‹ะฒะฐะตั‚ัั ะฒะผะตัั‚ะพ ะฟั€ะฐะฒะธะปะฐ ั€ะตั‡ะธ: +``` + - include: file_name +``` +ะคะฐะนะป ะผะพะถะตั‚ ัะพะดะตั€ะถะฐั‚ัŒ ะปัŽะฑะพะต ะบะพะปะธั‡ะตัั‚ะฒะพ ะฟะพะดะบะปัŽั‡ะตะฝะธะน. ะ˜ั… ัะพะดะตั€ะถะธะผะพะต ะพะฑั€ะฐะฑะฐั‚ั‹ะฒะฐะตั‚ัั ั‚ะฐะบ, ะบะฐะบ ะฑัƒะดั‚ะพ ะพะฝะพ ะฝะฐั…ะพะดะธะปะพััŒ ะฒ ะธัั…ะพะดะฝะพะผ ั„ะฐะนะปะต. ะŸะพะดะบะปัŽั‡ะฐะตะผั‹ะน ั„ะฐะนะป ะผะพะถะตั‚ ะฝะฐั…ะพะดะธั‚ัŒัั ะฒ ั‚ะตะบัƒั‰ะตะผ ะบะฐั‚ะฐะปะพะณะต ะพะฑั€ะฐะฑะฐั‚ั‹ะฒะฐะตะผะพะณะพ ั„ะฐะนะปะฐ ะฟั€ะฐะฒะธะป ะธะปะธ ะฒ ะบะฐั‚ะฐะปะพะณะต ะฟะพ ะพั‚ะฝะพัะธั‚ะตะปัŒะฝะพะผัƒ ะฟัƒั‚ะธ. + +## ะคะฐะนะปั‹ Unicode + +ะคะฐะนะปั‹ Unicode โ€” ัƒะฟั€ะพั‰ั‘ะฝะฝั‹ะต ะฒะตั€ัะธะธ ะฟั€ะฐะฒะธะป ั€ะตั‡ะธ. ะžะฝะธ ะพะฑะปะตะณั‡ะฐัŽั‚ ะพะฟะธัะฐะฝะธะต ะฟั€ะฐะฒะธะป ะดะปั ัะธะผะฒะพะปะพะฒ Unicode ะธ ะทะฐะผะตั‚ะฝะพ ัƒัะบะพั€ััŽั‚ ั€ะฐะฑะพั‚ัƒ. ะŸั€ะฐะฒะธะปะฐ ะปะธัั‚ะพะฒั‹ั… ัะปะตะผะตะฝั‚ะพะฒ, ะฝะฐะฟั€ะธะผะตั€ `mo`, ะฟะตั€ะตะพะฟั€ะตะดะตะปััŽั‚ ะพะฟั€ะตะดะตะปะตะฝะธั ะธะท ั„ะฐะนะปะพะฒ Unicode. ะžะดะฝะฐะบะพ ะฒ ั†ะตะปะพะผ ะฟั€ะฐะฒะธะปะฐ ั€ะตั‡ะธ ะดะปั ัะธะผะฒะพะปะพะฒ Unicode ัะปะตะดัƒะตั‚ ะฟะพะผะตั‰ะฐั‚ัŒ ะฒ ั„ะฐะนะป Unicode. + +ะšะฐะบ ะธ ะฟั€ะฐะฒะธะปะฐ ั€ะตั‡ะธ, ั„ะฐะนะปั‹ Unicode ะธะผะตัŽั‚ ั„ะพั€ะผะฐั‚ YAML. ะžัะฝะพะฒะฝะพะต ะพั‚ะปะธั‡ะธะต ัะพัั‚ะพะธั‚ ะฒ ั‚ะพะผ, ั‡ั‚ะพ ะดะปั ะพะฟั€ะตะดะตะปะตะฝะธั ะฟั€ะฐะฒะธะปะฐ ะธัะฟะพะปัŒะทัƒะตั‚ัั ั‚ะพะปัŒะบะพ ัะธะผะฒะพะป. ะ—ะฐะดะฐะฒะฐั‚ัŒ ะธะผั ะฟั€ะฐะฒะธะปะฐ, ะธะผั ั‚ะตะณะฐ ะธ ะฒั‹ั€ะฐะถะตะฝะธะต ัะพะฟะพัั‚ะฐะฒะปะตะฝะธั ะฝะต ั‚ั€ะตะฑัƒะตั‚ัั. ะ—ะฝะฐั‡ะตะฝะธะตะผ ะฟั€ะฐะฒะธะปะฐ ะผะพะถะตั‚ ะฑั‹ั‚ัŒ ะปัŽะฑะพะต ะดะพะฟัƒัั‚ะธะผะพะต ะทะฝะฐั‡ะตะฝะธะต `replace:` ะธะท ะฟั€ะฐะฒะธะป ั€ะตั‡ะธ. + +ะ‘ะพะปัŒัˆะธะฝัั‚ะฒะพ ะฟั€ะฐะฒะธะป ะพั‡ะตะฝัŒ ะฟั€ะพัั‚ั‹. ะะฐะฟั€ะธะผะตั€: +``` + - "+": [t: plus] # 0x2b +``` +ะญั‚ะพ ะฟั€ะฐะฒะธะปะพ ะฟั€ะตะพะฑั€ะฐะทัƒะตั‚ ัะธะผะฒะพะป `+` ะฒ ัั‚ั€ะพะบัƒ `plus`. + +ะ‘ะพะปะตะต ัะปะพะถะฝะพะต ะฟั€ะฐะฒะธะปะพ: +``` + - "[": # 0x5b + - test: + if: $SpeechStyle = 'ClearSpeak' + then: [t: open bracket] + else: [t: left bracket] +``` +ะ ะตะทัƒะปัŒั‚ะฐั‚ ัั‚ะพะณะพ ะฟั€ะฐะฒะธะปะฐ ะทะฐะฒะธัะธั‚ ะพั‚ ั‚ะตะบัƒั‰ะตะน ะฝะฐัั‚ั€ะพะนะบะธ ัั‚ะธะปั ั€ะตั‡ะธ. + +ะคะฐะนะปั‹ Unicode, ะบะฐะบ ะธ ั„ะฐะนะปั‹ ะฟั€ะฐะฒะธะป ั€ะตั‡ะธ, ะผะพะถะฝะพ ัะพะฒะผะตัั‚ะฝะพ ะธัะฟะพะปัŒะทะพะฒะฐั‚ัŒ ั ะฟะพะผะพั‰ัŒัŽ `- include: file_name`. + + +## ะคะฐะนะปั‹ Prefs + +ะŸั€ะธะผะตั‡ะฐะฝะธะต: ะฝะฐัั‚ั€ะพะนะบะธ, ะฝะฐะฟั€ะธะผะตั€ ะฝะฐัั‚ั€ะพะนะบะธ ClearSpeak, ะฟั€ะตะดัั‚ะฐะฒะปะตะฝั‹ ัะปะพะฒะฐั€ั‘ะผ ะฒะฝัƒั‚ั€ะธ ะทะฐะฟะธัะธ `ClearSpeak` ั„ะฐะนะปะฐ YAML. ะญั‚ะพ ะทะฐั‚ั€ัƒะดะฝัะตั‚ ะทะฐะดะฐะฝะธะต ะธ ั‡ั‚ะตะฝะธะต ะทะฝะฐั‡ะตะฝะธั. +ะŸะพัั‚ะพะผัƒ ะธะผั ะฟั€ะตะพะฑั€ะฐะทัƒะตั‚ัั ะฒ ัั‚ั€ะพะบัƒ ั ั€ะฐะทะดะตะปะธั‚ะตะปะตะผ `_`. +ะะฐะฟั€ะธะผะตั€, _ะธะผั_ ะฝะฐัั‚ั€ะพะนะบะธ `Fraction` ั€ะฐะทะดะตะปะฐ `ClearSpeak` โ€” `ClearSpeak_Fraction`. +ะ˜ะผะตะฝะฝะพ ะตะณะพ ัะปะตะดัƒะตั‚ ะธัะฟะพะปัŒะทะพะฒะฐั‚ัŒ ะดะปั ะทะฐะดะฐะฝะธั ะทะฝะฐั‡ะตะฝะธั ั‡ะตั€ะตะท API ะธ ะดะพัั‚ัƒะฟะฐ ะบ ะทะฝะฐั‡ะตะฝะธัŽ ะฒ `ClearSpeak_Rules.yaml`. + + +## ะคะฐะนะปั‹ Definition + + +## XPath +ะ’ะพ ะผะฝะพะณะธั… ั‡ะฐัั‚ัั… ะฟั€ะฐะฒะธะป ั€ะตั‡ะธ ะธัะฟะพะปัŒะทัƒะตั‚ัั XPath. ะญั‚ะพ ั€ะฐัะฟั€ะพัั‚ั€ะฐะฝั‘ะฝะฝั‹ะน ะธ ั…ะพั€ะพัˆะพ ะดะพะบัƒะผะตะฝั‚ะธั€ะพะฒะฐะฝะฝั‹ะน ัะฟะพัะพะฑ ะฒั‹ะฑะพั€ะฐ ั‡ะฐัั‚ะตะน XML-ะดะพะบัƒะผะตะฝั‚ะฐ. ะ’ ะธะฝั‚ะตั€ะฝะตั‚ะต ะตัั‚ัŒ ะผะฝะพะถะตัั‚ะฒะพ ั€ัƒะบะพะฒะพะดัั‚ะฒ. ะ•ัะปะธ ะฒั‹ ะตั‰ั‘ ะฝะต ะทะฝะฐะบะพะผั‹ ั XPath, ั€ะตะบะพะผะตะฝะดัƒะตั‚ัั ะฟั€ะพั‡ะธั‚ะฐั‚ัŒ ะพะดะฝะพ ะธะท ะฝะธั…. ะ’ MathCAT ะธัะฟะพะปัŒะทัƒะตั‚ัั ะฝะตะผะฝะพะณะพ ั€ะฐััˆะธั€ะตะฝะฝะฐั ั€ะตะฐะปะธะทะฐั†ะธั XPath 1.0. + +ะ’ MathCAT ะพะฑั‹ั‡ะฝะพ ะฟั€ะธะผะตะฝััŽั‚ัั ะปะธัˆัŒ ะฝะตะบะพั‚ะพั€ั‹ะต ะฒะพะทะผะพะถะฝะพัั‚ะธ XPath, ะฐ ั‚ะฐะบะถะต ะฝะตัะบะพะปัŒะบะพ ัะฟะตั†ะธะฐะปัŒะฝั‹ั… ั„ัƒะฝะบั†ะธะน. ะะธะถะต ะบั€ะฐั‚ะบะพ ะพะฟะธัะฐะฝั‹ ั€ะฐัะฟั€ะพัั‚ั€ะฐะฝั‘ะฝะฝั‹ะต ะฒะฐั€ะธะฐะฝั‚ั‹ ะธัะฟะพะปัŒะทะพะฒะฐะฝะธั XPath. + +| ะ—ะฐะฟะธััŒ | ะ—ะฝะฐั‡ะตะฝะธะต | +| ----- | ---- | +| `*` | ะกะพะพั‚ะฒะตั‚ัั‚ะฒัƒะตั‚ ะฒัะตะผ ะดะพั‡ะตั€ะฝะธะผ ัƒะทะปะฐะผ. | +| `[...]` | ะ’ั‹ะฑะธั€ะฐะตั‚ ัƒะทะปั‹ ะธะท ั‚ะตะบัƒั‰ะตะณะพ ัะพะฟะพัั‚ะฐะฒะปะตะฝะธั. | +| `*[1]` | ะ’ั‹ะฑะธั€ะฐะตั‚ ะฟะตั€ะฒั‹ะน ะดะพั‡ะตั€ะฝะธะน ัƒะทะตะป. | +| `*[self::m:mn]` | ะ’ั‹ะฑะธั€ะฐะตั‚ ะฒัะต ะดะพั‡ะตั€ะฝะธะต ัะปะตะผะตะฝั‚ั‹ `mn`. ะŸั€ะตั„ะธะบั `m` ะฟะพะบะฐะทั‹ะฒะฐะตั‚, ั‡ั‚ะพ ัะปะตะผะตะฝั‚ ะฝะฐั…ะพะดะธั‚ัั ะฒ ะฟั€ะพัั‚ั€ะฐะฝัั‚ะฒะต ะธะผั‘ะฝ MathML. | +| `*[1][self::m:mn]` | ะ’ั‹ะฑะธั€ะฐะตั‚ ะฟะตั€ะฒั‹ะน ะดะพั‡ะตั€ะฝะธะน ัƒะทะตะป, ะตัะปะธ ะพะฝ ัะฒะปัะตั‚ัั ัะปะตะผะตะฝั‚ะพะผ `mn`. | +| `*[1][self::m:mo][text()='-']` | ะ’ั‹ะฑะธั€ะฐะตั‚ ะฟะตั€ะฒั‹ะน ะดะพั‡ะตั€ะฝะธะน ัƒะทะตะป, ะตัะปะธ ะพะฝ ัะฒะปัะตั‚ัั ัะปะตะผะตะฝั‚ะพะผ `mo` ั ัะพะดะตั€ะถะธะผั‹ะผ `-`. ะœะพะถะฝะพ ะทะฐะฟะธัะฐั‚ัŒ `*[1][text()='-']`, ะฟะพัะบะพะปัŒะบัƒ ะดั€ัƒะณะธะต ัƒะทะปั‹, ัะบะพั€ะตะต ะฒัะตะณะพ, ะฝะต ัะพะดะตั€ะถะฐั‚ `-`, ะฝะพ ั‚ะฐะบะพะต ัะพะดะตั€ะถะธะผะพะต ะดะพะฟัƒัั‚ะธะผะพ ะดะปั `mtext`, ะฟะพัั‚ะพะผัƒ ะฑะตะทะพะฟะฐัะฝะตะต ัƒะบะฐะทะฐั‚ัŒ ะธะผั ัะปะตะผะตะฝั‚ะฐ. | +| `count(*[2]/*)` | ะšะพะปะธั‡ะตัั‚ะฒะพ ะดะพั‡ะตั€ะฝะธั… ัƒะทะปะพะฒ ะฒั‚ะพั€ะพะณะพ ะดะพั‡ะตั€ะฝะตะณะพ ัƒะทะปะฐ. | +| `count(preceding-sibling::*)+1` | ะšะพะปะธั‡ะตัั‚ะฒะพ ะพะดะฝะพัƒั€ะพะฒะฝะตะฒั‹ั… ัƒะทะปะพะฒ ะฟะตั€ะตะด ั‚ะตะบัƒั‰ะธะผ ัะปะตะผะตะฝั‚ะพะผ ะฟะปัŽั ะพะดะธะฝ. | + +MathCAT ะดะพะฑะฐะฒะปัะตั‚ ัะฟะตั†ะธะฐะปัŒะฝั‹ะต ั„ัƒะฝะบั†ะธะธ, ัƒะฟั€ะพั‰ะฐัŽั‰ะธะต ะฝะฐะฟะธัะฐะฝะธะต ะฟั€ะฐะฒะธะป: + +| ะคัƒะฝะบั†ะธั | ะ—ะฝะฐั‡ะตะฝะธะต | +| ----- | ---- | +| `IsNode(nodes, type)` | ะ’ะพะทะฒั€ะฐั‰ะฐะตั‚ true, ะตัะปะธ ะฒัะต ัƒะทะปั‹ ะธะผะตัŽั‚ ะพะดะธะฝะฐะบะพะฒั‹ะน ั‚ะธะฟ. ะ”ะพะฟัƒัั‚ะธะผั‹ะต ั‚ะธะฟั‹:
`"simple"` โ€” ะทะฐะดะฐะฝะฝั‹ะน ะฝะฐะฑะพั€ ัะปะตะผะตะฝั‚ะพะฒ ClearSpeak;
`"leaf"` โ€” ะพะดะธะฝ ะธะท ะปะธัั‚ะพะฒั‹ั… ัะปะตะผะตะฝั‚ะพะฒ MathML;
`"2D"` โ€” ะดะฒัƒะผะตั€ะฝั‹ะน ัƒะทะตะป, ะฝะฐะฟั€ะธะผะตั€ `mfrac` ะธะปะธ `mroot`;
`"modified"` โ€” ัƒะทะตะป ั ะธะฝะดะตะบัะพะผ ะธะปะธ ัะปะตะผะตะฝั‚ะพะผ ะฝะฐะด ะฝะธะผ ะปะธะฑะพ ะฟะพะด ะฝะธะผ;
`"scripts"` โ€” ัƒะทะตะป ั ะฟะพะดัั‚ั€ะพั‡ะฝั‹ะผ ะธ (ะธะปะธ) ะฝะฐะดัั‚ั€ะพั‡ะฝั‹ะผ ะธะฝะดะตะบัะพะผ;
`"common_fraction"` โ€” ั†ะตะปะพั‡ะธัะปะตะฝะฝั‹ะต ั‡ะธัะปะธั‚ะตะปัŒ ะธ ะทะฝะฐะผะตะฝะฐั‚ะตะปัŒ. | +| `ToOrdinal` | | +| `ToCommonFraction` | | +| `IsBracketed(openChar, closeChar, requiresComma)` | | +| `BaseNode(node)` | ะ ะตะบัƒั€ัะธะฒะฝะพ ะฒะพะทะฒั€ะฐั‰ะฐะตั‚ ะพัะฝะพะฒัƒ ัƒะทะปะฐ ั ะธะฝะดะตะบัะฐะผะธ. | +| `IsInDefinition(node, name)` | ะ’ะพะทะฒั€ะฐั‰ะฐะตั‚ true, ะตัะปะธ ัƒะทะตะป ะฒั…ะพะดะธั‚ ะฒ ัะฟะธัะพะบ `name`, ะทะฐะดะฐะฝะฝั‹ะน ะฒ `definitions.yaml`. | +| `IfThenElse(test, then-part, else-part)` | ะ’ะพะทะฒั€ะฐั‰ะฐะตั‚ `then-part`, ะตัะปะธ ัƒัะปะพะฒะธะต ะธัั‚ะธะฝะฝะพ, ะธะฝะฐั‡ะต ะฒะพะทะฒั€ะฐั‰ะฐะตั‚ `else-part`. ะ’ัะต ะฐั€ะณัƒะผะตะฝั‚ั‹ ัะฒะปััŽั‚ัั XPath. | +| `DistanceFromLeaf(node, left_side, treat_2d_elements_as_tokens)` | ะ’ะพะทะฒั€ะฐั‰ะฐะตั‚ ั€ะฐััั‚ะพัะฝะธะต ะพั‚ ั‚ะตะบัƒั‰ะตะณะพ ัƒะทะปะฐ ะดะพ ะบั€ะฐะนะฝะตะณะพ ะปะตะฒะพะณะพ ะธะปะธ ะฟั€ะฐะฒะพะณะพ ะปะธัั‚ะฐ: ะดะปั ัะธะผะฒะพะปะฐ 0, ะดะปั ั‚ะพะบะตะฝะฐ 1. ะ•ัะปะธ `left_side` ั€ะฐะฒะฝะพ `true`, ะพะฑั…ะพะด ะฒั‹ะฟะพะปะฝัะตั‚ัั ะฟะพ ะบั€ะฐะนะฝะธะผ ะปะตะฒั‹ะผ ะดะพั‡ะตั€ะฝะธะผ ัƒะทะปะฐะผ ะดะพ ะปะธัั‚ะฐ. ะ•ัะปะธ `treat_2d_elements_as_tokens` ั€ะฐะฒะฝะพ `true`, ะดะฒัƒะผะตั€ะฝั‹ะต ะพะฑะพะทะฝะฐั‡ะตะฝะธั, ะฝะฐะฟั€ะธะผะตั€ ะดั€ะพะฑะธ, ัั‡ะธั‚ะฐัŽั‚ัั ะปะธัั‚ะฐะผะธ. | +| `EdgeNode(node, "left"/"right", stopNodeName)` | ะ’ะพะทะฒั€ะฐั‰ะฐะตั‚ ัƒะทะตะป ะพัั‚ะฐะฝะพะฒะบะธ, ะตัะปะธ ะธัั…ะพะดะฝั‹ะน ัƒะทะตะป ะฝะฐั…ะพะดะธั‚ัั ัƒ ะปะตะฒะพะณะพ ะธะปะธ ะฟั€ะฐะฒะพะณะพ ะบั€ะฐั ัƒะบะฐะทะฐะฝะฝะพะณะพ ะฟั€ะตะดะบะฐ. ะ—ะฝะฐั‡ะตะฝะธะตะผ `stopNodeName` ั‚ะฐะบะถะต ะผะพะถะตั‚ ะฑั‹ั‚ัŒ `"2D"`. ะ•ัะปะธ ัะพะพั‚ะฒะตั‚ัั‚ะฒะธะต ะฝะต ะฝะฐะนะดะตะฝะพ, ะฒะพะทะฒั€ะฐั‰ะฐะตั‚ัั ะธัั…ะพะดะฝั‹ะน ัƒะทะตะป. ะ•ัะปะธ `stopNodeName=="math"`, ัƒั‡ะธั‚ั‹ะฒะฐะตั‚ัั ะฟัƒะฝะบั‚ัƒะฐั†ะธั, ะฟะพัะบะพะปัŒะบัƒ ะพะฝะฐ ะฝะต ัะฒะปัะตั‚ัั ั‡ะฐัั‚ัŒัŽ ะผะฐั‚ะตะผะฐั‚ะธั‡ะตัะบะพะณะพ ะฒั‹ั€ะฐะถะตะฝะธั. | +| `DEBUG(xpath)` | ะ”ะพะฑะฐะฒะปัะตั‚ ะฟะพะปะตะทะฝั‹ะต ะดะปั ะดะธะฐะณะฝะพัั‚ะธะบะธ ัะฒะตะดะตะฝะธั ะฒ ะพั‚ะปะฐะดะพั‡ะฝั‹ะน ะฒั‹ะฒะพะด. | + +ะกะปะตะดัƒัŽั‰ะธะต ั„ัƒะฝะบั†ะธะธ ะธัะฟะพะปัŒะทัƒัŽั‚ัั ะฟั€ะฐะฒะธะปะฐะผะธ ะบะพะดะฐ ะะตะผะตั‚ะฐ: + +| ะคัƒะฝะบั†ะธั | ะ—ะฝะฐั‡ะตะฝะธะต | +| ----- | ---- | +| `NestingChars` | ะ˜ัะฟะพะปัŒะทัƒะตั‚ัั ะฟั€ะฐะฒะธะปะฐะผะธ `mfrac`, `msqrt` ะธ `mroot`, ั‡ั‚ะพะฑั‹ ะฟะพะฒั‚ะพั€ัั‚ัŒ ัะธะผะฒะพะปั‹ ะฝัƒะถะฝะพะต ะบะพะปะธั‡ะตัั‚ะฒะพ ั€ะฐะท. | +| `BrailleChars` | ะ˜ัะฟะพะปัŒะทัƒะตั‚ัั ัะปะตะผะตะฝั‚ะฐะผะธ-ั‚ะพะบะตะฝะฐะผะธ ะดะปั ัะปะพะถะฝะพะน ะฟะตั€ะตัั‚ะฐะฝะพะฒะบะธ ะธะฝะดะธะบะฐั‚ะพั€ะพะฒ ะบะพะดะฐ ะะตะผะตั‚ะฐ, ะฝะฐะฟั€ะธะผะตั€ ะฟั€ะพะฟะธัะฝั‹ั… ะฑัƒะบะฒ ะธ ะฝะฐั‡ะตั€ั‚ะฐะฝะธั ัˆั€ะธั„ั‚ะฐ. | diff --git a/docs/ru/index.md b/docs/ru/index.md new file mode 100644 index 000000000..25c7d1b5a --- /dev/null +++ b/docs/ru/index.md @@ -0,0 +1,207 @@ +--- +layout: default +lang: ru +ref: index +title: MathCAT +--- +# MathCAT: ัั€ะตะดัั‚ะฒะพ ะพะฑะตัะฟะตั‡ะตะฝะธั ะดะพัั‚ัƒะฟะฝะพัั‚ะธ ะผะฐั‚ะตะผะฐั‚ะธะบะธ + +โ€” ะฑะธะฑะปะธะพั‚ะตะบะฐ, ะบะพั‚ะพั€ะฐั ะฟั€ะตะพะฑั€ะฐะทัƒะตั‚ MathML ะฒ: + +* ั‚ะตะบัั‚ ะดะปั ะพะทะฒัƒั‡ะธะฒะฐะฝะธั ัะพ ะฒัั‚ั€ะพะตะฝะฝั‹ะผะธ ะบะพะผะฐะฝะดะฐะผะธ ัะธะฝั‚ะตะทะฐั‚ะพั€ะฐ ั€ะตั‡ะธ; +* ะ‘ั€ะฐะนะปัŒ (ะบะพะด ะะตะผะตั‚ะฐ, ั‚ะตั…ะฝะธั‡ะตัะบะธะน ะฒะฐั€ะธะฐะฝั‚ UEB, ะฐ ะฒ ะดะฐะปัŒะฝะตะนัˆะตะผ ะธ ะดั€ัƒะณะธะต ะผะฐั‚ะตะผะฐั‚ะธั‡ะตัะบะธะต ัะธัั‚ะตะผั‹ ะทะฐะฟะธัะธ ะ‘ั€ะฐะนะปั); +* ะฟั€ะตะดัั‚ะฐะฒะปะตะฝะธะต ะดะปั ะฝะฐะฒะธะณะฐั†ะธะธ ะฟะพ ะผะฐั‚ะตะผะฐั‚ะธั‡ะตัะบะธะผ ะฒั‹ั€ะฐะถะตะฝะธัะผ, ะฒ ั‚ะพะผ ั‡ะธัะปะต ั ะฒะพะทะผะพะถะฝะพัั‚ัŒัŽ ะพะฑะทะพั€ะฐ. + +ะฆะตะปัŒ MathCAT โ€” ะฟั€ะตะดะพัั‚ะฐะฒะธั‚ัŒ ะฟั€ะพะณั€ะฐะผะผะฐะผ ัะบั€ะฐะฝะฝะพะณะพ ะดะพัั‚ัƒะฟะฐ ะธ ะดั€ัƒะณะธะผ ะฒัะฟะพะผะพะณะฐั‚ะตะปัŒะฝั‹ะผ ั‚ะตั…ะฝะพะปะพะณะธัะผ ัƒะดะพะฑะฝัƒัŽ ะฑะธะฑะปะธะพั‚ะตะบัƒ ะดะปั ะบะฐั‡ะตัั‚ะฒะตะฝะฝะพะณะพ ะพะทะฒัƒั‡ะธะฒะฐะฝะธั MathML ะธ ะฟั€ะตะพะฑั€ะฐะทะพะฒะฐะฝะธั MathML ะฒ ะ‘ั€ะฐะนะปัŒ. MathCAT ะฟั€ะพะดะพะปะถะฐะตั‚ ะธะดะตะธ MathPlayer (ะฟะพะดั€ะพะฑะฝะตะต ะพะฑ ัั‚ะพะผ ะฑัƒะดะตั‚ ัะบะฐะทะฐะฝะพ ะฝะธะถะต) ะธ ะธัะฟะพะปัŒะทัƒะตั‚ ะฝะฐะบะพะฟะปะตะฝะฝั‹ะน ะฒ ัั‚ะพะผ ะฟั€ะพะตะบั‚ะต ะพะฟั‹ั‚, ั‡ั‚ะพะฑั‹ ะตั‰ั‘ ะปัƒั‡ัˆะต ะพะทะฒัƒั‡ะธะฒะฐั‚ัŒ ะผะฐั‚ะตะผะฐั‚ะธั‡ะตัะบะธะต ะฒั‹ั€ะฐะถะตะฝะธั, ะฟั€ะตะดัั‚ะฐะฒะปัั‚ัŒ ะธั… ะฒ ะ‘ั€ะฐะนะปะต ะธ ะพะฑะตัะฟะตั‡ะธะฒะฐั‚ัŒ ะฝะฐะฒะธะณะฐั†ะธัŽ ะฟะพ ะฝะธะผ. ะ’ MathCAT ะฟั€ะธะผะตะฝััŽั‚ัั ะฝะพะฒั‹ะต ะธะดะตะธ, ะบะพั‚ะพั€ั‹ะต ั€ะฐะทั€ะฐะฑะฐั‚ั‹ะฒะฐะตั‚ [ั€ะฐะฑะพั‡ะฐั ะณั€ัƒะฟะฟะฐ MathML](https://mathml-refresh.github.io/charter-drafts/math-2020.html): ะพะฝะธ ะฟะพะทะฒะพะปััŽั‚ ะฐะฒั‚ะพั€ะฐะผ ัƒะบะฐะทั‹ะฒะฐั‚ัŒ ัะผั‹ัะป ะธัะฟะพะปัŒะทะพะฒะฐะฝะฝะพะณะพ ะพะฑะพะทะฝะฐั‡ะตะฝะธั. ะะฐะฟั€ะธะผะตั€, $(3, 6)$ ะผะพะถะตั‚ ะพะฑะพะทะฝะฐั‡ะฐั‚ัŒ ั‚ะพั‡ะบัƒ ะฝะฐ ะฟะปะพัะบะพัั‚ะธ, ะพั‚ะบั€ั‹ั‚ั‹ะน ะธะฝั‚ะตั€ะฒะฐะป ะธะปะธ ะดะฐะถะต ัะพะบั€ะฐั‰ั‘ะฝะฝัƒัŽ ะทะฐะฟะธััŒ ะฝะฐะธะฑะพะปัŒัˆะตะณะพ ะพะฑั‰ะตะณะพ ะดะตะปะธั‚ะตะปั. ะ•ัะปะธ ัั‚ะฐ ะธะฝั„ะพั€ะผะฐั†ะธั ะฟะตั€ะตะดะฐะฝะฐ ะฒ MathML, MathCAT ะธัะฟะพะปัŒะทัƒะตั‚ ะตั‘ ะดะปั ะฑะพะปะตะต ะตัั‚ะตัั‚ะฒะตะฝะฝะพะณะพ ะพะทะฒัƒั‡ะธะฒะฐะฝะธั. + +ะŸั€ะตะดัั‚ะพะธั‚ ัะดะตะปะฐั‚ัŒ: ะฟะพะดะบะปัŽั‡ะธั‚ัŒ ัั‚ะพั€ะพะฝะฝะธะต ะฑะธะฑะปะธะพั‚ะตะบะธ ะดะปั ะฟะพะดะดะตั€ะถะบะธ ะพะฑั‰ะตะณะพ ะฟะพะดะผะฝะพะถะตัั‚ะฒะฐ ะผะฐั‚ะตะผะฐั‚ะธั‡ะตัะบะธั… ะบะพะผะฐะฝะด TeX ะธ ASCIIMath. + + +# ะ”ะพะบัƒะผะตะฝั‚ะฐั†ะธั ะดะปั ั€ะฐะทะฝั‹ั… ะฟะพะปัŒะทะพะฒะฐั‚ะตะปะตะน MathCAT + +MathCAT ะธัะฟะพะปัŒะทัƒัŽั‚ ั€ะฐะทะฝั‹ะต ะฐัƒะดะธั‚ะพั€ะธะธ ั ั€ะฐะทะปะธั‡ะฝั‹ะผะธ ะฟะพั‚ั€ะตะฑะฝะพัั‚ัะผะธ ะธ ะทะฐะดะฐั‡ะฐะผะธ. ะŸะพะดั€ะพะฑะฝะพัั‚ะธ ะฟั€ะธะฒะตะดะตะฝั‹ ะฒ ัะพะพั‚ะฒะตั‚ัั‚ะฒัƒัŽั‰ะธั… ั€ะฐะทะดะตะปะฐั… ะดะพะบัƒะผะตะฝั‚ะฐั†ะธะธ: +* ะŸะพะปัŒะทะพะฒะฐั‚ะตะปะธ ะฒัะฟะพะผะพะณะฐั‚ะตะปัŒะฝั‹ั… ั‚ะตั…ะฝะพะปะพะณะธะน: [ะธะฝั„ะพั€ะผะฐั†ะธั ะพ ะดะพัั‚ัƒะฟะฝั‹ั… ะฝะฐัั‚ั€ะพะนะบะฐั…](users.md). +* ะ ะฐะทั€ะฐะฑะพั‚ั‡ะธะบะธ ะฒัะฟะพะผะพะณะฐั‚ะตะปัŒะฝั‹ั… ั‚ะตั…ะฝะพะปะพะณะธะน ะธ ะฟะพะปัŒะทะพะฒะฐั‚ะตะปะธ ะฑะธะฑะปะธะพั‚ะตะบะธ: [ะธะฝั„ะพั€ะผะฐั†ะธั ะพะฑ API MathCAT](callers.md). +* ะŸะตั€ะตะฒะพะดั‡ะธะบะธ ะธ ะฐะฒั‚ะพั€ั‹ ะฟั€ะฐะฒะธะป: [ะธะฝั„ะพั€ะผะฐั†ะธั ะพ ั„ะฐะนะปะฐั…, ะบะพั‚ะพั€ั‹ะต ะฝะตะพะฑั…ะพะดะธะผะพ ะฟะตั€ะตะฒะตัั‚ะธ](helpers.md). +* ะ ะฐะทั€ะฐะฑะพั‚ั‡ะธะบะธ MathCAT: [ะธะฝั„ะพั€ะผะฐั†ะธั ะพ ะฟั€ะพั†ะตััะต ั€ะฐะทั€ะฐะฑะพั‚ะบะธ ะธ ั‚ะตัั‚ะธั€ะพะฒะฐะฝะธะธ](developers.md). + +# ะะตะบะพั‚ะพั€ั‹ะต ั‚ะตั…ะฝะธั‡ะตัะบะธะต ะฟะพะดั€ะพะฑะฝะพัั‚ะธ +MathCAT ะฝะฐะฟะธัะฐะฝ ะฝะฐ Rust ะธ ะผะพะถะตั‚ ะธัะฟะพะปัŒะทะพะฒะฐั‚ัŒัั ะธะท ะผะฝะพะณะธั… ัะทั‹ะบะพะฒ ะฟั€ะพะณั€ะฐะผะผะธั€ะพะฒะฐะฝะธั. ะะฐ ะดะฐะฝะฝั‹ะน ะผะพะผะตะฝั‚ ะตัั‚ัŒ ะธะฝั‚ะตั€ั„ะตะนัั‹ ะดะปั: +* [C/C++](https://github.com/NSoiffer/MathCATForC); +* [Python](https://github.com/NSoiffer/MathCATForPython) โ€” ัั‚ะพั‚ ะธะฝั‚ะตั€ั„ะตะนั ะธัะฟะพะปัŒะทัƒัŽั‚ [ะดะพะฟะพะปะฝะตะฝะธะต NVDA](https://addons.nvda-project.org/addons/MathCAT.en.html) ะธ ะฟั€ะพะณั€ะฐะผะผะฐ ัะบั€ะฐะฝะฝะพะณะพ ะดะพัั‚ัƒะฟะฐ [Orca](https://help.gnome.org/users/orca/stable) ะดะปั Linux, ะฝะฐะฟะธัะฐะฝะฝั‹ะต ะฝะฐ Python; +* [Java](https://github.com/mwhapples/MathCAT4J) โ€” ัะตะนั‡ะฐั ัั‚ะพั‚ ะธะฝั‚ะตั€ั„ะตะนั ะธัะฟะพะปัŒะทัƒะตั‚ัั ะดะปั ัะบัะฟะตั€ะธะผะตะฝั‚ะพะฒ ั MathCAT ะฒ [BrailleBlaster](https://www.brailleblaster.org/); +* [WebAssembly (Wasm, ะพั‚ั‡ะฐัั‚ะธ ะฟะพั…ะพะถะธะน ะฝะฐ JavaScript)](https://github.com/NSoiffer/MathCATDemo/) โ€” ัั‚ะพั‚ ะธะฝั‚ะตั€ั„ะตะนั ะธัะฟะพะปัŒะทัƒะตั‚ัั ะฒ ะฒะตะฑ-ะดะตะผะพะฝัั‚ั€ะฐั†ะธะธ MathCAT. + +MathCAT ะฟั€ะธะผะตะฝัะตั‚ ะฝะตัะบะพะปัŒะบะพ ัะฒั€ะธัั‚ะธะบ, ั‡ั‚ะพะฑั‹ ะธัะฟั€ะฐะฒะปัั‚ัŒ ะฝะตะบะฐั‡ะตัั‚ะฒะตะฝะฝั‹ะน MathML ะธ ะฟั€ะธะฒะพะดะธั‚ัŒ ะตะณะพ ะบ ั€ะตะบะพะผะตะฝะดะพะฒะฐะฝะฝะพะผัƒ ะฒะธะดัƒ. ะะฐะฟั€ะธะผะตั€, ะบะพะฝะฒะตั€ั‚ะตั€ั‹ TeX ะธ WYSIWYG-ั€ะตะดะฐะบั‚ะพั€ั‹ ะผะพะณัƒั‚ ั€ะฐะทะดะตะปะธั‚ัŒ ั‡ะธัะปะพ ยซ1,234ยป ะฒ ะฒั‹ั€ะฐะถะตะฝะธะธ ยซ1,234+1ยป ะฟะพ ะทะฐะฟัั‚ะพะน. MathCAT ั€ะฐัะฟะพะทะฝะฐั‘ั‚ ั‚ะฐะบัƒัŽ ัะธั‚ัƒะฐั†ะธัŽ ะธ ะพะฑัŠะตะดะธะฝัะตั‚ ั‡ะธัะปะพ ะฒ ะพะดะธะฝ ัะปะตะผะตะฝั‚ `mn`. ะ”ั€ัƒะณะธะต ะธัะฟั€ะฐะฒะปะตะฝะธั ะทะฐั‚ั€ะฐะณะธะฒะฐัŽั‚ ัั‚ั€ัƒะบั‚ัƒั€ัƒ: MathCAT ัะพะทะดะฐั‘ั‚ ัะปะตะผะตะฝั‚ั‹ `mrow` ั ัƒั‡ั‘ั‚ะพะผ ัะปะพะฒะฐั€ั ะพะฟะตั€ะฐั‚ะพั€ะพะฒ MathML ะธ ะฟั€ะธ ะฝะตะพะฑั…ะพะดะธะผะพัั‚ะธ ะดะพะฑะฐะฒะปัะตั‚ ะฝะตะฒะธะดะธะผั‹ะต ะทะฝะฐะบะธ ะฟั€ะธะผะตะฝะตะฝะธั ั„ัƒะฝะบั†ะธะธ, ัƒะผะฝะพะถะตะฝะธั, ัะปะพะถะตะฝะธั (ะดะปั ัะผะตัˆะฐะฝะฝั‹ั… ะดั€ะพะฑะตะน) ะธ ั€ะฐะทะดะตะปะธั‚ะตะปะธ (ะฝะฐะฟั€ะธะผะตั€, ะผะตะถะดัƒ $i$ ะธ $j$ ะฒ $a\_{ij}$). ะญั‚ะพ ัƒะฟั€ะพั‰ะฐะตั‚ ะณะตะฝะตั€ะฐั†ะธัŽ ั€ะตั‡ะธ ะธ ะบะพะดะฐ ะะตะผะตั‚ะฐ, ะฐ ั‚ะฐะบะถะต ะผะพะถะตั‚ ะฑั‹ั‚ัŒ ะฟะพะปะตะทะฝะพ ะดั€ัƒะณะธะผ ะฟั€ะธะปะพะถะตะฝะธัะผ. ะกะตะนั‡ะฐั ะพั‡ะธัั‚ะบะฐ MathML ะฝะต ะดะพัั‚ัƒะฟะฝะฐ ั‡ะตั€ะตะท API, ะฝะพ ะฒ ะดะฐะปัŒะฝะตะนัˆะตะผ ะผะพะถะตั‚ ัั‚ะฐั‚ัŒ ะตั‰ั‘ ะพะดะฝะพะน ั„ัƒะฝะบั†ะธะตะน MathCAT. ะ’ ั†ะตะปะพะผ MathCAT ะธัะฟั€ะฐะฒะปัะตั‚ MathML ะดะพัั‚ะฐั‚ะพั‡ะฝะพ ะพัั‚ะพั€ะพะถะฝะพ. ะ˜ะฝะพะณะดะฐ ั€ะตะทัƒะปัŒั‚ะฐั‚ ะผะพะถะตั‚ ะพะบะฐะทะฐั‚ัŒัั ะฝะตะฒะตั€ะฝั‹ะผ, ะพะดะฝะฐะบะพ ะพะถะธะดะฐะตั‚ัั, ั‡ั‚ะพ ะฟั€ะฐะฒะธะปัŒะฝั‹ั… ะธัะฟั€ะฐะฒะปะตะฝะธะน ะฑัƒะดะตั‚ ะทะฝะฐั‡ะธั‚ะตะปัŒะฝะพ ะฑะพะปัŒัˆะต. ะŸะพะธัะบ ั‚ะธะฟะธั‡ะฝั‹ั… ะพัˆะธะฑะพะบ ะฒ ะบะพะฝะฒะตั€ั‚ะตั€ะฐั… MathML ะธ ะธัะฟั€ะฐะฒะปะตะฝะธะต ะฝะตะบะฐั‡ะตัั‚ะฒะตะฝะฝะพะณะพ MathML ะพัั‚ะฐัŽั‚ัั ะฟะพัั‚ะพัะฝะฝะพะน ะทะฐะดะฐั‡ะตะน ะฟั€ะพะตะบั‚ะฐ. + +## ะขะตะบัƒั‰ะตะต ัะพัั‚ะพัะฝะธะต (ะพะฑะฝะพะฒะปะตะฝะพ 27.03.2026) + +MathCAT ะฐะบั‚ะธะฒะฝะพ ั€ะฐะทะฒะธะฒะฐะตั‚ัั. DAISY ะฟั€ะธะฝะธะผะฐะตั‚ ะดะตัั‚ะตะปัŒะฝะพะต ัƒั‡ะฐัั‚ะธะต ะฒ ั€ะฐะทั€ะฐะฑะพั‚ะบะต, ะธ ะฒะบะปะฐะด ะฝะพะฒั‹ั… ัƒั‡ะฐัั‚ะฝะธะบะพะฒ ะฟั€ะธะฒะตั‚ัั‚ะฒัƒะตั‚ัั. MathCAT ั€ะฐัะฟั€ะพัั‚ั€ะฐะฝัะตั‚ัั ั ะพั‚ะบั€ั‹ั‚ั‹ะผ ะธัั…ะพะดะฝั‹ะผ ะบะพะดะพะผ. [ะ ะตะฟะพะทะธั‚ะพั€ะธะน ะฟั€ะพะตะบั‚ะฐ ะดะพัั‚ัƒะฟะตะฝ ะฝะฐ GitHub](https://github.com/daisy/MathCAT). [ะž ะฟั€ะพะฑะปะตะผะฐั… ะดะพะฟะพะปะฝะตะฝะธั MathCAT, ะพั‚ะฝะพััั‰ะธั…ัั ะบ NVDA, ะผะพะถะฝะพ ัะพะพะฑั‰ะธั‚ัŒ ะทะดะตััŒ](https://github.com/daisy/MathCATForPython/issues). + +* MathCAT ะฟะพะดะดะตั€ะถะธะฒะฐะตั‚ ะพะทะฒัƒั‡ะธะฒะฐะฝะธะต ะธ ะฝะฐะฒะธะณะฐั†ะธัŽ ะดะปั ะฐะฝะณะปะธะนัะบะพะณะพ, ะฒัŒะตั‚ะฝะฐะผัะบะพะณะพ, ะธะฝะดะพะฝะตะทะธะนัะบะพะณะพ, ะธัะฟะฐะฝัะบะพะณะพ, ะบะธั‚ะฐะนัะบะพะณะพ (ั‚ั€ะฐะดะธั†ะธะพะฝะฝะพะต ะฟะธััŒะผะพ), ะฝะตะผะตั†ะบะพะณะพ, ะฝะพั€ะฒะตะถัะบะพะณะพ, ั€ัƒััะบะพะณะพ, ั„ะธะฝัะบะพะณะพ ะธ ัˆะฒะตะดัะบะพะณะพ ัะทั‹ะบะพะฒ. +* MathCAT ะฟะพะดะดะตั€ะถะธะฒะฐะตั‚ ะบะพะด ะะตะผะตั‚ะฐ, UEB, CMU, ะฒัŒะตั‚ะฝะฐะผัะบัƒัŽ ัะธัั‚ะตะผัƒ ะทะฐะฟะธัะธ ะ‘ั€ะฐะนะปั, ะฐ ั‚ะฐะบะถะต ะฝะตะผะตั†ะบัƒัŽ ะธ ะฐะฒัั‚ั€ะธะนัะบัƒัŽ ัะธัั‚ะตะผั‹ ะทะฐะฟะธัะธ LaTeX ะธ ASCIIMath. +* ะกัƒั‰ะตัั‚ะฒัƒะตั‚ [ะดะพะฟะพะปะฝะตะฝะธะต NVDA](https://addons.nvda-project.org/addons/MathCAT.en.html). ะžะฝะพ ะผะพะถะตั‚ ะทะฐะผะตะฝะธั‚ัŒ MathPlayer ะดะปั ะฟะพะปัŒะทะพะฒะฐั‚ะตะปะตะน ะฐะฝะณะปะธะนัะบะพะณะพ ัะทั‹ะบะฐ ะธ ะฟะพะดะดะตั€ะถะธะฒะฐะตะผั‹ั… ะฟะตั€ะตะฒะพะดะพะฒ. ะะฐั‡ะธะฝะฐั ั NVDA 2026.1 MathCAT ะฒัั‚ั€ะพะตะฝ ะฒ NVDA, ะฟะพัั‚ะพะผัƒ ัะบะฐั‡ะธะฒะฐั‚ัŒ ะดะพะฟะพะปะฝะตะฝะธะต ะฝะต ะฝัƒะถะฝะพ. + +ะŸั€ะตะพะฑั€ะฐะทะพะฒะฐะฝะธะต ะฒ ะบะพะด ะะตะผะตั‚ะฐ ะฒ MathCAT ะทะฝะฐั‡ะธั‚ะตะปัŒะฝะพ ะบะฐั‡ะตัั‚ะฒะตะฝะฝะตะต, ั‡ะตะผ ะฒ MathPlayer ะธ ะดั€ัƒะณะธั… ะบะพะฝะฒะตั€ั‚ะตั€ะฐั… MathML โ†’ ะบะพะด ะะตะผะตั‚ะฐ. ะžะฝะพ ั‚ะฐะบะถะต ะธะฝั‚ะตะณั€ะธั€ะพะฒะฐะฝะพ ั ะฝะฐะฒะธะณะฐั†ะธะตะน: ั‚ะพั‡ะบะธ 7 ะธ 8 ะพะฑะพะทะฝะฐั‡ะฐัŽั‚ ั‚ะตะบัƒั‰ะธะน ัƒะทะตะป, ะฐ ะผะฐั€ัˆั€ัƒั‚ะธะทะฐั†ะธั ะบัƒั€ัะพั€ะฐ ะ‘ั€ะฐะนะปั ั€ะฐะฑะพั‚ะฐะตั‚ ะฒะพ ะฒั€ะตะผั ะฝะฐะฒะธะณะฐั†ะธะธ. ะ‘ะปะฐะณะพะดะฐั€ั ะฒั‹ัะพะบะพะผัƒ ะบะฐั‡ะตัั‚ะฒัƒ ะฒั‹ะฒะพะดะฐ [BrailleBlaster](https://www.brailleblaster.org/) ะธัะฟะพะปัŒะทัƒะตั‚ MathCAT ะดะปั ะฟั€ะตะพะฑั€ะฐะทะพะฒะฐะฝะธั MathML ะฒ ะบะพะด ะะตะผะตั‚ะฐ ะธ UEB. + +ะ ัะด ะดั€ัƒะณะธั… ั€ะฐะทั€ะฐะฑะพั‚ั‡ะธะบะพะฒ ะฒัะฟะพะผะพะณะฐั‚ะตะปัŒะฝั‹ั… ั‚ะตั…ะฝะพะปะพะณะธะน ั‚ะฐะบะถะต ะฒะบะปัŽั‡ะธะปะธ MathCAT ะฒ ัะฒะพะธ ะฟั€ะพะดัƒะบั‚ั‹. ะกั€ะตะดะธ ะฝะธั… ะพัะพะฑะตะฝะฝะพ ะฒั‹ะดะตะปัะตั‚ัั Vispero/JAWS. ะกะตะนั‡ะฐั JAWS ะฟะพะดะดะตั€ะถะธะฒะฐะตั‚ ะพะทะฒัƒั‡ะธะฒะฐะฝะธะต MathCAT ะฝะฐ ะฐะฝะณะปะธะนัะบะพะผ ะธ ะธัะฟะฐะฝัะบะพะผ ัะทั‹ะบะฐั…, ะฐ ั‚ะฐะบะถะต ะฒั‹ะฒะพะด ะฒ ะบะพะดะต ะะตะผะตั‚ะฐ ะธ UEB. ะ’ ะดะฐะปัŒะฝะตะนัˆะตะผ ะฟะพัะฒัั‚ัั ะดั€ัƒะณะธะต ัะทั‹ะบะธ ะธ ัะธัั‚ะตะผั‹ ะทะฐะฟะธัะธ ะ‘ั€ะฐะนะปั. ะ’ ัั€ะตะดัั‚ะฒะต ะฟั€ะพัะผะพั‚ั€ะฐ ะผะฐั‚ะตะผะฐั‚ะธั‡ะตัะบะธั… ะฒั‹ั€ะฐะถะตะฝะธะน JAWS ะดะพัั‚ัƒะฟะฝั‹ ะฒัะต ะฟั€ะตะดัƒัะผะพั‚ั€ะตะฝะฝั‹ะต MathCAT ะบะพะผะฐะฝะดั‹ ะพะทะฒัƒั‡ะธะฒะฐะฝะธั ะธ ะฝะฐะฒะธะณะฐั†ะธะธ, ะฒ ั‚ะพะผ ั‡ะธัะปะต ะฝะฐะฒะธะณะฐั†ะธะธ ะฟะพ ะ‘ั€ะฐะนะปัŽ. ะะฐัั‚ั€ะพะนะบะธ MathCAT ะฝะฐั…ะพะดัั‚ัั ะฒ ั†ะตะฝั‚ั€ะต ะฝะฐัั‚ั€ะพะตะบ JAWS. + +ะ”ั€ัƒะณะธะต ะฒัะฟะพะผะพะณะฐั‚ะตะปัŒะฝั‹ะต ั‚ะตั…ะฝะพะปะพะณะธะธ, ะธัะฟะพะปัŒะทัƒัŽั‰ะธะต MathCAT: + +* ะฟั€ะพะณั€ะฐะผะผะฐ ัะบั€ะฐะฝะฝะพะณะพ ะดะพัั‚ัƒะฟะฐ Orca ะดะปั Linux ะธัะฟะพะปัŒะทัƒะตั‚ MathCAT ะดะปั ะพะทะฒัƒั‡ะธะฒะฐะฝะธั, ะฝะฐะฒะธะณะฐั†ะธะธ ะธ ะฒั‹ะฒะพะดะฐ ะฒ ะ‘ั€ะฐะนะปะต; +* Dolphin EasyReader ะธัะฟะพะปัŒะทัƒะตั‚ MathCAT; +* Kurzweil 3000 ะธัะฟะพะปัŒะทัƒะตั‚ ะพะทะฒัƒั‡ะธะฒะฐะฝะธะต MathCAT ะธ ะพะดะฝะพะฒั€ะตะผะตะฝะฝะพ ะฒั‹ะดะตะปัะตั‚ ัะพะพั‚ะฒะตั‚ัั‚ะฒัƒัŽั‰ะตะต ะฟะพะดะฒั‹ั€ะฐะถะตะฝะธะต ะดะฒัƒะผั ั†ะฒะตั‚ะฐะผะธ, ะพะฑะตัะฟะตั‡ะธะฒะฐั ะฝะฐะณะปัะดะฝะพะต ะฒะธะทัƒะฐะปัŒะฝะพะต ัะพะฟั€ะพะฒะพะถะดะตะฝะธะต ะดะปั ะทั€ัั‡ะธั… ะฟะพะปัŒะทะพะฒะฐั‚ะตะปะตะน; +* Microsoft ะพะฑัŠัะฒะธะปะฐ, ั‡ั‚ะพ ะญะบั€ะฐะฝะฝั‹ะน ะดะธะบั‚ะพั€ ะฑัƒะดะตั‚ ะธัะฟะพะปัŒะทะพะฒะฐั‚ัŒ MathCAT ะฒ ะพะดะฝะพะน ะธะท ะฑัƒะดัƒั‰ะธั… ะฒะตั€ัะธะน. + +[_ะ”ั€ัƒะณะธะผ ะบะพะผะฟะฐะฝะธัะผ_: ะตัะปะธ ะฒั‹ ะฒะบะปัŽั‡ะธะปะธ MathCAT ะฒ ัะฒะพะน ะฟั€ะพะดัƒะบั‚ ะธ ั…ะพั‚ะธั‚ะต, ั‡ั‚ะพะฑั‹ ะพะฝ ะฑั‹ะป ัƒะฟะพะผัะฝัƒั‚ ะทะดะตััŒ, ะฝะฐะฟะธัˆะธั‚ะต ะผะฝะต ะฟะพ ัะปะตะบั‚ั€ะพะฝะฝะพะน ะฟะพั‡ั‚ะต ะธะปะธ ัะพะทะดะฐะนั‚ะต issue ั ะฟั€ะตะดะปะพะถะตะฝะธะตะผ ะพะฑะฝะพะฒะธั‚ัŒ ะดะพะบัƒะผะตะฝั‚ะฐั†ะธัŽ.] + +ะ‘ั‹ะปะฐ ั€ะฐะทั€ะฐะฑะพั‚ะฐะฝะฐ [ะดะตะผะพะฝัั‚ั€ะฐั†ะธะพะฝะฝะฐั ะฒะตั€ัะธั](https://nsoiffer.github.io/MathCATDemo/), ะบะพั‚ะพั€ะฐั ะฟะพะบะฐะทั‹ะฒะฐะตั‚ ะฝะตะบะพั‚ะพั€ั‹ะต ะฒะพะทะผะพะถะฝะพัั‚ะธ MathCAT ะธ ะฟะพะผะพะณะฐะตั‚ ะฟั€ะธ ะพั‚ะปะฐะดะบะต. ะกะพะพะฑั‰ะฐะนั‚ะต, ะฟะพะถะฐะปัƒะนัั‚ะฐ, ะพะฑะพ ะฒัะตั… ะฝะฐะนะดะตะฝะฝั‹ั… ะพัˆะธะฑะบะฐั…. ะญั‚ะฐ ะดะตะผะพะฝัั‚ั€ะฐั†ะธั _ะฝะต_ ะพั‚ั€ะฐะถะฐะตั‚ ั‚ะธะฟะธั‡ะฝั‹ะน ัะฟะพัะพะฑ ะฒะทะฐะธะผะพะดะตะนัั‚ะฒะธั ะฟะพะปัŒะทะพะฒะฐั‚ะตะปะตะน ะฒัะฟะพะผะพะณะฐั‚ะตะปัŒะฝั‹ั… ั‚ะตั…ะฝะพะปะพะณะธะน ั MathCAT, ะฝะพ ะฟะพะบะฐะทั‹ะฒะฐะตั‚ ั„ัƒะฝะบั†ะธะธ, ะบะพั‚ะพั€ั‹ะต ั‚ะฐะบะธะต ั‚ะตั…ะฝะพะปะพะณะธะธ ะฟะพั‚ะตะฝั†ะธะฐะปัŒะฝะพ ะผะพะณัƒั‚ ะฟั€ะตะดะพัั‚ะฐะฒะธั‚ัŒ ะบะพะฝะตั‡ะฝั‹ะผ ะฟะพะปัŒะทะพะฒะฐั‚ะตะปัะผ: ะฒั‹ะดะตะปะตะฝะธะต ะพะทะฒัƒั‡ะธะฒะฐะตะผะพะณะพ ั„ั€ะฐะณะผะตะฝั‚ะฐ, ะฝะฐะฒะธะณะฐั†ะธัŽ ะธ ะฒั‹ะฒะพะด ะฒ ะ‘ั€ะฐะนะปะต. + +ะŸะปะฐะฝั‹ ะดะฐะปัŒะฝะตะนัˆะตะน ั€ะฐะฑะพั‚ั‹: + +* ะ”ะพะฑะฐะฒะธั‚ัŒ ะดั€ัƒะณะธะต ัะทั‹ะบะธ. ะ•ัะปะธ ะฒั‹ ั…ะพั‚ะธั‚ะต ะฟะตั€ะตะฒะตัั‚ะธ MathCAT ะฝะฐ ัะทั‹ะบ, ะบะพั‚ะพั€ั‹ะน ะฟะพะบะฐ ะฝะต ะฟะพะดะดะตั€ะถะธะฒะฐะตั‚ัั, ัะพะทะดะฐะนั‚ะต issue ะฒ [ั€ะตะฟะพะทะธั‚ะพั€ะธะธ MathCAT ะฝะฐ GitHub](https://github.com/daisy/MathCAT/issues). +* ะŸะพะดะดะตั€ะถะฐั‚ัŒ ะดะพะฟะพะปะฝะธั‚ะตะปัŒะฝั‹ะต ัะธัั‚ะตะผั‹ ะทะฐะฟะธัะธ ะ‘ั€ะฐะนะปั. ะ”ะปั ะดะพะฑะฐะฒะปะตะฝะธั ั‚ะฐะบะพะน ะฟะพะดะดะตั€ะถะบะธ ะฝัƒะถะฝั‹ ั‚ั€ะธ ัะพัั‚ะฐะฒะปััŽั‰ะธะต: + * ัะฟะตั†ะธั„ะธะบะฐั†ะธั ัะธัั‚ะตะผั‹; + * ะฒะพะทะผะพะถะฝะพัั‚ัŒ ะทะฐะดะฐะฒะฐั‚ัŒ ะฒะพะฟั€ะพัั‹ ัะฟะตั†ะธะฐะปะธัั‚ัƒ ะฟะพ ัะพะพั‚ะฒะตั‚ัั‚ะฒัƒัŽั‰ะตะน ัะธัั‚ะตะผะต ะทะฐะฟะธัะธ ะ‘ั€ะฐะนะปั; + * ั‡ะตะปะพะฒะตะบ, ะณะพั‚ะพะฒั‹ะน ะฟะตั€ะตะฝะตัั‚ะธ ะฝะต ะผะตะฝะตะต 200 ะฟั€ะธะผะตั€ะพะฒ ะธะท ัะฟะตั†ะธั„ะธะบะฐั†ะธะธ ะฒ ะธัะฟะพะปัŒะทัƒะตะผั‹ะน ะดะปั ั‚ะตัั‚ะพะฒ ั„ะพั€ะผะฐั‚: MathML ะธ ัั‚ั€ะพะบัƒ ัะธะผะฒะพะปะพะฒ ะ‘ั€ะฐะนะปั ะฒ Unicode. ะญั‚ะพ ะผะพะถะตั‚ ะทะฐะฝัั‚ัŒ 30 ั‡ะฐัะพะฒ ะธะปะธ ะฑะพะปัŒัˆะต. + + ะ•ัะปะธ ะฒั‹ ะผะพะถะตั‚ะต ัะพะฑั€ะฐั‚ัŒ ะฒัั‘ ะฝะตะพะฑั…ะพะดะธะผะพะต, ัะพะทะดะฐะนั‚ะต issue ะฒ [ั€ะตะฟะพะทะธั‚ะพั€ะธะธ MathCAT ะฝะฐ GitHub](https://github.com/daisy/MathCAT/issues). +* ะ ะตะฐะปะธะทะพะฒะฐั‚ัŒ ะฟั€ะตะพะฑั€ะฐะทะพะฒะฐะฝะธะต _ะธะท_ ะ‘ั€ะฐะนะปั _ะฒ_ MathML. +* ะ ะฐะทั€ะฐะฑะพั‚ะฐั‚ัŒ ะดะฒัƒะผะตั€ะฝั‹ะต ะฒะฐั€ะธะฐะฝั‚ั‹ ัะธัั‚ะตะผ ะทะฐะฟะธัะธ ะ‘ั€ะฐะนะปั ะดะปั ะผะฝะพะณะพัั‚ั€ะพั‡ะฝั‹ั… ะพะฑะฝะพะฒะปัะตะผั‹ั… ะดะธัะฟะปะตะตะฒ ะ‘ั€ะฐะนะปั, ะฝะฐะฟั€ะธะผะตั€ Monarch ะธ Canute 360. + + + +## ะŸะพั‡ะตะผัƒ MathCAT? + +MathCAT โ€” ะฟั€ะพะดะพะปะถะตะฝะธะต MathPlayer. ะฏ ะฝะฐั‡ะฐะป ั€ะฐะทั€ะฐะฑะฐั‚ั‹ะฒะฐั‚ัŒ ั„ัƒะฝะบั†ะธะธ ะดะพัั‚ัƒะฟะฝะพัั‚ะธ MathPlayer ะฒ ะบะพะผะฟะฐะฝะธะธ Design Science ะฒ 2004 ะณะพะดัƒ ะฒัะบะพั€ะต ะฟะพัะปะต ะฟั€ะธั…ะพะดะฐ ะฒ ะบะพะผะฟะฐะฝะธัŽ. ะ’ ั‚ะพ ะฒั€ะตะผั MathPlayer ะฑั‹ะป ะณะปะฐะฒะฝั‹ะผ ะพะฑั€ะฐะทะพะผ ะฟะพะดะบะปัŽั‡ะฐะตะผั‹ะผ ะผะพะดัƒะปะตะผ C++ ะดะปั Internet Explorer (IE), ะพั‚ะพะฑั€ะฐะถะฐะฒัˆะธะผ MathML ะฝะฐ ะฒะตะฑ-ัั‚ั€ะฐะฝะธั†ะฐั…. ะ”ะพะปะณะพะต ะฒั€ะตะผั ัั‚ะพ ะฑั‹ะปะฐ ะฝะฐะธะฑะพะปะตะต ะฟะพะปะฝะฐั ะธะท ะดะพัั‚ัƒะฟะฝั‹ั… ั€ะตะฐะปะธะทะฐั†ะธะน MathML. ะŸะตั€ะฒะพะฝะฐั‡ะฐะปัŒะฝัƒัŽ ั€ะฐะฑะพั‚ัƒ ะฝะฐะด ะพั‚ะพะฑั€ะฐะถะตะฝะธะตะผ ะผะฐั‚ะตะผะฐั‚ะธั‡ะตัะบะธั… ะฒั‹ั€ะฐะถะตะฝะธะน ะฒั‹ะฟะพะปะฝะธะปะธ ะพัะฝะพะฒะฐั‚ะตะปัŒ Design Science ะŸะพะป ะขะพะฟะฟะธะฝะณ ะธ ั‚ะตั…ะฝะธั‡ะตัะบะธะน ะดะธั€ะตะบั‚ะพั€ ะบะพะผะฟะฐะฝะธะธ, ะฝั‹ะฝะต ะฟะพะบะพะนะฝั‹ะน ะ ะพะฑะตั€ั‚ ะœะฐะนะฝะตั€. ะŸะพะทะถะต ะฟะพ ั€ัะดัƒ ะฟั€ะธั‡ะธะฝ IE ะพั‚ะบะฐะทะฐะปัั ะพั‚ ะธะฝั‚ะตั€ั„ะตะนัะฐ, ะบะพั‚ะพั€ั‹ะน MathPlayer ะธัะฟะพะปัŒะทะพะฒะฐะป ะดะปั ะพั‚ะพะฑั€ะฐะถะตะฝะธั, ะธ ะฝะต ะฟั€ะตะดะปะพะถะธะป ะตะผัƒ ะทะฐะผะตะฝัƒ: ะฒะตะฑ ะฟะตั€ะตั…ะพะดะธะป ะบ ะธัะฟะพะปัŒะทะพะฒะฐะฝะธัŽ JavaScript ะฒ ะฑั€ะฐัƒะทะตั€ะต ะธ ะพั‚ะบะฐะทั‹ะฒะฐะปัั ะพั‚ ั€ะธัะบะพะฒ ะฑะตะทะพะฟะฐัะฝะพัั‚ะธ, ัะฒัะทะฐะฝะฝั‹ั… ั ะฒะฝะตัˆะฝะธะผ ะบะพะดะพะผ. ะŸะพัะปะต ัั‚ะพะณะพ MathPlayer ัั‚ะฐะป ะฑะธะฑะปะธะพั‚ะตะบะพะน, ะฟั€ะตะดะฝะฐะทะฝะฐั‡ะตะฝะฝะพะน ะธัะบะปัŽั‡ะธั‚ะตะปัŒะฝะพ ะดะปั ะพะฑะตัะฟะตั‡ะตะฝะธั ะดะพัั‚ัƒะฟะฝะพัั‚ะธ ะธ ะฒั‹ะทั‹ะฒะฐะตะผะพะน ะดั€ัƒะณะธะผะธ ะฟั€ะพะณั€ะฐะผะผะฐะผะธ, ะณะปะฐะฒะฝั‹ะผ ะพะฑั€ะฐะทะพะผ NVDA. MathPlayer ะฑั‹ะป ะฟั€ะพะฟั€ะธะตั‚ะฐั€ะฝั‹ะผ, ะฝะพ ั€ะฐัะฟั€ะพัั‚ั€ะฐะฝัะปัั ะฑะตัะฟะปะฐั‚ะฝะพ. + +ะ’ ะฝะฐั‡ะฐะปะต 2017 ะณะพะดะฐ ั ะฟะพะบะธะฝัƒะป Design Science. ะŸะพะทะถะต ะฒ ั‚ะพะผ ะถะต ะณะพะดัƒ WIRIS ะฟั€ะธะพะฑั€ะตะปะฐ ะบะพะผะฟะฐะฝะธัŽ. ะฏ ะฟั€ะตะดะปะพะถะธะป ะฑะตัะฟะปะฐั‚ะฝะพ ะธัะฟั€ะฐะฒะปัั‚ัŒ ะพัˆะธะฑะบะธ MathPlayer, ะธ ัะฝะฐั‡ะฐะปะฐ ัั‚ะฐ ะธะฝะธั†ะธะฐั‚ะธะฒะฐ ะฟะพะปัƒั‡ะธะปะฐ ะฟะพะดะดะตั€ะถะบัƒ. ะะพ ะบะพะณะดะฐ ะฟั€ะธัˆะปะพ ะฒั€ะตะผั ะฒั‹ะฟัƒัะบะฐั‚ัŒ ะฝะพะฒัƒัŽ ะฒะตั€ัะธัŽ, ะผะฝะพะณะธะต ัะพั‚ั€ัƒะดะฝะธะบะธ, ั€ะฐะฑะพั‚ะฐะฒัˆะธะต ะฒ ะบะพะผะฟะฐะฝะธะธ ะฒะพ ะฒั€ะตะผั ะฟั€ะธะพะฑั€ะตั‚ะตะฝะธั, ัƒะถะต ัƒัˆะปะธ, ะฐ ะพัั‚ะฐะฒัˆะฐััั ะบะพะผะฐะฝะดะฐ ะฝะต ะฑั‹ะปะฐ ะทะฐะธะฝั‚ะตั€ะตัะพะฒะฐะฝะฐ ะฒ ะฟะพะดะดะตั€ะถะบะต MathPlayer. ะžะบะพะฝั‡ะฐั‚ะตะปัŒะฝะพะต ั€ะตัˆะตะฝะธะต ะฑั‹ะปะพ ะฟั€ะธะฝัั‚ะพ ั‚ะพะปัŒะบะพ ะฒ ะบะพะฝั†ะต 2020 ะณะพะดะฐ. ะ’ 2021 ะณะพะดัƒ ั ะฝะฐั‡ะฐะป ั€ะฐะฑะพั‚ะฐั‚ัŒ ะฝะฐะด ะทะฐะผะตะฝะพะน MathPlayer. ะ’ ะบะฐั‡ะตัั‚ะฒะต ะดะพะฟะพะปะฝะธั‚ะตะปัŒะฝะพะน ะทะฐะดะฐั‡ะธ ั ั€ะตัˆะธะป ะธะทัƒั‡ะธั‚ัŒ Rust ะธ ั€ะตะฐะปะธะทะพะฒะฐะป ะฟั€ะพะตะบั‚ ะฝะฐ ะฝั‘ะผ. Rust โ€” ะฝะธะทะบะพัƒั€ะพะฒะฝะตะฒั‹ะน ัะทั‹ะบ ัะพ ัั‚ั€ะพะณะพะน ั‚ะธะฟะธะทะฐั†ะธะตะน ะธ ะฑะตะทะพะฟะฐัะฝะพะน ั€ะฐะฑะพั‚ะพะน ั ะฟะฐะผัั‚ัŒัŽ, ะฝะพ ะฑะตะท ะฐะฒั‚ะพะผะฐั‚ะธั‡ะตัะบะพะน ัะฑะพั€ะบะธ ะผัƒัะพั€ะฐ ะธะปะธ ะฟะพะดัั‡ั‘ั‚ะฐ ััั‹ะปะพะบ. ะ•ะณะพ ั‡ะฐัั‚ะพ ะฝะฐะทั‹ะฒะฐัŽั‚ ะฑะพะปะตะต ะฑะตะทะพะฟะฐัะฝะพะน ะทะฐะผะตะฝะพะน C/C++. + +Rust ะดะพัั‚ะฐั‚ะพั‡ะฝะพ ัั„ั„ะตะบั‚ะธะฒะตะฝ. ะะฐ ะบะพะผะฟัŒัŽั‚ะตั€ะต ั Core i7-770K (ะผะพั‰ะฝั‹ะผ ะฟะพ ะผะตั€ะบะฐะผ ะฟั€ะธะผะตั€ะฝะพ 2017 ะณะพะดะฐ ะฟั€ะพั†ะตััะพั€ะพะผ) ะดะปั ะฒั‹ั€ะฐะถะตะฝะธั ัั€ะตะดะฝะตะณะพ ั€ะฐะทะผะตั€ะฐ + + + + e + + + + 1 + 2 + + + + + ( + + + + x + + μ + + σ + + + ) + + + 2 + + + + + +ั‚ั€ะตะฑัƒะตั‚ัั ะพะบะพะปะพ 4 ะผั, ั‡ั‚ะพะฑั‹ ัะพะทะดะฐั‚ัŒ ัั‚ั€ะพะบัƒ ClearSpeak ะฝะฐ ะฐะฝะณะปะธะนัะบะพะผ ัะทั‹ะบะต +"_e raised to the exponent, negative 1 half times; open paren; the fraction with numerator; x minus mu; and denominator sigma; close paren squared, end exponent_" +ะธ ัั‚ั€ะพะบัƒ ะฒ ะบะพะดะต ะะตะผะตั‚ะฐ "โ ‘โ ˜โ คโ นโ ‚โ Œโ †โ ผโ ˆโ กโ ทโ นโ ญโ คโ จโ โ Œโ จโ Žโ ผโ พโ ˜โ ˜โ †". +ะŸั€ะธะผะตั€ะฝะพ 2 ะผั ะทะฐะฝะธะผะฐัŽั‚ ะพั‡ะธัั‚ะบะฐ MathML, 1 ะผั โ€” ะณะตะฝะตั€ะฐั†ะธั ั€ะตั‡ะธ, ะตั‰ั‘ 1 ะผั โ€” ะณะตะฝะตั€ะฐั†ะธั ะ‘ั€ะฐะนะปั. ะกัŽะดะฐ ะฒั…ะพะดะธั‚ ะฟั€ะพะฒะตั€ะบะฐ ะฐะบั‚ัƒะฐะปัŒะฝะพัั‚ะธ ะฒัะตั… ั„ะฐะนะปะพะฒ ะฟั€ะฐะฒะธะป, ะบะพั‚ะพั€ะฐั ะพะบะฐะทั‹ะฒะฐะตั‚ัั ะดะพัั‚ะฐั‚ะพั‡ะฝะพ ะทะฐั‚ั€ะฐั‚ะฝะพะน. ะญั‚ัƒ ะฟั€ะพะฒะตั€ะบัƒ ะผะพะถะฝะพ ะพั‚ะบะปัŽั‡ะธั‚ัŒ ั ะฟะพะผะพั‰ัŒัŽ ะฝะฐัั‚ั€ะพะนะบะธ: ะพะฝะฐ ะฝัƒะถะฝะฐ ะณะปะฐะฒะฝั‹ะผ ะพะฑั€ะฐะทะพะผ ะฟั€ะธ ะพั‚ะปะฐะดะบะต. ะ•ัะปะธ ะฟั€ะพะฒะตั€ะบะฐ ะพั‚ะบะปัŽั‡ะตะฝะฐ, ะฒั€ะตะผั ัƒะผะตะฝัŒัˆะฐะตั‚ัั ะดะพ 2,3 ะผั. +ะะฐ ะฑะพะปะตะต ะผะพั‰ะฝะพะผ ะฟั€ะพั†ะตััะพั€ะต Intel Core Ultra 9 285 2025 ะณะพะดะฐ ะณะตะฝะตั€ะฐั†ะธั ั€ะตั‡ะธ ะธ ะ‘ั€ะฐะนะปั ะฒ ะพะดะฝะพะผ ะฟะพั‚ะพะบะต ะทะฐะฝะธะผะฐะตั‚ ะพะบะพะปะพ 1 ะผั. + +
+ะŸะพะบะฐะทะฐั‚ัŒ MathML ัั‚ะพะณะพ ะฒั‹ั€ะฐะถะตะฝะธั +
+<math>
+  <mrow>
+    <msup>
+      <mi>e</mi>
+      <mrow>
+        <mo>−</mo>
+        <mfrac>
+          <mn>1</mn>
+          <mn>2</mn>
+        </mfrac>
+        <msup>
+          <mrow>
+            <mrow>
+              <mo>(</mo>
+              <mrow>
+                <mfrac>
+                  <mrow>
+                    <mi>x</mi>
+                    <mo>−</mo>
+                    <mi>μ</mi>
+                  </mrow>
+                  <mi>σ</mi>
+                </mfrac>
+              </mrow>
+              <mo>)</mo>
+            </mrow>
+          </mrow>
+          <mn>2</mn>
+        </msup>
+      </mrow>
+    </msup>
+  </mrow>
+</math>
+
+
+ +ะ”ะปั ะณะตะฝะตั€ะฐั†ะธะธ ั€ะตั‡ะธ ะธ ะ‘ั€ะฐะนะปั MathCAT ะธัะฟะพะปัŒะทัƒะตั‚ ะฒะฝะตัˆะฝะธะต ะฟั€ะฐะฒะธะปะฐ. +ะ˜ั… ะทะฐะณั€ัƒะทะบะฐ ะทะฐะฝะธะผะฐะตั‚ ะพะบะพะปะพ 40 ะผั. ะžะฝะฐ ะฒั‹ะฟะพะปะฝัะตั‚ัั ั‚ะพะปัŒะบะพ ะฟั€ะธ ะฟะตั€ะฒะพะผ ะธัะฟะพะปัŒะทะพะฒะฐะฝะธะธ ะฟั€ะฐะฒะธะป ะธะปะธ ะฟะพัะปะต ะธะทะผะตะฝะตะฝะธั ัั‚ะธะปั ั€ะตั‡ะธ, ัะทั‹ะบะฐ ะปะธะฑะพ ะดั€ัƒะณะพะน ะฒะฝะตัˆะฝะตะน ะฝะฐัั‚ั€ะพะนะบะธ. ะ•ั‰ั‘ 50 ะผั ั‚ั€ะตะฑัƒะตั‚ัั ะดะปั ะทะฐะณั€ัƒะทะบะธ ะฟะพะปะฝั‹ั… ั„ะฐะนะปะพะฒ Unicode ะดะปั ั€ะตั‡ะธ ะธ ะ‘ั€ะฐะนะปั, ะพะดะฝะฐะบะพ ะธััะปะตะดะพะฒะฐะฝะธั ะฟะพะบะฐะทะฐะปะธ, ั‡ั‚ะพ ะฒ ะฟะพะดะฐะฒะปััŽั‰ะตะผ ะฑะพะปัŒัˆะธะฝัั‚ะฒะต ะฐะฝะณะปะพัะทั‹ั‡ะฝั‹ั… ะผะฐั‚ะตะผะฐั‚ะธั‡ะตัะบะธั… ะผะฐั‚ะตั€ะธะฐะปะพะฒ ะดะปั ัˆะบะพะปัŒะฝะพะณะพ ะพะฑัƒั‡ะตะฝะธั ะธัะฟะพะปัŒะทัƒัŽั‚ัั ะปะธัˆัŒ ะฝะตะผะฝะพะณะธะต ัะธะผะฒะพะปั‹. +ะกัƒะดั ะฟะพ ะบะฝะธะณะฐะผ ะฟะพ ะผะฐั‚ะตะผะฐั‚ะธะบะต ั ะพั‚ะบั€ั‹ั‚ั‹ะผ ะธัั…ะพะดะฝั‹ะผ ะบะพะดะพะผ, ะฟะตั€ะฒะพะฝะฐั‡ะฐะปัŒะฝะพ ะทะฐะณั€ัƒะถะฐะตะผะพะณะพ ะฝะฐะฑะพั€ะฐ ะดะพะปะถะฝะพ ะฑั‹ั‚ัŒ ะดะพัั‚ะฐั‚ะพั‡ะฝะพ ะบะฐะบ ะผะธะฝะธะผัƒะผ ะดะปั 99,99 % ัะธะผะฒะพะปะพะฒ, ะฒัั‚ั€ะตั‡ะฐัŽั‰ะธั…ัั ะฒ ะฒั‹ั€ะฐะถะตะฝะธัั… ะฐะฝะณะปะพัะทั‹ั‡ะฝั‹ั… ัˆะบะพะปัŒะฝั‹ั… ัƒั‡ะตะฑะฝะธะบะพะฒ ะผะฐั‚ะตะผะฐั‚ะธะบะธ. + +ะ ะฐะทะผะตั€ ะฑะธะฑะปะธะพั‚ะตะบะธ ัะพัั‚ะฐะฒะปัะตั‚ ะพะบะพะปะพ 3 ะœะ‘. + +ะ•ัะปะธ ะฒั‹ ั€ะฐะทั€ะฐะฑะฐั‚ั‹ะฒะฐะตั‚ะต ั€ะตัˆะตะฝะธะต ะดะปั ั€ะฐะฑะพั‚ั‹ ะฝะตะฟะพัั€ะตะดัั‚ะฒะตะฝะฝะพ ะฒ ะฑั€ะฐัƒะทะตั€ะต, ั‚ะพ ะตัั‚ัŒ ะธัะฟะพะปัŒะทัƒะตั‚ะต JavaScript ะธะปะธ ะดั€ัƒะณะพะน ะฑั€ะฐัƒะทะตั€ะฝั‹ะน ัะทั‹ะบ, MathCAT, ะฒะตั€ะพัั‚ะฝะพ, ะฝะต ะฑัƒะดะตั‚ ะพะฟั‚ะธะผะฐะปัŒะฝั‹ะผ ะฒั‹ะฑะพั€ะพะผ. ะŸั€ะธ ัั‚ะพะผ ั, ัะบะพั€ะตะต ะฒัะตะณะพ, ะฒั‹ะดะตะปัŽ ะธะท [MathCATDemo](https://github.com/NSoiffer/MathCATDemo/) ะธะฝั‚ะตั€ั„ะตะนั JavaScript, ะฝะฐ ะบะพั‚ะพั€ะพะผ ะฟะพัั‚ั€ะพะตะฝะฐ ะดะตะผะพะฝัั‚ั€ะฐั†ะธะพะฝะฝะฐั ะฒะตั€ัะธั. ะŸะพะบะฐ ะพะฑั€ะฐั‚ะธั‚ะต ะฒะฝะธะผะฐะฝะธะต ะฝะฐ [Speech Rule Engine](https://github.com/zorkow/speech-rule-engine) (SRE) ะคะพะปัŒะบะตั€ะฐ ะ—ะพั€ะณะต. ะžะฝ ะฝะฐะฟะธัะฐะฝ ะฝะฐ TypeScript ะธ, ะฒะตั€ะพัั‚ะฝะพ, ะฟะพะดะพะนะดั‘ั‚ ะดะปั ะฑั€ะฐัƒะทะตั€ะฝะพะณะพ ั€ะตัˆะตะฝะธั, ะตัะปะธ ะฒะฐะผ ะฝะต ั‚ั€ะตะฑัƒะตั‚ัั ะ‘ั€ะฐะนะปัŒ. MathCAT ะฟะพะดะดะตั€ะถะธะฒะฐะตั‚ ะฝะตัะบะพะปัŒะบะพ ัะธัั‚ะตะผ ะทะฐะฟะธัะธ ะ‘ั€ะฐะนะปั ะธ ะบะฐะบ ะผะธะฝะธะผัƒะผ ะดะปั ะบะพะดะฐ ะะตะผะตั‚ะฐ ะพะฑะตัะฟะตั‡ะธะฒะฐะตั‚ ะฑะพะปะตะต ะบะฐั‡ะตัั‚ะฒะตะฝะฝั‹ะน ั€ะตะทัƒะปัŒั‚ะฐั‚. + +# ะ‘ะปะฐะณะพะดะฐั€ะฝะพัั‚ะธ + +ะŸั€ะพะตะบั‚ัƒ ะฟะพะผะพะณะฐะปะธ ะผะฝะพะณะธะต ะปัŽะดะธ, ะธ ั ะพั‡ะตะฝัŒ ะฟั€ะธะทะฝะฐั‚ะตะปะตะฝ ะธะผ ะทะฐ ัั‚ะพ! + +* ะ”ัะฒะธะด ะšะฐั€ะปะฐะนะป โ€” ะพะบะฐะทะฐะป ะฝะตะพั†ะตะฝะธะผัƒัŽ ะฟะพะผะพั‰ัŒ ั ะฝะตะบะพั‚ะพั€ั‹ะผะธ ะฒั‹ั€ะฐะถะตะฝะธัะผะธ ัะพะฟะพัั‚ะฐะฒะปะตะฝะธั XPath. +* ะกัŒัŽะทะฐะฝ ะ”ะถะพะปะปะธ โ€” ั‚ะตั€ะฟะตะปะธะฒะพ ะบะพะฝััƒะปัŒั‚ะธั€ะพะฒะฐะปะฐ ะฟะพ ะณะตะฝะตั€ะฐั†ะธะธ ะบะพะดะฐ ะะตะผะตั‚ะฐ ะธ UEB, ะฐ ั‚ะฐะบะถะต ะดะฐะฒะฐะปะฐ ะพะฑั€ะฐั‚ะฝัƒัŽ ัะฒัะทัŒ ะพ ะฟั€ะฐะฒะธะปัŒะฝั‹ั… ะธ ะพัˆะธะฑะพั‡ะฝั‹ั… ั€ะตะทัƒะปัŒั‚ะฐั‚ะฐั…. ะšั€ะพะผะต ั‚ะพะณะพ, ะพะฝะฐ ะฟะพะผะพะณะปะฐ ะผะฝะต ะฟั€ะธ ั€ะฐะทั€ะฐะฑะพั‚ะบะต ัะฒั€ะธัั‚ะธะบ ะดะปั ั…ะธะผะธั‡ะตัะบะธั… ั„ะพั€ะผัƒะป. +* ะญะปะตะนะฝ ะ. ะœัƒั€ โ€” ะฟะพะผะพะณะปะฐ ะพะฟั€ะตะดะตะปะธั‚ัŒ, ั‡ั‚ะพ ัะปะตะดัƒะตั‚ ะธ ะฝะต ัะปะตะดัƒะตั‚ ะฟั€ะพะธะทะฝะพัะธั‚ัŒ ะดะปั ั…ะธะผะธั‡ะตัะบะธั… ั„ะพั€ะผัƒะป, ะฐ ั‚ะฐะบะถะต ะบะฐะบะธะต ะทะฐะฟะธัะธ ะธะผะตัŽั‚ ัะผั‹ัะป ั ั‚ะพั‡ะบะธ ะทั€ะตะฝะธั ั…ะธะผะธะธ. +* ะ ะธั‡ะฐั€ะด ะžั€ะผ โ€” ะฟะพะปะฝะพัั‚ัŒัŽ ั€ะฐะทั€ะฐะฑะพั‚ะฐะป ะดะธะฐะปะพะณ ะฝะฐัั‚ั€ะพะตะบ MathCAT ะดะปั NVDA. +* ะกัะผ ะ”ัƒะปะธ, ะœัŽั€ั€ะตะน ะกะฐั€ะดะถะตะฝั‚ ะธ ะคะพะปัŒะบะตั€ ะ—ะพั€ะณะต โ€” ะฟั€ะตะดะพัั‚ะฐะฒะธะปะธ ั‚ะฐะฑะปะธั†ั‹ ะฟะตั€ะตะฒะพะดะฐ ัะธะผะฒะพะปะพะฒ ะฒ ะบะพะด ะะตะผะตั‚ะฐ ะธ ั‚ะตัั‚ั‹ ัั‚ะพะณะพ ะบะพะดะฐ. +* ะœะพั€ะธั† ะ“ั€ะพัั ([Math4VIP](https://www.math4vip.de/)) โ€” ั€ะฐะฑะพั‚ะฐะป ะฝะฐะด ั€ะฐะทะปะธั‡ะฝั‹ะผะธ ั‡ะฐัั‚ัะผะธ ะบะพะดะพะฒะพะน ะฑะฐะทั‹ Rust ะธ ัะพะทะดะฐะป ะธะฝัั‚ั€ัƒะผะตะฝั‚ Python ะดะปั ะพั‚ัะปะตะถะธะฒะฐะฝะธั ะฟั€ะพะณั€ะตััะฐ ะปะพะบะฐะปะธะทะฐั†ะธะธ. + +ะŸะตั€ะตะฒะพะดั‡ะธะบะธ: + +* ะšะธั‚ะฐะนัะบะธะน ัะทั‹ะบ (ั‚ั€ะฐะดะธั†ะธะพะฝะฝะพะต ะฟะธััŒะผะพ) โ€” ะฅะพะฝ-ะ”ะถะฐะฝะณ ะฏะฝะณ. +* ะคะธะฝัะบะธะน ัะทั‹ะบ โ€” ะกะฐะผะธ ะœััั‚ั‚ั, Accessibility Library Celia ะธ ะฝะตะทะฐะฒะธัะธะผั‹ะน ัะฟะตั†ะธะฐะปะธัั‚ ะญััะธ ะ’ะธะธะฟะฟะพะปะฐ. +* ะะตะผะตั†ะบะธะน ัะทั‹ะบ โ€” ะะฐะทะปะธ ะะฝะดะถะธั‡, ะ ะพะฑะตั€ั‚ ะ“ั€ะฐั„ ะธ ะŸะพะป ะ›ะธะฑะฑั€ะตั…ั‚ (IU International University of Applied Sciences). +* ะ˜ะฝะดะพะฝะตะทะธะนัะบะธะน ัะทั‹ะบ โ€” ะดะพะบั‚ะพั€ ะŸะธะฝั‚ะฐ ะ”ะตะฝะธัะฝั‚ะธ ะกะฐะผะฟะพัั€ะฝะพ, ะผะฐะณะธัั‚ั€ ะฝะฐัƒะบ; ะดะพะบั‚ะพั€ ะœะตะนะปะธะฐัะฐั€ะธ, ะฑะฐะบะฐะปะฐะฒั€ ะฟะตะดะฐะณะพะณะธั‡ะตัะบะธั… ะฝะฐัƒะบ, ะผะฐะณะธัั‚ั€ ะฝะฐัƒะบ; ะั€ะธ ะฅะตะฝะดะฐั€ะฝะพ, ะฑะฐะบะฐะปะฐะฒั€ ะฟะตะดะฐะณะพะณะธั‡ะตัะบะธั… ะฝะฐัƒะบ, ะผะฐะณะธัั‚ั€ ะบะพะผะฟัŒัŽั‚ะตั€ะฝั‹ั… ะฝะฐัƒะบ. +* ะะพั€ะฒะตะถัะบะธะน ัะทั‹ะบ โ€” ะœะฐั€ั‚ะต ะ“ัŒะตะปัŒัั‚ะฐะด, ะะฐั†ะธะพะฝะฐะปัŒะฝะฐั ะฑะธะฑะปะธะพั‚ะตะบะฐ ะะพั€ะฒะตะณะธะธ, Kvile. +* ะ ัƒััะบะธะน ัะทั‹ะบ โ€” ะ”ะฐะฝะธะป ะšะพัั‚ะตะฝะบะพะฒ. +* ะ˜ัะฟะฐะฝัะบะธะน ัะทั‹ะบ โ€” ะะพัะปะธั ะ ัƒะธั ะœะฐั€ั‚ะธะฝะตั, ะบะพั‚ะพั€ะฐั ั‚ะฐะบะถะต ะฟะพะผะพะณะฐะปะฐ ะฒ ั€ะฐะทั€ะฐะฑะพั‚ะบะต ะดะพะฟะพะปะฝะตะฝะธั NVDA, ะธ ะœะฐั€ะธั ะะปะปะพ ะ ะพะปัŒะดะฐะฝ. +* ะจะฒะตะดัะบะธะน ัะทั‹ะบ โ€” ะขะธะผ ะั€ะฑะพั€ะตะฐะปะธั ะ›ั‘ั‚ะฑะตั€ะณ, ะจะฒะตะดัะบะพะต ะฐะณะตะฝั‚ัั‚ะฒะพ ะดะพัั‚ัƒะฟะฝั‹ั… ะผะตะดะธะฐ (MTM), ะธ ะะฝะดะตั€ั ะญะบะปัƒะฝะด, SPSM. +* ะ’ัŒะตั‚ะฝะฐะผัะบะธะน ัะทั‹ะบ โ€” ะ”ะฐะฝะณ ะฅะพะฐะน ะคัƒะบ ะธ ะขั€ะฐะฝะณ ะคะฐะผ. +* ะ”ั€ัƒะณะธะต ัะทั‹ะบะธ??? โ€” ะฟั€ะธัะพะตะดะธะฝัะนั‚ะตััŒ, ั‡ั‚ะพะฑั‹ ั ะผะพะณ ัƒะบะฐะทะฐั‚ัŒ ะฒะฐั ะทะดะตััŒ... + +ะŸะตั€ะฒะพะฝะฐั‡ะฐะปัŒะฝั‹ะน ะฟะตั€ะตะฒะพะด ะผะฝะพะณะธั… ัะธะผะฒะพะปะพะฒ ะ‘ั€ะฐะนะปั ะดะปั ัะธัั‚ะตะผ ะทะฐะฟะธัะธ, ั€ะฐะทั€ะฐะฑะพั‚ะฐะฝะฝั‹ั… ะฒ 2024 ะณะพะดัƒ ะธ ะฟะพะทะดะฝะตะต, ะฑั‹ะป ััƒั‰ะตัั‚ะฒะตะฝะฝะพ ัƒะฟั€ะพั‰ั‘ะฝ ะฑะปะฐะณะพะดะฐั€ั ั‚ะฐะฑะปะธั†ะต, ะบะพั‚ะพั€ัƒัŽ ะผะฝะต ะฟั€ะตะดะพัั‚ะฐะฒะธะป ะ“ะตะพั€ะณะธะพั ะšัƒั€ัƒะฟั€ะตั‚ั€ะพะณะปัƒ ะธ ะฝะฐะด ะบะพั‚ะพั€ะพะน ั€ะฐะฑะพั‚ะฐะปะฐ ะฑะพะปัŒัˆะฐั ะบะพะผะฐะฝะดะฐ. ะ”ะปั ะฟะพะปัƒั‡ะตะฝะธั ะฟะพะดั€ะพะฑะฝะพะน ะธะฝั„ะพั€ะผะฐั†ะธะธ ะพะฑั€ะฐั‚ะธั‚ะตััŒ ะบ: + +* [MathBrailleCodes Repository](https://access.uoa.gr/mathbraille/index.php/en/), Speech and Accessibility Lab, National and Kapodistrian University of Athens, Greece: P. Riga, T. Antonakopoulou, D. Kouvaras, S. Lentas and G. Kouroupetroglou (2021) โ€œ[The BrailleMathCodes Repository](https://access.uoa.gr/mathbraille/index.php/en/)โ€, Proceedings of the 4th International Workshop on โ€œ[Digitization and e-Inclusion in Mathematics and Science 2021](https://workshop.sciaccess.net/deims2021/DEIMS2021_Proceedings.zip)โ€ DEIMS2021, February 18-19, 2021, Tokyo, pp. 105-114. + +ะกะฟะฐัะธะฑะพ ะฒัะตะผ ัƒั‡ะฐัั‚ะฝะธะบะฐะผ! + +# ะžะฑะพ ะผะฝะต + +ะฏ ั€ะฐะฑะพั‚ะฐัŽ ะฝะฐะด ะพะฑะตัะฟะตั‡ะตะฝะธะตะผ ะดะพัั‚ัƒะฟะฝะพัั‚ะธ ะผะฐั‚ะตะผะฐั‚ะธั‡ะตัะบะธั… ะฒั‹ั€ะฐะถะตะฝะธะน ั 2002 ะณะพะดะฐ. ะ’ ั‚ะพ ะฒั€ะตะผั ั ะทะฐะฝะธะผะฐะปัั WYSIWYG-ั€ะตะดะฐะบั‚ะพั€ะพะผ ั„ะพั€ะผัƒะป Mathematica ะธ ะดั€ัƒะณะธะผะธ ัะปะตะผะตะฝั‚ะฐะผะธ ะฟะพะปัŒะทะพะฒะฐั‚ะตะปัŒัะบะพะณะพ ะธะฝั‚ะตั€ั„ะตะนัะฐ. ะŸั€ะพั„ะตััะพั€ ะ”ะถะพะฝ ะ“ะฐั€ะดะฝะตั€, ะฟะพั‚ะตั€ัะฒัˆะธะน ะทั€ะตะฝะธะต ะฟัั‚ะฝะฐะดั†ะฐั‚ัŒัŽ ะณะพะดะฐะผะธ ั€ะฐะฝะตะต, ัะฟั€ะพัะธะป, ะผะพะณัƒ ะปะธ ั ัะดะตะปะฐั‚ัŒ ะธะฝั‚ะตั€ั„ะตะนั Mathematica ะดะพัั‚ัƒะฟะฝั‹ะผ. ะœะฝะต ัƒะดะฐะปะพััŒ ะฒั‹ะฟะพะปะฝะธั‚ัŒ, ะฒะตั€ะพัั‚ะฝะพ, ะพะบะพะปะพ 80 % ั€ะฐะฑะพั‚ั‹, ะฝะพ ะบะพะผะฟะฐะฝะธั ะฝะต ะทะฐั…ะพั‚ะตะปะฐ ะฟั€ะพะดะพะปะถะฐั‚ัŒ ะฟั€ะพะตะบั‚. ะ’ ะบะพะฝะตั‡ะฝะพะผ ะธั‚ะพะณะต ั ัƒัˆั‘ะป, ะฐ ะบะพะผะฟะฐะฝะธั ัƒะดะฐะปะธะปะฐ ะบะพะด. ะขะฐะบ ะฝะฐั‡ะฐะปัั ะผะพะน ะฟัƒั‚ัŒ ะฒ ัั„ะตั€ะต ะดะพัั‚ัƒะฟะฝะพัั‚ะธ: ัˆะฐะณ ะฒะฟะตั€ั‘ะด, ัˆะฐะณ ะฝะฐะทะฐะด ะธ ัะฝะพะฒะฐ ะฒะฟะตั€ั‘ะด, ะฟะพั‚ะพะผัƒ ั‡ั‚ะพ ะฒะพะทะผะพะถะฝะพัั‚ัŒ ะดะฐั‚ัŒ _ะบะฐะถะดะพะผัƒ_ ัˆะฐะฝั ะพั‚ะบั€ั‹ั‚ัŒ ะดะปั ัะตะฑั ั€ะฐะดะพัั‚ัŒ ะผะฐั‚ะตะผะฐั‚ะธะบะธ ะธ ะฝะฐัƒะบะธ ะฝะฐะฟะพะปะฝะธะปะฐ ะผะพัŽ ะถะธะทะฝัŒ ัะผั‹ัะปะพะผ. + +ะ—ะฐั‚ะตะผ ั ะฟะตั€ะตัˆั‘ะป ะฒ ะบะพะผะฟะฐะฝะธัŽ Design Science, Inc (DSI), ะทะฐะธะฝั‚ะตั€ะตัะพะฒะฐะฝะฝัƒัŽ ะฒ ะพะฑะตัะฟะตั‡ะตะฝะธะธ ะดะพัั‚ัƒะฟะฝะพัั‚ะธ ะผะฐั‚ะตะผะฐั‚ะธะบะธ. ะะตะทะฐะดะพะปะณะพ ะดะพ ัั‚ะพะณะพ DSI ั€ะฐะทั€ะฐะฑะพั‚ะฐะปะฐ MathPlayer โ€” ะฟะพะดะบะปัŽั‡ะฐะตะผั‹ะน ะผะพะดัƒะปัŒ ะดะปั IE6, ะพั‚ะพะฑั€ะฐะถะฐะฒัˆะธะน MathML. ะฏ ะดะพะฑะฐะฒะปัะป ะฒ ะฝะตะณะพ ะฝะพะฒั‹ะต ั„ัƒะฝะบั†ะธะธ ะธ ะฟั€ะธ ะฟะพะดะดะตั€ะถะบะต ะบะพะผะฟะฐะฝะธะธ ะฟะพะดะฐะป ะทะฐัะฒะบัƒ ะฝะฐ ะณั€ะฐะฝั‚ NSF ะดะปั ะพะฑะตัะฟะตั‡ะตะฝะธั ะดะพัั‚ัƒะฟะฝะพัั‚ะธ MathPlayer. ะ—ะฐัะฒะบะฐ ะฑั‹ะปะฐ ะพะดะพะฑั€ะตะฝะฐ, ะฐ ั€ะฐะฑะพั‚ะฐ ะพะบะฐะทะฐะปะฐััŒ ะฒะตััŒะผะฐ ัƒัะฟะตัˆะฝะพะน. ะ’ ะฟะพัะปะตะดัƒัŽั‰ะธะต ะณะพะดั‹ ั ะฟั€ะพะดะพะปะถะฐะป ั€ะฐะทะฒะธะฒะฐั‚ัŒ MathPlayer. ะžะดะฝะฐะบะพ ะธะท ัะพะพะฑั€ะฐะถะตะฝะธะน ะฑะตะทะพะฟะฐัะฝะพัั‚ะธ Internet Explorer ัƒะดะฐะปะธะป ะธะฝั‚ะตั€ั„ะตะนั, ะพั‚ ะบะพั‚ะพั€ะพะณะพ ะทะฐะฒะธัะตะป MathPlayer. ะ’ะพะทะฝะธะบะฐะตั‚ ัะพะฑะปะฐะทะฝ ัะบะฐะทะฐั‚ัŒ, ั‡ั‚ะพ ะธะผะตะฝะฝะพ ัั‚ะพ ะธ ะฟะพะณัƒะฑะธะปะพ IE... ะŸะพัะปะต ัั‚ะพะณะพ MathPlayer ัั‚ะฐะป ะดะพะฟะพะปะฝะตะฝะธะตะผ NVDA, ะฟั€ะตะดะฝะฐะทะฝะฐั‡ะตะฝะฝั‹ะผ ะธัะบะปัŽั‡ะธั‚ะตะปัŒะฝะพ ะดะปั ะพะฑะตัะฟะตั‡ะตะฝะธั ะดะพัั‚ัƒะฟะฝะพัั‚ะธ. ะ”ะฐะปัŒะฝะตะนัˆะฐั ั€ะฐะฑะพั‚ะฐ ะฟะพ ะณั€ะฐะฝั‚ัƒ IES ัะพะฒะผะตัั‚ะฝะพ ั ETS ะฟะพะผะพะณะปะฐ ัƒัะพะฒะตั€ัˆะตะฝัั‚ะฒะพะฒะฐั‚ัŒ ะฒะพะทะผะพะถะฝะพัั‚ะธ MathPlayer. ะคะธะฝะฐะฝัะธั€ัƒะตะผั‹ะต ะณั€ะฐะฝั‚ะพะผ ะฟะพะปัŒะทะพะฒะฐั‚ะตะปัŒัะบะธะต ะธััะปะตะดะพะฒะฐะฝะธั ะดะฐะปะธ ั†ะตะฝะฝัƒัŽ ะธะฝั„ะพั€ะผะฐั†ะธัŽ. + +ะŸะพะดั€ะพะฑะฝะตะต ะพะฑ ะธัั‚ะพั€ะธะธ MathPlayer ะธ ะฟะพัะฒะปะตะฝะธะธ MathCAT ะฒั‹ ะผะพะถะตั‚ะต ัƒะทะฝะฐั‚ัŒ ะฒ ั€ะฐะทะดะตะปะต [ยซะŸะพั‡ะตะผัƒ MathCAT?ยป](#why-mathcat). + +ะะฐ ะฟั€ะพั‚ัะถะตะฝะธะธ ะฒัะตะณะพ ัั‚ะพะณะพ ะฒั€ะตะผะตะฝะธ ั ัั‚ั€ะตะผะธะปัั ะพะฑะตัะฟะตั‡ะธั‚ัŒ ะฟะพะดะดะตั€ะถะบัƒ ะผะฐั‚ะตะผะฐั‚ะธั‡ะตัะบะธั… ะฒั‹ั€ะฐะถะตะฝะธะน ะฒ ะธะฝั‚ะตั€ะฝะตั‚ะต ะธ ัะดะตะปะฐั‚ัŒ ะธั… ะดะพัั‚ัƒะฟะฝั‹ะผะธ. ะ ะฐะฑะพั‚ะฐั ะฒ Wolfram Research, ั ะฟะพะผะพะณ ะทะฐะฟัƒัั‚ะธั‚ัŒ ะฟั€ะพะตะบั‚ W3C MathML ะธ ั ั‚ะตั… ะฟะพั€ ัƒั‡ะฐัั‚ะฒัƒัŽ ะฒ ะดะตัั‚ะตะปัŒะฝะพัั‚ะธ ั€ะฐะฑะพั‡ะตะน ะณั€ัƒะฟะฟั‹. ะกะตะนั‡ะฐั ั ัะฒะปััŽััŒ ัะพะฟั€ะตะดัะตะดะฐั‚ะตะปะตะผ ั€ะฐะฑะพั‡ะตะน ะณั€ัƒะฟะฟั‹ W3C Math. ะ—ะฐ ัั‚ะธ ะณะพะดั‹ ั ั‚ะฐะบะถะต ัƒั‡ะฐัั‚ะฒะพะฒะฐะป ะฒ ั€ะฐะฑะพั‚ะต ะฝะตัะบะพะปัŒะบะธั… ะดั€ัƒะณะธั… ะบะพะผะธั‚ะตั‚ะพะฒ ะธ ะฐะบั‚ะธะฒะฝะพ ะดะพะฑะธะฒะฐะปัั ะฒะบะปัŽั‡ะตะฝะธั ะดะพัั‚ัƒะฟะฝะพัั‚ะธ ะผะฐั‚ะตะผะฐั‚ะธั‡ะตัะบะธั… ะฒั‹ั€ะฐะถะตะฝะธะน ะฒ ะธั… ัั‚ะฐะฝะดะฐั€ั‚ั‹. ะกั€ะตะดะธ ั‚ะฐะบะธั… ะณั€ัƒะฟะฟ โ€” NIMAS, EPUB ะธ PDF/UA. + +ะ”ะปั ะผะตะฝั ะฑะพะปัŒัˆะฐั ั‡ะตัั‚ัŒ, ั‡ั‚ะพ ะฒ 2023 ะณะพะดัƒ ะะฐั†ะธะพะฝะฐะปัŒะฝะฐั ั„ะตะดะตั€ะฐั†ะธั ัะปะตะฟั‹ั… ะฟั€ะธััƒะดะธะปะฐ ะผะฝะต ะฟั€ะตะผะธัŽ ะ”ะถะตะนะบะพะฑะฐ ะ‘ะพะปะพั‚ะธะฝะฐ ะฒ ั€ะฐะทะผะตั€ะต $25 000. ะ˜ะท ัั‚ะพะน ััƒะผะผั‹ ั ะฟะพะถะตั€ั‚ะฒะพะฒะฐะป $15 000 ะฟั€ะพะตะบั‚ัƒ _Open Collective_ ะดะปั ัƒะปัƒั‡ัˆะตะฝะธั ะฟะพะดะดะตั€ะถะบะธ MathML ะฒ ะฑั€ะฐัƒะทะตั€ะฐั…. [ะŸะพ ัั‚ะพะน ััั‹ะปะบะต ะผะพะถะฝะพ ัƒะทะฝะฐั‚ัŒ, ะบะฐะบ ะฟะพะผะพั‡ัŒ ัƒะปัƒั‡ัˆะธั‚ัŒ ะฟะพะดะดะตั€ะถะบัƒ MathML ะฒ ะฑั€ะฐัƒะทะตั€ะฐั…](https://opencollective.com/mathml-core-support). diff --git a/docs/ru/nav-commands.md b/docs/ru/nav-commands.md new file mode 100644 index 000000000..e26f526e7 --- /dev/null +++ b/docs/ru/nav-commands.md @@ -0,0 +1,54 @@ +--- +layout: default +lang: ru +ref: nav-commands +title: ะšะพะผะฐะฝะดั‹ ะฝะฐะฒะธะณะฐั†ะธะธ MathCAT +--- +# ะšะพะผะฐะฝะดั‹ ะฝะฐะฒะธะณะฐั†ะธะธ MathCAT ะธ ัะพะพั‚ะฒะตั‚ัั‚ะฒัƒัŽั‰ะธะต ัะพั‡ะตั‚ะฐะฝะธั ะบะปะฐะฒะธัˆ + +ะŸั€ะธ ะฝะฐะฒะธะณะฐั†ะธะธ ะธัะฟะพะปัŒะทัƒัŽั‚ัั ะดะฒะฐ ะฝะตะทะฐะฒะธัะธะผั‹ั… ั€ะตะถะธะผะฐ: +* ะ ะตะถะธะผ ะพะทะฒัƒั‡ะธะฒะฐะฝะธั ะฟะพัะปะต ะฟะตั€ะตะผะตั‰ะตะฝะธั: ะฒั‹ั€ะฐะถะตะฝะธะต ั‡ะธั‚ะฐะตั‚ัั ะธะปะธ ะพะฟะธัั‹ะฒะฐะตั‚ัั, ั‚ะพ ะตัั‚ัŒ ะฟะพัะปะต ะบะฐะถะดะพะณะพ ะฟะตั€ะตะผะตั‰ะตะฝะธั ะพะทะฒัƒั‡ะธะฒะฐะตั‚ัั ะตะณะพ ะบั€ะฐั‚ะบะพะต ะพะฟะธัะฐะฝะธะต ะธะปะธ ะพะฑะทะพั€. +* ะ ะตะถะธะผ ะฝะฐะฒะธะณะฐั†ะธะธ: ะฟะตั€ะตะผะตั‰ะตะฝะธะต ะฟะพ ะฟะพะดะฒั‹ั€ะฐะถะตะฝะธัะผ, ะฝะตะฑะพะปัŒัˆะธะผ ั„ั€ะฐะณะผะตะฝั‚ะฐะผ ะธะปะธ ัะธะผะฒะพะปะฐะผ. ะกะพั‡ะตั‚ะฐะฝะธั Shift+ัั‚ั€ะตะปะบะฐ ะฒะฝะธะท ะธ Shift+ัั‚ั€ะตะปะบะฐ ะฒะฒะตั€ั… ั†ะธะบะปะธั‡ะตัะบะธ ะฟะตั€ะตะบะปัŽั‡ะฐัŽั‚ ะฑะพะปะตะต ะฟะพะดั€ะพะฑะฝั‹ะต ะธ ะฑะพะปะตะต ะพะฑั‰ะธะต ั€ะตะถะธะผั‹. + +ะžะฑัŠััะฝะตะฝะธะต ัั‚ะธั… ั€ะตะถะธะผะพะฒ ะฟั€ะธะฒะตะดะตะฝะพ ะฟะพัะปะต ั‚ะฐะฑะปะธั†ั‹ ะฒ ั€ะฐะทะดะตะปะต [ยซะ ะตะถะธะผั‹ ะฝะฐะฒะธะณะฐั†ะธะธยป](#navigation-modes). + +ะŸั€ะธะผะตั‡ะฐะฝะธะต: ะฟั€ะธ ะฝะฐะฒะธะณะฐั†ะธะธ ะฟะพ ะฒั‹ั€ะฐะถะตะฝะธัŽ ัะพั‡ะตั‚ะฐะฝะธะต Ctrl+C ะฒ NVDA ะบะพะฟะธั€ัƒะตั‚ ะผะฐั‚ะตะผะฐั‚ะธั‡ะตัะบะพะต ัะพะดะตั€ะถะธะผะพะต ั‚ะตะบัƒั‰ะตะณะพ ัƒะทะปะฐ ะฒ ั„ะพั€ะผะฐั‚ะต MathML, LaTeX, ASCIIMath ะธะปะธ ั‚ะตะบัั‚ะฐ ะดะปั ะพะทะฒัƒั‡ะธะฒะฐะฝะธั. + + +## ะขะฐะฑะปะธั†ะฐ ะบะพะผะฐะฝะด ะฝะฐะฒะธะณะฐั†ะธะธ + +| ะšะปะฐะฒะธัˆะฐ | ะ‘ะตะท ะผะพะดะธั„ะธะบะฐั‚ะพั€ะฐ | + Ctrl | + Shift | + Ctrl + Shift | +| --- | --- | --- | --- | --- | +| **ะกั‚ั€ะตะปะบะฐ ะฒะปะตะฒะพ** | ะŸะตั€ะตะนั‚ะธ ะบ ะฟั€ะตะดั‹ะดัƒั‰ะตะผัƒ ัะปะตะผะตะฝั‚ัƒ | ะ’ ั‚ะฐะฑะปะธั†ะต: ะฟะตั€ะตะนั‚ะธ ะบ ะฟั€ะตะดั‹ะดัƒั‰ะตะน ัั‡ะตะนะบะต.
ะ’ ัั‚ะพะปะฑะธะบะพะฒะพะน ะทะฐะฟะธัะธ: ะฟะตั€ะตะนั‚ะธ ะบ ะฟั€ะตะดั‹ะดัƒั‰ะตะน ั†ะธั„ั€ะต.
ะŸั€ะธะผะตั‡ะฐะฝะธะต: ั‚ะฐะบะถะต ะผะพะถะฝะพ ะธัะฟะพะปัŒะทะพะฒะฐั‚ัŒ Ctrl+Alt+ัั‚ั€ะตะปะบะฐ ะฒะปะตะฒะพ. | ะŸั€ะพั‡ะธั‚ะฐั‚ัŒ ะฟั€ะตะดั‹ะดัƒั‰ะธะน ัะปะตะผะตะฝั‚ | ะžะฟะธัะฐั‚ัŒ ะฟั€ะตะดั‹ะดัƒั‰ะธะน ัะปะตะผะตะฝั‚ | +| **ะกั‚ั€ะตะปะบะฐ ะฒะฟั€ะฐะฒะพ** | ะŸะตั€ะตะนั‚ะธ ะบ ัะปะตะดัƒัŽั‰ะตะผัƒ ัะปะตะผะตะฝั‚ัƒ | ะ’ ั‚ะฐะฑะปะธั†ะต: ะฟะตั€ะตะนั‚ะธ ะบ ัะปะตะดัƒัŽั‰ะตะน ัั‡ะตะนะบะต.
ะ’ ัั‚ะพะปะฑะธะบะพะฒะพะน ะทะฐะฟะธัะธ: ะฟะตั€ะตะนั‚ะธ ะบ ัะปะตะดัƒัŽั‰ะตะน ั†ะธั„ั€ะต.
ะŸั€ะธะผะตั‡ะฐะฝะธะต: ั‚ะฐะบะถะต ะผะพะถะฝะพ ะธัะฟะพะปัŒะทะพะฒะฐั‚ัŒ Ctrl+Alt+ัั‚ั€ะตะปะบะฐ ะฒะฟั€ะฐะฒะพ. | ะŸั€ะพั‡ะธั‚ะฐั‚ัŒ ัะปะตะดัƒัŽั‰ะธะน ัะปะตะผะตะฝั‚ | ะžะฟะธัะฐั‚ัŒ ัะปะตะดัƒัŽั‰ะธะน ัะปะตะผะตะฝั‚ | +| **ะกั‚ั€ะตะปะบะฐ ะฒะฒะตั€ั…** | ะฃะผะตะฝัŒัˆะธั‚ัŒ ะดะตั‚ะฐะปะธะทะฐั†ะธัŽ | ะ’ ั‚ะฐะฑะปะธั†ะต: ะฟะตั€ะตะนั‚ะธ ะบ ัั‡ะตะนะบะต ะฒั‹ัˆะต.
ะ’ ัั‚ะพะปะฑะธะบะพะฒะพะน ะทะฐะฟะธัะธ: ะฟะตั€ะตะนั‚ะธ ะบ ั†ะธั„ั€ะต ะฒั‹ัˆะต.
ะŸั€ะธะผะตั‡ะฐะฝะธะต: ั‚ะฐะบะถะต ะผะพะถะฝะพ ะธัะฟะพะปัŒะทะพะฒะฐั‚ัŒ Ctrl+Alt+ัั‚ั€ะตะปะบะฐ ะฒะฒะตั€ั…. | ะŸะตั€ะตะนั‚ะธ ะบ ะฑะพะปะตะต ะพะฑั‰ะตะผัƒ ั€ะตะถะธะผัƒ ะฝะฐะฒะธะณะฐั†ะธะธ: ั€ะฐััˆะธั€ะตะฝะฝะพะผัƒ, ะฟั€ะพัั‚ะพะผัƒ ะธะปะธ ะฟะพัะธะผะฒะพะปัŒะฝะพะผัƒ | ะฃะผะตะฝัŒัˆะธั‚ัŒ ะดะตั‚ะฐะปะธะทะฐั†ะธัŽ ะดะพ ะผะธะฝะธะผะฐะปัŒะฝะพะน | +| **ะกั‚ั€ะตะปะบะฐ ะฒะฝะธะท** | ะฃะฒะตะปะธั‡ะธั‚ัŒ ะดะตั‚ะฐะปะธะทะฐั†ะธัŽ | ะ’ ั‚ะฐะฑะปะธั†ะต: ะฟะตั€ะตะนั‚ะธ ะบ ัั‡ะตะนะบะต ะฝะธะถะต.
ะ’ ัั‚ะพะปะฑะธะบะพะฒะพะน ะทะฐะฟะธัะธ: ะฟะตั€ะตะนั‚ะธ ะบ ั†ะธั„ั€ะต ะฝะธะถะต.
ะŸั€ะธะผะตั‡ะฐะฝะธะต: ั‚ะฐะบะถะต ะผะพะถะฝะพ ะธัะฟะพะปัŒะทะพะฒะฐั‚ัŒ Ctrl+Alt+ัั‚ั€ะตะปะบะฐ ะฒะฝะธะท. | ะŸะตั€ะตะนั‚ะธ ะบ ะฑะพะปะตะต ะฟะพะดั€ะพะฑะฝะพะผัƒ ั€ะตะถะธะผัƒ ะฝะฐะฒะธะณะฐั†ะธะธ: ั€ะฐััˆะธั€ะตะฝะฝะพะผัƒ, ะฟั€ะพัั‚ะพะผัƒ ะธะปะธ ะฟะพัะธะผะฒะพะปัŒะฝะพะผัƒ | ะฃะฒะตะปะธั‡ะธั‚ัŒ ะดะตั‚ะฐะปะธะทะฐั†ะธัŽ ะดะพ ะผะฐะบัะธะผะฐะปัŒะฝะพะน | +| **Enter** | ะกะพะพะฑั‰ะธั‚ัŒ ั‚ะตะบัƒั‰ัƒัŽ ะฟะพะทะธั†ะธัŽ | ะกะพะพะฑั‰ะธั‚ัŒ ะฟะพะปะฝัƒัŽ ั‚ะตะบัƒั‰ัƒัŽ ะฟะพะทะธั†ะธัŽ |   |   | +| **ะฆะธั„ั€ั‹**
**1โ€“10 (0 ะพะทะฝะฐั‡ะฐะตั‚ 10)** | ะŸะตั€ะตะนั‚ะธ ะบ ะผะตั‚ะบะต ะฟะพะทะธั†ะธะธ | ะฃัั‚ะฐะฝะพะฒะธั‚ัŒ ะผะตั‚ะบัƒ ะฟะพะทะธั†ะธะธ | ะŸั€ะพั‡ะธั‚ะฐั‚ัŒ ัะพะดะตั€ะถะธะผะพะต ะผะตั‚ะบะธ ะฟะพะทะธั†ะธะธ | ะžะฟะธัะฐั‚ัŒ ัะพะดะตั€ะถะธะผะพะต ะผะตั‚ะบะธ ะฟะพะทะธั†ะธะธ | +| **ะŸั€ะพะฑะตะป** | ะŸั€ะพั‡ะธั‚ะฐั‚ัŒ ั‚ะตะบัƒั‰ะธะน ัะปะตะผะตะฝั‚ | ะŸั€ะพั‡ะธั‚ะฐั‚ัŒ ั‚ะตะบัƒั‰ัƒัŽ ัั‡ะตะนะบัƒ | ะŸะตั€ะตะบะปัŽั‡ะธั‚ัŒ ั€ะตะถะธะผ ั€ะตั‡ะธ ะผะตะถะดัƒ ั‡ั‚ะตะฝะธะตะผ ะธ ะพะฟะธัะฐะฝะธะตะผ | ะžะฟะธัะฐั‚ัŒ ั‚ะตะบัƒั‰ะธะน ัะปะตะผะตะฝั‚ | +| **Home** | ะŸะตั€ะตะนั‚ะธ ะบ ะฝะฐั‡ะฐะปัƒ ะฒั‹ั€ะฐะถะตะฝะธั | ะŸะตั€ะตะนั‚ะธ ะบ ะฝะฐั‡ะฐะปัƒ ัั‚ั€ะพะบะธ | ะŸะตั€ะตะนั‚ะธ ะบ ะฝะฐั‡ะฐะปัƒ ัั‚ะพะปะฑั†ะฐ.
ะŸะตั€ะตะนั‚ะธ ะบ ะฒะตั€ั…ะฝะตะน ั†ะธั„ั€ะต. | _ะŸะพะบะฐ ะฝะต ั€ะตะฐะปะธะทะพะฒะฐะฝะพ:_ ะฟั€ะพั‡ะธั‚ะฐั‚ัŒ ะพั‚ ะฝะฐั‡ะฐะปะฐ ะฒั‹ั€ะฐะถะตะฝะธั | +| **End** | ะŸะตั€ะตะนั‚ะธ ะบ ะบะพะฝั†ัƒ ะฒั‹ั€ะฐะถะตะฝะธั | ะŸะตั€ะตะนั‚ะธ ะบ ะบะพะฝั†ัƒ ัั‚ั€ะพะบะธ | ะŸะตั€ะตะนั‚ะธ ะบ ะบะพะฝั†ัƒ ัั‚ะพะปะฑั†ะฐ.
ะŸะตั€ะตะนั‚ะธ ะบ ะฝะธะถะฝะตะน ั†ะธั„ั€ะต. | _ะŸะพะบะฐ ะฝะต ั€ะตะฐะปะธะทะพะฒะฐะฝะพ:_ ะฟั€ะพั‡ะธั‚ะฐั‚ัŒ ะดะพ ะบะพะฝั†ะฐ ะฒั‹ั€ะฐะถะตะฝะธั | +| **Backspace** | ะ’ะตั€ะฝัƒั‚ัŒัั ะบ ะฟั€ะตะดั‹ะดัƒั‰ะตะน ะฟะพะทะธั†ะธะธ |   |   |   | + + +## ะ ะตะถะธะผั‹ ะฝะฐะฒะธะณะฐั†ะธะธ + +MathCAT ะฟะพะดะดะตั€ะถะธะฒะฐะตั‚ ั‚ั€ะธ ั€ะตะถะธะผะฐ ะฝะฐะฒะธะณะฐั†ะธะธ: ั€ะฐััˆะธั€ะตะฝะฝั‹ะน, ะฟั€ะพัั‚ะพะน ะธ ะฟะพัะธะผะฒะพะปัŒะฝั‹ะน. ะŸะตั€ะฒั‹ะต ะดะฒะฐ ั€ะตะถะธะผะฐ ัะปะตะดัƒัŽั‚ ัะผั‹ัะปัƒ ะพะทะฒัƒั‡ะตะฝะฝะพะณะพ ะฒั‹ั€ะฐะถะตะฝะธั, ะตัะปะธ ั‚ะพะปัŒะบะพ ะฝะต ะฒั‹ะฑั€ะฐะฝ ั€ะตะถะธะผ LiteralSpeech. ะะฐะฟั€ะธะผะตั€, ะฒ ะฒั‹ั€ะฐะถะตะฝะธะธ $\vert x+y \rvert > 0$ ะฒะตั€ั‚ะธะบะฐะปัŒะฝั‹ะต ะปะธะฝะธะธ, ะพะฑะพะทะฝะฐั‡ะฐัŽั‰ะธะต ะฐะฑัะพะปัŽั‚ะฝัƒัŽ ะฒะตะปะธั‡ะธะฝัƒ, ะฝะต ั‡ะธั‚ะฐัŽั‚ัั ะฑัƒะบะฒะฐะปัŒะฝะพ. ะ’ะผะตัั‚ะพ ะฝะธั… ะฟั€ะพะธะทะฝะพัะธั‚ัั ยซะผะพะดัƒะปัŒยป. ะŸั€ะธ ัƒะฒะตะปะธั‡ะตะฝะธะธ ะดะตั‚ะฐะปะธะทะฐั†ะธะธ MathCAT ัั€ะฐะทัƒ ะฟะตั€ะตะนะดั‘ั‚ ะบ ั‡ั‚ะตะฝะธัŽ ยซx ะฟะปัŽั yยป. ะ’ ะฟะพัะธะผะฒะพะปัŒะฝะพะผ ั€ะตะถะธะผะต ะฟั€ะธ ะฟะตั€ะตะผะตั‰ะตะฝะธะธ ะฟะพ ะฒั‹ั€ะฐะถะตะฝะธัŽ ะฑัƒะดัƒั‚ ะฟะพัะปะตะดะพะฒะฐั‚ะตะปัŒะฝะพ ะฟั€ะพะธะทะฝะตัะตะฝั‹ ยซะฒะตั€ั‚ะธะบะฐะปัŒะฝะฐั ะปะธะฝะธัยป, ยซxยป, ยซะฟะปัŽัยป, ยซyยป, ยซะฒะตั€ั‚ะธะบะฐะปัŒะฝะฐั ะปะธะฝะธัยป, ยซะฑะพะปัŒัˆะตยป, ยซะฝะพะปัŒยป. + +* _ะ ะฐััˆะธั€ะตะฝะฝั‹ะน ั€ะตะถะธะผ_: ะฟะตั€ะตะผะตั‰ะตะฝะธะต ะผะตะถะดัƒ ะผะฐั‚ะตะผะฐั‚ะธั‡ะตัะบะธ ะทะฝะฐั‡ะธะผั‹ะผะธ ั„ั€ะฐะณะผะตะฝั‚ะฐะผะธ: ะพะฟะตั€ะฐั‚ะพั€ะฐะผะธ, ะพะณั€ะฐะฝะธั‡ะธั‚ะตะปัะผะธ ะธ ะพะฟะตั€ะฐะฝะดะฐะผะธ. +* _ะŸั€ะพัั‚ะพะน ั€ะตะถะธะผ_: ะฟะตั€ะตะผะตั‰ะตะฝะธะต ะฟะพ ัะปะพะฒะฐะผ. ะšะพะณะดะฐ ะฒัั‚ั€ะตั‡ะฐะตั‚ัั ะดะฒัƒะผะตั€ะฝะพะต ะพะฑะพะทะฝะฐั‡ะตะฝะธะต, ะฝะฐะฟั€ะธะผะตั€ ะดั€ะพะฑัŒ ะธะปะธ ะบะพั€ะตะฝัŒ, ะพะฝะพ ั‡ะธั‚ะฐะตั‚ัั ั†ะตะปะธะบะพะผ. ะฃะฒะตะปะธั‡ะตะฝะธะต ะดะตั‚ะฐะปะธะทะฐั†ะธะธ ะฟะพะทะฒะพะปัะตั‚ ะธะทัƒั‡ะธั‚ัŒ ะดะฒัƒะผะตั€ะฝะพะต ะพะฑะพะทะฝะฐั‡ะตะฝะธะต ะฒ ั‚ะพะผ ะถะต ั€ะตะถะธะผะต. ะŸะพัะปะต ัƒะผะตะฝัŒัˆะตะฝะธั ะดะตั‚ะฐะปะธะทะฐั†ะธะธ ะธะปะธ ะฒั‹ั…ะพะดะฐ ะธะท ะดะฒัƒะผะตั€ะฝะพะณะพ ะพะฑะพะทะฝะฐั‡ะตะฝะธั ะฒั‹ะฟะพะปะฝัะตั‚ัั ะฒะพะทะฒั€ะฐั‚ ะฝะฐ ะฒะฝะตัˆะฝะธะน, ะฑะพะปะตะต ะพะฑั‰ะธะน ัƒั€ะพะฒะตะฝัŒ ะฝะฐะฒะธะณะฐั†ะธะธ. +* _ะŸะพัะธะผะฒะพะปัŒะฝั‹ะน ั€ะตะถะธะผ_: ะฒ ะดะตะนัั‚ะฒะธั‚ะตะปัŒะฝะพัั‚ะธ ะฒะบะปัŽั‡ะฐะตั‚ ะดะฒะฐ ะฟะพะปะตะทะฝั‹ั… ั€ะตะถะธะผะฐ โ€” ั€ะตะถะธะผ ัะปะพะฒ ะธ ั€ะตะถะธะผ ัะธะผะฒะพะปะพะฒ. ะงั‚ะพะฑั‹ ะฟะตั€ะตะนั‚ะธ ะบ ะฝะฐัั‚ะพัั‰ะตะผัƒ ะฟะพัะธะผะฒะพะปัŒะฝะพะผัƒ ั€ะตะถะธะผัƒ, ัƒะฒะตะปะธั‡ัŒั‚ะต ะดะตั‚ะฐะปะธะทะฐั†ะธัŽ. ะŸะตั€ะตะผะตั‰ะตะฝะธะต ะฒั‹ะฟะพะปะฝัะตั‚ัั ะฟะพ ัะปะพะฒะฐะผ ะธะปะธ ัะธะผะฒะพะปะฐะผ. ะ ะฐะทะฝะธั†ะฐ ะทะฐะผะตั‚ะฝะฐ ะฒ ะผะฝะพะณะพะทะฝะฐั‡ะฝั‹ั… ั‡ะธัะปะฐั… ะธ ะธะผะตะฝะฐั… ั„ัƒะฝะบั†ะธะน ะธะท ะฝะตัะบะพะปัŒะบะธั… ัะธะผะฒะพะปะพะฒ, ะฝะฐะฟั€ะธะผะตั€ `sin`. ะ’ ะพัั‚ะฐะปัŒะฝั‹ั… ัะปัƒั‡ะฐัั… ะฝะฐะฒะธะณะฐั†ะธั ะฟะพ ัะปะพะฒะฐะผ ะธ ัะธะผะฒะพะปะฐะผ ั€ะฐะฑะพั‚ะฐะตั‚ ะพะดะธะฝะฐะบะพะฒะพ. ะ’ ะพะฑะพะธั… ะฒะฐั€ะธะฐะฝั‚ะฐั… ะดะตั‚ะฐะปะธะทะฐั†ะธั ะดั€ะพะฑะตะน ะธ ะดั€ัƒะณะธั… ะฟะพะดะพะฑะฝั‹ั… ัะปะตะผะตะฝั‚ะพะฒ ัƒะฒะตะปะธั‡ะธะฒะฐะตั‚ัั ะฐะฒั‚ะพะผะฐั‚ะธั‡ะตัะบะธ. + +## ะขะธะฟะธั‡ะฝั‹ะน ัั†ะตะฝะฐั€ะธะน ะธัะฟะพะปัŒะทะพะฒะฐะฝะธั + +ะžะฑั‹ั‡ะฝะพ ะฝะฐะฒะธะณะฐั†ะธั ะฝะฐั‡ะธะฝะฐะตั‚ัั ั ะฟะตั€ะฒะพะณะพ ั‡ะปะตะฝะฐ ะฒั‹ั€ะฐะถะตะฝะธั, ะฟะพัะปะต ั‡ะตะณะพ ะฟะพะปัŒะทะพะฒะฐั‚ะตะปัŒ ะฟั€ะธ ะฝะตะพะฑั…ะพะดะธะผะพัั‚ะธ ะฟะตั€ะตะผะตั‰ะฐะตั‚ัั ะฒะฟั€ะฐะฒะพ. ะ”ะปั ะฟะตั€ะตั…ะพะดะฐ ะผะตะถะดัƒ ัƒั€ะพะฒะฝัะผะธ ะธัะฟะพะปัŒะทัƒัŽั‚ัั ัั‚ั€ะตะปะบะธ ะฒะฒะตั€ั… ะธ ะฒะฝะธะท. ะ”ะปั ะฟะตั€ะตะผะตั‰ะตะฝะธั ะฟะพ ัะปะตะผะตะฝั‚ะฐะผ ั‚ะฐะฑะปะธั†ั‹ ะธัะฟะพะปัŒะทัƒะตั‚ัั Alt+Ctrl+ัั‚ั€ะตะปะบะฐ. + +ะะฐะถะฐั‚ะธะต Backspace ะฒะพะทะฒั€ะฐั‰ะฐะตั‚ ะบ ะฟั€ะตะดั‹ะดัƒั‰ะตะน ะฟะพะทะธั†ะธะธ, ั‡ั‚ะพ ะฝะต ะฒัะตะณะดะฐ ัะพะฒะฟะฐะดะฐะตั‚ ั ะฟะตั€ะตะผะตั‰ะตะฝะธะตะผ ะฒะปะตะฒะพ. ะะฐะฟั€ะธะผะตั€, ะตัะปะธ ัั‚ั€ะตะปะบะฐ ะฒะฟั€ะฐะฒะพ ะฒั‹ะฒะตะปะฐ ะฒะฐั ะธะท ะดั€ะพะฑะธ, Backspace ะฒะตั€ะฝั‘ั‚ ะฒ ั‚ัƒ ะถะต ะฟะพะทะธั†ะธัŽ ะทะฝะฐะผะตะฝะฐั‚ะตะปั, ะฐ ัั‚ั€ะตะปะบะฐ ะฒะปะตะฒะพ ะฟะตั€ะตะนะดั‘ั‚ ะบะพ ะฒัะตะน ะดั€ะพะฑะธ. + +ะ’ะตั€ะพัั‚ะฝะพ, ะฑะพะปัŒัˆัƒัŽ ั‡ะฐัั‚ัŒ ะฒั€ะตะผะตะฝะธ ะฒะฐะผ ะฑัƒะดะตั‚ ัƒะดะพะฑะฝะตะต ะพะดะธะฝ ะพะฟั€ะตะดะตะปั‘ะฝะฝั‹ะน ั€ะตะถะธะผ ะฝะฐะฒะธะณะฐั†ะธะธ. ะ•ะณะพ ะผะพะถะฝะพ ะทะฐะดะฐั‚ัŒ ะฒ ะฝะฐัั‚ั€ะพะนะบะฐั… MathCAT. +ะžะดะฝะฐะบะพ ะฒ ะปัŽะฑะพะน ะผะพะผะตะฝั‚ ะฝะฐะฒะธะณะฐั†ะธะธ ั€ะตะถะธะผ ะผะพะถะฝะพ ะฟะตั€ะตะบะปัŽั‡ะธั‚ัŒ ั ะฟะพะผะพั‰ัŒัŽ Shift+ัั‚ั€ะตะปะบะฐ ะฒะฒะตั€ั… ะธะปะธ Shift+ัั‚ั€ะตะปะบะฐ ะฒะฝะธะท. +ะญั‚ะพ ะฟะพะปะตะทะฝะพ, ะฟะพัะบะพะปัŒะบัƒ ัƒ ะบะฐะถะดะพะณะพ ั€ะตะถะธะผะฐ ะฝะฐะฒะธะณะฐั†ะธะธ ะตัั‚ัŒ ัะฒะพะธ ะฟั€ะตะธะผัƒั‰ะตัั‚ะฒะฐ ะธ ะพะณั€ะฐะฝะธั‡ะตะฝะธั. + +## ะ‘ะปะฐะณะพะดะฐั€ะฝะพัั‚ะธ +ะžะดะฝะฐ ะธะท ะฒะตั€ัะธะน ัั‚ะพะณะพ ะดะพะบัƒะผะตะฝั‚ะฐ ะฑั‹ะปะฐ ะฟะพะดะณะพั‚ะพะฒะปะตะฝะฐ ะฒ ั€ะฐะผะบะฐั… ะฟั€ะพะตะบั‚ะฐ ClearSpeak. +ClearSpeak ะฟะพะดะดะตั€ะถะธะฒะฐะปัั ะ˜ะฝัั‚ะธั‚ัƒั‚ะพะผ ะฟะตะดะฐะณะพะณะธั‡ะตัะบะธั… ะฝะฐัƒะบ ะœะธะฝะธัั‚ะตั€ัั‚ะฒะฐ ะพะฑั€ะฐะทะพะฒะฐะฝะธั ะกะจะ ะฒ ั€ะฐะผะบะฐั… ะณั€ะฐะฝั‚ะฐ R324A110355, ะฟั€ะตะดะพัั‚ะฐะฒะปะตะฝะฝะพะณะพ Educational Testing Service. diff --git a/docs/ru/new_translators_guide_MathCAT_revised.md b/docs/ru/new_translators_guide_MathCAT_revised.md new file mode 100644 index 000000000..a44bb6408 --- /dev/null +++ b/docs/ru/new_translators_guide_MathCAT_revised.md @@ -0,0 +1,568 @@ +--- +layout: default +lang: ru +ref: new-translators-guide +title: ะ ัƒะบะพะฒะพะดัั‚ะฒะพ ะฟะตั€ะตะฒะพะดั‡ะธะบะฐ MathCAT +--- +# ะ ัƒะบะพะฒะพะดัั‚ะฒะพ ะฟะตั€ะตะฒะพะดั‡ะธะบะฐ MathCAT + +ะ’ ัั‚ะพะผ ั€ัƒะบะพะฒะพะดัั‚ะฒะต ะพะฑัŠััะฝัะตั‚ัั, ะบะฐะบ ัะพะทะดะฐั‚ัŒ ะธะปะธ ะพะฑะฝะพะฒะธั‚ัŒ ะฟะตั€ะตะฒะพะด MathCAT. ะ’ ะบะฐั‡ะตัั‚ะฒะต ะฟั€ะธะผะตั€ะฐ ั†ะตะปะตะฒะพะณะพ ัะทั‹ะบะฐ ะธัะฟะพะปัŒะทัƒะตั‚ัั ะฟะพั€ั‚ัƒะณะฐะปัŒัะบะธะน. + +ะ‘ะพะปัŒัˆะฐั ั‡ะฐัั‚ัŒ ั€ัƒะบะพะฒะพะดัั‚ะฒะฐ ะฟะพัะฒัั‰ะตะฝะฐ **ะฟะตั€ะตะฒะพะดัƒ ั€ะตั‡ะธ (TTS)**. ะ•ัะปะธ ะฒั‹ ั€ะฐะฑะพั‚ะฐะตั‚ะต ะฝะฐะด ะ‘ั€ะฐะนะปะตะผ, ะฒัั‘ ั€ะฐะฒะฝะพ ัะฝะฐั‡ะฐะปะฐ ะฟั€ะพั‡ะธั‚ะฐะนั‚ะต ะพะฟะธัะฐะฝะธะต ะพัะฝะพะฒะฝะพะณะพ ะฟั€ะพั†ะตััะฐ: ะฝะฐัั‚ั€ะพะนะบะฐ ัั€ะตะดั‹ ะธ ั‚ะตัั‚ะธั€ะพะฒะฐะฝะธะต ะฒะพ ะผะฝะพะณะพะผ ะฟะพั…ะพะถะธ. ะ—ะฐั‚ะตะผ ะฟะตั€ะตะนะดะธั‚ะต ะบ ั€ะฐะทะดะตะปัƒ [ยซะŸะตั€ะตะฒะพะด ะ‘ั€ะฐะนะปัยป](#braille-translation), ั‡ั‚ะพะฑั‹ ัƒะทะฝะฐั‚ัŒ ะพะฑ ะพั‚ะปะธั‡ะธัั…. + +ะ”ะปั ะบะฐั‡ะตัั‚ะฒะตะฝะฝะพะณะพ ะฟะตั€ะตะฒะพะดะฐ **ะฝะตะพะฑัะทะฐั‚ะตะปัŒะฝะพ** ะฑั‹ั‚ัŒ ะพะฟั‹ั‚ะฝั‹ะผ ะฟั€ะพะณั€ะฐะผะผะธัั‚ะพะผ. ะะตะบะพั‚ะพั€ั‹ะต ัƒัะฟะตัˆะฝั‹ะต ะฟะตั€ะตะฒะพะดั‡ะธะบะธ ะฝะฐั‡ะธะฝะฐะปะธ ั ะฑะฐะทะพะฒั‹ะผะธ ะทะฝะฐะฝะธัะผะธ ะฟั€ะพะณั€ะฐะผะผะธั€ะพะฒะฐะฝะธั ะฑะตะท ะพะฟั‹ั‚ะฐ ั€ะฐะฑะพั‚ั‹ ั YAML ะธ Rust. ะ’ะฐะถะฝะตะต ะฒัะตะณะพ ั…ะพั€ะพัˆะพ ะทะฝะฐั‚ัŒ ั†ะตะปะตะฒะพะน ัะทั‹ะบ, ะฟะพะฝะธะผะฐั‚ัŒ, ะบะฐะบ ะฝะฐ ะฝั‘ะผ ะพะฑั‹ั‡ะฝะพ ะฟั€ะพะธะทะฝะพััั‚ ะธะปะธ ะทะฐะฟะธัั‹ะฒะฐัŽั‚ ะผะฐั‚ะตะผะฐั‚ะธั‡ะตัะบะธะต ะฒั‹ั€ะฐะถะตะฝะธั, ะธ ั‚ั‰ะฐั‚ะตะปัŒะฝะพ ะฟั€ะพะฒะตั€ัั‚ัŒ ั€ะตะทัƒะปัŒั‚ะฐั‚. + +ะ—ะฝะฐะฝะธะต ะผะฐั‚ะตะผะฐั‚ะธะบะธ ะฑัƒะดะตั‚ ะพั‡ะตะฝัŒ ะฟะพะปะตะทะฝะพ. ะะตะพะฑัะทะฐั‚ะตะปัŒะฝะพ ะฑั‹ั‚ัŒ ะฟั€ะพั„ะตััะธะพะฝะฐะปัŒะฝั‹ะผ ะผะฐั‚ะตะผะฐั‚ะธะบะพะผ, ะฝะพ ะฝะตะพะฑั…ะพะดะธะผะพ ะทะฐะผะตั‡ะฐั‚ัŒ ะฝะตะตัั‚ะตัั‚ะฒะตะฝะฝั‹ะต, ะฝะตััะฝั‹ะต ะธะปะธ ะผะฐั‚ะตะผะฐั‚ะธั‡ะตัะบะธ ะฝะตะฒะตั€ะฝั‹ะต ั„ะพั€ะผัƒะปะธั€ะพะฒะบะธ. ะฅะพั€ะพัˆะตะน ะพั‚ะฟั€ะฐะฒะฝะพะน ั‚ะพั‡ะบะพะน ะฑัƒะดะตั‚ ะฒะปะฐะดะตะฝะธะต ัะทั‹ะบะพะผ ะฝะฐ ัƒั€ะพะฒะฝะต ะฝะพัะธั‚ะตะปั ะธ ัƒะฒะตั€ะตะฝะฝะพะต ะทะฝะฐะฝะธะต ะผะฐั‚ะตะผะฐั‚ะธะบะธ ะฟั€ะธะผะตั€ะฝะพ ะฝะฐ ัƒั€ะพะฒะฝะต ัƒะฝะธะฒะตั€ัะธั‚ะตั‚ะฐ. + +## ะžั†ะตะฝะบะฐ ั‚ั€ัƒะดะพะทะฐั‚ั€ะฐั‚ + +ะŸะพะปะฝั‹ะน ะฟะตั€ะตะฒะพะด ั‚ั€ะตะฑัƒะตั‚ ะฒั€ะตะผะตะฝะธ, ะพัะพะฑะตะฝะฝะพ ะตัะปะธ ะฒั‹ ัั‚ั€ะตะผะธั‚ะตััŒ ัะดะตะปะฐั‚ัŒ ะตะณะพ ะฝะฐะดั‘ะถะฝั‹ะผ ะธ ัƒะดะพะฑะฝั‹ะผ. + +ะกัƒะดั ะฟะพ ั€ะตะฐะปัŒะฝั‹ะผ ะฟั€ะพะตะบั‚ะฐะผ, ั‚ั‰ะฐั‚ะตะปัŒะฝั‹ะน ะฟะตั€ะตะฒะพะด TTS ะผะพะถะตั‚ ะทะฐะฝัั‚ัŒ ะพะบะพะปะพ **300โ€“450 ั‡ะฐัะพะฒ**, ะฐ ะฟะตั€ะตะฒะพะด ะ‘ั€ะฐะนะปั โ€” ะพะบะพะปะพ **160โ€“240 ั‡ะฐัะพะฒ**. ะกั€ะพะบะธ ัะธะปัŒะฝะพ ะทะฐะฒะธััั‚ ะพั‚ ะบะฐั‡ะตัั‚ะฒะฐ ะธัั…ะพะดะฝะพะน ะทะฐะณะพั‚ะพะฒะบะธ, ะฝะฐะปะธั‡ะธั ะฟะพั…ะพะถะตะณะพ ัะทั‹ะบะฐ ะธ ะฒะฐัˆะตะณะพ ะพะฟั‹ั‚ะฐ ะฟั€ะพะณั€ะฐะผะผะธั€ะพะฒะฐะฝะธั. + +## ะัƒะถะฝะฐ ะฟะพะผะพั‰ัŒ ะฒ ะฝะฐั‡ะฐะปะต ั€ะฐะฑะพั‚ั‹? + +ะญั‚ะพ ั€ัƒะบะพะฒะพะดัั‚ะฒะพ ะฝะฐะฟะธัะฐะปะธ ะœะฐั€ั‚ะต ะ“ัŒะตะปัŒัั‚ะฐะด, ะขะธะผ ะั€ะฑะพั€ะตะฐะปะธั ะ›ั‘ั‚ะฑะตั€ะณ ะธ ะะฝะดะตั€ั ะญะบะปัƒะฝะด, ัะพะทะดะฐะฒัˆะธะต ะฝะพั€ะฒะตะถัะบะธะน ะธ ัˆะฒะตะดัะบะธะน ะฟะตั€ะตะฒะพะดั‹ MathCAT. ะ•ัะปะธ ะฒะฐะผ ะฝัƒะถะฝะฐ ะฟะพะผะพั‰ัŒ, ะฝะฐะฟะธัˆะธั‚ะต ะฝะฐะผ: + +**[mathcat-wg@daisylists.org](mailto:mathcat-wg@daisylists.org)** + +--- + +## ะ ะตะบะพะผะตะฝะดัƒะตะผั‹ะน ะฟั€ะพั†ะตัั + +ะ ะฐะฑะพั‚ัƒ ะฝะฐะด ะฟะตั€ะตะฒะพะดะพะผ MathCAT ัƒะดะพะฑะฝะพ ะพั€ะณะฐะฝะธะทะพะฒะฐั‚ัŒ ั‚ะฐะบ: + +1. ะะฐัั‚ั€ะพะธั‚ัŒ ั€ะฐะฑะพั‡ัƒัŽ ะบะพะฟะธัŽ. +2. ะžะฑะฝะพะฒะธั‚ัŒ ะธ ะฟั€ะพะฒะตั€ะธั‚ัŒ ะฟะตั€ะตะฒะพะด ั ะฟะพะผะพั‰ัŒัŽ ะฐัƒะดะธั‚ะฐ. +3. ะšะฐะบ ะผะพะถะฝะพ ั€ะฐะฝัŒัˆะต ะฝะฐั‡ะฐั‚ัŒ ัะปัƒัˆะฐั‚ัŒ ั€ะตั‡ัŒ. +4. ะ”ะพะฑะฐะฒะธั‚ัŒ ะธ ะทะฐะฟัƒัั‚ะธั‚ัŒ ั‚ะตัั‚ั‹. +5. ะ˜ะทัƒั‡ะธั‚ัŒ ั€ะตะถะธะผั‹ ั€ะตั‡ะธ ะธ ัƒั€ะพะฒะฝะธ ะฟะพะดั€ะพะฑะฝะพัั‚ะธ. +6. ะ ะฐะฑะพั‚ะฐั‚ัŒ ั ั„ะฐะนะปะฐะผะธ ะฟั€ะฐะฒะธะป. +7. ะŸะพะฟั€ะพัะธั‚ัŒ ะผะฐั‚ะตะผะฐั‚ะธะบะฐ ะฟั€ะพะฒะตั€ะธั‚ัŒ ะฟะตั€ะตะฒะพะด. +8. ะŸั€ะพะฒะตัั‚ะธ ะฟะพะปัŒะทะพะฒะฐั‚ะตะปัŒัะบะพะต ั‚ะตัั‚ะธั€ะพะฒะฐะฝะธะต. +9. ะžั‚ะฟั€ะฐะฒะธั‚ัŒ ะฟะตั€ะตะฒะพะด. +10. ะŸะพะดะดะตั€ะถะธะฒะฐั‚ัŒ ะฟะตั€ะตะฒะพะด ะฒ ะฐะบั‚ัƒะฐะปัŒะฝะพะผ ัะพัั‚ะพัะฝะธะธ. + +--- + +## ะจะฐะณ 1. ะะฐัั‚ั€ะพะนั‚ะต ั€ะฐะฑะพั‡ัƒัŽ ะบะพะฟะธัŽ + +### ะŸะพะปัƒั‡ะธั‚ะต ั€ะตะฟะพะทะธั‚ะพั€ะธะน + +MathCAT ั€ะฐะทะผะตั‰ั‘ะฝ ะฝะฐ GitHub. + +ะ•ัะปะธ ะฒั‹ ั€ะฐะฝัŒัˆะต ะฝะต ะธัะฟะพะปัŒะทะพะฒะฐะปะธ GitHub, ะฝะต ะฟะพะทะฒะพะปัะนั‚ะต ัั‚ะพะผัƒ ะฒะฐั ะพัั‚ะฐะฝะพะฒะธั‚ัŒ. ะ”ะปั ะฟะตั€ะตะฒะพะดะฐ ะฝัƒะถะฝะฐ ะปะธัˆัŒ ะฝะตะฑะพะปัŒัˆะฐั ั‡ะฐัั‚ัŒ ะตะณะพ ะฒะพะทะผะพะถะฝะพัั‚ะตะน: ะฟะพะปัƒั‡ะธั‚ัŒ ะบะพะฟะธัŽ ะฟั€ะพะตะบั‚ะฐ, ั€ะตะดะฐะบั‚ะธั€ะพะฒะฐั‚ัŒ ั„ะฐะนะปั‹ ะธ ัะพั…ั€ะฐะฝัั‚ัŒ ะธะทะผะตะฝะตะฝะธั. + +ะงะฐัั‚ะพ ะฟั€ะพั‰ะต ะฒัะตะณะพ ะฝะฐั‡ะฐั‚ัŒ ั **GitHub Desktop**: +[https://desktop.github.com/](https://desktop.github.com/) + +ะžัะฝะพะฒะฝะพะน ะฟั€ะพั†ะตัั: + +1. ะกะพะทะดะฐะนั‚ะต ั„ะพั€ะบ ั€ะตะฟะพะทะธั‚ะพั€ะธั MathCAT. +2. ะšะปะพะฝะธั€ัƒะนั‚ะต ะตะณะพ ะฝะฐ ัะฒะพะน ะบะพะผะฟัŒัŽั‚ะตั€. +3. ะ ะฐะฑะพั‚ะฐะนั‚ะต ะฒ ัะพะฑัั‚ะฒะตะฝะฝะพะน ะฒะตั‚ะบะต, ะฝะฐะฟั€ะธะผะตั€ `pt`. + +ะญั‚ะพะณะพ ะดะพัั‚ะฐั‚ะพั‡ะฝะพ ะดะปั ะฝะฐั‡ะฐะปะฐ. + +### ะฃัั‚ะฐะฝะพะฒะธั‚ะต ะฝะตะพะฑั…ะพะดะธะผั‹ะต ะธะฝัั‚ั€ัƒะผะตะฝั‚ั‹ + +ะŸะพั‚ั€ะตะฑัƒะตั‚ัั ะฝะตัะบะพะปัŒะบะพ ะธะฝัั‚ั€ัƒะผะตะฝั‚ะพะฒ. ะŸะพะฝะฐั‡ะฐะปัƒ ัะฟะธัะพะบ ะผะพะถะตั‚ ะฟะพะบะฐะทะฐั‚ัŒัั ะดะปะธะฝะฝั‹ะผ, ะฝะพ ัƒ ะบะฐะถะดะพะณะพ ะธะฝัั‚ั€ัƒะผะตะฝั‚ะฐ ะตัั‚ัŒ ััะฝะพะต ะฝะฐะทะฝะฐั‡ะตะฝะธะต. + +* Git: [https://git-scm.com/](https://git-scm.com/) +* GitHub Desktop: [https://desktop.github.com/](https://desktop.github.com/) +* ะ ะตะดะฐะบั‚ะพั€ ะบะพะดะฐ, ะฝะฐะฟั€ะธะผะตั€ VS Code: [https://code.visualstudio.com/](https://code.visualstudio.com/) +* Rust: [https://rust-lang.org/tools/install/](https://rust-lang.org/tools/install/) +* NVDA: [https://www.nvaccess.org/download/](https://www.nvaccess.org/download/) +* MathCAT, ัƒัั‚ะฐะฝะพะฒะปะตะฝะฝั‹ะน ะธะท ะผะฐะณะฐะทะธะฝะฐ ะดะพะฟะพะปะฝะตะฝะธะน NVDA. + +Rust ั‚ั€ะตะฑัƒะตั‚ัั ั‚ะพะปัŒะบะพ ะดะปั ะทะฐะฟัƒัะบะฐ ะฐะฒั‚ะพะผะฐั‚ะธั‡ะตัะบะธั… ั‚ะตัั‚ะพะฒ. ะงั‚ะพะฑั‹ ะฟะตั€ะตะฒะพะดะธั‚ัŒ MathCAT, ะธะทัƒั‡ะฐั‚ัŒ ะฟั€ะพะณั€ะฐะผะผะธั€ะพะฒะฐะฝะธะต ะฝะฐ Rust ะฝะต ะฝัƒะถะฝะพ. + +--- + +## ะจะฐะณ 2. ะžะฑะฝะพะฒะธั‚ะต ะฟะตั€ะตะฒะพะด ะธ ะฒั‹ะฟะพะปะฝะธั‚ะต ะฐัƒะดะธั‚ + +ะŸะตั€ะตะด ะฝะฐั‡ะฐะปะพะผ ะฟะตั€ะตะฒะพะดะฐ ัƒะฑะตะดะธั‚ะตััŒ, ั‡ั‚ะพ ั„ะฐะนะปั‹ ะฒะฐัˆะตะณะพ ัะทั‹ะบะฐ ัะพะพั‚ะฒะตั‚ัั‚ะฒัƒัŽั‚ ั‚ะตะบัƒั‰ะตะน ัั‚ั€ัƒะบั‚ัƒั€ะต ะฐะฝะณะปะธะนัะบะธั… ั„ะฐะนะปะพะฒ. ะ•ัะปะธ ะฟั€ะพะฟัƒัั‚ะธั‚ัŒ ัั‚ะพั‚ ัˆะฐะณ, ะผะพะถะฝะพ ะฟะพั‚ั€ะฐั‚ะธั‚ัŒ ะฒั€ะตะผั ะฝะฐ ะธัะฟั€ะฐะฒะปะตะฝะธะต ะฟั€ะพะฑะปะตะผ, ะฒั‹ะทะฒะฐะฝะฝั‹ั… ัƒัั‚ะฐั€ะตะฒัˆะธะผะธ ั„ะฐะนะปะฐะผะธ. + +### ะ˜ัะฟะพะปัŒะทัƒะนั‚ะต ะธะฝัั‚ั€ัƒะผะตะฝั‚ ะฐัƒะดะธั‚ะฐ + +ะ”ะพะบัƒะผะตะฝั‚ะฐั†ะธั: +[https://github.com/daisy/MathCAT/blob/main/PythonScripts/audit_translations/README.md](https://github.com/daisy/MathCAT/blob/main/PythonScripts/audit_translations/README.md) + +ะ˜ัะฟะพะปัŒะทัƒะนั‚ะต ะธะฝัั‚ั€ัƒะผะตะฝั‚ ะฐัƒะดะธั‚ะฐ, ั‡ั‚ะพะฑั‹ ะฝะฐะนั‚ะธ ะพั‚ััƒั‚ัั‚ะฒัƒัŽั‰ะธะต ะฟั€ะฐะฒะธะปะฐ ะฒ ั„ะฐะนะปะฐั… `pt`, ะธ ะดะพะฑะฐะฒัŒั‚ะต ะธั…. ะŸะพะดั€ะพะฑะฝั‹ะต ะธะฝัั‚ั€ัƒะบั†ะธะธ ะฟั€ะธะฒะตะดะตะฝั‹ ะฒ ะดะพะบัƒะผะตะฝั‚ะฐั†ะธะธ ะธะฝัั‚ั€ัƒะผะตะฝั‚ะฐ, ะฟะพัั‚ะพะผัƒ ะฝะฐั‡ะฝะธั‚ะต ั ะฝะตั‘. + +### ะŸะพ ะฒะพะทะผะพะถะฝะพัั‚ะธ ะฝะฐั‡ะฝะธั‚ะต ั ะฟะพั…ะพะถะตะณะพ ัะทั‹ะบะฐ + +ะ•ัะปะธ ัƒะถะต ััƒั‰ะตัั‚ะฒัƒะตั‚ ะณั€ะฐะผะผะฐั‚ะธั‡ะตัะบะธ ะพั‡ะตะฝัŒ ะฟะพั…ะพะถะธะน ัะทั‹ะบ, ั‡ะฐัั‚ะพ ะปัƒั‡ัˆะต ะฝะฐั‡ะฐั‚ัŒ ั ะฝะตะณะพ, ะฐ ะฝะต ั ะฐะฝะณะปะธะนัะบะพะณะพ ะธะปะธ ะฐะฒั‚ะพะผะฐั‚ะธั‡ะตัะบะธ ัะพะทะดะฐะฝะฝะพะณะพ ะฟะตั€ะตะฒะพะดะฐ. + +ะะฐะฟั€ะธะผะตั€, ะฝะพั€ะฒะตะถัะบะธะน ะฟะตั€ะตะฒะพะด ะฑั‹ะป ะพัะฝะพะฒะฐะฝ ะฝะฐ ัˆะฒะตะดัะบะพะผ. ะญั‚ะพ ะผะพะถะตั‚ ะทะฝะฐั‡ะธั‚ะตะปัŒะฝะพ ััะบะพะฝะพะผะธั‚ัŒ ะฒั€ะตะผั, ะพัะพะฑะตะฝะฝะพ ะตัะปะธ ะณั€ะฐะผะผะฐั‚ะธะบะฐ ะธ ะฟะพั€ัะดะพะบ ัะปะพะฒ ัะธัั‚ะตะผะฐั‚ะธั‡ะตัะบะธ ะพั‚ะปะธั‡ะฐัŽั‚ัั ะพั‚ ะฐะฝะณะปะธะนัะบะธั…. ะะพ ะฟะตั€ะตะด ะฟะตั€ะตะฒะพะดะพะผ ะฝะฐ ัะฒะพะน ัะทั‹ะบ ะฒัั‘ ั€ะฐะฒะฝะพ ะธัะฟะพะปัŒะทัƒะนั‚ะต ะธะฝัั‚ั€ัƒะผะตะฝั‚ ะฐัƒะดะธั‚ะฐ ะดะปั ะฟะพะธัะบะฐ ะพั‚ััƒั‚ัั‚ะฒัƒัŽั‰ะธั… ะฟั€ะฐะฒะธะป. + +--- + +## ะจะฐะณ 3. ะšะฐะบ ะผะพะถะฝะพ ั€ะฐะฝัŒัˆะต ะฝะฐั‡ะฝะธั‚ะต ัะปัƒัˆะฐั‚ัŒ ั€ะตั‡ัŒ + +ะกะปัƒัˆะฐะนั‚ะต ั€ะตะทัƒะปัŒั‚ะฐั‚ ะฟะพ ะผะตั€ะต ั€ะฐะฑะพั‚ั‹, ั‡ั‚ะพะฑั‹ ะฑั‹ัั‚ั€ะพ ะทะฐะผะตั‡ะฐั‚ัŒ ะพัˆะธะฑะบะธ. ะŸะตั€ะตะฒะพะด ะผะพะถะตั‚ ะฒั‹ะณะปัะดะตั‚ัŒ ะฑะตะทัƒะฟั€ะตั‡ะฝะพ ะฒ ั„ะฐะนะปะต YAML, ะฝะพ ะฟั€ะธ ะพะทะฒัƒั‡ะธะฒะฐะฝะธะธ ะพะบะฐะทะฐั‚ัŒัั ะฝะตะตัั‚ะตัั‚ะฒะตะฝะฝั‹ะผ, ะฟะพะฒั‚ะพั€ััŽั‰ะธะผัั ะธะปะธ ะฝะตััะฝั‹ะผ. ะŸะพัะปะต ะฟะตั€ะตะฒะพะดะฐ ะบะฐะถะดะพะณะพ ั„ะฐะนะปะฐ ะฟะพะปะตะทะฝะพ ะฟั€ะพัะปัƒัˆะฐั‚ัŒ ะฝะตัะบะพะปัŒะบะพ ะฒั‹ั€ะฐะถะตะฝะธะน ั ะฟะพะผะพั‰ัŒัŽ ะฟั€ะพะณั€ะฐะผะผั‹ ัะบั€ะฐะฝะฝะพะณะพ ะดะพัั‚ัƒะฟะฐ. + +### ะะฐัั‚ั€ะพะนั‚ะต NVDA ะดะปั ะปะพะบะฐะปัŒะฝั‹ั… ะฟั€ะฐะฒะธะป + +1. ะกะบะฐั‡ะฐะนั‚ะต NVDA: [https://www.nvaccess.org/download/](https://www.nvaccess.org/download/). +2. ะ’ NVDA ะพั‚ะบั€ะพะนั‚ะต **ะกะตั€ะฒะธั โ†’ ะœะฐะณะฐะทะธะฝ ะดะพะฟะพะปะฝะตะฝะธะน** ะธ ัƒัั‚ะฐะฝะพะฒะธั‚ะต MathCAT. +3. ะกะพะทะดะฐะนั‚ะต ะบะพะฟะธัŽ ะบะฐั‚ะฐะปะพะณะฐ ัะฒะพะตะณะพ ัะทั‹ะบะฐ, ะฝะฐะฟั€ะธะผะตั€ `pt`, ะธ ะดะพะฑะฐะฒัŒั‚ะต ะตั‘ ะฒ: + +```text +%AppData%\nvda\addons\MathCAT\globalPlugins\MathCAT\Rules\Languages +``` + +ะขะตะฟะตั€ัŒ ะปะพะบะฐะปัŒะฝั‹ะน ะฟะตั€ะตะฒะพะด ะผะพะถะฝะพ ัะปัƒัˆะฐั‚ัŒ ะฒ NVDA. + +### ะŸั€ะพะฒะตั€ัะนั‚ะต ั€ะตะฐะปัŒะฝั‹ะต ะฒั‹ั€ะฐะถะตะฝะธั + +ะ”ะปั ะฟั€ะฐะบั‚ะธั‡ะตัะบะพะน ะฟั€ะพะฒะตั€ะบะธ ั€ะตั‡ะธ ะฒะพะทัŒะผะธั‚ะต ะฒั‹ั€ะฐะถะตะฝะธั MathML ะธะท ั„ะฐะนะปะพะฒ ั‚ะตัั‚ะพะฒ Rust ะธ ะฟะพะผะตัั‚ะธั‚ะต ะธั… ะฒ ะฟั€ะพัั‚ะพะน HTML-ะดะพะบัƒะผะตะฝั‚. ะ—ะฐั‚ะตะผ ะพั‚ะบั€ะพะนั‚ะต ั„ะฐะนะป ะธ ะฟั€ะพัะปัƒัˆะฐะนั‚ะต ะตะณะพ ะฒ NVDA. + +ะ’ะฝะพัะธั‚ะต ะฟะพ ะพะดะฝะพะผัƒ ะธะทะผะตะฝะตะฝะธัŽ, ัะฝะพะฒะฐ ัะปัƒัˆะฐะนั‚ะต ั€ะตะทัƒะปัŒั‚ะฐั‚ ะธ ะดะตะปะฐะนั‚ะต ะทะฐะผะตั‚ะบะธ. ะขะฐะบ ัƒะดะพะฑะฝะพ ะธะทัƒั‡ะฐั‚ัŒ ั€ะตะฐะปัŒะฝะพะต ะฟะพะฒะตะดะตะฝะธะต ะฟั€ะฐะฒะธะป. + +--- + +## ะจะฐะณ 4. ะ”ะพะฑะฐะฒัŒั‚ะต ะธ ะทะฐะฟัƒัั‚ะธั‚ะต ั‚ะตัั‚ั‹ + +ะะฒั‚ะพะผะฐั‚ะธั‡ะตัะบะธะต ั‚ะตัั‚ั‹ โ€” ะฒะฐะถะฝะตะนัˆะฐั ั‡ะฐัั‚ัŒ ะฟั€ะพั†ะตััะฐ. ะžะฝะธ ะฟะพะผะพะณะฐัŽั‚ ะพะฑะฝะฐั€ัƒะถะธะฒะฐั‚ัŒ ัะธะฝั‚ะฐะบัะธั‡ะตัะบะธะต ะพัˆะธะฑะบะธ, ะดะพะบัƒะผะตะฝั‚ะธั€ัƒัŽั‚ ะพะถะธะดะฐะตะผัƒัŽ ั€ะตั‡ัŒ ะธ ะฟะพะทะฒะพะปััŽั‚ ัƒะฑะตะดะธั‚ัŒัั, ั‡ั‚ะพ ะฑัƒะดัƒั‰ะธะต ะธะทะผะตะฝะตะฝะธั MathCAT ะฝะตะทะฐะผะตั‚ะฝะพ ะฝะต ะฝะฐั€ัƒัˆะฐั‚ ะฟะตั€ะตะฒะพะด. ะŸะพะปะตะทะฝะพ ะฟะตั€ะตะฒะพะดะธั‚ัŒ ั‚ะตัั‚ั‹ ะฟะพ ะผะตั€ะต ั€ะฐะฑะพั‚ั‹, ะฐ ะฝะต ะพั‚ะบะปะฐะดั‹ะฒะฐั‚ัŒ ะธั… ะฝะฐะฟะพัะปะตะดะพะบ. + +ะžั‚ะบั€ะพะนั‚ะต ั„ะฐะนะป `languages.rs` ะฒ `MathCAT/tests` ะธ ะดะพะฑะฐะฒัŒั‚ะต ัั‚ั€ะพะบัƒ, ะฒ ัะปัƒั‡ะฐะต ะฟะพั€ั‚ัƒะณะฐะปัŒัะบะพะณะพ ัะทั‹ะบะฐ: + +```rust +mod pt; +``` + +ะ—ะฐั‚ะตะผ ะฒ ะบะฐั‚ะฐะปะพะณะต `MathCAT/tests/Languages`: + +1. ะกะบะพะฟะธั€ัƒะนั‚ะต `en.rs` ะฒ `pt.rs`. +2. ะกะบะพะฟะธั€ัƒะนั‚ะต ะบะฐั‚ะฐะปะพะณ `en` ะฒ `pt`. + +ะ•ัะปะธ ัะฝะฐั‡ะฐะปะฐ ะฒั‹ ะฒั‹ะฑั€ะฐะปะธ ั‚ะพะปัŒะบะพ ะพะดะธะฝ ัั‚ะธะปัŒ ั€ะตั‡ะธ, ะดั€ัƒะณะพะน ะผะพะถะฝะพ ัƒะดะฐะปะธั‚ัŒ ะธะปะธ ะทะฐะบะพะผะผะตะฝั‚ะธั€ะพะฒะฐั‚ัŒ. + +ะ’ ะบะฐะถะดะพะผ ั‚ะตัั‚ะต ะทะฐะผะตะฝะธั‚ะต `"en"` ะฝะฐ `"pt"`. + +ะŸะพัะปะต ัั‚ะพะณะพ ะทะฐะฟัƒัั‚ะธั‚ะต: + +```bash +cargo test Languages::pt +``` + +ะ’ะตั€ะพัั‚ะฝะพ, ะฟั€ะธ ะฟะตั€ะฒะพะผ ะทะฐะฟัƒัะบะต ะผะฝะพะณะธะต ั‚ะตัั‚ั‹ ะทะฐะฒะตั€ัˆะฐั‚ัั ั ะพัˆะธะฑะบะพะน. ะญั‚ะพ ะฝะพั€ะผะฐะปัŒะฝะพ. + +### ะŸะพะฝะธะผะฐะฝะธะต ะพัˆะธะฑะพะบ ั‚ะตัั‚ะพะฒ + +ะขะธะฟะธั‡ะฝะพะต ัะพะพะฑั‰ะตะฝะธะต ะพะฑ ะพัˆะธะฑะบะต ะฒั‹ะณะปัะดะธั‚ ะฟั€ะธะผะตั€ะฝะพ ั‚ะฐะบ: + +```rust +left: "1 half" +right: "1 halv" +``` + +ะ“ะปะฐะฒะฝะพะต ะทะดะตััŒ โ€” ัั€ะฐะฒะฝะตะฝะธะต: + +* `left` โ€” ะพะถะธะดะฐะตะผั‹ะน ั‚ะตะบัั‚, ะทะฐะฟะธัะฐะฝะฝั‹ะน ะฒ ั‚ะตัั‚ะต; +* `right` โ€” ั‚ะตะบัั‚, ั„ะฐะบั‚ะธั‡ะตัะบะธ ัะพะทะดะฐะฝะฝั‹ะน MathCAT. + +ะ•ัะปะธ ัะพะทะดะฐะฝะฝั‹ะน ั‚ะตะบัั‚ ะฒะตั€ะตะฝ, ัะบะพะฟะธั€ัƒะนั‚ะต ะตะณะพ ะฒ ั‚ะตัั‚. ะ•ัะปะธ ะฝะตะฒะตั€ะตะฝ, ะธัะฟั€ะฐะฒัŒั‚ะต ะฟั€ะฐะฒะธะปะพ. + +ะ˜ะฝะพะณะดะฐ ะฑั‹ัั‚ั€ะตะต ะทะฐะฟัƒัั‚ะธั‚ัŒ ั‚ะตัั‚ั‹ ะดะพ ะฟะตั€ะตะฒะพะดะฐ ะฒัะตั… ะพะถะธะดะฐะตะผั‹ั… ั€ะตะทัƒะปัŒั‚ะฐั‚ะพะฒ. ะกะพะพะฑั‰ะตะฝะธั ะพะฑ ะพัˆะธะฑะบะฐั… ะฟะพะบะฐะถัƒั‚, ั‡ั‚ะพ MathCAT ัƒะถะต ัะพะทะดะฐั‘ั‚ ะฝะฐ ะฒะฐัˆะตะผ ัะทั‹ะบะต, ะธ ะฟั€ะฐะฒะธะปัŒะฝั‹ะต ัั‚ั€ะพะบะธ ะผะพะถะฝะพ ะฑัƒะดะตั‚ ะฟะตั€ะตะฝะตัั‚ะธ ะฒ ั‚ะตัั‚ั‹. + +### ะŸั€ะธะผะตั€ ะฟั€ะพัั‚ะพะณะพ ั‚ะตัั‚ะฐ + +```rust +#[test] +fn common_fraction_half() -> Result<()> { + let expr = " + 1 2 + "; + test("pt", "ClearSpeak", expr, "um meio")?; + return Ok(()); +} +``` + +ะ—ะดะตััŒ: + +* `common_fraction_half` โ€” ะธะผั ั‚ะตัั‚ะฐ; +* `expr` ัะพะดะตั€ะถะธั‚ ะฒั‹ั€ะฐะถะตะฝะธะต MathML; +* `"pt"` โ€” ะบะพะด ัะทั‹ะบะฐ; +* `"ClearSpeak"` โ€” ั€ะตะถะธะผ ั€ะตั‡ะธ; +* `"um meio"` โ€” ะพะถะธะดะฐะตะผั‹ะน ั‚ะตะบัั‚ ะดะปั ะพะทะฒัƒั‡ะธะฒะฐะฝะธั. + +### ะŸั€ะธะผะตั€ ั ะฝะฐัั‚ั€ะพะนะบะฐะผะธ + +ะะตะบะพั‚ะพั€ั‹ะต ั‚ะตัั‚ั‹ ะธัะฟะพะปัŒะทัƒัŽั‚ `test_prefs`, ั‡ั‚ะพะฑั‹ ะฟั€ะพะฒะตั€ัั‚ัŒ ะฟั€ะฐะฒะธะปะพ ั ะทะฐะดะฐะฝะฝั‹ะผะธ ะฝะฐัั‚ั€ะพะนะบะฐะผะธ. + +```rust +#[test] +fn common_fraction_tenths() -> Result<()> { + let expr = " + 17 10 + "; + test_prefs("en", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Fractions", "Auto")], expr, "17 tenths")?; + test_prefs("en", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Fractions", "Ordinal")], expr, "17 tenths")?; + return Ok(()); +} +``` + +ะ’ ั‚ะฐะบะธั… ั‚ะตัั‚ะฐั…: + +* `test_prefs` ะทะฐะฟัƒัะบะฐะตั‚ ะพะฑั€ะฐะฑะพั‚ะบัƒ ะฒั‹ั€ะฐะถะตะฝะธั ั ะทะฐะดะฐะฝะฝั‹ะผะธ ะฝะฐัั‚ั€ะพะนะบะฐะผะธ; +* `vec![]` ัะพะดะตั€ะถะธั‚ ัั‚ะธ ะฝะฐัั‚ั€ะพะนะบะธ; +* `("Verbosity", "Medium")` ะทะฐะดะฐั‘ั‚ ัƒั€ะพะฒะตะฝัŒ ะฟะพะดั€ะพะฑะฝะพัั‚ะธ; +* `("ClearSpeak_Fractions", "Auto")` ะทะฐะดะฐั‘ั‚ ะฝะฐัั‚ั€ะพะนะบัƒ ClearSpeak. + +ะ’ ะฝะตะบะพั‚ะพั€ั‹ั… ะผะตัั‚ะฐั… MathCAT ั‚ะฐะบะถะต ะดะพะฑะฐะฒะปัะตั‚ ะฟะฐัƒะทั‹. ะ’ ัั‚ั€ะพะบะฐั… ั‚ะตัั‚ะพะฒ ะพะฝะธ ะพะฑะพะทะฝะฐั‡ะฐัŽั‚ัั ะทะฝะฐะบะฐะผะธ ะฟั€ะตะฟะธะฝะฐะฝะธั, ะฝะฐะฟั€ะธะผะตั€ ะทะฐะฟัั‚ั‹ะผะธ ะธ ั‚ะพั‡ะบะฐะผะธ ั ะทะฐะฟัั‚ะพะน. ะ•ัะปะธ ั€ะตะทัƒะปัŒั‚ะฐั‚ั‹ ะฟะพั‡ั‚ะธ ัะพะฒะฟะฐะดะฐัŽั‚, ะฒัะตะณะดะฐ ะฟั€ะพะฒะตั€ัะนั‚ะต, ะฝะต ัะฒัะทะฐะฝะฐ ะปะธ ั€ะฐะทะฝะธั†ะฐ ั ะฟะฐัƒะทะฐะผะธ, ะฐ ะฝะต ั ั„ะพั€ะผัƒะปะธั€ะพะฒะบะพะน. + +--- + +## ะจะฐะณ 5. ะ˜ะทัƒั‡ะธั‚ะต ั€ะตะถะธะผั‹ ั€ะตั‡ะธ ะธ ัƒั€ะพะฒะฝะธ ะฟะพะดั€ะพะฑะฝะพัั‚ะธ + +ะ•ัั‚ัŒ ะดะฒะฐ ะพัะฝะพะฒะฝั‹ั… ั€ะตะถะธะผะฐ ั€ะตั‡ะธ: ClearSpeak ะธ SimpleSpeak. ะ’ ัั‚ะฐั‚ัŒะต ะะธะปะฐ [A Comparison of Different Styles of Speech for Mathematics](https://scholarworks.calstate.edu/downloads/5t34sv64c) ั…ะพั€ะพัˆะพ ะพะฑัŠััะฝัะตั‚ัั ั€ะฐะทะปะธั‡ะธะต ะผะตะถะดัƒ ะฝะธะผะธ. ะšั€ะฐั‚ะบะพ: + +* ClearSpeak ะดะพะปะถะตะฝ ะฑั‹ั‚ัŒ ะฟะพั…ะพะถ ะฝะฐ ั‚ะพ, ะบะฐะบ ัƒั‡ะธั‚ะตะปัŒ ะฟั€ะพะธะทะฝะพัะธั‚ ะผะฐั‚ะตะผะฐั‚ะธั‡ะตัะบะพะต ะฒั‹ั€ะฐะถะตะฝะธะต ะฝะฐ ัƒั€ะพะบะต. +* SimpleSpeak ะบะพะผะฟะฐะบั‚ะฝะพ ะพะทะฒัƒั‡ะธะฒะฐะตั‚ ะฟั€ะพัั‚ั‹ะต ะฒั‹ั€ะฐะถะตะฝะธั. ะะฐะฟั€ะธะผะตั€, $\frac{x}{y} + 1$ ั‡ะธั‚ะฐะตั‚ัั ะบะฐะบ ยซx over y plus oneยป. ะกะปะพะฒะฐ, ะพะฑะพะทะฝะฐั‡ะฐัŽั‰ะธะต ะฝะฐั‡ะฐะปะพ ะธ ะบะพะฝะตั† ะดั€ะพะฑะธ, ะฝะต ะธัะฟะพะปัŒะทัƒัŽั‚ัั, ะฟะพั‚ะพะผัƒ ั‡ั‚ะพ ั‡ะธัะปะธั‚ะตะปัŒ ะธ ะทะฝะฐะผะตะฝะฐั‚ะตะปัŒ ะฟั€ะพัั‚ั‹. ะ’ั‹ั€ะฐะถะตะฝะธะต $\frac{x}{y+1}$ ั‡ะธั‚ะฐะตั‚ัั ะบะฐะบ ยซfraction, x over y plus one, end fractionยป. ะ—ะดะตััŒ ั‚ะฐะบะธะต ัะปะพะฒะฐ ะธัะฟะพะปัŒะทัƒัŽั‚ัั, ะฟะพัะบะพะปัŒะบัƒ ะทะฝะฐะผะตะฝะฐั‚ะตะปัŒ ะฝะต ัะฒะปัะตั‚ัั ะฟั€ะพัั‚ั‹ะผ. + +ะ’ั‹ ะผะพะถะตั‚ะต ะฟะตั€ะตะฒะตัั‚ะธ ะพะฑะฐ ัั‚ะธะปั ั€ะตั‡ะธ ะธะปะธ ัะพัั€ะตะดะพั‚ะพั‡ะธั‚ัŒัั ะฝะฐ ะพะดะฝะพะผ. ะ’ ะทะฐะฒะธัะธะผะพัั‚ะธ ะพั‚ ะฟั€ะธะฝัั‚ะพะณะพ ัะฟะพัะพะฑะฐ ะฟั€ะพะธะทะฝะตัะตะฝะธั ะผะฐั‚ะตะผะฐั‚ะธั‡ะตัะบะธั… ะฒั‹ั€ะฐะถะตะฝะธะน ะฒ ั†ะตะปะตะฒะพะผ ัะทั‹ะบะต ะฟะตั€ะตะฒะตะดั‘ะฝะฝั‹ะต ัั‚ะธะปะธ ะผะพะณัƒั‚ ั€ะฐะทะปะธั‡ะฐั‚ัŒัั ัะธะปัŒะฝะตะต ะธะปะธ ัะปะฐะฑะตะต ะฐะฝะณะปะธะนัะบะธั…. + +MathCAT ั‚ะฐะบะถะต ะฟะพะดะดะตั€ะถะธะฒะฐะตั‚ ัƒั€ะพะฒะฝะธ ะฟะพะดั€ะพะฑะฝะพัั‚ะธ **Terse**, **Medium** ะธ **Verbose**. ะŸะตั€ะตะฒะพะดั‡ะธะบ ัะฐะผ ะพะฟั€ะตะดะตะปัะตั‚, ะฝะฐัะบะพะปัŒะบะพ ะพะฝะธ ะดะพะปะถะฝั‹ ั€ะฐะทะปะธั‡ะฐั‚ัŒัั ะฒ ะตะณะพ ัะทั‹ะบะต. ะ˜ะฝะพะณะดะฐ ะตัั‚ะตัั‚ะฒะตะฝะฝั‹ะน ะฟะตั€ะตะฒะพะด ะพะฑัŠะตะดะธะฝัะตั‚ ะดะฒะฐ ะฐะฝะณะปะธะนัะบะธั… ะฒะฐั€ะธะฐะฝั‚ะฐ ะฒ ะพะดะธะฝ, ะฝะฐะฟั€ะธะผะตั€ ะตัะปะธ ะฒ ั†ะตะปะตะฒะพะผ ัะทั‹ะบะต ะฝะตั‚ ัะปะพะฒะฐ `the`. ะ’ ะดั€ัƒะณะธั… ัะปัƒั‡ะฐัั… ะดะปั ะพะดะฝะพะณะพ ะฐะฝะณะปะธะนัะบะพะณะพ ะฒะฐั€ะธะฐะฝั‚ะฐ ะผะพะถะตั‚ ััƒั‰ะตัั‚ะฒะพะฒะฐั‚ัŒ ะฝะตัะบะพะปัŒะบะพ ัะฟะพัะพะฑะพะฒ ะฟั€ะพะธะทะฝะตัั‚ะธ ะฒั‹ั€ะฐะถะตะฝะธะต. ะญั‚ะพ ะฝะพั€ะผะฐะปัŒะฝะพ. ะฏัะฝะพัั‚ัŒ ะฒะฐะถะฝะตะต ะธัะบัƒััั‚ะฒะตะฝะฝะพ ัะพะทะดะฐะฝะฝั‹ั… ั€ะฐะทะปะธั‡ะธะน. + +ะ’ ClearSpeak ะดะพัั‚ัƒะฟะฝะพ ะผะฝะพะณะพ ะฝะฐัั‚ั€ะพะตะบ, ะธัะฟะพะปัŒะทัƒะตะผั‹ั… ะฒ ะฟั€ะฐะฒะธะปะฐั… ะธ ั‚ะตัั‚ะฐั…. ะŸะพะดั€ะพะฑะฝะตะต ัะผ. [ะฝะฐัั‚ั€ะพะนะบะธ ClearSpeak](https://github.com/daisy/MathCAT/blob/main/docs/ClearSpeakRulesAndPreferences.docx). ะกะตะนั‡ะฐั ัั‚ะธ ะฝะฐัั‚ั€ะพะนะบะธ ะฝะต ะฒะธะดะฝั‹ ะฟะพะปัŒะทะพะฒะฐั‚ะตะปัะผ ะฒ ะฝะฐัั‚ั€ะพะนะบะฐั… MathCAT ะฒ NVDA. + +--- + +## ะจะฐะณ 6. ะ ะฐะฑะพั‚ะฐะนั‚ะต ั ั„ะฐะนะปะฐะผะธ ะฟั€ะฐะฒะธะป + +### ะšะฐะบะธะต ั„ะฐะนะปั‹ ั‚ั€ะตะฑัƒะตั‚ัั ะฟะตั€ะตะฒะตัั‚ะธ? + +ะžัะฝะพะฒะฝะฐั ั€ะฐะฑะพั‚ะฐ ะฒั‹ะฟะพะปะฝัะตั‚ัั ะฒ ั„ะฐะนะปะฐั… ะฟั€ะฐะฒะธะป YAML. ะŸั€ะธ ะฟะตั€ะตะฒะพะดะต ะฝะฐ ะฟะพั€ั‚ัƒะณะฐะปัŒัะบะธะน ัะทั‹ะบ ั„ะฐะนะปั‹ ะฝะฐั…ะพะดัั‚ัั ะฒ ะบะฐั‚ะฐะปะพะณะต `MathCAT\Rules\Languages\pt`: + +* `ClearSpeak_Rules.yaml` +* `definitions.yaml` +* `navigate.yaml` +* `overview.yaml` (ะฝะตะพะฑัะทะฐั‚ะตะปัŒะฝะพ) +* `SimpleSpeak_Rules.yaml` +* `unicode.yaml` +* `unicode-full.yaml` (ั‡ะฐัั‚ะธั‡ะฝะพ ะฝะตะพะฑัะทะฐั‚ะตะปัŒะฝะพ) + +ะ’ ะฟะพะดะบะฐั‚ะฐะปะพะณะต `MathCAT\Rules\Languages\pt\SharedRules` ะฝะฐั…ะพะดัั‚ัั ะฝะตะฑะพะปัŒัˆะธะต ะฟั€ะฐะฒะธะปะฐ, ะธะท ะบะพั‚ะพั€ั‹ั… ัะพัั‚ะพัั‚ ะฟั€ะฐะฒะธะปะฐ ะฒ `ClearSpeak_Rules.yaml` ะธ `SimpleSpeak_Rules.yaml`. ะ’ัะต ัั‚ะธ ั„ะฐะนะปั‹ ั‚ะฐะบะถะต ั‚ั€ะตะฑัƒะตั‚ัั ะฟะตั€ะตะฒะตัั‚ะธ. + +### ะก ั‡ะตะณะพ ะฝะฐั‡ะฐั‚ัŒ + +ะ”ะปั ะทะฝะฐะบะพะผัั‚ะฒะฐ ั ะฟั€ะธะฝั†ะธะฟะฐะผะธ ั€ะฐะฑะพั‚ั‹ ะฟั€ะฐะฒะธะป ัƒะดะพะฑะฝะพ ะฝะฐั‡ะฐั‚ัŒ, ะฝะฐะฟั€ะธะผะตั€, ั `ClearSpeak_Rules.yaml` ะธ ะฝะตัะบะพะปัŒะบะธั… ั„ะฐะนะปะพะฒ ะธะท `SharedRules`. + +ะšะฐะบ ัƒะบะฐะทะฐะฝะพ ะฒั‹ัˆะต, ะผะฝะพะณะธะต ะฝะตะพะฑั…ะพะดะธะผั‹ะต ะธะทะผะตะฝะตะฝะธั ะฑัƒะดัƒั‚ ะพะฑะฝะฐั€ัƒะถะตะฝั‹ ั ะฟะพะผะพั‰ัŒัŽ ั‚ะตัั‚ะพะฒ. ะžะดะฝะฐะบะพ ั„ะฐะนะปั‹ `unicode.yaml`, `unicode-full.yaml`, `navigate.yaml` ะธ `definitions.yaml` ะฝะตะดะพัั‚ะฐั‚ะพั‡ะฝะพ ั…ะพั€ะพัˆะพ ะฟะพะบั€ั‹ั‚ั‹ ั‚ะตัั‚ะฐะผะธ ะธ ั‚ั€ะตะฑัƒัŽั‚ ะพัะพะฑะพะณะพ ะฒะฝะธะผะฐะฝะธั ะฟั€ะธ ั€ัƒั‡ะฝะพะน ะฟั€ะพะฒะตั€ะบะต. + +ะะต ั‚ั€ะฐั‚ัŒั‚ะต ะผะฝะพะณะพ ะฒั€ะตะผะตะฝะธ ะฝะฐ `unicode-full.yaml` ะฒ ะฝะฐั‡ะฐะปะต ั€ะฐะฑะพั‚ั‹. ะžะฝ ัะพะดะตั€ะถะธั‚ ะฝะตัะบะพะปัŒะบะพ ั‚ั‹ััั‡ ัั‚ั€ะพะบ, ะฐ ะฑะพะปัŒัˆะธะฝัั‚ะฒะพ ัะธะผะฒะพะปะพะฒ ะบั€ะฐะนะฝะต ั€ะตะดะบะพ ะฒัั‚ั€ะตั‡ะฐัŽั‚ัั ะฝะฐ ะฟั€ะฐะบั‚ะธะบะต. ะะตะบะพั‚ะพั€ั‹ะต ะธะท ะฝะธั… ะดะฐะถะต ะฝะต ะพั‚ะพะฑั€ะฐะถะฐัŽั‚ัั ะฒ VS Code. ะžัั‚ะฐะฒัŒั‚ะต ัั‚ะพั‚ ั„ะฐะนะป ะฝะฐะฟะพัะปะตะดะพะบ: ะดะพัั‚ะฐั‚ะพั‡ะฝะพ ะฟั€ะพัะผะพั‚ั€ะตั‚ัŒ ะตะณะพ ะธ ะฟั€ะพะฒะตั€ะธั‚ัŒ ะฝะฐะธะฑะพะปะตะต ัƒะทะฝะฐะฒะฐะตะผั‹ะต ัะธะผะฒะพะปั‹. + +ะคะฐะนะป `overview.yaml` ั‚ะฐะบะถะต ะผะตะฝะตะต ะฒะฐะถะตะฝ, ั‡ะตะผ ะพัั‚ะฐะปัŒะฝั‹ะต, ะฟะพัะบะพะปัŒะบัƒ ะฝะต ะฒะปะธัะตั‚ ะฝะตะฟะพัั€ะตะดัั‚ะฒะตะฝะฝะพ ะฝะฐ ั‡ั‚ะตะฝะธะต ะผะฐั‚ะตะผะฐั‚ะธั‡ะตัะบะธั… ะฒั‹ั€ะฐะถะตะฝะธะน. ะžะดะฝะฐะบะพ ะพะฝ ะฟั€ะตะดะพัั‚ะฐะฒะปัะตั‚ ะฟั€ะพะณั€ะฐะผะผะฐะผ ัะบั€ะฐะฝะฝะพะณะพ ะดะพัั‚ัƒะฟะฐ ะบั€ะฐั‚ะบะธะต ัั‚ั€ัƒะบั‚ัƒั€ะฝั‹ะต ะพะฑะทะพั€ั‹ ะฒั‹ั€ะฐะถะตะฝะธะน, ะฟะพัั‚ะพะผัƒ ัะพ ะฒั€ะตะผะตะฝะตะผ ะตะณะพ ัั‚ะพะธั‚ ะฟั€ะพะฒะตั€ะธั‚ัŒ. + +### ะงั‚ะพ ะดะตะปะฐั‚ัŒ + +ะžัะฝะพะฒะฝะฐั ะทะฐะดะฐั‡ะฐ โ€” ะฝะฐะนั‚ะธ ะฒัะต ะบะปัŽั‡ะธ YAML `t:`, ัะพะพั‚ะฒะตั‚ัั‚ะฒัƒัŽั‰ะธะต ะฟั€ะพะธะทะฝะพัะธะผั‹ะผ ั‚ะตะบัั‚ะพะฒั‹ะผ ัั‚ั€ะพะบะฐะผ. ะกั‚ั€ะพั‡ะฝะฐั ะฑัƒะบะฒะฐ ะฒ ะบะปัŽั‡ะต `t:` ะพะทะฝะฐั‡ะฐะตั‚, ั‡ั‚ะพ ั‚ะตะบัั‚ ะตั‰ั‘ ะฝะต ะฟั€ะพะฒะตั€ะตะฝ ะฟะตั€ะตะฒะพะดั‡ะธะบะพะผ. ะŸั€ะพะฒะตั€ัŒั‚ะต ะฐะฒั‚ะพะผะฐั‚ะธั‡ะตัะบะธ ัะพะทะดะฐะฝะฝั‹ะน ะฟะตั€ะตะฒะพะด ะธะปะธ ะธะทะผะตะฝะธั‚ะต ะตะณะพ. ะŸะพัะปะต ะฟั€ะพะฒะตั€ะบะธ ะทะฐะผะตะฝะธั‚ะต ะบะปัŽั‡ ะฝะฐ `T:`, ั‡ั‚ะพะฑั‹ ะพั‚ะผะตั‚ะธั‚ัŒ ะพะฑั€ะฐะฑะพั‚ะฐะฝะฝั‹ะน ั„ั€ะฐะณะผะตะฝั‚. + +ะขะพั‚ ะถะต ะฟั€ะธะฝั†ะธะฟ ะฟั€ะธะผะตะฝัะตั‚ัั ะบะพ ะฒัะตะผ ะบะปัŽั‡ะฐะผ `ct:`, `ot:`, `spell:`, `pronounce:` ะธ `IfThenElse:`, ะพะดะฝะฐะบะพ ะพะฝะธ ะฒัั‚ั€ะตั‡ะฐัŽั‚ัั ะณะพั€ะฐะทะดะพ ั€ะตะถะต, ั‡ะตะผ `t:`. + +### ะะดะฐะฟั‚ะฐั†ะธั ะธ ัะพะทะดะฐะฝะธะต ัะพะฑัั‚ะฒะตะฝะฝั‹ั… ะฟั€ะฐะฒะธะป + +ะขะตัั‚ั‹ ะฟะพะบั€ั‹ะฒะฐัŽั‚ ะฑะพะปัŒัˆะธะฝัั‚ะฒะพ ะฟั€ะฐะฒะธะป. ะžะดะฝะฐะบะพ ะฒ ะฟะพั€ั‚ัƒะณะฐะปัŒัะบะพะผ ะธะปะธ ะดั€ัƒะณะพะผ ัะทั‹ะบะต ะผะพะณัƒั‚ ััƒั‰ะตัั‚ะฒะพะฒะฐั‚ัŒ ะณั€ะฐะผะผะฐั‚ะธั‡ะตัะบะธะต ะพัะพะฑะตะฝะฝะพัั‚ะธ, ะบะพั‚ะพั€ั‹ั… ะฝะตั‚ ะฒ ะฐะฝะณะปะธะนัะบะพะผ ะธ ะบะพั‚ะพั€ั‹ะต ะฝะต ะพั…ะฒะฐั‡ะตะฝั‹ ั‚ะตัั‚ะฐะผะธ. ะŸะพัั‚ะพะผัƒ ะฟะพะปะตะทะฝะพ ะฟั€ะพัะผะพั‚ั€ะตั‚ัŒ ะฒัะต ะฟั€ะฐะฒะธะปะฐ ะธ ัƒะฑะตะดะธั‚ัŒัั ะฒ ะธั… ะบะพั€ั€ะตะบั‚ะฝะพัั‚ะธ. + +ะŸั€ะธ ะณั€ะฐะผะผะฐั‚ะธั‡ะตัะบะธั… ั€ะฐะทะปะธั‡ะธัั… ะฟั€ะพัั‚ะพะน ะทะฐะผะตะฝั‹ ั‚ะตะบัั‚ะพะฒั‹ั… ัั‚ั€ะพะบ ะฝะตะดะพัั‚ะฐั‚ะพั‡ะฝะพ. ะะตะพะฑั…ะพะดะธะผะพ ะธะทะผะตะฝะธั‚ัŒ ะฟั€ะฐะฒะธะปะฐ ะธะปะธ ะดะพะฑะฐะฒะธั‚ัŒ ะฝะพะฒั‹ะต. ะ”ะปั ัะพะฒะตั€ัˆะตะฝะฝะพ ะฝะพะฒั‹ั… ะฟั€ะฐะฒะธะป ะฟะพะปะตะทะฝะพ ะฝะฐะฟะธัะฐั‚ัŒ ั‚ะตัั‚ั‹, ะฟะพะดั‚ะฒะตั€ะถะดะฐัŽั‰ะธะต ะฟั€ะฐะฒะธะปัŒะฝะพัั‚ัŒ ั€ะตะทัƒะปัŒั‚ะฐั‚ะฐ. ะะต ะฑะพะนั‚ะตััŒ ะฟั€ะพะฑะพะฒะฐั‚ัŒ ั€ะฐะทะฝั‹ะต ะฒะฐั€ะธะฐะฝั‚ั‹. + +ะะธะถะต ะฟั€ะธะฒะตะดั‘ะฝ ะบั€ะฐั‚ะบะธะน ะพะฑะทะพั€ ัั‚ั€ัƒะบั‚ัƒั€ั‹ ะฟั€ะฐะฒะธะปะฐ MathCAT. ะšะฐะถะดะพะต ะฟั€ะฐะฒะธะปะพ ะพะฟะธัั‹ะฒะฐะตั‚ ัƒัะปะพะฒะธั ะฟั€ะธะผะตะฝะตะฝะธั ะธ ะฟั€ะพะธะทะฝะพัะธะผั‹ะน ั‚ะตะบัั‚. ะžัะฝะพะฒะฝั‹ะต ั‡ะฐัั‚ะธ: + +* `name` โ€” ะธะผั ะฟั€ะฐะฒะธะปะฐ; +* `tag` โ€” ัะปะตะผะตะฝั‚ MathML, ะบ ะบะพั‚ะพั€ะพะผัƒ ะฟั€ะธะผะตะฝัะตั‚ัั ะฟั€ะฐะฒะธะปะพ; +* `match` โ€” ัƒัะปะพะฒะธะต ะฟั€ะธะผะตะฝะตะฝะธั ะฟั€ะฐะฒะธะปะฐ; +* `replace` โ€” ั€ะตะทัƒะปัŒั‚ะฐั‚ ะธ ะดะตะนัั‚ะฒะธั MathCAT. + +ะ’ะฝัƒั‚ั€ะธ `replace` ั‡ะฐัั‚ะพ ะธัะฟะพะปัŒะทัƒัŽั‚ัั ัะปะตะดัƒัŽั‰ะธะต ะบะพะผะฐะฝะดั‹: + +* `t:` โ€” ะฟั€ะพะธะทะฝะพัะธะผั‹ะน ั‚ะตะบัั‚; +* `ct:` โ€” ะฟั€ะธัะพะตะดะธะฝะธั‚ัŒ ั‚ะตะบัั‚ ะฑะตะท ะฟั€ะพะฑะตะปะฐ ะฟะตั€ะตะด ะฝะธะผ; +* `ot:` โ€” ะฝะตะพะฑัะทะฐั‚ะตะปัŒะฝั‹ะน ั‚ะตะบัั‚ ะดะปั ะฟั€ะตะดะพั‚ะฒั€ะฐั‰ะตะฝะธั ะฟะพะฒั‚ะพั€ะตะฝะธะน; +* `x:` โ€” ะฒั‹ั€ะฐะถะตะฝะธะต XPath; +* `test:` โ€” ัƒัะปะพะฒะฝะฐั ะปะพะณะธะบะฐ; +* `pause:` โ€” ะฟะฐัƒะทะฐ ะฒ ั€ะตั‡ะธ; +* `bookmark:` โ€” ัะธะฝั…ั€ะพะฝะฝะพะต ะฒั‹ะดะตะปะตะฝะธะต. + +#### ะŸั€ะธะผะตั€ 1 + +```yaml +- name: squared + tag: power + match: "*[2][self::m:mn][.='2'] and $ClearSpeak_Exponents = 'Auto'" + replace: + - x: "*[1]" + - bookmark: "*[2]/@id" + - t: "squared" # phrase(7 'squared' equals 49) +``` + +ะญั‚ะพ ะฟั€ะฐะฒะธะปะพ ะพะทะฝะฐั‡ะฐะตั‚: ะตัะปะธ ัั‚ะตะฟะตะฝัŒ ะธะผะตะตั‚ ะฟะพะบะฐะทะฐั‚ะตะปัŒ 2 ะธ ะฝะฐัั‚ั€ะพะนะบะฐ `ClearSpeak_Exponents` ั€ะฐะฒะฝะฐ `Auto`, ัะปะตะดัƒะตั‚ ะฒั‹ะฒะตัั‚ะธ ยซะพัะฝะพะฒะฐะฝะธะต ะฒ ะบะฒะฐะดั€ะฐั‚ะตยป. ะะฐะฟั€ะธะผะตั€, $x^2$ ะพะทะฒัƒั‡ะธะฒะฐะตั‚ัั ะบะฐะบ ยซx squaredยป. + +ะžะฑั€ะฐั‚ะธั‚ะต ะฒะฝะธะผะฐะฝะธะต: + +* `match` ะพะฟั€ะตะดะตะปัะตั‚ ะฒั‹ั€ะฐะถะตะฝะธั, ะบ ะบะพั‚ะพั€ั‹ะผ ะฟั€ะธะผะตะฝัะตั‚ัั ะฟั€ะฐะฒะธะปะพ. +* ะ’ั‹ั€ะฐะถะตะฝะธะต ะฟะพัะปะต `x` โ€” ัั‚ะพ XPath. ะžะฝะพ ะฟะพะปัƒั‡ะฐะตั‚ ะฟะตั€ะฒั‹ะน ะดะพั‡ะตั€ะฝะธะน ัƒะทะตะป ัะปะตะผะตะฝั‚ะฐ ัั‚ะตะฟะตะฝะธ, ั‚ะพ ะตัั‚ัŒ ะพัะฝะพะฒะฐะฝะธะต. +* ะกั‚ั€ะพะบะฐ ะฟะพัะปะต `t` ะดะพะปะถะฝะฐ ะฑั‹ั‚ัŒ ะฟะตั€ะตะฒะตะดะตะฝะฐ. ะŸะพัะปะต ะฟั€ะพะฒะตั€ะบะธ ะฟะตั€ะตะฒะพะดะฐ ะธะทะผะตะฝะธั‚ะต `t` ะฝะฐ ะฟั€ะพะฟะธัะฝัƒัŽ `T`. + +#### ะŸั€ะธะผะตั€ 2 + +```yaml +- name: fraction-over-text + tag: fraction + match: + - "not($ClearSpeak_Fractions='General' or $ClearSpeak_Fractions='GeneralEndFrac') and" + - "( " + - " ((*[1][self::m:mi or self::m:mtext][string-length(.)>1]) or " + - " (*[1][self::m:mrow][count(*)=3][ " + - " *[1][self::m:mn] and " + - " *[2][self::m:mo][.='โข'] and " + - " *[3][self::m:mi or self::m:mtext][string-length(.)>1] ]) ) and" + - " ((*[2][self::m:mi or self::m:mtext][string-length(.)>1]) or " + - " (*[2][self::m:mrow][count(*)=3][ " + - " *[1][self::m:mn] and " + - " *[2][self::m:mo][.='โข'] and " + - " *[3][self::m:mi or self::m:mtext][string-length(.)>1] ]) )" + - ")" + replace: + - x: "*[1]" + - t: "over" # phrase(the fraction 3 'over' 4) + - x: "*[2]" + - test: + if: "$ClearSpeak_Fractions='EndFrac' or $ClearSpeak_Fractions='OverEndFrac'" + then: + - pause: short + - t: "end fraction" # phrase(7 over 8 'end fraction') + - pause: short +``` + +ะ”ะปั ะฟั€ะธะผะตะฝะตะฝะธั ะฟั€ะฐะฒะธะปะฐ ะดะพะปะถะฝั‹ ะฒั‹ะฟะพะปะฝัั‚ัŒัั ะฒัะต ัƒัะปะพะฒะธั ะธะท `match`. + +ะ’ ะพะฑั‹ั‡ะฝะพะน ั„ะพั€ะผัƒะปะธั€ะพะฒะบะต: + +* ะฝะฐัั‚ั€ะพะนะบะฐ `ClearSpeak_Fractions` ะฝะต ะดะพะปะถะฝะฐ ะธะผะตั‚ัŒ ะทะฝะฐั‡ะตะฝะธะต `General` ะธะปะธ `GeneralEndFrac`, **ะธ** +* ั‡ะธัะปะธั‚ะตะปัŒ ะดะพะปะถะตะฝ ะฑั‹ั‚ัŒ ั‚ะตะบัั‚ะพะฒะพะน ัั‚ั€ะพะบะพะน ะดะปะธะฝะพะน ะฑะพะปะตะต ะพะดะฝะพะณะพ ัะธะผะฒะพะปะฐ ะธะปะธ ั‡ะธัะปะพะผ, ะฝะตัะฒะฝะพ ัƒะผะฝะพะถะตะฝะฝั‹ะผ ะฝะฐ ั‚ะฐะบัƒัŽ ัั‚ั€ะพะบัƒ, **ะธ** +* ะทะฝะฐะผะตะฝะฐั‚ะตะปัŒ ะดะพะปะถะตะฝ ัƒะดะพะฒะปะตั‚ะฒะพั€ัั‚ัŒ ั‚ะตะผ ะถะต ัƒัะปะพะฒะธัะผ, ั‡ั‚ะพ ะธ ั‡ะธัะปะธั‚ะตะปัŒ. + +ะ•ัะปะธ ะฒัะต ัƒัะปะพะฒะธั ะฒั‹ะฟะพะปะฝะตะฝั‹, ะดั€ะพะฑัŒ ะพะทะฒัƒั‡ะธะฒะฐะตั‚ัั ะบะฐะบ ยซั‡ะธัะปะธั‚ะตะปัŒ ะฝะฐะด ะทะฝะฐะผะตะฝะฐั‚ะตะปะตะผยป. ะ•ัะปะธ `ClearSpeak_Fractions` ะธะผะตะตั‚ ะทะฝะฐั‡ะตะฝะธะต `EndFrac` ะธะปะธ `OverEndFrac`, ั‚ะฐะบะถะต ะดะพะฑะฐะฒะปัะตั‚ัั ะบะพั€ะพั‚ะบะฐั ะฟะฐัƒะทะฐ ะฟะตั€ะตะด ั„ั€ะฐะทะพะน ยซะบะพะฝะตั† ะดั€ะพะฑะธยป. + +ะะฐะฟั€ะธะผะตั€, ะฒั‹ั€ะฐะถะตะฝะธะต $\frac{\text{meter}}{\text{second}}$ ะพะทะฒัƒั‡ะธะฒะฐะตั‚ัั ะบะฐะบ ยซmeter over secondยป. + +--- + +## ะจะฐะณ 7. ะŸะพะฟั€ะพัะธั‚ะต ะผะฐั‚ะตะผะฐั‚ะธะบะฐ ะฟั€ะพะฒะตั€ะธั‚ัŒ ะฟะตั€ะตะฒะพะด + +ะšะพะณะดะฐ ะฟะตั€ะตะฒะพะด ัั‚ะฐะฝะตั‚ ะดะพัั‚ะฐั‚ะพั‡ะฝะพ ะฟะพะปะฝั‹ะผ, ะฟะพะฟั€ะพัะธั‚ะต ะผะฐั‚ะตะผะฐั‚ะธะบะฐ, ัƒั‡ะธั‚ะตะปั ะผะฐั‚ะตะผะฐั‚ะธะบะธ ะธะปะธ ะดั€ัƒะณะพะณะพ ัะฟะตั†ะธะฐะปะธัั‚ะฐ-ะฟั€ะตะดะผะตั‚ะฝะธะบะฐ, ะฒะปะฐะดะตัŽั‰ะตะณะพ ัะทั‹ะบะพะผ ะบะฐะบ ั€ะพะดะฝั‹ะผ, ะฟั€ะพะฒะตั€ะธั‚ัŒ ะฟั€ะตะดัั‚ะฐะฒะธั‚ะตะปัŒะฝั‹ะน ะฝะฐะฑะพั€ ั€ะตะทัƒะปัŒั‚ะฐั‚ะพะฒ. + +ะŸะพะปะตะทะฝะพ ะฟะพะดะณะพั‚ะพะฒะธั‚ัŒ ะฝะตัะบะพะปัŒะบะพ ะฟั€ะธะผะตั€ะพะฒ ะฒั‹ั€ะฐะถะตะฝะธะน ะฒะผะตัั‚ะต ั ั€ะฐััˆะธั„ั€ะพะฒะบะฐะผะธ ั‚ะตะบัั‚ะฐ MathCAT. ะŸะพะฟั€ะพัะธั‚ะต ะฟั€ะพะฒะตั€ััŽั‰ะตะณะพ ะพั‚ะผะตั‚ะธั‚ัŒ ะฒัั‘, ั‡ั‚ะพ ะทะฒัƒั‡ะธั‚ ะผะฐั‚ะตะผะฐั‚ะธั‡ะตัะบะธ ัั‚ั€ะฐะฝะฝะพ, ะฝะตะพะดะฝะพะทะฝะฐั‡ะฝะพ ะธะปะธ ะฝะตะฟั€ะธะฒั‹ั‡ะฝะพ. + +ะขะฐะบะฐั ะฟั€ะพะฒะตั€ะบะฐ ะฒะฐะถะฝะฐ: ะฟะตั€ะตะฒะพะด ะผะพะถะตั‚ ะฑั‹ั‚ัŒ ะณั€ะฐะผะผะฐั‚ะธั‡ะตัะบะธ ะฒะตั€ะฝั‹ะผ, ะฝะพ ะฝะต ะฟะพั…ะพะถะธะผ ะฝะฐ ะฝะฐัั‚ะพัั‰ัƒัŽ ะผะฐั‚ะตะผะฐั‚ะธั‡ะตัะบัƒัŽ ั€ะตั‡ัŒ. ะกะฟะตั†ะธะฐะปะธัั‚ ั‡ะฐัั‚ะพ ะทะฐะผะตั‡ะฐะตั‚ ะฟั€ะพะฑะปะตะผั‹ ะฒ ั‚ะตั€ะผะธะฝะพะปะพะณะธะธ, ะธะผะตะฝะฐั… ัะธะผะฒะพะปะพะฒ ะธ ัะฟะพัะพะฑะฐั… ะพะทะฒัƒั‡ะธะฒะฐะฝะธั ะบั€ัƒะฟะฝั‹ั… ัั‚ั€ัƒะบั‚ัƒั€. + +ะŸั€ะธ ัั‚ะพะผ ะฝะต ะฒัะตะณะดะฐ ะฒะพะทะผะพะถะฝะพ ะธะดะตะฐะปัŒะฝะพ ัƒะดะพะฒะปะตั‚ะฒะพั€ะธั‚ัŒ ะบะฐะถะดะพะต ะฟะพะถะตะปะฐะฝะธะต. ะžัะพะฑะตะฝะฝะพัั‚ะธ ะฟั€ะพะณั€ะฐะผะผ ัะบั€ะฐะฝะฝะพะณะพ ะดะพัั‚ัƒะฟะฐ ะธ ัั‚ั€ัƒะบั‚ัƒั€ั‹ MathCAT ะผะพะณัƒั‚ ะพะทะฝะฐั‡ะฐั‚ัŒ, ั‡ั‚ะพ ะฝะฐะธะฑะพะปะตะต ัะปะตะณะฐะฝั‚ะฝะฐั ั ะผะฐั‚ะตะผะฐั‚ะธั‡ะตัะบะพะน ั‚ะพั‡ะบะธ ะทั€ะตะฝะธั ั„ะพั€ะผัƒะปะธั€ะพะฒะบะฐ ะฝะต ัะฒะปัะตั‚ัั ัะฐะผะพะน ัƒะดะพะฑะฝะพะน. + +--- + +## ะจะฐะณ 8. ะŸั€ะพะฒะตะดะธั‚ะต ะฟะพะปัŒะทะพะฒะฐั‚ะตะปัŒัะบะพะต ั‚ะตัั‚ะธั€ะพะฒะฐะฝะธะต + +ะ•ัะปะธ ะฒั‹ ัะฐะผะธ ะฝะต ัะฒะปัะตั‚ะตััŒ ะพะฟั‹ั‚ะฝั‹ะผ ะฟะพะปัŒะทะพะฒะฐั‚ะตะปะตะผ ะฟั€ะพะณั€ะฐะผะผั‹ ัะบั€ะฐะฝะฝะพะณะพ ะดะพัั‚ัƒะฟะฐ, ะฟะพะปัŒะทะพะฒะฐั‚ะตะปัŒัะบะพะต ั‚ะตัั‚ะธั€ะพะฒะฐะฝะธะต ะพะฑัะทะฐั‚ะตะปัŒะฝะพ. + +ะ›ัƒั‡ัˆะต ะฒัะตะณะพ ะฟั€ะธะฒะปะตะบะฐั‚ัŒ ะฝะตะทั€ัั‡ะธั… ะฟะพะปัŒะทะพะฒะฐั‚ะตะปะตะน, ัƒะฒะตั€ะตะฝะฝะพ ั€ะฐะฑะพั‚ะฐัŽั‰ะธั… ั ะผะฐั‚ะตะผะฐั‚ะธะบะพะน, ะพัะพะฑะตะฝะฝะพ ัะฟะตั†ะธะฐะปะธัั‚ะพะฒ ะฒ ะพะฑะปะฐัั‚ะธ STEM. ะŸั€ะตะดะพัั‚ะฐะฒัŒั‚ะต ะธะผ ะปะพะบะฐะปัŒะฝัƒัŽ ะฒะตั€ัะธัŽ MathCAT ั ะฟะตั€ะตะฒะพะดะพะผ ะธ HTML-ั„ะฐะนะป ั ะฟั€ะตะดัั‚ะฐะฒะธั‚ะตะปัŒะฝั‹ะผะธ ะฒั‹ั€ะฐะถะตะฝะธัะผะธ MathML. + +ะกะฝะฐั‡ะฐะปะฐ ะฟะพะปะตะทะฝะพ ะดะฐั‚ัŒ ะฟะพะปัŒะทะพะฒะฐั‚ะตะปัะผ ะฒะพะทะผะพะถะฝะพัั‚ัŒ ัะฐะผะพัั‚ะพัั‚ะตะปัŒะฝะพ ะฟะพะฟั€ะพะฑะพะฒะฐั‚ัŒ ะฟะตั€ะตะฒะพะด. ะ—ะฐั‚ะตะผ ะฒัั‚ั€ะตั‚ัŒั‚ะตััŒ ั ะฝะธะผะธ ะธ ั€ะฐะทะฑะตั€ะธั‚ะต ะดะพะฟะพะปะฝะธั‚ะตะปัŒะฝั‹ะต ะฟั€ะธะผะตั€ั‹ ะฒะผะตัั‚ะต. ะกะฟั€ะฐัˆะธะฒะฐะนั‚ะต ะฝะต ั‚ะพะปัŒะบะพ ะพ ะฟั€ะฐะฒะธะปัŒะฝะพัั‚ะธ ั„ะพั€ะผัƒะปะธั€ะพะฒะพะบ, ะฝะพ ะธ ะพ ััะฝะพัั‚ะธ ัั‚ั€ัƒะบั‚ัƒั€ั‹, ะฟะพะปะตะทะฝะพัั‚ะธ ะฟะฐัƒะท ะธ ัะพะพั‚ะฒะตั‚ัั‚ะฒะธะธ ะฟั€ะธะฒั‹ั‡ะฝะพะผัƒ ัะฟะพัะพะฑัƒ ะฒะพัะฟั€ะธัั‚ะธั. + +ะฃัั‚ะฝะฐั ะผะฐั‚ะตะผะฐั‚ะธะบะฐ ะพั†ะตะฝะธะฒะฐะตั‚ัั ะฝะต ั‚ะพะปัŒะบะพ ะฟะพ ะบะพั€ั€ะตะบั‚ะฝะพัั‚ะธ: ะพะฝะฐ ะดะพะปะถะฝะฐ ะฑั‹ั‚ัŒ ัƒะดะพะฑะฝะฐ ะฒ ั€ะตะฐะปัŒะฝะพะน ั€ะฐะฑะพั‚ะต ั ะฟั€ะพะณั€ะฐะผะผะพะน ัะบั€ะฐะฝะฝะพะณะพ ะดะพัั‚ัƒะฟะฐ. ะะฐ ะฟั€ะฐะบั‚ะธะบะต ะพะฑั€ะฐั‚ะฝะฐั ัะฒัะทัŒ ะฟะพะปัŒะทะพะฒะฐั‚ะตะปะตะน ั‡ะฐัั‚ะพ ะฒะฐะถะฝะตะต ั‚ะตะพั€ะตั‚ะธั‡ะตัะบะธั… ะฟั€ะตะดะฟะพั‡ั‚ะตะฝะธะน ะฒ ะณั€ะฐะผะผะฐั‚ะธะบะต, ะพัะพะฑะตะฝะฝะพ ะตัะปะธ ัะฟะพั€ ะบะฐัะฐะตั‚ัั ััะฝะพัั‚ะธ ะธะปะธ ะฝะฐะฒะธะณะฐั†ะธะธ, ะฐ ะฝะต ะผะฐั‚ะตะผะฐั‚ะธั‡ะตัะบะพะณะพ ัะผั‹ัะปะฐ. + +--- + +## ะจะฐะณ 9. ะžั‚ะฟั€ะฐะฒัŒั‚ะต ะฟะตั€ะตะฒะพะด + +ะŸะตั€ะตะด ัะพะทะดะฐะฝะธะตะผ pull request ะธะปะธ ะฟะตั€ะตะดะฐั‡ะตะน ะฟะตั€ะตะฒะพะดะฐ ะฟะพะปะตะทะฝะพ ะฒั‹ะฟะพะปะฝะธั‚ัŒ ะธั‚ะพะณะพะฒัƒัŽ ะฟั€ะพะฒะตั€ะบัƒ. ะญั‚ะพ ัƒะผะตะฝัŒัˆะธั‚ ะบะพะปะธั‡ะตัั‚ะฒะพ ะปะธัˆะฝะธั… ะธัะฟั€ะฐะฒะปะตะฝะธะน ะธ ัƒะฟั€ะพัั‚ะธั‚ ั€ะตั†ะตะฝะทะธั€ะพะฒะฐะฝะธะต. + +### ะ˜ั‚ะพะณะพะฒั‹ะน ัะฟะธัะพะบ ะฟั€ะพะฒะตั€ะพะบ + +ะŸั€ะพะฒะตั€ัŒั‚ะต ัะปะตะดัƒัŽั‰ะธะต ะฟัƒะฝะบั‚ั‹. + +#### ะคะฐะนะปั‹ ะธ ัั‚ั€ัƒะบั‚ัƒั€ะฐ + +* ะคะฐะนะปั‹ ะฒะฐัˆะตะณะพ ัะทั‹ะบะฐ ัะพะพั‚ะฒะตั‚ัั‚ะฒัƒัŽั‚ ั‚ะตะบัƒั‰ะตะน ัั‚ั€ัƒะบั‚ัƒั€ะต ะฐะฝะณะปะธะนัะบะธั… ั„ะฐะนะปะพะฒ. +* ะŸั€ะฐะฒะธะปะฐ ะฝะต ะฟั€ะพะฟัƒั‰ะตะฝั‹: ะธะฝัั‚ั€ัƒะผะตะฝั‚ ะฐัƒะดะธั‚ะฐ ะทะฐะฟัƒั‰ะตะฝ. +* ะ’ ะฟะตั€ะตะฒะพะดะต ะฝะตั‚ ะพั‡ะตะฒะธะดะฝั‹ั… ะพัั‚ะฐั‚ะบะพะฒ ะฐะฝะณะปะธะนัะบะพะณะพ ั‚ะตะบัั‚ะฐ. + +#### ะกะพัั‚ะพัะฝะธะต ะฟะตั€ะตะฒะพะดะฐ + +* ะ’ะพ ะฒัั‘ะผ ะฟั€ะพะฒะตั€ะตะฝะฝะพะผ ั‚ะตะบัั‚ะต `t:` ะทะฐะผะตะฝะตะฝะพ ะฝะฐ `T:`, `ct:` ะฝะฐ `CT:`, `ot:` ะฝะฐ `OT:` ะธ ั‚. ะด. +* ะ’ั‹ ะพัะพะทะฝะฐะฝะฝะพ ะฟั€ะพะฒะตั€ะธะปะธ ั„ะพั€ะผัƒะปะธั€ะพะฒะบะธ, ะฐ ะฝะต ั‚ะพะปัŒะบะพ ะธัะฟะพะปัŒะทะพะฒะฐะปะธ ะฐะฒั‚ะพะผะฐั‚ะธั‡ะตัะบะธะน ะฟะตั€ะตะฒะพะด. + +#### ะ ะตั‡ัŒ + +* ะ’ั‹ ะฟั€ะพัะปัƒัˆะฐะปะธ ะฟั€ะตะดัั‚ะฐะฒะธั‚ะตะปัŒะฝั‹ะน ะฝะฐะฑะพั€ ะฒั‹ั€ะฐะถะตะฝะธะน ะฒ NVDA. +* ะะฐ ะฒะฐัˆะตะผ ัะทั‹ะบะต ั€ะตะทัƒะปัŒั‚ะฐั‚ ะทะฒัƒั‡ะธั‚ ะตัั‚ะตัั‚ะฒะตะฝะฝะพ ะธ ะพะดะฝะพะทะฝะฐั‡ะฝะพ. +* ะŸะฐัƒะทั‹ ะธ ัั‚ั€ัƒะบั‚ัƒั€ะฐ ั…ะพั€ะพัˆะพ ะฒะพัะฟั€ะธะฝะธะผะฐัŽั‚ัั ะฝะฐ ัะปัƒั…. + +#### ะขะตัั‚ั‹ + +* ะ”ะปั ะฒะฐัˆะตะณะพ ัะทั‹ะบะฐ ะดะพะฑะฐะฒะปะตะฝั‹ ั‚ะตัั‚ั‹. +* ะ’ัะต ั‚ะตัั‚ั‹ ะฟั€ะพั…ะพะดัั‚: + + ```bash + cargo test Languages::pt + ``` + +* ะžะถะธะดะฐะตะผั‹ะต ั€ะตะทัƒะปัŒั‚ะฐั‚ั‹ ั‚ะตัั‚ะพะฒ ัะพะพั‚ะฒะตั‚ัั‚ะฒัƒัŽั‚ ะทะฐะดัƒะผะฐะฝะฝะพะน ั€ะตั‡ะธ, ะฒะบะปัŽั‡ะฐั ะฟะฐัƒะทั‹. + +#### ะญะบัะฟะตั€ั‚ะฝะฐั ะฟั€ะพะฒะตั€ะบะฐ + +* ะœะฐั‚ะตะผะฐั‚ะธะบ ะธะปะธ ะดั€ัƒะณะพะน ัะฟะตั†ะธะฐะปะธัั‚ ะฟั€ะพะฒะตั€ะธะป ะฟั€ะตะดัั‚ะฐะฒะธั‚ะตะปัŒะฝั‹ะน ะฝะฐะฑะพั€ ั€ะตะทัƒะปัŒั‚ะฐั‚ะพะฒ. +* ะžัะฝะพะฒะฝั‹ะต ะฟั€ะพะฑะปะตะผั‹ ั‚ะตั€ะผะธะฝะพะปะพะณะธะธ ะธ ัั‚ั€ัƒะบั‚ัƒั€ั‹ ัƒัั‚ั€ะฐะฝะตะฝั‹. + +#### ะŸะพะปัŒะทะพะฒะฐั‚ะตะปัŒัะบะพะต ั‚ะตัั‚ะธั€ะพะฒะฐะฝะธะต + +* ะŸั€ะพะฒะตะดะตะฝะพ ั…ะพั‚ั ะฑั‹ ะฝะตะบะพั‚ะพั€ะพะต ั‚ะตัั‚ะธั€ะพะฒะฐะฝะธะต ั ะฟะพะปัŒะทะพะฒะฐั‚ะตะปัะผะธ ะฟั€ะพะณั€ะฐะผะผ ัะบั€ะฐะฝะฝะพะณะพ ะดะพัั‚ัƒะฟะฐ. +* ะฃั‡ั‚ะตะฝะฐ ะพะฑั€ะฐั‚ะฝะฐั ัะฒัะทัŒ ะพ ััะฝะพัั‚ะธ ะธ ัƒะดะพะฑัั‚ะฒะต ะธัะฟะพะปัŒะทะพะฒะฐะฝะธั. + +### ะžั‚ะฟั€ะฐะฒะบะฐ ะฟะตั€ะตะฒะพะดะฐ + +ะŸะพัะปะต ะฒั‹ะฟะพะปะฝะตะฝะธั ัะฟะธัะบะฐ ะฟั€ะพะฒะตั€ะพะบ: + +1. **ะกะพะทะดะฐะนั‚ะต ะบะพะผะผะธั‚ ั ะธะทะผะตะฝะตะฝะธัะผะธ** ะฒ ัะฒะพะตะน ะฒะตั‚ะบะต, ะฝะฐะฟั€ะธะผะตั€ `pt`. +2. **ะžั‚ะฟั€ะฐะฒัŒั‚ะต ะฒะตั‚ะบัƒ** ะฝะฐ GitHub. +3. **ะกะพะทะดะฐะนั‚ะต pull request** ะฒ ะพัะฝะพะฒะฝะพะน ั€ะตะฟะพะทะธั‚ะพั€ะธะน MathCAT. + +ะ’ pull request ะฟะพะปะตะทะฝะพ ัƒะบะฐะทะฐั‚ัŒ: + +* ะบั€ะฐั‚ะบะพะต ะพะฟะธัะฐะฝะธะต ะฟะตั€ะตะฒะพะดะฐ; +* ะทะฐะฒะตั€ัˆั‘ะฝะฝั‹ะต ั‡ะฐัั‚ะธ, ะฝะฐะฟั€ะธะผะตั€ ClearSpeak, SimpleSpeak ะธ ั‚ะตัั‚ั‹; +* ะธะทะฒะตัั‚ะฝั‹ะต ะพะณั€ะฐะฝะธั‡ะตะฝะธั ะธ ะพะฑะปะฐัั‚ะธ, ั‚ั€ะตะฑัƒัŽั‰ะธะต ะดะฐะปัŒะฝะตะนัˆะตะน ั€ะฐะฑะพั‚ั‹. + +ะŸะพัะปะต ัั‚ะพะณะพ ัะพะฟั€ะพะฒะพะถะดะฐัŽั‰ะธะต ะฟั€ะพะตะบั‚ะฐ ะฟั€ะพะฒะตั€ัั‚ ั€ะฐะฑะพั‚ัƒ ะธ ะผะพะณัƒั‚ ะฟั€ะตะดะปะพะถะธั‚ัŒ ะธะทะผะตะฝะตะฝะธั ะฟะตั€ะตะด ัะปะธัะฝะธะตะผ. + +### ะšะพะณะดะฐ ะฟะตั€ะตะฒะพะด ัั‚ะฐะฝะตั‚ ะดะพัั‚ัƒะฟะตะฝ ะฟะพะปัŒะทะพะฒะฐั‚ะตะปัะผ? + +ะŸะพัะปะต ัะปะธัะฝะธั ะฟะตั€ะตะฒะพะดะฐ ั MathCAT: + +* ะพะฝ ะฒะพะนะดั‘ั‚ ะฒ ะฑัƒะดัƒั‰ะธะต ะฒั‹ะฟัƒัะบะธ MathCAT; +* ะฟะพะปัŒะทะพะฒะฐั‚ะตะปะธ ัะผะพะณัƒั‚ ะฒั‹ะฑั€ะฐั‚ัŒ ัะทั‹ะบ ะฒ ะฟะพะดะดะตั€ะถะธะฒะฐะตะผั‹ั… ะฟั€ะพะณั€ะฐะผะผะฐั… ัะบั€ะฐะฝะฝะพะณะพ ะดะพัั‚ัƒะฟะฐ, ะฝะฐะฟั€ะธะผะตั€ NVDA. + +ะงั‚ะพะฑั‹ ะธัะฟะพะปัŒะทะพะฒะฐั‚ัŒ ะฟะตั€ะตะฒะพะด ัั€ะฐะทัƒ, ะฝะต ะดะพะถะธะดะฐัััŒ ะพั„ะธั†ะธะฐะปัŒะฝะพะณะพ ะฒั‹ะฟัƒัะบะฐ: + +* ะฟั€ะพะดะพะปะถะฐะนั‚ะต ะธัะฟะพะปัŒะทะพะฒะฐั‚ัŒ ะบะฐั‚ะฐะปะพะณ ะปะพะบะฐะปัŒะฝั‹ั… ะฟั€ะฐะฒะธะป ะฒ NVDA ะธะปะธ +* ัƒัั‚ะฐะฝะพะฒะธั‚ะต ั€ะฐะทั€ะฐะฑะฐั‚ั‹ะฒะฐะตะผัƒัŽ ะฒะตั€ัะธัŽ MathCAT, ัะพะดะตั€ะถะฐั‰ัƒัŽ ะฒะฐัˆะธ ะธะทะผะตะฝะตะฝะธั. + +--- + +## ะจะฐะณ 10. ะŸะพะดะดะตั€ะถะธะฒะฐะนั‚ะต ะฟะตั€ะตะฒะพะด ะฒ ะฐะบั‚ัƒะฐะปัŒะฝะพะผ ัะพัั‚ะพัะฝะธะธ + +ะกั‚ั€ะพะณะพ ะณะพะฒะพั€ั, ะฟะตั€ะตะฒะพะด ะฝะธะบะพะณะดะฐ ะฝะต ะฑั‹ะฒะฐะตั‚ ยซะทะฐะฒะตั€ัˆั‘ะฝยป. ะ”ะฐะถะต ะฟะพัะปะต ัะปะธัะฝะธั ัะพ ะฒั€ะตะผะตะฝะตะผ ะฟะพัะฒัั‚ัั ะฝะตะฑะพะปัŒัˆะธะต ัƒะปัƒั‡ัˆะตะฝะธั, ะพัะพะฑะตะฝะฝะพ ะบะพะณะดะฐ ะฟะพะปัŒะทะพะฒะฐั‚ะตะปะธ ะฝะฐั‡ะฝัƒั‚ ั€ะฐะฑะพั‚ะฐั‚ัŒ ั ั€ะตะฐะปัŒะฝั‹ะผะธ ะผะฐั‚ะตั€ะธะฐะปะฐะผะธ. + +ะšั€ะพะผะต ั‚ะพะณะพ, ะฐะฝะณะปะธะนัะบะฐั ะฒะตั€ัะธั ะฐะบั‚ะธะฒะฝะพ ั€ะฐะทะฒะธะฒะฐะตั‚ัั, ะธ ะฝะพะฒั‹ะต ั„ัƒะฝะบั†ะธะธ ะฝะตะพะฑั…ะพะดะธะผะพ ะดะพะฑะฐะฒะปัั‚ัŒ ะฒ ะฟะตั€ะตะฒะพะด. ะ”ะปั ัะธะฝั…ั€ะพะฝะธะทะฐั†ะธะธ ะธัะฟะพะปัŒะทัƒะนั‚ะต [ะธะฝัั‚ั€ัƒะผะตะฝั‚ ะฐัƒะดะธั‚ะฐ ะฟะตั€ะตะฒะพะดะฐ](https://github.com/daisy/MathCAT/blob/main/PythonScripts/audit_translations/README.md). + + + +--- + + +## ะŸะตั€ะตะฒะพะด ะ‘ั€ะฐะนะปั + +ะžะฑั‰ะธะน ะฟั€ะพั†ะตัั ะฟะตั€ะตะฒะพะดะฐ ะ‘ั€ะฐะนะปั ะฟะพั…ะพะถ ะฝะฐ ะฟะตั€ะตะฒะพะด ั€ะตั‡ะธ, ะฝะพ ะตัั‚ัŒ ะฝะตัะบะพะปัŒะบะพ ะฒะฐะถะฝั‹ั… ะพั‚ะปะธั‡ะธะน. + +ะŸะตั€ะตะด ั€ะฐะฑะพั‚ะพะน ะฝะฐะด ะฟั€ะฐะฒะธะปะฐะผะธ ะ‘ั€ะฐะนะปั ะพะฟั€ะตะดะตะปะธั‚ะต, ะบะฐะบะพะน ัั‚ะฐะฝะดะฐั€ั‚ ะผะฐั‚ะตะผะฐั‚ะธั‡ะตัะบะพะน ะทะฐะฟะธัะธ ะธัะฟะพะปัŒะทัƒะตั‚ัั ะฒ ะฒะฐัˆะตะน ัั‚ั€ะฐะฝะต. ะ’ ะฝะตะบะพั‚ะพั€ั‹ั… ัั‚ั€ะฐะฝะฐั… ััƒั‰ะตัั‚ะฒัƒัŽั‚ ัƒัั‚ะฐะฝะพะฒะปะตะฝะฝั‹ะต ัะธัั‚ะตะผั‹ ะทะฐะฟะธัะธ ะ‘ั€ะฐะนะปั, ะฐ ะฒ ะดั€ัƒะณะธั… ะฟั€ะธะผะตะฝััŽั‚ัั ะพะฑะพะทะฝะฐั‡ะตะฝะธั ะดั€ัƒะณะพะณะพ ั‚ะธะฟะฐ, ะฝะฐะฟั€ะธะผะตั€ LaTeX ะธะปะธ ASCIIMath. ะ ะตัˆะธั‚ะต ะทะฐั€ะฐะฝะตะต, ะบะฐะบะพะผัƒ ัั‚ะฐะฝะดะฐั€ั‚ัƒ ะดะพะปะถะตะฝ ัะปะตะดะพะฒะฐั‚ัŒ MathCAT. + +ะ•ัะปะธ ัƒะถะต ััƒั‰ะตัั‚ะฒัƒะตั‚ ะฟะพั…ะพะถะฐั ัะธัั‚ะตะผะฐ ะ‘ั€ะฐะนะปั, ะตั‘ ะผะพะถะฝะพ ะธัะฟะพะปัŒะทะพะฒะฐั‚ัŒ ะบะฐะบ ะพั‚ะฟั€ะฐะฒะฝัƒัŽ ั‚ะพั‡ะบัƒ. ะ’ ะฟั€ะพั‚ะธะฒะฝะพะผ ัะปัƒั‡ะฐะต, ัะบะพั€ะตะต ะฒัะตะณะพ, ะฟั€ะธะดั‘ั‚ัั ะฝะฐั‡ะธะฝะฐั‚ัŒ ะฟะพั‡ั‚ะธ ั ะฝัƒะปั. + +### ะคะฐะนะปั‹ ะ‘ั€ะฐะนะปั + +ะ”ะปั ะฝะพะฒะพะน ัะธัั‚ะตะผั‹ ะทะฐะฟะธัะธ ะ‘ั€ะฐะนะปั ัะพะทะดะฐะนั‚ะต ั‚ั€ะธ ั„ะฐะนะปะฐ `.yaml` ะฒ `Rules\Braille\your-braille-language`: + +1. `xxx_Rules.yaml`, ะณะดะต `xxx` โ€” ะธะผั ัะธัั‚ะตะผั‹ ะทะฐะฟะธัะธ ะ‘ั€ะฐะนะปั. ะคะฐะนะป ัะพะดะตั€ะถะธั‚ ะฟั€ะฐะฒะธะปะฐ ะฟั€ะตะพะฑั€ะฐะทะพะฒะฐะฝะธั MathML ะฒ ะ‘ั€ะฐะนะปัŒ. +2. `unicode.yaml` โ€” ะฟะตั€ะตะฒะพะดั‹ ะฝะฐะธะฑะพะปะตะต ั€ะฐัะฟั€ะพัั‚ั€ะฐะฝั‘ะฝะฝั‹ั… ัะธะผะฒะพะปะพะฒ. +3. `unicode-full.yaml` โ€” ะฟะตั€ะตะฒะพะดั‹ ะพัั‚ะฐะปัŒะฝั‹ั… ัะธะผะฒะพะปะพะฒ. + +ะ”ะฒะฐ ั„ะฐะนะปะฐ Unicode ะธัะฟะพะปัŒะทัƒัŽั‚ัั ะฟะพ ะฟั€ะฐะบั‚ะธั‡ะตัะบะพะน ะฟั€ะธั‡ะธะฝะต: ะฝะตะฑะพะปัŒัˆะพะน ั„ะฐะนะป ั ั€ะฐัะฟั€ะพัั‚ั€ะฐะฝั‘ะฝะฝั‹ะผะธ ัะธะผะฒะพะปะฐะผะธ ัƒัะบะพั€ัะตั‚ ะทะฐะฟัƒัะบ. + +### ะŸั€ะธะผะตั€ ัˆะฒะตะดัะบะพะณะพ ัะทั‹ะบะฐ + +ะจะฒะตะดัะบะธะน ะฟะตั€ะตะฒะพะด ะ‘ั€ะฐะนะปั ัะปะตะดัƒะตั‚ ะพั„ะธั†ะธะฐะปัŒะฝะพะน ัˆะฒะตะดัะบะพะน ัะธัั‚ะตะผะต ะผะฐั‚ะตะผะฐั‚ะธั‡ะตัะบะพะน ะทะฐะฟะธัะธ ะ‘ั€ะฐะนะปั. ะญั‚ะพ ัˆะตัั‚ะธั‚ะพั‡ะตั‡ะฝั‹ะน ัั‚ะฐะฝะดะฐั€ั‚, ะฟั€ะตะดะฝะฐะทะฝะฐั‡ะตะฝะฝั‹ะน ะดะปั ะฟะตั‡ะฐั‚ะฝั‹ั… ะผะฐั‚ะตั€ะธะฐะปะพะฒ. ะฃัั‚ะพัะฒัˆะตะณะพัั ะฒะพััŒะผะธั‚ะพั‡ะตั‡ะฝะพะณะพ ะผะฐั‚ะตะผะฐั‚ะธั‡ะตัะบะพะณะพ ัั‚ะฐะฝะดะฐั€ั‚ะฐ ะฝะต ะฑั‹ะปะพ, ะฟะพัั‚ะพะผัƒ ะฟะตั€ะตะฒะพะด ะพัะฝะพะฒั‹ะฒะฐะปัั ะฝะฐ ะตะดะธะฝัั‚ะฒะตะฝะฝะพะผ ะฟั€ะธะทะฝะฐะฝะฝะพะผ ัั‚ะฐะฝะดะฐั€ั‚ะต. + +ะ ะฐะฑะพั‚ะฐ ะฝะฐะด ัˆะฒะตะดัะบะธะผ ะฟะตั€ะตะฒะพะดะพะผ ั‚ะฐะบะถะต ะฟะพะบะฐะทะฐะปะฐ, ั‡ั‚ะพ ะธัั…ะพะดะฝั‹ะต ัั‚ะฐะฝะดะฐั€ั‚ั‹ ะฝะต ะฒัะตะณะดะฐ ะดะพัั‚ะฐั‚ะพั‡ะฝะพ ัั‚ั€ะพะณะธ ะดะปั ะฟั€ะพะณั€ะฐะผะผะฝะพะณะพ ะพะฑะตัะฟะตั‡ะตะฝะธั. ะะตะบะพั‚ะพั€ั‹ะต ะฟะตั‡ะฐั‚ะฝั‹ะต ัั‚ะฐะฝะดะฐั€ั‚ั‹ ะดะพะฟัƒัะบะฐัŽั‚ ั€ะฐััั‚ะฐะฝะพะฒะบัƒ ะฟั€ะพะฑะตะปะพะฒ ะฒ ัะพะพั‚ะฒะตั‚ัั‚ะฒะธะธ ั ะฟะตั‡ะฐั‚ะฝั‹ะผ ะพั€ะธะณะธะฝะฐะปะพะผ. ะ”ะปั MathCAT ัั‚ะพะณะพ ะฝะตะดะพัั‚ะฐั‚ะพั‡ะฝะพ. ะŸั€ะฐะฒะธะปะฐ ะดะพะปะถะฝั‹ ะฑั‹ั‚ัŒ ัะฒะฝั‹ะผะธ, ะฟะพัั‚ะพะผัƒ ะธะฝะพะณะดะฐ ะฟะพั‚ั€ะตะฑัƒะตั‚ัั ัƒัั‚ั€ะฐะฝะธั‚ัŒ ะฝะตัะพะณะปะฐัะพะฒะฐะฝะฝะพัั‚ะธ ะธ ะฟั€ะธะฝัั‚ัŒ ะพะดะฝะพะทะฝะฐั‡ะฝั‹ะต ั€ะตัˆะตะฝะธั ะพ ะฟั€ะพะฑะตะปะฐั…. + +### ะขะตัั‚ะธั€ะพะฒะฐะฝะธะต ะ‘ั€ะฐะนะปั + +ะžัะฝะพะฒะฝะพะน ะฟั€ะธะฝั†ะธะฟ ะฟะพั…ะพะถ ะฝะฐ ั‚ะตัั‚ะธั€ะพะฒะฐะฝะธะต TTS, ะฝะพ ะฒะผะตัั‚ะพ ัั‚ั€ะพะบ ั€ะตั‡ะธ ะฟั€ะพะฒะตั€ััŽั‚ัั ัะธะผะฒะพะปั‹ ะ‘ั€ะฐะนะปั ะฒ Unicode. + +ะฃะดะพะฑะฝะพ ะฟะธัะฐั‚ัŒ ั‚ะตัั‚ั‹ Rust ั ะพะถะธะดะฐะตะผั‹ะผ ะฒั‹ะฒะพะดะพะผ ะ‘ั€ะฐะนะปั ะธะท ะฝะฐั†ะธะพะฝะฐะปัŒะฝะพะณะพ ัั‚ะฐะฝะดะฐั€ั‚ะฐ ะธะปะธ ัะพะณะปะฐัะพะฒะฐะฝะฝั‹ั… ะฟั€ะธะผะตั€ะพะฒ. ะ—ะฐะฟัƒัะบะฐะนั‚ะต ั‚ะตัั‚ั‹, ะธะทัƒั‡ะฐะนั‚ะต ะพัˆะธะฑะบะธ ะธ ะดะพั€ะฐะฑะฐั‚ั‹ะฒะฐะนั‚ะต ะฟั€ะฐะฒะธะปะฐ ะดะพ ัะพะฒะฟะฐะดะตะฝะธั ั€ะตะทัƒะปัŒั‚ะฐั‚ะฐ. + +ะ’ ัˆะฒะตะดัะบะพะผ ะฟะตั€ะตะฒะพะดะต ะธัะฟะพะปัŒะทะพะฒะฐะปะธััŒ ะฟั€ะธะผะตั€ั‹ ะฝะตะฟะพัั€ะตะดัั‚ะฒะตะฝะฝะพ ะธะท ัˆะฒะตะดัะบะพะณะพ ัั‚ะฐะฝะดะฐั€ั‚ะฐ ะ‘ั€ะฐะนะปั, ะพัะพะฑะตะฝะฝะพ ะดะปั ะฐั€ะธั„ะผะตั‚ะธะบะธ, ะดั€ะพะฑะตะน, ะฟะพะดัั‚ั€ะพั‡ะฝั‹ั… ะธ ะฝะฐะดัั‚ั€ะพั‡ะฝั‹ั… ะธะฝะดะตะบัะพะฒ, ะฐ ั‚ะฐะบะถะต ะพัะฝะพะฒะฝั‹ั… ั„ัƒะฝะบั†ะธะน. ะญั‚ะพ ะฟะพะผะพะณะปะพ ะฟั€ะพั‡ะฝะพ ัะฒัะทะฐั‚ัŒ ะฟั€ะฐะฒะธะปะฐ ั ั€ะตะฐะปัŒะฝั‹ะผ ัั‚ะฐะฝะดะฐั€ั‚ะพะผ. + +### ะžัะพะฑั‹ะต ัะปะพะถะฝะพัั‚ะธ ะ‘ั€ะฐะนะปั + +ะŸั€ะธ ั€ะฐะฑะพั‚ะต ั ะ‘ั€ะฐะนะปะตะผ ั‡ะฐัั‚ะพ ะฒะพะทะฝะธะบะฐัŽั‚ ะฟั€ะพะฑะปะตะผั‹, ะฝะต ะฒัั‚ั€ะตั‡ะฐัŽั‰ะธะตัั ะฒ ะฟะตั€ะตะฒะพะดะต ั€ะตั‡ะธ. ะะฐะฟั€ะธะผะตั€: + +* ัั‚ะฐะฝะดะฐั€ั‚ ะผะพะถะตั‚ ะฑั‹ั‚ัŒ ะฝะตะฟะพะปะฝั‹ะผ ะธะปะธ ะฝะตัะพะณะปะฐัะพะฒะฐะฝะฝั‹ะผ; +* ัั‚ะฐะฝะดะฐั€ั‚ ะผะพะถะตั‚ ะฟั€ะตะดะฟะพะปะฐะณะฐั‚ัŒ ะฟะตั‡ะฐั‚ะฝั‹ะน ะบะพะฝั‚ะตะบัั‚, ะฐ ะฝะต ะฐะฒั‚ะพะผะฐั‚ะธั‡ะตัะบะธ ัะพะทะดะฐะฒะฐะตะผั‹ะน ะฒั‹ะฒะพะด; +* ัƒ ะฝะตะบะพั‚ะพั€ั‹ั… ัะธะผะฒะพะปะพะฒ ะผะพะถะตั‚ ะฝะต ะฑั‹ั‚ัŒ ะพะดะฝะพะทะฝะฐั‡ะฝะพะณะพ ัƒัั‚ะพัะฒัˆะตะณะพัั ะฟั€ะตะดัั‚ะฐะฒะปะตะฝะธั; +* ะฟั€ะฐะฒะธะปะฐ ะฟั€ะพะฑะตะปะพะฒ ะผะพะณัƒั‚ ะฟะพั‚ั€ะตะฑะพะฒะฐั‚ัŒ ะฑะพะปัŒัˆะตะน ัั‚ั€ะพะณะพัั‚ะธ, ั‡ะตะผ ะฟั€ะตะดะฟะพะปะฐะณะฐะตั‚ ะธัั…ะพะดะฝั‹ะน ัั‚ะฐะฝะดะฐั€ั‚. + +### ะŸะพะปัŒะทะพะฒะฐั‚ะตะปัŒัะบะพะต ั‚ะตัั‚ะธั€ะพะฒะฐะฝะธะต ะ‘ั€ะฐะนะปั + +ะŸะพะปัŒะทะพะฒะฐั‚ะตะปัŒัะบะพะต ั‚ะตัั‚ะธั€ะพะฒะฐะฝะธะต ะ‘ั€ะฐะนะปั ั‚ะฐะบ ะถะต ะฒะฐะถะฝะพ, ะบะฐะบ ั‚ะตัั‚ะธั€ะพะฒะฐะฝะธะต ั€ะตั‡ะธ. + +ะŸั€ะธ ั€ะฐะฑะพั‚ะต ะฝะฐะด ัˆะฒะตะดัะบะธะผ ะฟะตั€ะตะฒะพะดะพะผ ั‚ะตัั‚ะธั€ะพะฒั‰ะธะบะธ ะธัะฟะพะปัŒะทะพะฒะฐะปะธ NVDA ะฒะผะตัั‚ะต ัะพ ัั€ะตะดัั‚ะฒะพะผ ะฟั€ะพัะผะพั‚ั€ะฐ ะ‘ั€ะฐะนะปั, ั‡ั‚ะพะฑั‹ ะบะพะฝั‚ั€ะพะปะธั€ะพะฒะฐั‚ัŒ ั€ะตะทัƒะปัŒั‚ะฐั‚ ะฒะพ ะฒั€ะตะผั ัƒะดะฐะปั‘ะฝะฝั‹ั… ัะตะฐะฝัะพะฒ. ะญั‚ะพ ะฟะพะทะฒะพะปัะปะพ ะฝะฐะฑะปัŽะดะฐั‚ัŒ ะฒั‹ะฒะพะด, ะดะฐะถะต ะตัะปะธ ัะฐะผะธ ั€ะตั†ะตะฝะทะตะฝั‚ั‹ ั‡ะธั‚ะฐะปะธ ะตะณะพ ะฝะฐ ั„ะธะทะธั‡ะตัะบะพะผ ะดะธัะฟะปะตะต ะ‘ั€ะฐะนะปั. + +ะšะฐะบ ะธ ะดะปั ั€ะตั‡ะธ, ะฒะฐะถะฝะฐ ะฝะต ั‚ะพะปัŒะบะพ ั‚ะตั…ะฝะธั‡ะตัะบะฐั ะฟั€ะฐะฒะธะปัŒะฝะพัั‚ัŒ. ะ ะตะทัƒะปัŒั‚ะฐั‚ ะดะพะปะถะตะฝ ะฑั‹ั‚ัŒ ั‡ะธั‚ะฐะตะผั‹ะผ, ัะพะณะปะฐัะพะฒะฐะฝะฝั‹ะผ ะธ ะฟะพะปะตะทะฝั‹ะผ ะฒ ั€ะตะฐะปัŒะฝะพะน ั€ะฐะฑะพั‚ะต. + +--- + +## ะŸั€ะธะปะพะถะตะฝะธะต + +### ะŸั€ะฐะบั‚ะธั‡ะตัะบะธะต ัะพะฒะตั‚ั‹ ะดะปั ัั„ั„ะตะบั‚ะธะฒะฝะพะน ั€ะฐะฑะพั‚ั‹ + +ะ˜ะฝัั‚ั€ัƒะผะตะฝั‚ั‹ ะธัะบัƒััั‚ะฒะตะฝะฝะพะณะพ ะธะฝั‚ะตะปะปะตะบั‚ะฐ ะผะพะณัƒั‚ ะฑั‹ั‚ัŒ ะฟะพะปะตะทะฝั‹ ะฟั€ะธ ะฟะพะดะณะพั‚ะพะฒะบะต ั‡ะตั€ะฝะพะฒะพะณะพ ะฟะตั€ะตะฒะพะดะฐ, ะฟะพะธัะบะต ะฐะปัŒั‚ะตั€ะฝะฐั‚ะธะฒะฝั‹ั… ั„ะพั€ะผัƒะปะธั€ะพะฒะพะบ ะธ ั€ะฐะทะฑะพั€ะต ัะปะพะถะฝะพะณะพ ะฟั€ะฐะฒะธะปะฐ. ะžะฝะธ ั‚ะฐะบะถะต ะผะพะณัƒั‚ ะฟะพะผะพั‡ัŒ ะฟั€ะธ ะฝะฐะฟะธัะฐะฝะธะธ ะธ ั€ะตะดะฐะบั‚ะธั€ะพะฒะฐะฝะธะธ ะฟั€ะฐะฒะธะป. + +ะžะดะฝะฐะบะพ ะพั‚ะฝะพัะธั‚ะตััŒ ะบ ะฝะธะผ ะบะฐะบ ะบ ะฟะพะผะพั‰ะฝะธะบะฐะผ, ะฐ ะฝะต ะบะฐะบ ะบ ะฐะฒั‚ะพั€ะธั‚ะตั‚ะฝั‹ะผ ะธัั‚ะพั‡ะฝะธะบะฐะผ. ะะฒั‚ะพะผะฐั‚ะธั‡ะตัะบะธะน ะฟะตั€ะตะฒะพะด ะฒัะตะณะดะฐ ั‚ั€ะตะฑัƒะตั‚ ะฟั€ะพะฒะตั€ะบะธ ั‡ะตะปะพะฒะตะบะพะผ, ะฐ ะธะทะผะตะฝะตะฝะธั ะฟั€ะฐะฒะธะป โ€” ั‚ะตัั‚ะธั€ะพะฒะฐะฝะธั ะฝะฐ ั€ะตะฐะปัŒะฝะพะผ ะฒั‹ะฒะพะดะต. + +ะ’ ั†ะตะปะพะผ ะฟะพะปะตะทะฝะพ ะฒะฝะพัะธั‚ัŒ ะฟะพ ะพะดะฝะพะผัƒ ะธะทะผะตะฝะตะฝะธัŽ, ั‡ะฐัั‚ะพ ะทะฐะฟัƒัะบะฐั‚ัŒ ั‚ะตัั‚ั‹ ะธ ะฟั€ะธ ะฒะพะทะผะพะถะฝะพัั‚ะธ ะพะฑััƒะถะดะฐั‚ัŒ ัะปะพะถะฝั‹ะต ัะปัƒั‡ะฐะธ ั ะดั€ัƒะณะธะผะธ ะฟะตั€ะตะฒะพะดั‡ะธะบะฐะผะธ ะธะปะธ ัะฟะตั†ะธะฐะปะธัั‚ะฐะผะธ. + +### ะฃัั‚ั€ะฐะฝะตะฝะธะต ะฟั€ะพะฑะปะตะผ + +ะ•ัะปะธ ั‡ั‚ะพ-ั‚ะพ ั€ะฐะฑะพั‚ะฐะตั‚ ะฝะต ั‚ะฐะบ, ะบะฐะบ ะพะถะธะดะฐะปะพััŒ, ัะฝะฐั‡ะฐะปะฐ ะฟั€ะพะฒะตั€ัŒั‚ะต ะพั‚ัั‚ัƒะฟั‹. ะžัˆะธะฑะบะธ YAML ั€ะฐัะฟั€ะพัั‚ั€ะฐะฝะตะฝั‹, ะธ ะธั… ะฑั‹ะฒะฐะตั‚ ะฝะตะพะถะธะดะฐะฝะฝะพ ั‚ั€ัƒะดะฝะพ ะทะฐะผะตั‚ะธั‚ัŒ. ะŸั€ะธ ะธัะฟะพะปัŒะทะพะฒะฐะฝะธะธ VS Code ะฟะพะปะตะทะฝะพ ัƒัั‚ะฐะฝะพะฒะธั‚ัŒ ั€ะฐััˆะธั€ะตะฝะธะต YAML, ะฟะพะผะพะณะฐัŽั‰ะตะต ะฝะฐั…ะพะดะธั‚ัŒ ั‚ะฐะบะธะต ะพัˆะธะฑะบะธ. + +ะขะฐะบะถะต ะฒะฝะธะผะฐั‚ะตะปัŒะฝะพ ะธะทัƒั‡ะฐะนั‚ะต ั€ะตะทัƒะปัŒั‚ะฐั‚ั‹ ั‚ะตัั‚ะพะฒ ะธ ัะฝะพะฒะฐ ัะปัƒัˆะฐะนั‚ะต ั€ะตั‡ัŒ. ะœะฝะพะณะธะต ะฟั€ะพะฑะปะตะผั‹ ะปะตะณั‡ะต ัƒัะปั‹ัˆะฐั‚ัŒ, ั‡ะตะผ ัƒะฒะธะดะตั‚ัŒ. + +### XPath + +ะ’ะพ ะผะฝะพะณะธั… ั‡ะฐัั‚ัั… ะฟั€ะฐะฒะธะป ั€ะตั‡ะธ ะธัะฟะพะปัŒะทัƒะตั‚ัั XPath. ะญั‚ะพ ั€ะฐัะฟั€ะพัั‚ั€ะฐะฝั‘ะฝะฝั‹ะน ะธ ั…ะพั€ะพัˆะพ ะดะพะบัƒะผะตะฝั‚ะธั€ะพะฒะฐะฝะฝั‹ะน ัะฟะพัะพะฑ ะฒั‹ะฑะพั€ะฐ ั‡ะฐัั‚ะตะน XML-ะดะพะบัƒะผะตะฝั‚ะฐ. ะ’ ะธะฝั‚ะตั€ะฝะตั‚ะต ะตัั‚ัŒ ะผะฝะพะถะตัั‚ะฒะพ ั€ัƒะบะพะฒะพะดัั‚ะฒ. ะ•ัะปะธ ะฒั‹ ะตั‰ั‘ ะฝะต ะทะฝะฐะบะพะผั‹ ั XPath, ั€ะตะบะพะผะตะฝะดัƒะตั‚ัั ะฟั€ะพั‡ะธั‚ะฐั‚ัŒ ะพะดะฝะพ ะธะท ะฝะธั…. ะ’ MathCAT ะธัะฟะพะปัŒะทัƒะตั‚ัั ะฝะตะผะฝะพะณะพ ั€ะฐััˆะธั€ะตะฝะฝะฐั ั€ะตะฐะปะธะทะฐั†ะธั XPath 1.0. + +ะ’ MathCAT ะพะฑั‹ั‡ะฝะพ ะฟั€ะธะผะตะฝััŽั‚ัั ะปะธัˆัŒ ะฝะตะบะพั‚ะพั€ั‹ะต ะฒะพะทะผะพะถะฝะพัั‚ะธ XPath, ะฐ ั‚ะฐะบะถะต ะฝะตัะบะพะปัŒะบะพ ัะฟะตั†ะธะฐะปัŒะฝั‹ั… ั„ัƒะฝะบั†ะธะน. ะะธะถะต ะบั€ะฐั‚ะบะพ ะพะฟะธัะฐะฝั‹ ั€ะฐัะฟั€ะพัั‚ั€ะฐะฝั‘ะฝะฝั‹ะต ะฒะฐั€ะธะฐะฝั‚ั‹ ะธัะฟะพะปัŒะทะพะฒะฐะฝะธั XPath. + +| ะ—ะฐะฟะธััŒ | ะ—ะฝะฐั‡ะตะฝะธะต | +| --- | --- | +| `*` | ะกะพะพั‚ะฒะตั‚ัั‚ะฒัƒะตั‚ ะฒัะตะผ ะดะพั‡ะตั€ะฝะธะผ ัƒะทะปะฐะผ. | +| `[...]` | ะ’ั‹ะฑะธั€ะฐะตั‚ ัƒะทะปั‹ ะธะท ั‚ะตะบัƒั‰ะตะณะพ ัะพะฟะพัั‚ะฐะฒะปะตะฝะธั. | +| `*[1]` | ะ’ั‹ะฑะธั€ะฐะตั‚ ะฟะตั€ะฒั‹ะน ะดะพั‡ะตั€ะฝะธะน ัƒะทะตะป. | +| `*[self::m:mn]` | ะ’ั‹ะฑะธั€ะฐะตั‚ ะฒัะต ะดะพั‡ะตั€ะฝะธะต ัะปะตะผะตะฝั‚ั‹ `mn`. ะŸั€ะตั„ะธะบั `m` ะฟะพะบะฐะทั‹ะฒะฐะตั‚, ั‡ั‚ะพ ัะปะตะผะตะฝั‚ ะฝะฐั…ะพะดะธั‚ัั ะฒ ะฟั€ะพัั‚ั€ะฐะฝัั‚ะฒะต ะธะผั‘ะฝ MathML. | +| `*[1][self::m:mn]` | ะ’ั‹ะฑะธั€ะฐะตั‚ ะฟะตั€ะฒั‹ะน ะดะพั‡ะตั€ะฝะธะน ัƒะทะตะป, ะตัะปะธ ะพะฝ ัะฒะปัะตั‚ัั ัะปะตะผะตะฝั‚ะพะผ `mn`. | +| `*[1][self::m:mo][text()='-']` | ะ’ั‹ะฑะธั€ะฐะตั‚ ะฟะตั€ะฒั‹ะน ะดะพั‡ะตั€ะฝะธะน ัƒะทะตะป, ะตัะปะธ ะพะฝ ัะฒะปัะตั‚ัั ัะปะตะผะตะฝั‚ะพะผ `mo` ั ัะพะดะตั€ะถะธะผั‹ะผ `-`. ะœะพะถะฝะพ ะทะฐะฟะธัะฐั‚ัŒ `*[1][text()='-']`, ะฟะพัะบะพะปัŒะบัƒ ะดั€ัƒะณะธะต ัƒะทะปั‹, ัะบะพั€ะตะต ะฒัะตะณะพ, ะฝะต ัะพะดะตั€ะถะฐั‚ `-`, ะฝะพ ั‚ะฐะบะพะต ัะพะดะตั€ะถะธะผะพะต ะดะพะฟัƒัั‚ะธะผะพ ะดะปั `mtext`, ะฟะพัั‚ะพะผัƒ ะฑะตะทะพะฟะฐัะฝะตะต ัƒะบะฐะทะฐั‚ัŒ ะธะผั ัะปะตะผะตะฝั‚ะฐ. | +| `count(*[2]/*)` | ะšะพะปะธั‡ะตัั‚ะฒะพ ะดะพั‡ะตั€ะฝะธั… ัƒะทะปะพะฒ ะฒั‚ะพั€ะพะณะพ ะดะพั‡ะตั€ะฝะตะณะพ ัƒะทะปะฐ. | +| `count(preceding-sibling::*)+1` | ะšะพะปะธั‡ะตัั‚ะฒะพ ะพะดะฝะพัƒั€ะพะฒะฝะตะฒั‹ั… ัƒะทะปะพะฒ ะฟะตั€ะตะด ั‚ะตะบัƒั‰ะธะผ ัะปะตะผะตะฝั‚ะพะผ ะฟะปัŽั ะพะดะธะฝ. | + +MathCAT ะดะพะฑะฐะฒะปัะตั‚ ัะฟะตั†ะธะฐะปัŒะฝั‹ะต ั„ัƒะฝะบั†ะธะธ, ัƒะฟั€ะพั‰ะฐัŽั‰ะธะต ะฝะฐะฟะธัะฐะฝะธะต ะฟั€ะฐะฒะธะป: + +| ะคัƒะฝะบั†ะธั | ะ—ะฝะฐั‡ะตะฝะธะต | +| --- | --- | +| `IsNode(nodes, type)` | ะ’ะพะทะฒั€ะฐั‰ะฐะตั‚ true, ะตัะปะธ ะฒัะต ัƒะทะปั‹ ะธะผะตัŽั‚ ะพะดะธะฝะฐะบะพะฒั‹ะน ั‚ะธะฟ. ะ”ะพะฟัƒัั‚ะธะผั‹ะต ั‚ะธะฟั‹:
`"simple"` โ€” ะทะฐะดะฐะฝะฝั‹ะน ะฝะฐะฑะพั€ ัะปะตะผะตะฝั‚ะพะฒ ClearSpeak;
`"leaf"` โ€” ะพะดะธะฝ ะธะท ะปะธัั‚ะพะฒั‹ั… ัะปะตะผะตะฝั‚ะพะฒ MathML;
`"2D"` โ€” ะดะฒัƒะผะตั€ะฝั‹ะน ัƒะทะตะป, ะฝะฐะฟั€ะธะผะตั€ `mfrac` ะธะปะธ `mroot`;
`"modified"` โ€” ัƒะทะตะป ั ะธะฝะดะตะบัะพะผ ะธะปะธ ัะปะตะผะตะฝั‚ะพะผ ะฝะฐะด ะฝะธะผ ะปะธะฑะพ ะฟะพะด ะฝะธะผ;
`"scripts"` โ€” ัƒะทะตะป ั ะฟะพะดัั‚ั€ะพั‡ะฝั‹ะผ ะธ (ะธะปะธ) ะฝะฐะดัั‚ั€ะพั‡ะฝั‹ะผ ะธะฝะดะตะบัะพะผ;
`"common_fraction"` โ€” ั†ะตะปะพั‡ะธัะปะตะฝะฝั‹ะต ั‡ะธัะปะธั‚ะตะปัŒ ะธ ะทะฝะฐะผะตะฝะฐั‚ะตะปัŒ. | +| `ToOrdinal` | | +| `ToCommonFraction` | | +| `IsBracketed(openChar, closeChar, requiresComma)` | | +| `BaseNode(node)` | ะ ะตะบัƒั€ัะธะฒะฝะพ ะฒะพะทะฒั€ะฐั‰ะฐะตั‚ ะพัะฝะพะฒัƒ ัƒะทะปะฐ ั ะธะฝะดะตะบัะฐะผะธ. | +| `IsInDefinition(node, name)` | ะ’ะพะทะฒั€ะฐั‰ะฐะตั‚ true, ะตัะปะธ ัƒะทะตะป ะฒั…ะพะดะธั‚ ะฒ ัะฟะธัะพะบ `name`, ะทะฐะดะฐะฝะฝั‹ะน ะฒ `definitions.yaml`. | +| `IfThenElse(test, then-part, else-part)` | ะ’ะพะทะฒั€ะฐั‰ะฐะตั‚ `then-part`, ะตัะปะธ ัƒัะปะพะฒะธะต ะธัั‚ะธะฝะฝะพ, ะธะฝะฐั‡ะต ะฒะพะทะฒั€ะฐั‰ะฐะตั‚ `else-part`. ะ’ัะต ะฐั€ะณัƒะผะตะฝั‚ั‹ ัะฒะปััŽั‚ัั ะฒั‹ั€ะฐะถะตะฝะธัะผะธ XPath. | +| `DistanceFromLeaf(node, left_side, treat_2d_elements_as_tokens)` | ะ’ะพะทะฒั€ะฐั‰ะฐะตั‚ ั€ะฐััั‚ะพัะฝะธะต ะพั‚ ั‚ะตะบัƒั‰ะตะณะพ ัƒะทะปะฐ ะดะพ ะบั€ะฐะนะฝะตะณะพ ะปะตะฒะพะณะพ ะธะปะธ ะฟั€ะฐะฒะพะณะพ ะปะธัั‚ะฐ: ะดะปั ัะธะผะฒะพะปะฐ 0, ะดะปั ั‚ะพะบะตะฝะฐ 1. ะ•ัะปะธ `left_side` ั€ะฐะฒะฝะพ `true`, ะพะฑั…ะพะด ะฒั‹ะฟะพะปะฝัะตั‚ัั ะฟะพ ะบั€ะฐะนะฝะธะผ ะปะตะฒั‹ะผ ะดะพั‡ะตั€ะฝะธะผ ัƒะทะปะฐะผ ะดะพ ะปะธัั‚ะฐ, ะธะฝะฐั‡ะต ะฟะพ ะฟั€ะฐะฒั‹ะผ. ะ•ัะปะธ `treat_2d_elements_as_tokens` ั€ะฐะฒะฝะพ `true`, ะดะฒัƒะผะตั€ะฝั‹ะต ะพะฑะพะทะฝะฐั‡ะตะฝะธั, ะฝะฐะฟั€ะธะผะตั€ ะดั€ะพะฑะธ, ัั‡ะธั‚ะฐัŽั‚ัั ะพะดะธะฝะพั‡ะฝั‹ะผะธ ั‚ะพะบะตะฝะฐะผะธ, ะฟะพะดะพะฑะฝั‹ะผะธ ะปะธัั‚ะฐะผ. | +| `EdgeNode(node, "left"/"right", stopNodeName)` | ะ’ะพะทะฒั€ะฐั‰ะฐะตั‚ ัƒะทะตะป ะพัั‚ะฐะฝะพะฒะบะธ, ะตัะปะธ ะธัั…ะพะดะฝั‹ะน ัƒะทะตะป ะฝะฐั…ะพะดะธั‚ัั ัƒ ะปะตะฒะพะณะพ ะธะปะธ ะฟั€ะฐะฒะพะณะพ ะบั€ะฐั ัƒะบะฐะทะฐะฝะฝะพะณะพ ะฟั€ะตะดะบะฐ. ะ—ะฝะฐั‡ะตะฝะธะตะผ `stopNodeName` ั‚ะฐะบะถะต ะผะพะถะตั‚ ะฑั‹ั‚ัŒ `"2D"`. ะ•ัะปะธ ัะพะพั‚ะฒะตั‚ัั‚ะฒะธะต ะฝะต ะฝะฐะนะดะตะฝะพ, ะฒะพะทะฒั€ะฐั‰ะฐะตั‚ัั ะธัั…ะพะดะฝั‹ะน ัƒะทะตะป. ะ•ัะปะธ `stopNodeName` ั€ะฐะฒะฝะพ `"math"`, ัƒั‡ะธั‚ั‹ะฒะฐะตั‚ัั ะฟัƒะฝะบั‚ัƒะฐั†ะธั, ะฟะพัะบะพะปัŒะบัƒ ะพะฝะฐ ะฝะต ัะฒะปัะตั‚ัั ั‡ะฐัั‚ัŒัŽ ะผะฐั‚ะตะผะฐั‚ะธั‡ะตัะบะพะณะพ ะฒั‹ั€ะฐะถะตะฝะธั. | +| `DEBUG(xpath)` | ะ”ะพะฑะฐะฒะปัะตั‚ ะฟะพะปะตะทะฝั‹ะต ะดะปั ะดะธะฐะณะฝะพัั‚ะธะบะธ ัะฒะตะดะตะฝะธั ะฒ ะพั‚ะปะฐะดะพั‡ะฝั‹ะน ะฒั‹ะฒะพะด. | + +ะกะปะตะดัƒัŽั‰ะธะต ั„ัƒะฝะบั†ะธะธ ะธัะฟะพะปัŒะทัƒัŽั‚ัั ะฟั€ะฐะฒะธะปะฐะผะธ ะบะพะดะฐ ะะตะผะตั‚ะฐ: + +| ะคัƒะฝะบั†ะธั | ะ—ะฝะฐั‡ะตะฝะธะต | +| --- | --- | +| `NestingChars` | ะ˜ัะฟะพะปัŒะทัƒะตั‚ัั ะฟั€ะฐะฒะธะปะฐะผะธ `mfrac`, `msqrt` ะธ `mroot`, ั‡ั‚ะพะฑั‹ ะฟะพะฒั‚ะพั€ัั‚ัŒ ัะธะผะฒะพะปั‹ ะฝัƒะถะฝะพะต ะบะพะปะธั‡ะตัั‚ะฒะพ ั€ะฐะท. | +| `BrailleChars` | ะ˜ัะฟะพะปัŒะทัƒะตั‚ัั ัะปะตะผะตะฝั‚ะฐะผะธ-ั‚ะพะบะตะฝะฐะผะธ ะดะปั ัะปะพะถะฝะพะน ะฟะตั€ะตัั‚ะฐะฝะพะฒะบะธ ะธะฝะดะธะบะฐั‚ะพั€ะพะฒ ะบะพะดะฐ ะะตะผะตั‚ะฐ, ะฝะฐะฟั€ะธะผะตั€ ะฟั€ะพะฟะธัะฝั‹ั… ะฑัƒะบะฒ ะธ ะฝะฐั‡ะตั€ั‚ะฐะฝะธั ัˆั€ะธั„ั‚ะฐ. | diff --git a/docs/ru/users.md b/docs/ru/users.md new file mode 100644 index 000000000..29d4fa9f1 --- /dev/null +++ b/docs/ru/users.md @@ -0,0 +1,203 @@ +--- +layout: default +lang: ru +ref: users +title: ะ ัƒะบะพะฒะพะดัั‚ะฒะพ ะฟะพะปัŒะทะพะฒะฐั‚ะตะปั MathCAT +--- +# ะ›ะพะณะพั‚ะธะฟ MathCAT ะ ัƒะบะพะฒะพะดัั‚ะฒะพ ะฟะพะปัŒะทะพะฒะฐั‚ะตะปั + +## ะ ะตะบะพะผะตะฝะดะฐั†ะธะธ ะฟะพ ะฒั‹ะฑะพั€ัƒ ะณะพะปะพัะฐ + +ะ’ NVDA ะผะพะถะฝะพ ะธัะฟะพะปัŒะทะพะฒะฐั‚ัŒ ั€ะฐะทะฝั‹ะต ัะธะฝั‚ะตะทะฐั‚ะพั€ั‹ ั€ะตั‡ะธ. ะ”ะปั ะฒั‹ะฑะพั€ะฐ ะพั‚ะบั€ะพะนั‚ะต `ะŸะฐั€ะฐะผะตั‚ั€ั‹:ะะฐัั‚ั€ะพะนะบะธ...` ะฒ NVDA, ะฐ ะทะฐั‚ะตะผ ะฒั‹ะฑะตั€ะธั‚ะต ะบะฐั‚ะตะณะพั€ะธัŽ `ะ ะตั‡ัŒ`. ะžะฑั‹ั‡ะฝะพ ะดะพัั‚ัƒะฟะฝั‹ ะบะฐะบ ะผะธะฝะธะผัƒะผ ั‚ั€ะธ ะฒะฐั€ะธะฐะฝั‚ะฐ: eSpeak NG, Microsoft Speech API ะธ ะณะพะปะพัะฐ Windows OneCore. ะ’ัะต ัะธะฝั‚ะตะทะฐั‚ะพั€ั‹ ั€ะฐะฑะพั‚ะฐัŽั‚, ะฝะพ ะณะพะปะพัะฐ Windows OneCore ะฝะตะฟั€ะฐะฒะธะปัŒะฝะพ ะฟั€ะพะธะทะฝะพััั‚ ยซaยป, ะฟะพัั‚ะพะผัƒ ั€ะตะบะพะผะตะฝะดัƒะตั‚ัั ะฒั‹ะฑั€ะฐั‚ัŒ ะดั€ัƒะณะพะน ะฒะฐั€ะธะฐะฝั‚. ะ’ ั‡ะฐัั‚ะฝะพัั‚ะธ, ั…ะพั€ะพัˆะตะน ะทะฐะผะตะฝะพะน ะณะพะปะพัะฐะผ OneCore ัะปัƒะถะธั‚ Microsoft Speech API. + +## ะ˜ะฝั„ะพั€ะผะฐั†ะธั ะดะปั ะฟะพะปัŒะทะพะฒะฐั‚ะตะปะตะน MathCAT + +MathCAT ะฟะพะดะดะตั€ะถะธะฒะฐะตั‚ ั€ัะด ะฝะฐัั‚ั€ะพะตะบ ะพะทะฒัƒั‡ะธะฒะฐะฝะธั, ะ‘ั€ะฐะนะปั ะธ ะฝะฐะฒะธะณะฐั†ะธะธ. ะžะฝะธ ะพะฟะธัะฐะฝั‹ ะฝะธะถะต. +ะŸะพะบะฐ ะฟะพะดะดะตั€ะถะธะฒะฐัŽั‚ัั ะฝะต ะฒัะต ะฝะฐัั‚ั€ะพะนะบะธ. ะ”ะปั ะบะฐะถะดะพะน ะฝะฐัั‚ั€ะพะนะบะธ ัƒะบะฐะทะฐะฝะพ ั‚ะตะบัƒั‰ะตะต ัะพัั‚ะพัะฝะธะต ะฟะพะดะดะตั€ะถะบะธ. ะกะธะผะฒะพะป โœ“ ะฟะตั€ะตะด ะฝะฐัั‚ั€ะพะนะบะพะน ะพะทะฝะฐั‡ะฐะตั‚, ั‡ั‚ะพ ะพะฝะฐ ะฟะพะดะดะตั€ะถะธะฒะฐะตั‚ัั ั…ะพั‚ั ะฑั‹ ั‡ะฐัั‚ะธั‡ะฝะพ. + +ะŸั€ะธะผะตั‡ะฐะฝะธะต: ะฒ NVDA ะฝะฐัั‚ั€ะพะนะบะธ ะทะฐะดะฐัŽั‚ัั ะฒ ะดะธะฐะปะพะณะต ะฟะฐั€ะฐะผะตั‚ั€ะพะฒ MathCAT. ะงั‚ะพะฑั‹ ะพั‚ะบั€ั‹ั‚ัŒ ะตะณะพ, ะฟะตั€ะตะนะดะธั‚ะต ะฒ ะฟะฐั€ะฐะผะตั‚ั€ั‹ NVDA, ะฒั‹ะฑะตั€ะธั‚ะต ยซะŸะฐั€ะฐะผะตั‚ั€ั‹ยป, ะฐ ะทะฐั‚ะตะผ ยซะะฐัั‚ั€ะพะนะบะธ MathCAT...ยป. ะะฐัั‚ั€ะพะนะบะธ ั€ะฐะทะดะตะปะตะฝั‹ ะฝะฐ ั‚ั€ะธ ะบะฐั‚ะตะณะพั€ะธะธ: ยซะ ะตั‡ัŒยป, ยซะะฐะฒะธะณะฐั†ะธัยป ะธ ยซะ‘ั€ะฐะนะปัŒยป. ะขะฐะบะพะต ะถะต ั€ะฐะทะดะตะปะตะฝะธะต ะธัะฟะพะปัŒะทัƒะตั‚ัั ะฝะธะถะต. + +MathCAT ะฟะพะดะดะตั€ะถะธะฒะฐะตั‚ ะฝะตัะบะพะปัŒะบะพ ั€ะตะถะธะผะพะฒ ะฝะฐะฒะธะณะฐั†ะธะธ. ะกะฟะพัะพะฑ ะฒั…ะพะดะฐ ะฒ ั€ะตะถะธะผ ะฝะฐะฒะธะณะฐั†ะธะธ ะธ ะฒั‹ั…ะพะดะฐ ะธะท ะฝะตะณะพ ะทะฐะฒะธัะธั‚ ะพั‚ ะธัะฟะพะปัŒะทัƒะตะผะพะน ะฒัะฟะพะผะพะณะฐั‚ะตะปัŒะฝะพะน ั‚ะตั…ะฝะพะปะพะณะธะธ (ะฟะพะดั€ะพะฑะฝะตะต ะฒ ัะฟะธัะบะต ะฝะธะถะต). MathCAT ะฟั€ะธะฝะธะผะฐะตั‚ ั‚ะต ะถะต ะบะพะผะฐะฝะดั‹ ะธ ัะพั‡ะตั‚ะฐะฝะธั ะบะปะฐะฒะธัˆ, ั‡ั‚ะพ ะธ MathPlayer. ะžะฝะธ [ะฟะตั€ะตั‡ะธัะปะตะฝั‹ ะฒ ัั‚ะพะผ ะดะพะบัƒะผะตะฝั‚ะต](nav-commands.md). +ะ”ะพะบัƒะผะตะฝั‚ะฐั†ะธั ะพะฟะธัั‹ะฒะฐะตั‚ ะผะฝะพะถะตัั‚ะฒะพ ะฟะพะปะตะทะฝั‹ั… ัะฟะพัะพะฑะพะฒ ะฝะฐะฒะธะณะฐั†ะธะธ ะฟะพ ะผะฐั‚ะตะผะฐั‚ะธั‡ะตัะบะธะผ ะฒั‹ั€ะฐะถะตะฝะธัะผ. ะงั‚ะพะฑั‹ ะฑั‹ัั‚ั€ะพ ะฝะฐั‡ะฐั‚ัŒ ั€ะฐะฑะพั‚ัƒ: + +* ะ˜ัะฟะพะปัŒะทัƒะนั‚ะต ะบะปะฐะฒะธัˆะธ-ัั‚ั€ะตะปะบะธ ะดะปั ะฟะตั€ะตะผะตั‰ะตะฝะธั ะฒะปะตะฒะพ, ะฒะฟั€ะฐะฒะพ, ะฒะฒะตั€ั… ะธ ะฒะฝะธะท ะฟะพ ัั‚ั€ัƒะบั‚ัƒั€ะต ะผะฐั‚ะตะผะฐั‚ะธั‡ะตัะบะพะณะพ ะฒั‹ั€ะฐะถะตะฝะธั, ะฝะฐะฟั€ะธะผะตั€ ะดะปั ะฒั…ะพะดะฐ ะฒ ะดั€ะพะฑัŒ ะธ ะฒั‹ั…ะพะดะฐ ะธะท ะฝะตั‘. +* ะ’ะฝัƒั‚ั€ะธ ั‚ะฐะฑะปะธั†ั‹ ะฝะฐะถะธะผะฐะนั‚ะต Ctrl+ัั‚ั€ะตะปะบะฐ ะดะปั ะฟะตั€ะตะผะตั‰ะตะฝะธั ะฟะพ ัั‡ะตะนะบะฐะผ. +* ะะฐะถะธะผะฐะนั‚ะต Home ะธ End ะดะปั ะฟะตั€ะตั…ะพะดะฐ ะบ ะฝะฐั‡ะฐะปัƒ ะธ ะบะพะฝั†ัƒ ะฒั‹ั€ะฐะถะตะฝะธั. +* ะะฐะถะธะผะฐะนั‚ะต ะฟั€ะพะฑะตะป ะดะปั ะพะทะฒัƒั‡ะธะฒะฐะฝะธั ั‚ะตะบัƒั‰ะตะน ะฟะพะทะธั†ะธะธ. +* ะะฐะถะธะผะฐะนั‚ะต Shift+ัั‚ั€ะตะปะบะฐ ะฒะฒะตั€ั… ะธะปะธ Shift+ัั‚ั€ะตะปะบะฐ ะฒะฝะธะท ะดะปั ะธะทะผะตะฝะตะฝะธั ั€ะตะถะธะผะฐ ะฝะฐะฒะธะณะฐั†ะธะธ (ัะผ. [ะดะพะบัƒะผะตะฝั‚ะฐั†ะธัŽ ะฟะพ ะฝะฐะฒะธะณะฐั†ะธะธ](nav-commands.md)). + +ะงั‚ะพะฑั‹ ะฝะฐั‡ะฐั‚ัŒ ะฝะฐะฒะธะณะฐั†ะธัŽ: + +* NVDA: ะฝะฐะถะผะธั‚ะต NVDA+Alt+M ะธะปะธ ะฟั€ะพะฑะตะป ะดะปั ะฒั…ะพะดะฐ ะฒ ั€ะตะถะธะผ ะฝะฐะฒะธะณะฐั†ะธะธ ะฟะพ ะผะฐั‚ะตะผะฐั‚ะธั‡ะตัะบะพะผัƒ ะฒั‹ั€ะฐะถะตะฝะธัŽ, ะฐ ะดะปั ะฒั‹ั…ะพะดะฐ ะฝะฐะถะผะธั‚ะต Escape. + +ะะฐะฒะธะณะฐั†ะธั MathCAT ั€ะฐะฑะพั‚ะฐะตั‚ ะพะดะธะฝะฐะบะพะฒะพ ะฒ Word ะธ ะฒ ะฑั€ะฐัƒะทะตั€ะต. + +ะŸั€ะธ ะฝะฐะฒะธะณะฐั†ะธะธ ะฟะพ ะฒั‹ั€ะฐะถะตะฝะธัŽ ัะพั‡ะตั‚ะฐะฝะธะต Ctrl+C ะฒ NVDA ะบะพะฟะธั€ัƒะตั‚ ะผะฐั‚ะตะผะฐั‚ะธั‡ะตัะบะพะต ัะพะดะตั€ะถะธะผะพะต ั‚ะตะบัƒั‰ะตะณะพ ัƒะทะปะฐ. ะŸะพะดะดะตั€ะถะธะฒะฐัŽั‚ัั ัะปะตะดัƒัŽั‰ะธะต ั„ะพั€ะผะฐั‚ั‹: + +* MathML (ะฟะพ ัƒะผะพะปั‡ะฐะฝะธัŽ); +* LaTeX; +* ASCIIMath; +* ั‚ะตะบัั‚ ะดะปั ะพะทะฒัƒั‡ะธะฒะฐะฝะธั. + +## ะกะฟะธัะพะบ ะฝะฐัั‚ั€ะพะตะบ + +ะะธะถะต ะฟะตั€ะตั‡ะธัะปะตะฝั‹ ะฝะฐัั‚ั€ะพะนะบะธ. ะ‘ะพะปัŒัˆะธะฝัั‚ะฒะพ ะธะท ะฝะธั… ะฟั€ะธะฝะธะผะฐัŽั‚ ั‚ะพะปัŒะบะพ ะพะณั€ะฐะฝะธั‡ะตะฝะฝั‹ะน ะฝะฐะฑะพั€ ะทะฝะฐั‡ะตะฝะธะน, ะบะพั‚ะพั€ั‹ะน ัƒะบะฐะทะฐะฝ ะฒ ะพะฟะธัะฐะฝะธะธ. +ะ—ะฝะฐั‡ะตะฝะธะต ะฟะพ ัƒะผะพะปั‡ะฐะฝะธัŽ ะฟั€ะธะฒะตะดะตะฝะพ ะฒ \[ะบะฒะฐะดั€ะฐั‚ะฝั‹ั… ัะบะพะฑะบะฐั…\]. + +### ะะฐัั‚ั€ะพะนะบะธ ั€ะตั‡ะธ + +* โœ“Impairment: [Blindness] + * ะ—ะฝะฐั‡ะตะฝะธั: Blindness, LowVision, LearningDisability. + * ะžะฟะธัะฐะฝะธะต: ะพะฟั€ะตะดะตะปัะตั‚, ัะปะตะดัƒะตั‚ ะปะธ ัƒัั‚ั€ะฐะฝัั‚ัŒ ะฝะตะพะดะฝะพะทะฝะฐั‡ะฝะพัั‚ัŒ ะฝะตะบะพั‚ะพั€ั‹ั… ะพะฑะพะทะฝะฐั‡ะตะฝะธะน ะฟั€ะธ ะพะทะฒัƒั‡ะธะฒะฐะฝะธะธ. + * ะกะพัั‚ะพัะฝะธะต: ะพัะฝะพะฒะฝะพะต ะฒะฝะธะผะฐะฝะธะต ัƒะดะตะปัะปะพััŒ ะทะฝะฐั‡ะตะฝะธัŽ Blindness, ะฝะพ ะดั€ัƒะณะธะต ะทะฝะฐั‡ะตะฝะธั ั‚ะฐะบะถะต ั‡ะฐัั‚ะธั‡ะฝะพ ะฟะพะดะดะตั€ะถะธะฒะฐัŽั‚ัั. ะญั‚ัƒ ะฟะพะดะดะตั€ะถะบัƒ ะฝะตะพะฑั…ะพะดะธะผะพ ัƒะปัƒั‡ัˆะธั‚ัŒ. + +* โœ“Language: [en] + * ะ—ะฝะฐั‡ะตะฝะธั: ะปัŽะฑะพะน ะธะทะฒะตัั‚ะฝั‹ะน ะบะพะด ัะทั‹ะบะฐ ะธ ะฟะพะดะบะพะด, ะฝะฐะฟั€ะธะผะตั€ `en-uk`. + [ะกะฟะธัะพะบ ะฒะฐั€ะธะฐะฝั‚ะพะฒ ะฟั€ะธะฒะตะดั‘ะฝ ะฝะฐ ัั‚ะพะผ ัะฐะนั‚ะต](https://www.venea.net/web/culture_code). + * ะžะฟะธัะฐะฝะธะต: ะพะฟั€ะตะดะตะปัะตั‚ ะธัะฟะพะปัŒะทัƒะตะผั‹ะน ัะทั‹ะบ. + ะ•ัะปะธ ั€ะตะณะธะพะฝะฐะปัŒะฝั‹ะน ะฒะฐั€ะธะฐะฝั‚ ะฝะต ะฝะฐะนะดะตะฝ ัั€ะตะดะธ ะฟั€ะฐะฒะธะป ะพะทะฒัƒั‡ะธะฒะฐะฝะธั, ะธัะฟะพะปัŒะทัƒะตั‚ัั ะพัะฝะพะฒะฝะพะน ัะทั‹ะบ. ะ•ัะปะธ ะฝะต ะฝะฐะนะดะตะฝั‹ ะธ ะฟั€ะฐะฒะธะปะฐ ะดะปั ะพัะฝะพะฒะฝะพะณะพ ัะทั‹ะบะฐ, ะธัะฟะพะปัŒะทัƒะตั‚ัั ะฐะฝะณะปะธะนัะบะธะน ัะทั‹ะบ (`en`). + * ะกะพัั‚ะพัะฝะธะต: ัะตะนั‡ะฐั ะฟะพะดะดะตั€ะถะธะฒะฐัŽั‚ัั ั‚ะพะปัŒะบะพ ะฐะฝะณะปะธะนัะบะธะน, ะธัะฟะฐะฝัะบะธะน, ั„ะธะฝัะบะธะน, ะธะฝะดะพะฝะตะทะธะนัะบะธะน, ัˆะฒะตะดัะบะธะน, ะฒัŒะตั‚ะฝะฐะผัะบะธะน ะธ ะบะธั‚ะฐะนัะบะธะน ัะทั‹ะบะธ. + ะ”ั€ัƒะณะธะต ัะทั‹ะบะธ ะฑัƒะดัƒั‚ ะดะพะฑะฐะฒะปัั‚ัŒัั ั ะฟะพะผะพั‰ัŒัŽ ะดะพะฑั€ะพะฒะพะปัŒั†ะตะฒ. + +* โœ“SpeechStyle: [ClearSpeak] + * ะ—ะฝะฐั‡ะตะฝะธั: ะปัŽะฑะพะน ั€ะตะฐะปะธะทะพะฒะฐะฝะฝั‹ะน ัั‚ะธะปัŒ ั€ะตั‡ะธ. ะกะตะนั‡ะฐั ะดะพัั‚ัƒะฟะฝั‹ ั‚ะพะปัŒะบะพ ClearSpeak ะธ SimpleSpeak. + * ะžะฟะธัะฐะฝะธะต: ัั‚ะธะปัŒ ั€ะตั‡ะธ, ั‚ะพ ะตัั‚ัŒ ัะพะณะปะฐัะพะฒะฐะฝะฝั‹ะน ะฟะพะดั…ะพะด ะบ ะพะทะฒัƒั‡ะธะฒะฐะฝะธัŽ ะฒั‹ั€ะฐะถะตะฝะธั. + * ClearSpeak ะฑั‹ะป ั€ะฐะทั€ะฐะฑะพั‚ะฐะฝ ETS ะดะปั ะฒะฐะถะฝั‹ั… ัะบะทะฐะผะตะฝะพะฒ, ะฝะฐะฟั€ะธะผะตั€ SAT. [ะŸะพะดั€ะพะฑะฝะพัั‚ะธ ัะฟะตั†ะธั„ะธะบะฐั†ะธะธ ClearSpeak ะฟั€ะธะฒะตะดะตะฝั‹ ะฒ ัั‚ะพะผ ะดะพะบัƒะผะตะฝั‚ะต Word](../ClearSpeakRulesAndPreferences.docx). + * SimpleSpeak ัั‚ั€ะตะผะธั‚ัั ัะพะบั€ะฐั‚ะธั‚ัŒ ะพะทะฒัƒั‡ะธะฒะฐะฝะธะต: ะฟั€ะพัั‚ั‹ะต ะฒั‹ั€ะฐะถะตะฝะธั, ะฝะฐะฟั€ะธะผะตั€ $\frac{a}{b}$, ั‡ะธั‚ะฐัŽั‚ัั ะฑั‹ัั‚ั€ะพ, ะฑะตะท ะพะฑั€ะฐะผะปััŽั‰ะธั… ัะปะพะฒ (ยซa over bยป). ะžะฝะธ ะพั‚ะปะธั‡ะฐัŽั‚ัั ะพั‚ ะฑะพะปะตะต ัะปะพะถะฝั‹ั… ะฒั‹ั€ะฐะถะตะฝะธะน, ะฝะฐะฟั€ะธะผะตั€ $\frac{a}{b+1}$, ะฒ ะบะพั‚ะพั€ั‹ั… ะพะฑั€ะฐะผะปััŽั‰ะธะต ัะปะพะฒะฐ ะธัะฟะพะปัŒะทัƒัŽั‚ัั ะฒัะตะณะดะฐ (ยซfraction a over b plus 1 end fractionยป). + * ะกะพัั‚ะพัะฝะธะต: ัะตะนั‡ะฐั ั€ะตะฐะปะธะทะพะฒะฐะฝั‹ ั‚ะพะปัŒะบะพ ClearSpeak ะธ SimpleSpeak, ะฝะพ ะฒ ะดะฐะปัŒะฝะตะนัˆะตะผ, ะฒะตั€ะพัั‚ะฝะพ, ะฑัƒะดะตั‚ ั€ะตะฐะปะธะทะพะฒะฐะฝ MathSpeak. + +* โœ“Verbosity: [Medium] + * ะ—ะฝะฐั‡ะตะฝะธั: Terse, Medium, Verbose. + * ะžะฟะธัะฐะฝะธะต: ะพะฟั€ะตะดะตะปัะตั‚ ะบะพะปะธั‡ะตัั‚ะฒะพ ะดะพะฟะพะปะฝะธั‚ะตะปัŒะฝั‹ั… ัะปะพะฒ ะฟั€ะธ ะพะทะฒัƒั‡ะธะฒะฐะฝะธะธ. ะะฐะฟั€ะธะผะตั€, ะฒ ะฟะพะดั€ะพะฑะฝะพะผ ั€ะตะถะธะผะต ะบะฒะฐะดั€ะฐั‚ะฝั‹ะน ะบะพั€ะตะฝัŒ ั‡ะธั‚ะฐะตั‚ัั ะบะฐะบ ยซthe square root of xยป, ะฐ ะฒ ะบั€ะฐั‚ะบะพะผ โ€” ะบะฐะบ ยซsquare root xยป. + * ะกะพัั‚ะพัะฝะธะต: ะฝะฐัั‚ั€ะพะนะบะฐ ะฟะพะดะดะตั€ะถะธะฒะฐะตั‚ัั, ะฝะพ ัะพ ะฒั€ะตะผะตะฝะตะผ, ะฒะตั€ะพัั‚ะฝะพ, ะฑัƒะดะตั‚ ะดะพั€ะฐะฑะฐั‚ั‹ะฒะฐั‚ัŒัั. + +* โœ“MathRate: [100] + * ะ—ะฝะฐั‡ะตะฝะธั: ั‡ะธัะปะพ ะพั‚ 1 ะดะพ 100. + * ะžะฟะธัะฐะฝะธะต: ะธะทะผะตะฝัะตั‚ ะพั‚ะฝะพัะธั‚ะตะปัŒะฝัƒัŽ ัะบะพั€ะพัั‚ัŒ ั€ะตั‡ะธ ะฒ ะฟั€ะพั†ะตะฝั‚ะฐั… ะพั‚ ัั‚ะฐะฝะดะฐั€ั‚ะฝะพะน ัะบะพั€ะพัั‚ะธ ั€ะตั‡ะตะฒะพะณะพ ัะธะฝั‚ะตะทะฐั‚ะพั€ะฐ. ะ—ะฝะฐั‡ะตะฝะธะต `100` ะพะทะฝะฐั‡ะฐะตั‚, ั‡ั‚ะพ ะผะฐั‚ะตะผะฐั‚ะธั‡ะตัะบะธะต ะฒั‹ั€ะฐะถะตะฝะธั ั‡ะธั‚ะฐัŽั‚ัั ั ั‚ะพะน ะถะต ัะบะพั€ะพัั‚ัŒัŽ, ั‡ั‚ะพ ะธ ะพะฑั‹ั‡ะฝั‹ะน ั‚ะตะบัั‚. + ะะฐัั‚ั€ะพะนะบะฐ ั€ะฐะฑะพั‚ะฐะตั‚ ั‚ะพะปัŒะบะพ ะฒ ั€ะตะฐะปะธะทะฐั†ะธัั…, ะบะพั‚ะพั€ั‹ะต ัƒะบะฐะทั‹ะฒะฐัŽั‚ MathCAT ัะพะทะดะฐะฒะฐั‚ัŒ ั€ะฐะทะผะตั‚ะบัƒ ั€ะตั‡ะตะฒะพะณะพ ัะธะฝั‚ะตะทะฐั‚ะพั€ะฐ, ะฝะฐะฟั€ะธะผะตั€ SSML. + * ะกะพัั‚ะพัะฝะธะต: ะฝะฐัั‚ั€ะพะนะบะฐ ะดะพะปะถะฝะฐ ั€ะฐะฑะพั‚ะฐั‚ัŒ ะฒ NVDA. + +* โœ“PauseFactor: [50] + * ะ—ะฝะฐั‡ะตะฝะธั: ั‡ะธัะปะพ ะพั‚ 0 ะดะพ 100. + * ะžะฟะธัะฐะฝะธะต: ะธะทะผะตะฝัะตั‚ ะพั‚ะฝะพัะธั‚ะตะปัŒะฝัƒัŽ ะดะปะธั‚ะตะปัŒะฝะพัั‚ัŒ ะดะพะฑะฐะฒะปัะตะผั‹ั… MathCAT ะฟะฐัƒะท. ะ—ะฝะฐั‡ะตะฝะธะต 0 ะพั‚ะบะปัŽั‡ะฐะตั‚ ะฒัะต ะฟะฐัƒะทั‹, ะฐ ะทะฝะฐั‡ะตะฝะธะต 100 ัƒะฒะตะปะธั‡ะธะฒะฐะตั‚ ะพะฑั‹ั‡ะฝัƒัŽ ะดะปะธั‚ะตะปัŒะฝะพัั‚ัŒ ะฟะฐัƒะท ะฒ ะดะตััั‚ัŒ ั€ะฐะท. + ะะฐัั‚ั€ะพะนะบะฐ ั€ะฐะฑะพั‚ะฐะตั‚ ั‚ะพะปัŒะบะพ ะฒ ั€ะตะฐะปะธะทะฐั†ะธัั…, ะบะพั‚ะพั€ั‹ะต ัƒะบะฐะทั‹ะฒะฐัŽั‚ MathCAT ัะพะทะดะฐะฒะฐั‚ัŒ ั€ะฐะทะผะตั‚ะบัƒ ั€ะตั‡ะตะฒะพะณะพ ัะธะฝั‚ะตะทะฐั‚ะพั€ะฐ, ะฝะฐะฟั€ะธะผะตั€ SSML. + * ะกะพัั‚ะพัะฝะธะต: ะฝะฐัั‚ั€ะพะนะบะฐ ะดะพะปะถะฝะฐ ั€ะฐะฑะพั‚ะฐั‚ัŒ ะฒ NVDA. + +* โœ“SpeechSound: [None] + * ะ—ะฝะฐั‡ะตะฝะธั: None, Beep. + * ะžะฟะธัะฐะฝะธะต: ะฟะตั€ะตะด ั‡ั‚ะตะฝะธะตะผ ะฒั‹ั€ะฐะถะตะฝะธั ะธ ะฟะพัะปะต ะฝะตะณะพ ะฒะพัะฟั€ะพะธะทะฒะพะดะธั‚ัั ะทะฒัƒะบะพะฒะพะน ัะธะณะฝะฐะป. + * ะกะพัั‚ะพัะฝะธะต: ะฝะฐัั‚ั€ะพะนะบะฐ ะดะพะปะถะฝะฐ ั€ะฐะฑะพั‚ะฐั‚ัŒ ะฒ NVDA. + +* SubjectArea: [General] + * ะกะพัั‚ะพัะฝะธะต: ะฝะฐัั‚ั€ะพะนะบะฐ ะธัะฟะพะปัŒะทะพะฒะฐะปะฐััŒ ะฒ MathPlayer, ะฝะพ ะฟะพะบะฐ ะฝะต ั€ะตะฐะปะธะทะพะฒะฐะฝะฐ. ะฏ ะถะดัƒ ะดะฐะปัŒะฝะตะนัˆะตะณะพ ะพะฑััƒะถะดะตะฝะธั ะฒ ั€ะฐะฑะพั‡ะตะน ะณั€ัƒะฟะฟะต MathML: ะฒะพะทะผะพะถะฝะพ, ัั‚ะฐ ะฝะฐัั‚ั€ะพะนะบะฐ ะฑัƒะดะตั‚ ะธัะฟะพะปัŒะทะพะฒะฐั‚ัŒัั ะดะปั ะทะฐะดะฐะฝะธั ั€ะฐะทะฝั‹ั… ะทะฝะฐั‡ะตะฝะธะน `intent` ะฟะพ ัƒะผะพะปั‡ะฐะฝะธัŽ. + +* Chemistry: [SpellOut] + * ะ—ะฝะฐั‡ะตะฝะธั: SpellOut, AsCompound, Off. + * ะžะฟะธัะฐะฝะธะต: ะพะฟั€ะตะดะตะปัะตั‚ ัะฟะพัะพะฑ ั‡ั‚ะตะฝะธั ั…ะธะผะธั‡ะตัะบะธั… ั„ะพั€ะผัƒะป. ะŸั€ะธะผะตั€ั‹ ะดะปั $\mathrm{H}_2\mathrm{O}$: + * โœ“SpellOut: ยซH 2 Oยป (ะฝะฐัั‚ั€ะพะนะบะฐ ะฟะพะดั€ะพะฑะฝะพัั‚ะธ ะพะฟั€ะตะดะตะปัะตั‚, ะฟั€ะพะธะทะฝะพััั‚ัั ะปะธ ัะปะพะฒะฐ `sub` ะธ `super`); + * AsCompound: ยซWaterยป; + * โœ“Off: ยซH sub 2 Oยป. + * ะกะพัั‚ะพัะฝะธะต: ั€ะตะฐะปะธะทะพะฒะฐะฝะพ ะผะฝะพะถะตัั‚ะฒะพ ัะฒั€ะธัั‚ะธะบ ะดะปั ะพะฟั€ะตะดะตะปะตะฝะธั ั‚ะพะณะพ, ัะฒะปัะตั‚ัั ะปะธ ะทะฐะฟะธััŒ ั…ะธะผะธั‡ะตัะบะพะน ั„ะพั€ะผัƒะปะพะน. ะ ะฐัะฟะพะทะฝะฐะฒะฐะฝะธะต ั…ะธะผะธั‡ะตัะบะธั… ะพะฑะพะทะฝะฐั‡ะตะฝะธะน ะฝะต ะฒัะตะณะดะฐ ะพั‡ะตะฒะธะดะฝะพ, ะฟะพัั‚ะพะผัƒ MathCAT ะธะฝะพะณะดะฐ ะผะพะถะตั‚ ะฝะต ั€ะฐัะฟะพะทะฝะฐั‚ัŒ ั„ะพั€ะผัƒะปัƒ ะธะปะธ ะฟะพ ะพัˆะธะฑะบะต ะฟั€ะธะฝัั‚ัŒ ะดั€ัƒะณัƒัŽ ะทะฐะฟะธััŒ ะทะฐ ั…ะธะผะธั‡ะตัะบัƒัŽ. ะ ะฐะฑะพั‚ะฐ ะณั€ัƒะฟะฟั‹ MathML ะผะพะถะตั‚ ััƒั‰ะตัั‚ะฒะตะฝะฝะพ ัƒะฟั€ะพัั‚ะธั‚ัŒ ะฐะฒั‚ะพั€ะฐะผ ัะฒะฝะพะต ัƒะบะฐะทะฐะฝะธะต ั…ะธะผะธั‡ะตัะบะธั… ั„ะพั€ะผัƒะป. + +SpeechOverrides: + +* โœ“CapitalLetters: "cap" # ัะปะพะฒะพ-ะฟั€ะตั„ะธะบั ะดะปั ะฟั€ะพะฟะธัะฝั‹ั… ะฑัƒะบะฒ, ะตัะปะธ ะพะฝะพ ะฝะต ะทะฐะดะฐะฝะพ ะฒ unicode.yaml; ะฟัƒัั‚ะฐั ัั‚ั€ะพะบะฐ ะฟะตั€ะตะดะฐั‘ั‚ ะพะฑั€ะฐะฑะพั‚ะบัƒ ะฟั€ะพะณั€ะฐะผะผะต ัะบั€ะฐะฝะฝะพะณะพ ะดะพัั‚ัƒะฟะฐ +* LeftParen: "" # ะฟะตั€ะตะพะฟั€ะตะดะตะปะตะฝะธะต ัะปะพะฒะฐ +* RightParen: "" # ะฟะตั€ะตะพะฟั€ะตะดะตะปะตะฝะธะต ัะปะพะฒะฐ + +ClearSpeak ัะพะดะตั€ะถะธั‚ ั€ัะด ะฝะฐัั‚ั€ะพะตะบ. ะžะฝะธ ะฟั€ะตะดะฝะฐะทะฝะฐั‡ะตะฝั‹ ะดะปั ะฐะฒั‚ะพั€ะพะฒ, ะฝะพ ะผะพะณัƒั‚ ะทะฐะดะฐะฒะฐั‚ัŒัั ะธ ะฟะพะปัŒะทะพะฒะฐั‚ะตะปัะผะธ, ั…ะพั‚ั ะพะฑั‹ั‡ะฝะพ ะฝะต ัะปะธัˆะบะพะผ ะธะผ ะฟะพะปะตะทะฝั‹. + +* โœ“CapitalLetters: Auto, SayCaps ะธะปะธ ะธะทะผะตะฝะตะฝะธะต ะฒั‹ัะพั‚ั‹ ั‚ะพะฝะฐ +* โœ“AbsoluteValue: Auto, AbsEnd, Cardinality, Determinant +* โœ“Fraction: Auto, Ordinal, Over, FracOver, General, EndFrac, GeneralEndFrac, OverEndFrac, Per +* โœ“Exponent: Auto, Ordinal, OrdinalPower, AfterPower +* โœ“Roots: Auto, PosNegSqRoot, RootEnd, PosNegSqRootEnd +* โœ“Functions: Auto, None +* โœ“Trig: Auto, TrigInverse, ArcTrig +* โœ“Log: Auto, LnAsNaturalLog +* โœ“ImpliedTimes: Auto, MoreImpliedTimes, None +* โœ“Paren: Auto, Speak, SpeakNestingLevel, Silent, CoordPoint, Interval +* โœ“Matrix: Auto, SpeakColNum, SilentColNum, EndMatrix, Vector, EndVector, Combinatorics +* โœ“MultiLineLabel: Auto, Case, Constraint, Equation, Line, None, Row, Step +* โœ“MultiLineOverview: Auto, None +* โœ“MultiLinePausesBetweenColumns: Short, Long +* โœ“Sets: Auto, woAll, SilentBracket +* โœ“MultSymbolX: Auto, By, Cross +* โœ“MultSymbolDot: Auto, Dot +* โœ“TriangleSymbol: Auto, Delta +* โœ“Ellipses: Auto, AndSoOn +* โœ“VerticalLine: Auto, SuchThat, Divides, Given +* โœ“SetMemberSymbol: Auto, Belongs, Element, Member +* โœ“Prime: Auto, Angle, Length +* โœ“CombinationPermutation: Auto, ChoosePermute +* โœ“Bar: Auto, Bar, Conjugate, Mean + +### ะะฐัั‚ั€ะพะนะบะธ ะฝะฐะฒะธะณะฐั†ะธะธ (ัะผ. [ะดะพะบัƒะผะตะฝั‚ะฐั†ะธัŽ ะฟะพ ะฝะฐะฒะธะณะฐั†ะธะธ](nav-commands.md)) + +* โœ“NavMode: Enhanced โ€” Enhanced, Simple, Character. +* ResetNavMode: false โ€” ะทะฐะฟะพะผะธะฝะฐั‚ัŒ ะธ ะธัะฟะพะปัŒะทะพะฒะฐั‚ัŒ ะฟั€ะตะดั‹ะดัƒั‰ะตะต ะทะฝะฐั‡ะตะฝะธะต. +* Overview: false โ€” ะพะทะฒัƒั‡ะธะฒะฐั‚ัŒ ะฒั‹ั€ะฐะถะตะฝะธะต ะธะปะธ ะดะฐะฒะฐั‚ัŒ ะตะณะพ ะพะฟะธัะฐะฝะธะต ะธ ะพะฑะทะพั€. +* ResetOverView: true โ€” ะทะฐะฟะพะผะธะฝะฐั‚ัŒ ะธ ะธัะฟะพะปัŒะทะพะฒะฐั‚ัŒ ะฟั€ะตะดั‹ะดัƒั‰ะตะต ะทะฝะฐั‡ะตะฝะธะต. +* โœ“NavVerbosity: Medium โ€” Terse, Medium, Full (ัะปะพะฒะฐ ะดะปั ะฟั€ะพะธะทะฝะตัะตะฝะธั ะบะพะผะฐะฝะดั‹ ะฝะฐะฒะธะณะฐั†ะธะธ). +* โœ“AutoZoomOut: true โ€” ะฐะฒั‚ะพะผะฐั‚ะธั‡ะตัะบะธ ัƒะผะตะฝัŒัˆะฐั‚ัŒ ะดะตั‚ะฐะปะธะทะฐั†ะธัŽ ะดะฒัƒะผะตั€ะฝั‹ั… ะฒั‹ั€ะฐะถะตะฝะธะน. ะ•ัะปะธ ะฝะฐัั‚ั€ะพะนะบะฐ ะพั‚ะบะปัŽั‡ะตะฝะฐ, ะดะปั ะฟั€ะธะฝัƒะดะธั‚ะตะปัŒะฝะพะณะพ ัƒะผะตะฝัŒัˆะตะฝะธั ะดะตั‚ะฐะปะธะทะฐั†ะธะธ ะธัะฟะพะปัŒะทัƒะนั‚ะต Shift+ัั‚ั€ะตะปะบะฐ. + * `true`: ะตัะปะธ ะฒั‹ ะฝะฐั…ะพะดะธั‚ะตััŒ ัƒ ะบั€ะฐั ะดะฒัƒะผะตั€ะฝะพะณะพ ะฒั‹ั€ะฐะถะตะฝะธั, ะฝะฐะฟั€ะธะผะตั€ ะดั€ะพะฑะธ ะธะปะธ ะฝะฐะดัั‚ั€ะพั‡ะฝะพะณะพ ะธะฝะดะตะบัะฐ, ะธ ะฟั‹ั‚ะฐะตั‚ะตััŒ ะฒั‹ะนั‚ะธ ะธะท ะฝะตะณะพ ะฒะปะตะฒะพ ะธะปะธ ะฒะฟั€ะฐะฒะพ, ะฟะตั€ะตะผะตั‰ะตะฝะธะต ั€ะฐะทั€ะตัˆะฐะตั‚ัั, ะฐ ัƒั€ะพะฒะตะฝัŒ ะดะตั‚ะฐะปะธะทะฐั†ะธะธ ัƒัั‚ะฐะฝะฐะฒะปะธะฒะฐะตั‚ัั ะฒ ัะพะพั‚ะฒะตั‚ัั‚ะฒะธะธ ั ะฟั€ะตะดั‹ะดัƒั‰ะธะผ ะธะปะธ ัะปะตะดัƒัŽั‰ะธะผ ัะปะตะผะตะฝั‚ะพะผ. + * `false`: ะฟะตั€ะตะผะตั‰ะตะฝะธะต ะฒะปะตะฒะพ ะธะปะธ ะฒะฟั€ะฐะฒะพ ะทะฐ ะบั€ะฐะน ะดะฒัƒะผะตั€ะฝะพะณะพ ะฒั‹ั€ะฐะถะตะฝะธั ะทะฐะฟั€ะตั‰ะตะฝะพ. ะงั‚ะพะฑั‹ ะฟะตั€ะตะผะตัั‚ะธั‚ัŒัั, ะฝะตะพะฑั…ะพะดะธะผะพ ัƒะผะตะฝัŒัˆะธั‚ัŒ ะดะตั‚ะฐะปะธะทะฐั†ะธัŽ, ะฒะพะทะผะพะถะฝะพ ะฝะตัะบะพะปัŒะบะพ ั€ะฐะท, ะฟะพะบะฐ ะฒั‹ ะฝะต ะฟะตั€ะตัั‚ะฐะฝะตั‚ะต ะฝะฐั…ะพะดะธั‚ัŒัั ัƒ ะบั€ะฐั. +* CopyMathAS: ะพะฟั€ะตะดะตะปัะตั‚ ั„ะพั€ะผะฐั‚ ะบะพะฟะธั€ะพะฒะฐะฝะธั ะผะฐั‚ะตะผะฐั‚ะธั‡ะตัะบะพะณะพ ัะพะดะตั€ะถะธะผะพะณะพ ั‚ะตะบัƒั‰ะตะณะพ ัƒะทะปะฐ ะฝะฐะฒะธะณะฐั†ะธะธ: MathML, LaTeX, ASCIIMath ะธะปะธ ั‚ะตะบัั‚ ะดะปั ะพะทะฒัƒั‡ะธะฒะฐะฝะธั. + + +### ะะฐัั‚ั€ะพะนะบะธ ะ‘ั€ะฐะนะปั + +* โœ“BrailleCode: [Nemeth] + * ะ—ะฝะฐั‡ะตะฝะธั: ะปัŽะฑะฐั ั€ะตะฐะปะธะทะพะฒะฐะฝะฝะฐั ัะธัั‚ะตะผะฐ ะทะฐะฟะธัะธ ะ‘ั€ะฐะนะปั. + * ะžะฟะธัะฐะฝะธะต: ะธัะฟะพะปัŒะทัƒะตะผะฐั ัะธัั‚ะตะผะฐ ะผะฐั‚ะตะผะฐั‚ะธั‡ะตัะบะพะน ะทะฐะฟะธัะธ ะ‘ั€ะฐะนะปั. + * ะกะพัั‚ะพัะฝะธะต: ัะตะนั‡ะฐั ะฟะพะดะดะตั€ะถะธะฒะฐัŽั‚ัั ASCIIMath, ASCIIMath-Finnish, CMU, LaTeX, ะบะพะด ะะตะผะตั‚ะฐ, ัˆะฒะตะดัะบะฐั ัะธัั‚ะตะผะฐ, UEB ะธ ะฒัŒะตั‚ะฝะฐะผัะบะฐั ัะธัั‚ะตะผะฐ. ะŸะพะดะดะตั€ะถะบะฐ ะดั€ัƒะณะธั… ัะธัั‚ะตะผ ะทะฐะฟะธัะธ ะ‘ั€ะฐะนะปั ะทะฐะฒะธัะธั‚ ะพั‚ ะฟะพะผะพั‰ะธ ะฝะพะฒั‹ั… ัƒั‡ะฐัั‚ะฝะธะบะพะฒ. +* โœ“BrailleNavHighlight: [EndPoints] + * ะ—ะฝะฐั‡ะตะฝะธั: Off, FirstChar, EndPoints, All. + * ะžะฟะธัะฐะฝะธะต: ะฒั‹ะดะตะปัะตั‚ ะฒั‹ะฑั€ะฐะฝะฝั‹ะน ัƒะทะตะป ะฝะฐะฒะธะณะฐั†ะธะธ ั‚ะพั‡ะบะฐะผะธ 7 ะธ 8. +* UEB: + * โœ“START_MODE: [Grade2] + * ะ—ะฝะฐั‡ะตะฝะธั: Grade1, Grade2. + * ะžะฟะธัะฐะฝะธะต: ะฟั€ะตะดะฟะพะปะฐะณะฐะตะผั‹ะน ะฝะฐั‡ะฐะปัŒะฝั‹ะน ั€ะตะถะธะผ UEB. ะ—ะฝะฐั‡ะตะฝะธะต Grade1 ะพะทะฝะฐั‡ะฐะตั‚, ั‡ั‚ะพ ะธัะฟะพะปัŒะทัƒะตั‚ัั ั€ะตะถะธะผ ั„ั€ะฐะณะผะตะฝั‚ะฐ Grade 1. + * โœ“UseSpacesAroundAllOperators: [false] + * ะ—ะฝะฐั‡ะตะฝะธั: true/false. + * ะžะฟะธัะฐะฝะธะต: ั€ะตะบะพะผะตะฝะดะฐั†ะธะธ UEB ะฟั€ะตะดะฟะพะปะฐะณะฐัŽั‚, ั‡ั‚ะพ ะฒ ะผะปะฐะดัˆะธั… ะบะปะฐััะฐั… ะผะพะถะตั‚ ะฑั‹ั‚ัŒ ะฟะพะปะตะทะฝะพ ะดะพะฑะฐะฒะปัั‚ัŒ ะฟั€ะพะฑะตะปั‹ ะฒะพะบั€ัƒะณ ั‚ะฐะบะธั… ะพะฟะตั€ะฐั‚ะพั€ะพะฒ, ะบะฐะบ `+` ะธ `-`. ะžะฑั‹ั‡ะฝะพ ะฟั€ะพะฑะตะปั‹ ะดะพะฑะฐะฒะปััŽั‚ัั ั‚ะพะปัŒะบะพ ะฒะพะบั€ัƒะณ ะพะฟะตั€ะฐั‚ะพั€ะพะฒ ะพั‚ะฝะพัˆะตะฝะธะน, ะฝะฐะฟั€ะธะผะตั€ `=` ะธ `<`. + +ะ’ะพ ะผะฝะพะณะธั… ัะธัั‚ะตะผะฐั… ะทะฐะฟะธัะธ ะ‘ั€ะฐะนะปั ะผะพะถะฝะพ ะพะฟั€ะตะดะตะปัั‚ัŒ ะฟะพะปัŒะทะพะฒะฐั‚ะตะปัŒัะบะธะต ัะธะผะฒะพะปั‹. MathCAT ะฟั€ะตะดะพัั‚ะฐะฒะปัะตั‚ ะดะปั ัั‚ะพะณะพ ะฝะตัะบะพะปัŒะบะพ ะฝะฐัั‚ั€ะพะตะบ. + +ะ’ ะบะพะดะต ะะตะผะตั‚ะฐ ะพะฟั€ะตะดะตะปะตะฝั‹ ะฝะฐั‡ะตั€ั‚ะฐะฝะธั Bold, Italic, SansSerif ะธ Script, ะฝะพ ะฝะต ะพะฟั€ะตะดะตะปะตะฝะพ ะฝะฐั‡ะตั€ั‚ะฐะฝะธะต DoubleStruck (Blackboard Bold). +ะ—ะดะตััŒ ะผะพะถะฝะพ ะทะฐะดะฐั‚ัŒ ะพะฟั€ะตะดะตะปัะตะผะพะต ั‚ั€ะฐะฝัะบั€ะธะฑะฐั‚ะพั€ะพะผ ะธะทะผะตะฝะตะฝะธะต ะฝะฐั‡ะตั€ั‚ะฐะฝะธั. ะŸะพ ัƒะผะพะปั‡ะฐะฝะธัŽ DoubleStruck ัะพะฟะพัั‚ะฐะฒะปัะตั‚ัั ั Italic. + +* Nemeth: + * โœ“SansSerif: "โ  โ จ" + * โœ“Bold: "โ ธ" + * โœ“DoubleStruck: "โ จ" + * โœ“Script: "โ ˆ" + * โœ“Italic: "โ จ" + +ะ’ [ั€ัƒะบะพะฒะพะดัั‚ะฒะต UEB ะฟะพ ั‚ะตั…ะฝะธั‡ะตัะบะธะผ ะผะฐั‚ะตั€ะธะฐะปะฐะผ](https://iceb.org/Guidelines_for_Technical_Material_2008-10.pdf) ั€ะตะบะพะผะตะฝะดัƒะตั‚ัั ะพะฑั‹ั‡ะฝะพ ะพะฑั€ะฐะฑะฐั‚ั‹ะฒะฐั‚ัŒ Fraktur ะธ DoubleStruck ะบะฐะบ Script. +ะ’ะผะตัั‚ะพ ัั‚ะพะณะพ ะทะดะตััŒ ะผะพะถะฝะพ ะทะฐะดะฐั‚ัŒ ะฟะพะปัŒะทะพะฒะฐั‚ะตะปัŒัะบะธะน ะฟั€ะตั„ะธะบัะฝั‹ะน ะธะฝะดะธะบะฐั‚ะพั€ ะฝะฐั‡ะตั€ั‚ะฐะฝะธั. +ะŸั€ะธะผะตั‡ะฐะฝะธะต: ะฟั€ะตั„ะธะบัั‹ ั ะฟะตั€ะฒะพะณะพ ะฟะพ ะฟัั‚ั‹ะน: "โ ˆโ ผ", "โ ˜โ ผ", "โ ธโ ผ", "โ โ ผ", "โ จโ ผ". + +* UEB: + * โœ“DoubleStruck: "โ ˆ" [script] + * โœ“Fraktur: "โ ˆ" [script] + * โœ“SansSerif: "โ ˆโ ผ" [ะฟะตั€ะฒั‹ะน ะพะฟั€ะตะดะตะปัะตะผั‹ะน ั‚ั€ะฐะฝัะบั€ะธะฑะฐั‚ะพั€ะพะผ ะฟั€ะตั„ะธะบัะฝั‹ะน ะธะฝะดะธะบะฐั‚ะพั€ ะฝะฐั‡ะตั€ั‚ะฐะฝะธั] + * โœ“GreekVariant: "โ จ" [ะฟะพ ัƒะผะพะปั‡ะฐะฝะธัŽ Greek] + +ะะฐะฑะพั€ ะพะฟั€ะตะดะตะปัะตะผั‹ั… ัะธะผะฒะพะปะพะฒ ะดะปั ะฒัŒะตั‚ะฝะฐะผัะบะพะน ัะธัั‚ะตะผั‹ ะตั‰ั‘ ะพะฑััƒะถะดะฐะตั‚ัั. ะ’ะตั€ะพัั‚ะฝะพ, ะฝะตะบะพั‚ะพั€ั‹ะต ะทะฝะฐั‡ะตะฝะธั ะธะทะผะตะฝัั‚ัั. + +* Vietnam: + * โœ“UseDropNumbers: [false] + * ะ—ะฝะฐั‡ะตะฝะธั: true, false. + * ะžะฟะธัะฐะฝะธะต: ะพะฟัƒัะบะฐะตั‚ ั†ะธั„ั€ั‹ ะฝะฐ ัั‚ั€ะพะบัƒ ะฝะธะถะต ะฒ ะฟั€ะพัั‚ั‹ั… ั‡ะธัะปะพะฒั‹ั… ะดั€ะพะฑัั…. + * โœ“DoubleStruck: "โ ˆ" [script] + * โœ“Fraktur: "โ ˆ" [script] + * โœ“SansSerif: "โ ˆโ ผ" [ะฟะตั€ะฒั‹ะน ะพะฟั€ะตะดะตะปัะตะผั‹ะน ั‚ั€ะฐะฝัะบั€ะธะฑะฐั‚ะพั€ะพะผ ะฟั€ะตั„ะธะบัะฝั‹ะน ะธะฝะดะธะบะฐั‚ะพั€ ะฝะฐั‡ะตั€ั‚ะฐะฝะธั] + * โœ“GreekVariant: "โ จ" [ะฟะพ ัƒะผะพะปั‡ะฐะฝะธัŽ Greek] + +### ะ”ั€ัƒะณะธะต ะฝะฐัั‚ั€ะพะนะบะธ + +MathCAT ะธัะฟั€ะฐะฒะปัะตั‚ ะฝะตะบะฐั‡ะตัั‚ะฒะตะฝะฝั‹ะน MathML. ะ’ MathML ั‡ะธัะปะฐ ั‡ะฐัั‚ะพ ั€ะฐะทะผะตั‡ะฐัŽั‚ัั ะฝะตะฟั€ะฐะฒะธะปัŒะฝะพ. ะงั‚ะพะฑั‹ ะธัะฟั€ะฐะฒะธั‚ัŒ ะธั… ะบะพั€ั€ะตะบั‚ะฝะพ, MathCAT ะดะพะปะถะตะฝ ะทะฝะฐั‚ัŒ ั€ะตะณะธะพะฝะฐะปัŒะฝั‹ะต ะฝะฐัั‚ั€ะพะนะบะธ: ัะธะผะฒะพะปั‹, ะบะพั‚ะพั€ั‹ะต ะผะพะณัƒั‚ ั€ะฐะทะดะตะปัั‚ัŒ ะณั€ัƒะฟะฟั‹ ั†ะธั„ั€, ะธ ัะธะผะฒะพะปั‹ ะดะตััั‚ะธั‡ะฝะพะณะพ ั€ะฐะทะดะตะปะธั‚ะตะปั. ะžะฑั‹ั‡ะฝะพ ะฐััะธัั‚ะธะฒะฝะฐั ั‚ะตั…ะฝะพะปะพะณะธั ะทะฐะดะฐั‘ั‚ ัั‚ะธ ะฟะฐั€ะฐะผะตั‚ั€ั‹ ะฝะฐ ะพัะฝะพะฒะต ะบะพะดะฐ ัั‚ั€ะฐะฝั‹ ะฒ ะดะพะบัƒะผะตะฝั‚ะต. ะะพ ะบะพะด ัั‚ั€ะฐะฝั‹ ะผะพะถะตั‚ ะพั‚ััƒั‚ัั‚ะฒะพะฒะฐั‚ัŒ, ะธ ั‚ะพะณะดะฐ ะฐััะธัั‚ะธะฒะฝะพะน ั‚ะตั…ะฝะพะปะพะณะธะธ ะฟั€ะธั…ะพะดะธั‚ัั ะพะฟั€ะตะดะตะปัั‚ัŒ ั„ะพั€ะผะฐั‚ ะฟะพ ะบะพะดัƒ ัะทั‹ะบะฐ. + +* DecimalSeparators: "." # [ะฟะพ ัƒะผะพะปั‡ะฐะฝะธัŽ] +* BlockSeparators: ", \u00A0\u202F" # [ะฟะพ ัƒะผะพะปั‡ะฐะฝะธัŽ; ะฒะบะปัŽั‡ะฐะตั‚ ะดะฒะฐ ะฒะฐั€ะธะฐะฝั‚ะฐ ะฝะตั€ะฐะทั€ั‹ะฒะฝั‹ั… ะฟั€ะพะฑะตะปะพะฒ] diff --git a/docs/test-exprs.html b/docs/test-exprs.html new file mode 100644 index 000000000..a89a04901 --- /dev/null +++ b/docs/test-exprs.html @@ -0,0 +1,3727 @@ + + + + + + MathCAT English Test Expressions + + + +

MathCAT English Test Expressions

+

MathML expressions from tests/Languages/en (excluding ClearSpeak).

+ + + +
+

alphabets

+
+ โ„Œ,โ„ญ +
+
+ โ„,โ„ฟ +
+
+ โ„,โ„ณ +
+
+ ฮ‘,ฮฉ +
+
+ ฮฑ,ฯ‰ +
+
+ ๏ˆ,๏ˆ‰ +
+
+ ฮฑ,ฯ‰ +
+
+ ะ,ะฏ +
+
+ โ’œ,โ’ต +
+
+ โ’ถ,โ“ +
+
+ ๐Ÿ…,๐Ÿ…ฉ +
+
+ โ“,โ“ฉ +
+
+ ๐”„,๐”œ +
+
+ ๐”ž,๐”ท +
+
+ ๏€€,๏€˜ +
+
+ ๏€š,๏€ณ +
+
+ ๐•ฌ,๐–… +
+
+ ๐–†,๐–Ÿ +
+
+ ๏€,๏™ +
+
+ ๏š,๏ณ +
+
+ ๐”ธ,๐• +
+
+ ๐•’,๐•ซ +
+
+ ๐Ÿ˜,๐Ÿก +
+
+ ๏‚€,๏‚˜ +
+
+ ๏‚š,๏‚ณ +
+
+ ๏ƒ€,๏ƒ‰ +
+
+ ๐’œ,๐’ต +
+
+ ๐’ถ,๐“ +
+
+ ๏„€,๏„™ +
+
+ ๏„š,๏„ณ +
+
+ ๐“,๐“ฉ +
+
+ ๐“ช,๐”ƒ +
+
+ ๏…€,๏…™ +
+
+ ๏…š,๏…ณ +
+
+ ๐€,๐™ +
+
+ ๐š,๐ณ +
+
+ ๏‰ ,๏‰น +
+
+ ๏‰บ,๏Š“ +
+
+ ๐ด,๐‘ +
+
+ ๐‘Ž,๐‘ง +
+
+ ๏Š”,๏Šญ +
+
+ ๏Šฎ,๏‹‡ +
+
+ ๐– ,๐–น +
+
+ ๐–บ,๐—“ +
+
+ ๏Œ€,๏Œ™ +
+
+ ๏Œš,๏Œณ +
+
+ ๐—”,๐—ญ +
+
+ ๐—ฎ,๐˜‡ +
+
+ ๏Œด,๏ +
+
+ ๏Ž,๏ง +
+
+ ๐˜ˆ,๐˜ก +
+
+ ๐˜ข,๐˜ป +
+
+ ๏จ,๏ށ +
+
+ ๏Ž‚,๏Ž› +
+
+ ๐˜ผ,๐™• +
+
+ ๐™–,๐™ฏ +
+
+ ๏Žœ,๏Žต +
+
+ ๏Žถ,๏ +
+
+ ๐™ฐ,๐š‰ +
+
+ ๐šŠ,๐šฃ +
+
+ ๏,๏ฉ +
+
+ ๏ช,๏ƒ +
+
+ ๐šจ,๐›€ +
+
+ ๐›‚,๐›š +
+
+ ๏ˆ,๏  +
+
+ ๏ข,๏บ +
+
+ ๐››,๐›ก +
+
+ ๏ป,๏‘ +
+
+ ๐›ข,๐›บ +
+
+ ๐›ผ,๐œ” +
+
+ ๏‘‚,๏‘š +
+
+ ๏‘œ,๏‘ด +
+
+ ๐œ•,๐œ› +
+
+ ๏‘ต,๏‘ป +
+
+ ๐œœ,๐œด +
+
+ ๐œถ,๐Ž +
+
+ ๏‘ผ,๏’” +
+
+ ๏’–,๏’ฎ +
+
+ ๐,๐• +
+
+ ๏’ฏ,๏’ต +
+
+ ๐–,๐ฎ +
+
+ ๐ฐ,๐žˆ +
+
+ ๏’ถ,๏“Ž +
+
+ ๏“,๏“จ +
+
+ ๐ž‰,๐ž +
+
+ ๏“ฉ,๏“ฏ +
+
+ ๐ž,๐žจ +
+
+ ๐žช,๐Ÿ‚ +
+
+ ๏“ฐ,๏”ˆ +
+
+ ๏”Š,๏”ข +
+
+ ๐Ÿƒ,๐Ÿ‰ +
+
+ ๏”ฃ,๏”ฉ +
+
+ ๏†€,๏†™ +
+
+ โ„ฒ,โ…„ +
+
+ โ‘ ,โ‘จ +
+
+ โถ,ใŠฟ +
+
+ โ‘ด,โ‘ผ +
+
+ โ’ˆ,โ’ +
+
+ โ“ต,โ“ฝ +
+
+
+

chemistry

+
+ NaCl +
+
+ H2O +
+
+ C +
+
+ + [SO4] + 2 + +
+
+ Al2 + (SO4)3 +
+
+ + + C + H 3 + + C + H 2 + + O + H + + +
+
+ + + [ClO2] + + + + + [ClO4] + - + + +
+
+ + H2C + = + CH2 + +
+
+ + Fe + Cl3 + (aq) + +
+
+ + H2C + :: + CH2 + +
+
+ + C + + 6 + 14 + + + + N + + 7 + 14 + + + + + e + + + + 1 + + 0 + +
+
+ + + + + + + + A + + + + + + + + + 6 + + + + + + + + + 14 + + + + + + + + + + + + A + + + + + + + + + 2 + + + + + + + + 6 + + + + + + + + + + + + 2 + + + + + + + + 14 + + + + + + C + + + + + + + + + + + + A + + + + + + + + + 7 + + + + + + + + + 14 + + + + + + + + + + + + A + + + + + + + + + 2 + + + + + + + + 7 + + + + + + + + + + + + 2 + + + + + + + + 14 + + + + + + N + + + + + + + + + + + A + + + + + + + + + + 1 + + + + + + + + + 0 + + + + + + + + + + + + A + + + + + + + + + 2 + + + + + + + + + 1 + + + + + + + + + + + + 2 + + + + + + + + 0 + + + + + + e + + + +
+
+ + 2HCl+2Na + + 2NaCl+ + H 2 + + +
+
+ + + + SO + + + + + + + A + + + + + + + + 4 + + + + + + + + + + A + + + + + + 2 + + + + + + +
+
+ + + 2 + + + + + HCl + + + ( + + aq + + ) + + + + + 2 + + + + + Na + + + ( + + s + + ) + + + + + + 2 + + + + + NaCl + + + ( + + aq + + ) + + + + + + H + + + + + + + A + + + + + + + + 2 + + + + + + ( + + g + + ) + + +
+
+ + + + + H + 2 + + + + + ( + g + ) + + + + + + + + I + 2 + + + + + ( + g + ) + + + + + + โ†ฝ + - + + + - + โ‡€ + + + + 2 + + + H + + I + + + ( + g + ) + + + + + +
+
+ + + + Fe + + II + + + + Fe + + III + + + + O + 4 + + + + +
+
+ + + + 2 + + + SO + + 2 + + + + + + + + + O + + 2 + + + + + + + + + + + + โ†ฝ + + + + + โˆ’ + + + + + + + + โˆ’ + + + + + โ‡€ + + + + + + 2 + + + SO + + 3 + + + + + + + + +
+
+
+

definitions

+
+ + + x + y + + +
+
+ + + x + y + + +
+
+ + R + +
+
+ + i + +
+
+ + + x + + +
+
+ + + A + + B + + +
+
+
+

intent

+
+ 2 x +
+
+ x T +
+
+ x T +
+
+ + x + y + z + +
+
+ + x + +
+
+ + x + +
+
+ + x + y + z + +
+
+ + x + +
+
+ + x + +
+
+ 2 x +
+
+ + + H + 2 + +
+
+ + + H + 2 + +
+
+ + + x + P + +
+
+
+

mtable

+
+ + + ( + + 3 + + ) + +
+
+ + + | + + 3 + + | + +
+
+ + + ( + + + + 3 + + + 5 + + + + ) + +
+
+ + + ( + + + + -x + + + 5 + + + 12 + + + + ) + +
+
+ + + ( + + + + + x+1 + + + + + + + x-1 + + + + ) + +
+
+ + + ( + + + + + x + + + + + + + a + + + + + + + x + + x+1 + + + + + + ) + +
+
+ + + | + + + + 2 + + + 1 + + + + + 7 + + + 5 + + + + + | + +
+
+ + + [ + + + + 3 + + + 1 + + + 4 + + + + + 0 + + + 2 + + + 6 + + + + ] + +
+
+ + + [ + + + + 3 + + + 1 + + + 4 + + + + + 0 + + + 2 + + + 6 + + + + ] + +
+
+ + + [ + + + + (3.1) + + + 3 + + + 1 + + + 4 + + + + + 0 + + + 2 + + + 6 + + + + ] + +
+
+ + + [ + + + + 1 + + + + + 2 + + + + + 3 + + + ] + +
+
+ + + ( + + + + 3 + + + + + 6 + + + + + 1 + + + + + 2 + + + + ) + +
+
+ + + ( + + + + 3 + + + + + 6 + + + + + 1 + + + + + (3.1) + + + 2 + + + + ) + +
+
+ + + ( + + + + 3 + + + 6 + + + 1 + + + 2 + + + + ) + +
+
+ + + ( + + + + 0 + + + 3 + + + 4 + + + 3 + + + + + 2 + + + 1 + + + 0 + + + 9 + + + + + 3 + + + 0 + + + 2 + + + 1 + + + + + 6 + + + 2 + + + 9 + + + 0 + + + + ) + +
+
+ + + ( + + + + 1 + + + 3 + + + + + 4 + + + 2 + + + + + 2 + + + 1 + + + + + 0 + + + 5 + + + + + ) + +
+
+ + | x | + +
+
+ + | + x+1 + | + +
+
+ + | S | + +
+
+ + + ( + + + + 2 + 1 + + + 7 + 5 + + + ) + +
+
+ + + ( + + + + 1 + + + 2 + + + 3 + + + ) + +
+
+ + + [ + + + + 1 2 + + + ] + +
+
+ ( + + + b11 + b12 + + + b21 + b22 + + + ) +
+
+ + + ( + + + + 2 + 1 + + + 7 + 5 + + + ) + +
+
+ + + ( + + + + 1 + + + 2 + + + 3 + + + ) + +
+
+ + + [ + + + + 1 2 + + + ] + +
+
+ ( + + + b11 + b12 + + + b21 + b22 + + + ) +
+
+ + + ( + + + + 2 + 1 + + + 7 + 5 + + + ) + +
+
+ + + ( + + + + 1 + + + 2 + + + 3 + + + ) + +
+
+ + + [ + + + + 1 2 + + + ] + +
+
+ ( + + + b11 + b12 + + + b21 + b22 + + + ) +
+
+ + + [ + + + 1 + 2 + -1 + 3 + + + -3 + 3 + -1 + 2 + + + 2 + 3 + 2 + -1 + + + ] + + +
+
+ + + ( + + + + 2 + 1 + + + 7 + 5 + + + ) + +
+
+ + + ( + + + + 1 + + + 2 + + + 3 + + + ) + +
+
+ + + [ + + + + 1 2 + + + ] + +
+
+ ( + + + b11 + b12 + + + b21 + b22 + + + ) +
+
+ + + ( + + + + 2 + 1 + + + 7 + 5 + + + ) + +
+
+ + + ( + + + + 1 + + + 2 + + + 3 + + + ) + +
+
+ + + [ + + + + 1 2 + + + ] + +
+
+ ( + + + b11 + b12 + + + b21 + b22 + + + ) +
+
+ ( + 32 + ) +
+
+ 1234 + abcd +
+
+ + + + + a + + + = + + + + b + + + c + + d + + + + + + + + + + e + + f + + + + +
+
+ [ + + 00 + 00 + + ] +
+
+ ( + + 100 + 010 + 001 + + ) +
+
+ [ + + 10 + 0-1 + + ] +
+
+ [ + + 10 + 00 + + ] +
+
+ ( + + 200 + 010 + 00x2 + + ) +
+
+ + + + (2) + ๐‘ = 2 + + + +
+
+
+

shared

+
+ + a ` + b ~ + c ̆ + b ̌ + c ` + + r ห‡ + + x . + y ˙ + z ¨ + u + v + + x ^ + + t โ†’ + +
+
+ + lim + x 0 + + + + sin x + x + + +
+
+ + lim + x โ†— 0 + + + sin x + +
+
+ Cmn +
+
+ Cmn +
+
+ Cn,m +
+
+ Pkn +
+
+ Pkn +
+
+ Pkn +
+
+ + R i j k l + +
+
+ + R i j k l m + I J K L + +
+
+ x +
+
+ P(A|B) +
+
+ + + + x + + k + + + i + + + + +
+
+ ij2k +
+
+ + x + + k + + + i + + +
+
+ I + = + โˆ’ + b + r + + + + z + I + +
+
+ C + + + I + + + X +
+
+ + + P + ( + A + + +  and  + + + B + ) + = + P + ( + A + โˆฉ + B + ) + = + P + ( + A + ) + P + ( + B + ) + . + + +
+
+ {2}. +
+
+ + + + ฯ• + ( + x + ) + = + c + + e + + โˆ’ + + h + + 2 + + + + x + + 2 + + + + + , + + + +
+
+ + + + P + ( + A + โˆฃ + B + ) + = + + + + P + ( + A + โˆฉ + B + ) + + + P + ( + B + ) + + + + . + + + + +
+
+ + + [ + + 0 + + , + + 2 + ฯ€ + + ) + + +
+
+ x^2+y^ +
+
+ 1 234 567 +
+
+ x + = + 2 + + ๐’”๐’Š๐’ + + t + + - + 1 +
+
+ 1,234.56 +
+
+ ·F +
+
+ ×F +
+
+ F +
+
+ + + + A + โ†’ + + โŠฅ + + B + โ†’ + + + +
+
+ + + + x×y + · + z/2 + + + ab + + + x! + + + +
+
+ + + f + + + ( + + x + ! + + ) + + + +
+
+ + + f + + + ( + + x + ! + + ) + + + +
+
+ + + + A + โ†’ + + โŠฅ + + B + โ†’ + + + +
+
+ + + f + + + ( + + x + ! + + ) + + + +
+
+
+

functions

+
+ + sinx+ + cosy+ + tanz+ + secα+ + cscϕ+ + cotφ + +
+
+ + sinhx+ + coshy+ + tanhz+ + sechα+ + cschϕ+ + cothφ + +
+
+ sin-1x +
+
+ sin2x +
+
+ tan3x +
+
+ sec4x +
+
+ sinhn-1x +
+
+ logx +
+
+ log(x+y) +
+
+ logbx +
+
+ logb(x+y) +
+
+ ln(x+y) +
+
+ lnx +
+
+ Covx +
+
+ exp(x) +
+
+ t(x) +
+
+ t(x) +
+
+ tx +
+
+ tx +
+
+ x y +
+
+ + 2 + ( 3 ) + +
+
+ + ( 2 ) + 3 + +
+
+ + a + b + = + ab + +
+
+ + ( + 25 + ) + x + +
+
+ + b + ( + xy + ) + +
+
+ + 2+ + ( + 2 + ) + +
+
+ + ( + 2x + ) + +1 + +
+
+ + + + + ( + 2x + ) + 2 + + + +
+
+ + 2 + + + + ( + 12 + ) + +
+
+ + ( + (c,d) + ) + +
+
+ + [ + [(]c,d) + ) + +
+
+ + ( + (c,d] + ] + +
+
+ + [ + [(]c,d] + ] + +
+
+ + ( + - โˆž,d) + ) + +
+
+ + ( + - โˆž,d] + ] + +
+
+
+

geometry

+
+ BCโŒ’ +
+
+ XY¯ +
+
+ BCโŒ’ +
+
+ XYโ†’ +
+
+
+

large_ops

+
+ + โˆ‘ + n=1 + 10 + + n +
+
+ + โˆ‘ + S + + i +
+
+ + โˆ‘ + n=1 + 10 + + n +
+
+ + โˆ‘ + S + + i +
+
+ โˆ‘ + ai +
+
+ + โˆ + n=1 + 10 + + n +
+
+ + โˆ + S + + i +
+
+ โˆ + ai +
+
+ + โ‹‚ + i=1 + 10 + + Si +
+
+ + โ‹‚ + C + + Si +
+
+ โ‹‚ + Si +
+
+ + โ‹ƒ + i=1 + 10 + + Si +
+
+ + โ‹ƒ + C + + Si +
+
+ โ‹ƒ + Si +
+
+ + + โˆซ + 0 + 1 + + f(x ) + + dx +
+
+ + โˆซ + โ„ + + f(x ) + dx +
+
+ โˆซ + f(x ) + dx +
+
+
+

linear_algebra

+
+ MT +
+
+ TrM +
+
+ DimM +
+
+ Hom(M) +
+
+ ker(L) +
+
+ + + โˆฅ + f + โˆฅ + + +
+
+ + + โˆฅ + x + + + y + โˆฅ + + +
+
+ + + + โˆฅ + f + โˆฅ + + p + + +
+
+ ( + b + + + + + ) + a +
+
+
+

mfrac

+
+ + 1 2 + +
+
+ + 2 3 + +
+
+ + 17 10 + +
+
+ + 89 10 + +
+
+ + + + x+y + + x-y + + + +
+
+ + + + x+ 1y + + x-y + + + +
+
+ + + + x+ 1y + + x-y + + + +
+
+ + + + x+ 2+1y + + x-y + + + +
+
+ + + + x + + x-y + + + +
+
+ + + x-y + x + + +
+
+ + + 62 + + mi + hr + + + +
+
+ + + 1 + + gal + mi + + + +
+
+ + + + 3 + gal + + mi + + +
+
+ + + 3 m + s2 + + +
+
+ 3 + 1 2 +
+
+ 3 + + 1 8 +
+
+ 3 + 7 83 +
+
+ + rise run + +
+
+ + + + 2miles + + 3gallons + + +
+
+ + + + + + 1 + 2 + + + + + 2 + 3 + + + + + +
+
+ 2 + ( + 7 3 + ) +
+
+ 2 + ( + n+7 3 + ) +
+
+ 2 + ( + 7 k+3 + ) +
+
+ 2 + ( + n+7 k+3 + ) +
+
+
+

msup

+
+ + x 2 + +
+
+ + x 3 + +
+
+ + x 4 + +
+
+ + x n + +
+
+ + x 0 + +
+
+ + x 2.0 + +
+
+ + + + 3 + + y+2 + + + +
+
+ + + x + - 2 + + +
+
+ + + x + 13 + + +
+
+ + + + 3 + + 2 + + x + 2 + + + + + +
+
+ + + + 3 + + - + 2 + + x + 2 + + + + + +
+
+ + + y + + 45 + 3 + + + +
+
+ + + y + + - + + 45 + 3 + + + + +
+
+ + + + e + + + 1 + 2 + + + x + 2 + + + + + +
+
+ + + + e + + + 1 + 2 + + + x + 2 + + + + + +
+
+ + + + 3 + + + 3 + + 10 + + + + + +
+
+ + + + 3 + + + + ( + + x+1 + ) + 2 + + + + + +
+
+ + + t + + 45 + n + + + +
+
+ + + t + + 45 + n+1 + + + +
+
+ + + t + + 45 + -3 + + + +
+
+ + + + e + + + 1 + 2 + + + + ( + + + + xμ + σ + + + ) + 2 + + + + + +
+
+ + + t + + b+1 + 3 + + + +
+
+
+

multiline

+
+ + + f( + x + )={ + + + + + 1 if x<0 + + + + + + 0 if x=0 + + + + + + 1 if x>0 + + + + +
+
+ + + + + + + x+y + + + = + + + 7 + + + + + + 2x+3y + + + = + + + + 17 + + + + + +
+
+
+

sets

+
+ + โ„‚ + +
+
+ + โ„• + +
+
+ + โ„š + +
+
+ + โ„ + +
+
+ + โ„ค + +
+
+ + + โ„‚ + 2 + + +
+
+ + + โ„• + 2 + + +
+
+ + + โ„š + 2 + + +
+
+ + + โ„ + 3 + + +
+
+ + + โ„ค + 4 + + +
+
+ + + โ„ค + + + + +
+
+ + + โ„ค + - + + +
+
+ + + โ„š + + + + +
+
+ + + โ„š + - + + +
+
+ { } +
+
+ { 12} +
+
+ { 5 , 10 , 15 } +
+
+ { x:x>2 } +
+
+ { x|x>2 } +
+
+ 3+2iโˆ‰โ„ +
+
+ + โˆ‘ + i โˆˆ โ„ค + + + 1 + i 2 + +
+
+ { + x + โˆˆ + โ„ค + : + 2 + < + x + < + 7 + } +
+
+ { + xโˆˆโ„• + | + x  is an even number + } +
+
+
+

subscripts

+
+ x 1 +
+
+ x 1.2 +
+
+ x 1.2 3 +
+
+ x i +
+
+ x 1 102 +
+
+ x 1 2 +
+
+ x 1 x,2 +
+
+
+

units

+
+ Qg, + Rg, + Yg, + Zg, + Eg, + Pg, + Tg, + Gg, + Mg, + kg, + hg, + dag, + dg, + cg, + mg, + ยตg, + ng, + pg, + fg, + ag, + zg, + yg, + rg, + qg +
+
+ 1A,2A, + 1cd,2cd, + 1K,2K, + 1โ„ช,2โ„ช, + 1g,2g, + 1m,2m, + 1mol,2mol, + 1s,2s, + 1โ€ณ,2โ€ณ, + 1",2", + 1sec,2sec +
+
+ 1QA,2RA, + 1Ycd,2Zcd, + 1EK,2PK, + 1Tโ„ช,2Gโ„ช, + 1Mg,2kg, + 1hm,2dam, + 1dmol,2cmol, + 1ms,2ยตs, + 1nsec,2psec +
+
+ 1Bq,2Bq, + 1C,2C, + 1ยฐC,2ยฐC, + 1โ„ƒ,2โ„ƒ, + 1F,2F, + 1Gy,2Gy, + 1H,2H, + 1Hz,2Hz, + 1J,2J, + 1kat,2kat, + 1lm,2lm, + 1lx,2lx +
+
+ 1QBq,2RBq, + 1YC,2ZC, + 1EF,2PF, + 1TGy,2GGy, + 1MH,2kH, + 1daHz,2dHz, + 1cJ,2mJ, + 1ยตkat,2nkat, + 1plm,2flm, + 1alx,2zlx, + 1mยฐC,2ยตยฐC, + 1pโ„ƒ,2nโ„ƒ +
+
+ 1N,2N, + 1ฮฉ,2ฮฉ, + 1โ„ฆ,2โ„ฆ, + 1Pa,2Pa, + 1S,2S, + 1Sv,2Sv, + 1T,2T, + 1V,2V, + 1W,2W, + 1Wb,2Wb +
+
+ 1qN,2rN, + 1yฮฉ,2zฮฉ, + 1aโ„ฆ,2fโ„ฆ, + 1pPa,2nPa, + 1ยตS,2mS, + 1cSv,2dSv, + 1daT,2hT, + 1kV,2MV, + 1GW,2TW, + 1PWb,2EWb +
+
+ 1l,2l, + 1L,2L, + 1โ„“,2โ„“, + 1t,2t, + 1Da,2Da, + 1Np,2Np, + 1u,2u, + 1eV,2eV, + 1rad,2rad, + 1sr,2sr, + 1a,2a, + 1as,2as, + 1b,2b, + 1B,2B, + 1Bd,2Bd +
+
+ 1Ql,2Rl, + 1YL,2ZL, + 1Eโ„“,2Pโ„“, + 1Tt,2Gt, + 1MDa,2kDa, + 1dNp,2cNp, + 1hu,2dau, + 1meV,2ยตeV, + 1nrad,2prad, + 1fsr,2asr, + 1Ga,2Ma, + 1zas,2yas, + 1kb,2Mb, + 1GB,2TB, + 1TBd,2EBd +
+
+ 1โ€ณ,2โ€ณ, + 1",2", + 1โ€ฒ,2โ€ฒ, + 1',2', + 1min,2min, + 1h,2h, + 1hr,2hr, + 1Hr,2Hr, + 1d,2d, + 1dy,2dy, + 1w,2w, + 1wk,2wk, + 1y,2y, + 1yr,2yr +
+
+ 1ยฐ,2ยฐ, + 1deg,2deg, + 1arcmin,2arcmin, + 1amin,2amin, + 1am,2am, + 1MOA,2MOA, + 1arcsec,2arcsec, + 1asec,2asec +
+
+ 1au,2au, + 1ltyr,2ltyr, + 1pc,2pc, + 1ร…,2ร…, + 1โ„ซ,2โ„ซ, + 1fm,2fm +
+
+ 1ha,2ha, + 1dB,2dB, + 1atm,2atm, + 1amu,2amu, + 1bar,2bar, + 1cal,2cal, + 1Ci,2Ci, + 1grad,2grad, + 1M,2M, + 1R,2R, + 1rpm,2rpm, + 1fl dr,2fl dr, + 1โ„ง,2โ„ง, + 1dyn,2dyn, + 1erg,2erg +
+
+ 1Kib,2Kib, + 1Mib,2Mib, + 1Gib,2Gib, + 1Tib,2Tib, + 1Pib,2Pib, + 1Eib,2Eib, + 1Zib,2Zib, + 1Yib,2Yib, + 1KiB,2KiB, + 1MiB,2MiB, + 1GiB,2GiB, + 1TiB,2TiB, + 1PiB,2PiB, + 1EiB,2EiB, + 1ZiB,2ZiB, + 1YiB,2YiB +
+
+ 1.0l, + 2.0 m, + x ms, + yยตs, + dag, + 1235daN, + 2.5µsec, + 32.34mol +
+
+ [ + 1t, + 2PA, + 3Pa, + 4.5mT + ] +
+
+ 3m, + 1km, + 3m, + 310F, + mmin +
+
+ + + diff --git a/src/braille.rs b/src/braille.rs index b944578f0..9fd64b4cc 100644 --- a/src/braille.rs +++ b/src/braille.rs @@ -50,9 +50,9 @@ pub fn braille_mathml(mathml: Element, nav_node_id: &str) -> Result<(String, usi "CMU" => cmu_cleanup(pref_manager, braille_string), "Finnish" => finnish_cleanup(pref_manager, braille_string), "Swedish" => swedish_cleanup(pref_manager, braille_string), + "Russian" => russian_cleanup(pref_manager, braille_string), "LaTeX" => LaTeX_cleanup(pref_manager, braille_string), "ASCIIMath" => ASCIIMath_cleanup(pref_manager, braille_string), - "ASCIIMath-fi" => ASCIIMath_cleanup(pref_manager, braille_string), _ => braille_string.trim_matches('โ €').to_string(), // probably needs cleanup if someone has another code, but this will have to get added by hand }; @@ -2167,6 +2167,66 @@ fn swedish_cleanup(pref_manager: Ref, raw_braille: String) -> return result.to_string(); } +fn russian_cleanup(_pref_manager: Ref, raw_braille: String) -> String { + static REPLACE_INDICATORS: LazyLock = LazyLock::new(|| Regex::new(r"([BCILNW#])").unwrap()); + static COLLAPSE_SPACES: LazyLock = LazyLock::new(|| Regex::new(r"โ €+").unwrap()); + + let mut raw_braille_without_repeated_number_indicators = String::with_capacity(raw_braille.len()); + let mut previous_char_was_digit = false; + for ch in raw_braille.chars() { + if ch == 'N' && previous_char_was_digit { + previous_char_was_digit = false; + continue; + } + raw_braille_without_repeated_number_indicators.push(ch); + previous_char_was_digit = matches!(ch, 'โ š' | 'โ ' | 'โ ƒ' | 'โ ‰' | 'โ ™' | 'โ ‘' | 'โ ‹' | 'โ ›' | 'โ “' | 'โ Š'); + } + + let result = add_russian_alphabet_indicators(&raw_braille_without_repeated_number_indicators); + let result = REPLACE_INDICATORS.replace_all(&result, |cap: &Captures| { + match &cap[0] { + "B" => "โ ธ", + "C" => "โ  ", + "I" => "โ จ", + "L" => "", + "N" => "โ ผ", + "W" => "โ €", + "#" => "", + _ => "", + } + }); + return COLLAPSE_SPACES.replace_all(&result, "โ €") + .trim_matches('โ €') + .to_string(); + + fn add_russian_alphabet_indicators(raw_braille: &str) -> String { + let mut result = String::with_capacity(raw_braille.len()); + let mut alphabet_mode = None; + for ch in raw_braille.chars() { + match ch { + 'l' | 'u' | 'g' | 'v' => { + if alphabet_mode != Some(ch) { + result.push_str(match ch { + 'l' => "โ  ", // Latin lowercase: dots 6 + 'u' => "โ จ", // Latin uppercase: dots 4-6 + 'g' => "โ ฐ", // Greek lowercase: dots 5-6 + 'v' => "โ ธ", // Greek uppercase: dots 4-5-6 + _ => unreachable!(), + }); + alphabet_mode = Some(ch); + } + }, + 'C' | 'N' | '#' => { + alphabet_mode = None; + result.push(ch); + }, + _ => result.push(ch), + } + } + return result; + } +} + #[allow(non_snake_case)] fn LaTeX_cleanup(_pref_manager: Ref, raw_braille: String) -> String { static REMOVE_SPACE: LazyLock = LazyLock::new(|| Regex::new(r" ([\^_,;)\]}])").unwrap()); // '^', '_', ',', ';', ')', ']', '}' @@ -2330,6 +2390,7 @@ impl BrailleChars { "Vietnam" => BrailleChars:: get_braille_vietnam_chars(node, text_range), "Swedish" => BrailleChars:: get_braille_ueb_chars(node, text_range), // FIX: need to figure out what to implement "Finnish" => BrailleChars:: get_braille_ueb_chars(node, text_range), // FIX: need to figure out what to implement + "Russian" => BrailleChars:: get_braille_ueb_chars(node, text_range), _ => return Err(sxd_xpath::function::Error::Other(format!("get_braille_chars: unknown braille code '{code}'"))) }; return match result { diff --git a/src/canonicalize.rs b/src/canonicalize.rs index 89b6c6c21..6117a5791 100644 --- a/src/canonicalize.rs +++ b/src/canonicalize.rs @@ -1888,10 +1888,6 @@ impl CanonicalizeContext { /// 'mo' should only be '+', '-', '=', ',', '.' -- unlikely someone is doing anything sophisticated fn is_roman_numeral_adjacent<'a, I>(siblings: I, must_be_upper_case: bool) -> bool where I: Iterator> { - static ROMAN_NUMERAL_OPERATORS: phf::Set<&str> = phf_set! { - "+", "-'", "=", "<", "โ‰ค", ">", "โ‰ฅ", - // ",", ".", // [c,d] triggers this if "," is present, so omitting it - }; let mut found_match = false; // guard against no siblings let mut last_was_roman_numeral = true; // started at roman numeral // debug!("start is_roman_numeral_adjacent"); @@ -1901,15 +1897,17 @@ impl CanonicalizeContext { match name(maybe_roman_numeral) { "mo" => { if !last_was_roman_numeral { + debug!("maybe_roman_numeral (mo): not last was roman numeral"); return false; } let text = as_text(maybe_roman_numeral); - if !ROMAN_NUMERAL_OPERATORS.contains(text) { + // ",", "." omitted โ€” [c,d] triggers this if "," is present + if !matches!(text, "+" | "-" | "=" | "<" | "โ‰ค" | ">" | "โ‰ฅ") { return false; } last_was_roman_numeral = false; }, - "mi" | "mn" => { + "mi" | "mn" | "mtext" => { if last_was_roman_numeral { return false; // no implicit multiplication (or whatever) } @@ -1921,7 +1919,7 @@ impl CanonicalizeContext { found_match = true; last_was_roman_numeral = true; }, - "mtext" | "mspace" | "mphantom" => {}, + "mspace" | "mphantom" => {}, _ => { return false; } @@ -3424,7 +3422,7 @@ impl CanonicalizeContext { // FIX: MathType generates the wrong version of union and intersection ops (binary instead of unary) } else if !is_base && (parent_name == "msup" || parent_name == "msubsup") { mo_text = match mo_text { - "\u{00BA}"| "\u{2092}"| "\u{20D8}"| "\u{2218}" | "\u{25E6}" => "\u{00B0}", // circle-like objects -> degree + "\u{00BA}"| "\u{2092}"| "\u{20D8}"| "\u{2218}" | "\u{25E6}" | "\u{02DA}" => "\u{00B0}", // circle-like objects -> degree _ => mo_text, }; } else { @@ -5971,19 +5969,64 @@ mod canonicalize_tests { let target_str = " XLVIII +mmxxvi "; - // let target_str = "XLVIII +mmxxvi"; are_strs_canonically_equal_result(test_str, target_str, &[]) } - // #[test] - // fn roman_numeral_context() { - // let test_str = "vi-i=v"; - // let target_str = " - // vi-i - // = v - // "; - // are_strs_canonically_equal_result(test_str, target_str, &[]) - // } + #[test] + fn roman_numeral_multi_letter_mi() -> Result<()> { + let test_str = " + IX + + + VIII + = + XVII + "; + let target_str = " + + IX + + + VIII + + = + XVII + "; + are_strs_canonically_equal_result(test_str, target_str, &[]) + } + + #[test] + fn roman_like_single_letter_mi_is_not_number() -> Result<()> { + // Regression test for https://github.com/daisy/MathCAT/issues/528 + let test_str = " + C + = + D + "; + let target_str = " + + C + = + D + + "; + are_strs_canonically_equal_result(test_str, target_str, &[]) + } + + #[test] + fn roman_numeral_context() -> Result<()> { + let test_str = "vi-i=v"; + let target_str = " + + + vi + - + i + + = + v + + "; + return are_strs_canonically_equal_result(test_str, target_str, &[]) + } #[test] fn not_roman_numeral() -> Result<()> { diff --git a/src/infer_intent.rs b/src/infer_intent.rs index 429e1ddac..1112d859e 100644 --- a/src/infer_intent.rs +++ b/src/infer_intent.rs @@ -101,11 +101,12 @@ fn add_fixity(intent: Element) { let definitions = definitions.borrow(); // debug!(" add_fixity: intent_name: {}, ", intent_name); if let Some(definition) = definitions.get_hashmap("IntentMappings").unwrap().get(intent_name) && - let Some((fixity, _)) = definition.split_once("=") { - let new_properties = (if properties.is_empty() {":"} else {properties}).to_string() + fixity + ":"; - intent.set_attribute_value(INTENT_PROPERTY, &new_properties); - // debug!("Added fixity: new value '{}'", intent.attribute_value(INTENT_PROPERTY).unwrap()); - }; + let Some((fixity, _)) = definition.split_once("=") && + fixity != "nofix" { + let new_properties = (if properties.is_empty() {":"} else {properties}).to_string() + fixity + ":"; + intent.set_attribute_value(INTENT_PROPERTY, &new_properties); + // debug!("Added fixity: new value '{}'", intent.attribute_value(INTENT_PROPERTY).unwrap()); + } }); } } @@ -140,6 +141,7 @@ pub fn add_fixity_children(intent: Element) -> Element { let properties = mathml.attribute_value(INTENT_PROPERTY).unwrap_or_default(); let fixity = properties.rsplit(':').find(|&property| FIXITIES.contains(property)).unwrap_or_default(); let intent_name = name(mathml); + // debug!("add_fixity_child: fixity '{}', intent_name '{}'", fixity, intent_name); let op_name_id = mathml.attribute_value("id").unwrap_or("new-id"); match fixity { @@ -922,7 +924,6 @@ mod tests { #[test] fn intent_with_literals() -> Result<()> { - init_logger(); let mathml = " x "; diff --git a/src/interface.rs b/src/interface.rs index 11b965028..55fe74698 100644 --- a/src/interface.rs +++ b/src/interface.rs @@ -1338,4 +1338,113 @@ mod tests { assert!(set_mathml(bad_mathml).is_err()); assert!(get_spoken_text().unwrap() == ""); } + + + + fn setup_speech_ssml() { + set_rules_dir(super::super::abs_rules_dir_path()).unwrap(); + set_preference("Language", "en").unwrap(); + set_preference("TTS", "SSML").unwrap(); + set_preference("MathRate", "80").unwrap(); + set_preference("SpeechStyle", "SimpleSpeak").unwrap(); + set_preference("Verbosity", "Medium").unwrap(); + } + + #[test] + fn test_no_escaping() -> Result<()> { + setup_speech_ssml(); + let expr = " + + x+y + x-y + + "; + set_mathml(&expr)?; + let speech = get_spoken_text()?; + // Rule-generated SSML must pass through verbatim (not XML-entity-encoded). + assert!(!speech.contains("<")); + assert!(!speech.contains(">")); + assert!(!speech.contains("&lt;")); + return Ok(()); + } + + /// The attack payload must not pass through verbatim (rule-generated SSML may contain `"#; + /// Same bytes as `PAYLOAD`, entity-encoded so attribute values are well-formed XML. + const PAYLOAD_ATTR_XML: &str = "<break time="50000ms"/>"; + /// Entity-encoded payload plus trailing literal text (well-formed in leaf element text). + const PAYLOAD_LEAF_XML: &str = "<break time="50000ms"/>note"; + + #[test] + /// User-supplied leaf text must not inject SSML when TTS is SSML. + fn leaf_text_ssml_attack_neutralized_in_speech() -> Result<()> { + setup_speech_ssml(); + // Entity-encoded payload: valid XML through set_mathml (no CDATA), decodes to PAYLOAD + "note". + let mathml = format!( + r#"{PAYLOAD_LEAF_XML}+ + {PAYLOAD_LEAF_XML}+ + {PAYLOAD_LEAF_XML}+ + {PAYLOAD_LEAF_XML}"# + ); + set_mathml(&mathml)?; + let speech = get_spoken_text()?; + assert_ssml_attack_neutralized(&speech, PAYLOAD); + assert!(speech.contains("note") || speech.contains("<")); + let mathml = format!( + "{PAYLOAD_LEAF_XML}+1" + ); + set_mathml(&mathml)?; + let speech = get_spoken_text()?; + assert_ssml_attack_neutralized(&speech, PAYLOAD); + assert!(speech.contains("note") || speech.contains("<")); + return Ok(()); + } + + #[test] + /// Attribute values read via xpath must not inject SSML when TTS is SSML. + fn attribute_ssml_attack_neutralized_in_speech() -> Result<()> { + use crate::speech::{SpeechRulesWithContext, SPEECH_RULES}; + + setup_speech_ssml(); + let mathml = format!( + r#"x"# + ); + set_mathml(&mathml)?; + let speech = get_spoken_text()?; + assert_ssml_attack_neutralized(&speech, PAYLOAD); + + // XPath Attribute nodes use replace_chars (same path as replace_nodes_string). + SPEECH_RULES.with(|rules| { + rules.borrow_mut().read_files()?; + let rules_ref = rules.borrow(); + let package = parser::parse(&mathml)?; + let math = get_element(&package); + let attr = math + .attribute("data-ssml-attack") + .expect("data-ssml-attack attribute"); + let work_package = Package::new(); + let mut ctx = + SpeechRulesWithContext::new(&rules_ref, work_package.as_document(), "", 0); + let from_attr = ctx.replace_chars(attr.value(), math)?; + assert_ssml_attack_neutralized(&from_attr, PAYLOAD); + assert!( + from_attr.contains("<"), + "attribute value should be XML-escaped for SSML: {from_attr}" + ); + Ok::<(), Error>(()) + })?; + return Ok(()); + } } diff --git a/src/lib.rs b/src/lib.rs index f1fc0c1fd..a1b3dc4f7 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -105,7 +105,6 @@ pub fn are_strs_canonically_equal_with_locale(test: &str, target: &str, ignore_a match crate::interface::report_any_panic(result) { Ok(()) => Ok(()), Err(e) => { - eprintln!("{}", e); Err(e) } } diff --git a/src/main.rs b/src/main.rs index 3a086246b..e058fe83f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -193,9 +193,10 @@ fn main() { // "; let expr = r#" - 1 kg sec โˆ’1 m โˆ’1 - - "#; + + ๐Ÿข + + "#; // let instant = Instant::now(); // let rules_dir = "".to_string(); // Use MathCATRulesDir, potentially pointing to a zipped version @@ -235,39 +236,44 @@ fn main() { eprintln!("Error: exiting -- {}", errors_to_string(&e)); exit(1); }; - // match do_navigate_command("ZoomIn".to_string()) { - // Err(e) => eprintln!("Error: exiting -- {}", errors_to_string(&e)); exit(1);, - // Ok(speech) => info!("\nZoomIn speech: '{speech}'"), - // } - // match do_navigate_command("ToggleZoomLockUp".to_string()) { + match do_navigate_command("ZoomIn") { + Err(e) => {eprintln!("Error: exiting -- {}", errors_to_string(&e)); exit(1);}, + Ok(speech) => info!("\nZoomIn speech: '{speech}'"), + } + match do_navigate_command("ZoomIn") { + Err(e) => {eprintln!("Error: exiting -- {}", errors_to_string(&e)); exit(1);}, + Ok(speech) => info!("\nZoomIn speech: '{speech}'"), + } + info!("\n"); + // match do_navigate_command("ToggleZoomLockUp") { // Err(e) => eprintln!("Error: exiting -- {}", errors_to_string(&e)); exit(1);, // Ok(speech) => info!("ToggleZoomLockUp speech: '{speech}'"), // } - // match do_navigate_command("MovePrevious".to_string()) { + // match do_navigate_command("MovePrevious") { // Err(e) => eprintln!("Error: exiting -- {}", errors_to_string(&e)); exit(1);, // Ok(speech) => info!("MovePrevious speech: '{speech}'"), // } - // match do_navigate_command("MovePrevious".to_string()) { + // match do_navigate_command("MovePrevious") { // Err(e) => eprintln!("Error: exiting -- {}", errors_to_string(&e)); exit(1);, // Ok(speech) => info!("MovePrevious speech: '{}'", speech), // } - // match do_navigate_command("MovePrevious".to_string()) { + // match do_navigate_command("MovePrevious") { // Err(e) => eprintln!("Error: exiting -- {}", errors_to_string(&e)); exit(1);, // Ok(speech) => info!("MovePrevious speech: '{}'", speech), // } - // match do_navigate_command("MoveNext".to_string()) { + // match do_navigate_command("MoveNext") { // Err(e) => eprintln!("Error: exiting -- {}", errors_to_string(&e)); exit(1);, // Ok(speech) => info!("MoveNext speech: '{}'", speech), // } - // match do_navigate_command("MoveNext".to_string()) { + // match do_navigate_command("MoveNext") { // Err(e) => eprintln!("Error: exiting -- {}", errors_to_string(&e)); exit(1);, // Ok(speech) => info!("MoveNext speech: '{}'", speech), // } - // match do_navigate_command("MoveNext".to_string()) { + // match do_navigate_command("MoveNext") { // Err(e) => eprintln!("Error: exiting -- {}", errors_to_string(&e)); exit(1);, // Ok(speech) => info!("MoveNext speech: '{}'", speech), // } - // match do_navigate_command("MoveNext".to_string()) { + // match do_navigate_command("MoveNext") { // Err(e) => eprintln!("Error: exiting -- {}", errors_to_string(&e)); exit(1);, // Ok(speech) => info!("MoveNext speech: '{}'", speech), // } diff --git a/src/prefs.rs b/src/prefs.rs index 590709fad..00126d26c 100644 --- a/src/prefs.rs +++ b/src/prefs.rs @@ -259,9 +259,23 @@ impl PreferenceManager { /// /// If rules_dir is an empty PathBuf, the existing rules_dir is used (an error if it doesn't exist) pub fn initialize(&mut self, rules_dir: PathBuf) -> Result<()> { + // Resolve the rules directory to an absolute, canonical path. + // If canonicalize() fails (e.g., ACCESS_DENIED in containers), fall back to: + // - returning the path as-is if it is already absolute, + // - prepending the current working directory if it is relative. + // Note: if current_dir() also fails, unwrap_or_default yields an empty PathBuf, + // and the result may remain relative. #[cfg(not(feature = "include-zip"))] let rules_dir = match rules_dir.canonicalize() { - Err(e) => bail!("set_rules_dir: could not canonicalize path {}: {}", rules_dir.display(), e), + Err(_e) => { + if rules_dir.is_absolute() { + rules_dir + } else { + std::env::current_dir() + .unwrap_or_default() + .join(&rules_dir) + } + }, Ok(rules_dir) => rules_dir, }; diff --git a/src/shim_filesystem.rs b/src/shim_filesystem.rs index 085d90240..b758a4213 100644 --- a/src/shim_filesystem.rs +++ b/src/shim_filesystem.rs @@ -340,14 +340,31 @@ cfg_if! { } } + /// Resolves the path to an absolute, canonical form using the OS. + /// If `canonicalize()` fails (e.g., ACCESS_DENIED in containers), falls back to: + /// - returning the path as-is if it is already absolute, + /// - prepending the current working directory if it is relative. + /// Note: the fallback does not resolve symlinks or normalize `..`/`.` segments. pub fn canonicalize_shim(path: &Path) -> std::io::Result { - return path.canonicalize(); + match path.canonicalize() { + Ok(p) => Ok(p), + Err(_) => { + if path.is_absolute() { + Ok(path.to_path_buf()) + } else { + // Prepend cwd to make the relative path absolute. + // unwrap_or_default yields an empty PathBuf if cwd is unavailable, + // in which case the returned path will still be relative. + Ok(std::env::current_dir().unwrap_or_default().join(path)) + } + } + } } pub fn read_to_string_shim(path: &Path) -> Result { let path = match path.canonicalize() { Ok(path) => path, - Err(e) => bail!("Read error while trying to canonicalize in read_to_string_shim {}: {}", path.display(), e), + Err(_) => path.to_path_buf(), }; debug!("Reading file '{}'", &path.display()); match std::fs::read_to_string(&path) { diff --git a/src/speech.rs b/src/speech.rs index 1ca431506..2545d308a 100644 --- a/src/speech.rs +++ b/src/speech.rs @@ -146,6 +146,7 @@ fn speak_rules(rules: &'static std::thread::LocalKey>, math fn nestable_speak_rules<'c, 's:'c, 'm:'c>(rules_with_context: &mut SpeechRulesWithContext<'c, 's, 'm>, mathml: Element<'c>) -> Result { let mut speech_string = rules_with_context.match_pattern::(mathml) .context("Pattern match/replacement failure!")?; + // debug!("Speech string: {}", speech_string); // Note: [[...]] is added around a matching child, but if the "id" is on 'mathml', the whole string is used if !rules_with_context.nav_node_id.is_empty() { // See https://github.com/NSoiffer/MathCAT/issues/174 for why we can just start the speech at the nav node @@ -328,6 +329,10 @@ pub trait TreeOrString<'c, 'm:'c, T> { fn replace_nodes<'s:'c, 'r>(rules: &'r mut SpeechRulesWithContext<'c, 's,'m>, nodes: Vec>, mathml: Element<'c>) -> Result; fn highlight_braille(braille: T, highlight_style: String) -> T; fn mark_nav_speech(speech: T) -> T; + /// Sanitize xpath-derived literal text before it becomes speech (not used for intent/braille trees). + fn sanitize_xpath_string(s: String, _rules_with_context: &SpeechRulesWithContext<'c, '_, 'm>) -> String { + return s; + } } impl<'c, 'm:'c> TreeOrString<'c, 'm, String> for String { @@ -358,6 +363,8 @@ impl<'c, 'm:'c> TreeOrString<'c, 'm, String> for String { fn mark_nav_speech(speech: String) -> String { return SpeechRulesWithContext::mark_nav_speech(speech); } + + // SSML/SAPI escaping is applied in replace_chars; xpath literals go through that path. } impl<'c, 'm:'c> TreeOrString<'c, 'm, Element<'m>> for Element<'m> { @@ -2444,6 +2451,14 @@ impl<'c, 's:'c, 'r, 'm:'c> SpeechRulesWithContext<'c, 's,'m> { return self.speech_rules; } + pub fn escape_string_for_safety(&self, s: String) -> String { + return crate::tts::escape_string_for_safety( + s, + self.speech_rules.name, + &self.speech_rules.pref_manager.borrow().get_tts(), + ); + } + pub fn get_context(&mut self) -> &mut sxd_xpath::Context<'c> { return &mut self.context_stack.base; } @@ -2563,15 +2578,15 @@ impl<'c, 's:'c, 'r, 'm:'c> SpeechRulesWithContext<'c, 's,'m> { if let Some(id) = mathml.attribute_value("id") && self.nav_node_id == id { let offset = mathml.attribute_value(crate::navigate::ID_OFFSET).unwrap_or("0"); - debug!("nav_node_adjust: id/name='{}/{}' offset?='{}'", id, name(mathml), - self.nav_node_offset.to_string().as_str() == offset - ); + // debug!("nav_node_adjust: id/name='{}/{}' offset?='{}'", id, name(mathml), + // self.nav_node_offset.to_string().as_str() == offset + // ); if is_leaf(mathml) || self.nav_node_offset.to_string().as_str() == offset { if self.speech_rules.name == RulesFor::Braille { let highlight_style = self.speech_rules.pref_manager.borrow().pref_to_string("BrailleNavHighlight"); return T::highlight_braille(speech, highlight_style); } else { - debug!("nav_node_adjust: id='{}' offset='{}/{}'", id, self.nav_node_offset, offset); + // debug!("nav_node_adjust: id='{}' offset='{}/{}'", id, self.nav_node_offset, offset); return T::mark_nav_speech(speech) } } @@ -2643,7 +2658,7 @@ impl<'c, 's:'c, 'r, 'm:'c> SpeechRulesWithContext<'c, 's,'m> { fn mark_nav_speech(speech: String) -> String { // add unique markers (since speech is mostly ascii letters and digits, most any symbol will do) // it's a bug (but happened during intent generation), we might have identical id's, choose innermost one - debug!("mark_nav_speech: adding [[ {} ]] ", &speech); + // debug!("mark_nav_speech: adding [[ {} ]] ", &speech); if !speech.contains("[[") { return "[[".to_string() + &speech + "]]"; } else { @@ -2734,7 +2749,7 @@ impl<'c, 's:'c, 'r, 'm:'c> SpeechRulesWithContext<'c, 's,'m> { }; let matched = match node { Node::Element(n) => self.match_pattern::(n)?, - Node::Text(t) => self.replace_chars(t.text(), mathml)?, + Node::Text(t) => self.replace_chars(t.text(), mathml)?, Node::Attribute(attr) => self.replace_chars(attr.value(), mathml)?, _ => bail!("replace_nodes: found unexpected node type!!!"), }; @@ -2746,6 +2761,13 @@ impl<'c, 's:'c, 'r, 'm:'c> SpeechRulesWithContext<'c, 's,'m> { /// Lookup unicode "pronunciation" of char. /// Note: TTS is not supported here (not needed and a little less efficient) pub fn replace_chars(&'r mut self, str: &str, mathml: Element<'c>) -> Result { + if is_quoted_string(str) { // quoted string -- already translated (set in get_braille_chars) + return Ok(unquote_string(str).to_string()); + } + self.replace_chars_escaping_xml_chars(str, mathml) + } + + fn replace_chars_escaping_xml_chars(&'r mut self, str: &str, mathml: Element<'c>) -> Result { let chars = str.chars().collect::>(); let rules = self.speech_rules; // handled in match_pattern -- temporarily leaving as comments in case something is missed and needed here @@ -2762,24 +2784,22 @@ impl<'c, 's:'c, 'r, 'm:'c> SpeechRulesWithContext<'c, 's,'m> { // return Ok( ch.to_string() ); // } // } - if is_quoted_string(str) { // quoted string -- already translated (set in get_braille_chars) - return Ok(unquote_string(str).to_string()); - } // in a string, avoid "a" -> "eigh", "." -> "point", etc if rules.translate_single_chars_only { if chars.len() == 1 { - return self.replace_single_char(chars[0], mathml) + return self.replace_single_char(chars[0], mathml); } else { - // more than one char -- fix up non-breaking space - return Ok(str.replace('\u{00A0}', " ").replace(['\u{2061}', '\u{2062}', '\u{2063}', '\u{2064}'], "")) + // more than one char -- user literal (e.g. mtext); fix up non-breaking space + let s = str.replace('\u{00A0}', " ").replace(['\u{2061}', '\u{2062}', '\u{2063}', '\u{2064}'], ""); + return Ok(self.escape_string_for_safety(s)); } - }; + } let result = chars.iter() .map(|&ch| self.replace_single_char(ch, mathml)) .collect::>>()? .join(""); - return Ok( result ); + return Ok(result); } fn replace_single_char(&'r mut self, ch: char, mathml: Element<'c>) -> Result { @@ -2805,7 +2825,7 @@ impl<'c, 's:'c, 'r, 'm:'c> SpeechRulesWithContext<'c, 's,'m> { self.translate_count = 0; // not in loop // debug!("*** Did not find unicode {} for char '{}'/{:#06x}", rules.name, ch, ch_as_u32); if rules.translate_single_chars_only || ch.is_ascii() { // speech or if braille, avoid loop (ASCII remains ASCII if not found) - return Ok(String::from(ch)); // no replacement, so just return the char and hope for the best + return Ok(self.escape_string_for_safety(String::from(ch))); } else { // braille -- must turn into braille dots // Emulate what NVDA does: generate (including single quotes) '\xhhhh' or '\yhhhhhh' let ch_as_int = ch as u32; diff --git a/src/tts.rs b/src/tts.rs index e1b28d0fc..521715381 100644 --- a/src/tts.rs +++ b/src/tts.rs @@ -72,7 +72,7 @@ use sxd_document::dom::Element; use yaml_rust::Yaml; use std::fmt; -use crate::speech::{SpeechRulesWithContext, MyXPath, TreeOrString}; +use crate::speech::{RulesFor, SpeechRulesWithContext, MyXPath, TreeOrString}; use std::string::ToString; use std::str::FromStr; use strum_macros::{Display, EnumString}; @@ -267,6 +267,24 @@ pub enum TTS { // Mac, } +/// Escape literal text so user MathML (e.g. `mtext`) cannot inject SSML/SAPI markup. +/// Applies only when generating speech (not braille) with SSML or SAPI5 output. +/// Returns `s` unchanged when no escaping is needed (no allocation). +pub fn escape_string_for_safety(s: String, rules_for: RulesFor, tts: &TTS) -> String { + if rules_for == RulesFor::Braille || (*tts != TTS::SSML && *tts != TTS::SAPI5) { + return s; + } + if !needs_xml_text_escape(&s) { + return s; + } + log::debug!("Escaping string for safety: {}", s); + return encode_safe(&s).into_owned(); +} + +fn needs_xml_text_escape(s: &str) -> bool { + return s.as_bytes().iter().any(|&b| b == b'&' || b == b'<' || b == b'>' || b == b'"'); +} + impl TTS { /// Given the tts command ("pause", "rate", etc) and its value, build the TTS data structure for it. /// @@ -455,16 +473,15 @@ impl TTS { if result.is_empty() { result += " "; } - // need to sanitize string so that SSML is not injected into it via mtext, etc. let speech = command.replacements.replace::(rules_with_context, mathml)?; - result += &encode_safe(&speech); + result += &speech; } let end_tag = match self { TTS::None => self.get_string_none(&command, prefs, false), TTS::SSML => self.get_string_ssml(&command, prefs, false), TTS::SAPI5 => self.get_string_sapi5(&command, prefs, false), - }; + }; if end_tag.is_empty() { return Ok( result ); // avoids adding in " " @@ -759,4 +776,28 @@ mod tests { assert!(!output.contains("100ms")); assert!(output.contains("300ms")); } + + /// Returns the same String allocation when escaping is not needed. + #[test] + fn escape_string_for_safety_no_alloc_when_clean() { + let input = "23".to_string(); + let ptr = input.as_ptr(); + let output = escape_string_for_safety(input, RulesFor::Speech, &TTS::SSML); + assert_eq!(output, "23"); + assert_eq!(output.as_ptr(), ptr); + let output = escape_string_for_safety(output, RulesFor::Braille, &TTS::SSML); + assert_eq!(output, "23"); + assert_eq!(output.as_ptr(), ptr); + } + + #[test] + fn escape_string_for_safety_escapes_markup() { + let output = escape_string_for_safety( + "".to_string(), + RulesFor::Speech, + &TTS::SSML, + ); + assert_eq!(output, "<break/>"); + } + } diff --git a/tests/Languages/de/alphabets.rs b/tests/Languages/de/alphabets.rs index 309db4eba..b01206a7d 100644 --- a/tests/Languages/de/alphabets.rs +++ b/tests/Languages/de/alphabets.rs @@ -405,3 +405,13 @@ fn enclosed_numbers() -> Result<()> { return Ok(()); } + +#[test] +fn mathematical_digit_names() -> Result<()> { + let expr = " ๐ŸŽ,๐Ÿ,๐Ÿ–"; + test("de", "SimpleSpeak", expr, "fett null komma fett eins komma fett acht")?; + let expr = " ๐Ÿช,๐Ÿพ"; + test("de", "SimpleSpeak", expr, "acht komma acht")?; + Ok(()) + +} diff --git a/tests/Languages/en/definitions.rs b/tests/Languages/en/definitions.rs new file mode 100644 index 000000000..6680b80c5 --- /dev/null +++ b/tests/Languages/en/definitions.rs @@ -0,0 +1,1026 @@ +/// Tests for rules in definitions: +/// * modified var +use crate::common::*; +use anyhow::Result; + +#[test] +fn tuple_basic() -> Result<()> { + // function + let expr = r#" + + + x + y + + + "#; + + test("en", "ClearSpeak", expr, "the tuple of x comma, y")?; + test("en", "SimpleSpeak", expr, "the tuple of x comma, y")?; + + return Ok(()); +} + +#[test] +fn my_set_basic() -> Result<()> { + let expr = r#" + + + x + y + + + "#; + + test("en", "ClearSpeak", expr, "the set of x comma, y")?; + + Ok(()) +} + +#[test] +fn fixed_test() -> Result<()> { + let expr = r#" + + R + + + "#; + + test("en", "ClearSpeak", expr, "set of all real numbers")?; + Ok(()) +} + +#[test] +fn i_test() -> Result<()> { + let expr = r#" + + i + + + "#; + + test("en", "ClearSpeak", expr, "i")?; + Ok(()) +} + + +#[test] +fn floor_basic() -> Result<()> { + let expr = r#" + + + x + + + "#; + + test("en", "ClearSpeak", expr, "floor of x")?; + + Ok(()) +} + +#[test] +fn set_difference_basic() -> Result<()> { + let expr = r#" + + + A + + B + + + "#; + + test( "en", "ClearSpeak", expr, "set difference of cap eigh and cap b")?; + + Ok(()) +} + +#[test] +fn postfix_test() -> Result<()> { + let tests = [ + ( + "transpose", + r#" + + x + T + + "#, + "x transpose", + ), + ( + "highlight", + r#" + + x + + "#, + "x highlighted", + ), + ]; + + // Loop through all test cases, name _, body, and expected result + for (_, body, expected) in tests { + let expr = format!( + r#" + + {} + + "#, + body + ); + + test("en", "ClearSpeak", &expr, expected)?; + } + + Ok(()) +} + +#[test] +fn prefix_test() -> Result<()> { + // Prefix test limit, unit-vector, line-segment + // Directed-line-segment, line, ray, arc + let tests = [ + ( + "limit", + r#" + + x + + "#, + "limit as x", + ), + ( + "unit-vector", + r#" + + x + ^ + + "#, + "unit vector x", + ), + ( + "line-segment", + r#" + + x + ยฏ + + "#, + "line segment x", + ), + ]; + + for (_, body, expected) in tests { + let expr = format!( + r#" + + {} + + "#, + body + ); + + test("en", "ClearSpeak", &expr, expected)?; + } + + Ok(()) +} + + +#[test] +fn functions_and_inverses_tests() -> Result<()> { + let tests = vec![ + //("closed-interval", "closed interval between x and y"), + //("closed-open-interval", "interval between x included and y"), + //("open-closed-interval", "interval between x and y included"), + //("open-interval", "open interval between x and y"), + + ("inverse", "inverse of x"), + ("domain", "domain of x"), + ("codomain", "codomain of x"), + ("image", "image of x"), + + //("fraction", "fraction x over y end fraction"), + ("mixed-fraction", "x and y"), + ("quotient", "integer part of x divided by y"), + ("evaluated-at", "x evaluated at y"), + ("remainder", "the remainder x divided by y"), + + ("max", "max x"), + ("min", "min x"), + + ("power", "x to the power y"), + + ("root", "root x"), + + ("greatest-common-divisor", "gcd: the gcd: the greatest common divisor x"), + ("least-common-multiple", "lcm: the lcm: the least common multiple x"), + + ("absolute-value", "absolute value: the absolute value: the absolute value x end absolute value"), + + ("complex-conjugate", "complex conjugate x"), + ("complex-arg", "arg x"), + ("real-part", "the real part x"), + ("imaginary-part", "imaginary part: the imaginary part: the imaginary part x"), + + ("polar-coordinate", "polar coordinate x comma y"), + ("spherical-coordinate", "spherical coordinate x comma y comma z"), + ("cartesian-coordinate", "cartesian coordinate x comma y"), + ("coordinate", "coordinate x comma y"), + + ("floor", "floor x"), + ("ceiling", "ceiling x"), + ("round", "rounded-value x"), + ("fractional-part", "fractional part x"), + + + ]; + + for (intent, expected) in tests { + let expr = match intent { + + "max" + | "min" + | "greatest-common-divisor" + | "least-common-multiple" + | "spherical-coordinate" + | "cartesian-coordinate" + | "coordinate" => { + format!( + " + + x + y + z + + ", + intent + ) + } + + "power" + | "mixed-fraction" + | "quotient" + | "evaluated-at" + | "remainder" + | "closed-interval" + | "closed-open-interval" + | "open-closed-interval" + | "open-interval" + | "polar-coordinate" => { + format!( + " + + x + y + + ", + intent + ) + } + + _ => { + format!( + " + + x + + ", + intent + ) + } + }; + + test("en", "ClearSpeak", &expr, expected)?; + } + + Ok(()) +} + + +#[test] +fn calculus_tests() -> Result<()> { + let tests = vec![ + //("derivative", "the derivative of x with respect to x"), + //"definite-integral", "integral over x from x to x"), + + // prefix + ("limit", "limit as x"), + + // infix + ("tends-to", "x tends to y"), + ("tends-to-from-above", "x tends to from above y"), + ("tends-to-from-below", "x tends to from below y"), + ]; + + for (intent, expected) in tests { + let expr = match intent { + "limit" => { + format!( + " + + x + + ", + intent + ) + } + + _ => { + // infix cases + format!( + " + + x + y + + ", + intent + ) + } + }; + + test("en", "ClearSpeak", &expr, expected)?; + } + + Ok(()) +} + + +#[test] +fn set_tests() -> Result<()> { + let tests = vec![ + ("set", "the set of x"), + // ("set-difference", "set difference of x and y"), + ("complement", "complement of x"), + //("empty-set", "empty set"), + ("cardinality", "cardinality of x"), + ("list", "list of x"), + ("tuple", "the tuple of x"), + ]; + + for (intent, expected) in tests { + let expr = format!( + " + + x + + ", + intent + ); + + test("en", "ClearSpeak", &expr, expected)?; + } + + Ok(()) +} + + +#[test] +fn sequence_and_series_intents() -> Result<()> { + let tests = [ + ( + "sum-1", + r#" + + + x + + "#, + "sum of x", + ), + ( + "sum-2", + r#" + + + i + x + + "#, + "sum over i of x", + ), + ( + "sum-3", + r#" + + + i + n + x + + "#, + "sum from i to n of x", + ), + ( + "product-1", + r#" + + + x + + "#, + "product of x", + ), + ( + "product-2", + r#" + + + i + x + + "#, + "product over i of x", + ), + ( + "product-3", + r#" + + + i + n + x + + "#, + "product from i to n of x", + ), + ]; + + for (_, body, expected) in tests { + let expr = format!( + r#" + + {} + + "#, + body + ); + + test("en", "ClearSpeak", &expr, expected)?; + } + + Ok(()) +} + +#[test] +fn elementary_classical_tests() -> Result<()> { + let tests = vec![ + // Trig + ("sine", "sine of x"), + ("cosine", "cosine of x"), + ("tangent", "tangent of x"), + ("secant", "secant of x"), + ("cosecant", "cosecant of x"), + ("cotangent", "cotangent of x"), + + // Inverse trig + ("arcsine", "arcsine of x"), + ("arccosine", "arccosine of x"), + ("arctangent", "arctangent of x"), + ("arcsecant", "arcsecant of x"), + ("arccosecant", "arc-cosecant of x"), + ("arccotangent", "arc-cotangent of x"), + + // Hyperbolic trig + ("hyperbolic-sine", "shine of x"), + ("hyperbolic-cosine", "cosh of x"), + ("hyperbolic-tangent", "tanch of x"), + ("hyperbolic-secant", "sech of x"), + ("hyperbolic-cosecant", "cosech of x"), + ("hyperbolic-cotangent", "coth of x"), + + // Inverse hyperbolic trig + ("arc-hyperbolic-sine", "arc shine of x"), + ("arc-hyperbolic-cosine", "arc cosh of x"), + ("arc-hyperbolic-tangent", "arc tanch of x"), + ("arc-hyperbolic-secant", "arc sech of x"), + ("arc-hyperbolic-cosecant", "arc cosech of x"), + ("arc-hyperbolic-cotangent", "arc coth of x"), + ]; + + for (intent, expected) in tests { + let expr = format!( + " + + x + + ", + intent + ); + + test("en", "ClearSpeak", &expr, expected)?; + } + + Ok(()) +} + +#[test] +fn statistics_and_probability_tests() -> Result<()> { + let tests = vec![ + ("mean", "mean of x"), + ("standard-deviation", "standard deviation of x"), + ("variance", "variance of x"), + ("median", "median of x"), + ("mode", "mode of x"), + + // conditional probability typically two arguments + // ("conditional-probability", "probability of x given y"), + ]; + + for (intent, expected) in tests { + let expr = match intent { + "conditional-probability" => format!( + " + + P + ( + + x + | + y + + ) + + ", + intent + ), + _ => format!( + " + + x + + ", + intent + ), + }; + + test("en", "ClearSpeak", &expr, expected)?; + } + + Ok(()) +} + +#[test] +fn linear_algebra_tests() -> Result<()> { + let tests = vec![ + ("vector", "vector of x"), + // ("matrix", "matrix of x"), + ("determinant", "determinant of x"), + ("adjugate", "adjugate of x"), + ("magnitude", "magnitude of x"), + ("norm", "norm of x"), + ("span", "span of x"), + + // transpose supports both postfix and function; we test function explicitly + ("transpose", "transpose of x"), + + // dimensional product is infix + ("dimensional-product", "x by y"), + + // unit-vector is prefix + ("unit-vector", "unit vector x") + ]; + + for (intent, expected) in tests { + let expr: String = match intent { + "dimensional-product" => { + " + + x + y + + " + .to_string() + } + _ => format!( + " + + x + + " + ), + }; + + test("en", "ClearSpeak", &expr, expected)?; + } + + Ok(()) +} + +#[test] +fn nofix_set_tests() -> Result<()> { + let tests = vec![ + ("set-of-integers", "โ„ค", "set of all integers"), + ("set-of-reals", "โ„", "set of all real numbers"), + ("set-of-rationals", "โ„š", "set of all rational numbers"), + ("set-of-natural-numbers", "โ„•", "set of all natural numbers"), + ("set-of-complex-numbers", "โ„‚", "set of all complex numbers"), + ("set-of-primes", "โ„™", "set of all prime numbers"), + ]; + + for (intent, symbol, expected) in tests { + let expr = format!( + " + {} + ", + intent, + symbol + ); + + test("en", "ClearSpeak", &expr, expected)?; + } + + Ok(()) +} + +#[test] +fn geometry_prefix_multi_value_tests() -> Result<()> { + let tests = vec![ + ("line-segment", "line segment x y"), + ("directed-line-segment", "directed line segment x y"), + ("line", "line x y"), + ("ray", "ray x y"), + ("arc", "arc x y"), + ("point", "point x y z"), + ]; + + for (intent, expected) in tests { + let expr = match intent{ + "point" => { + format!( + " + + x + y + z + + " + ) + } + + _ => { + format!( + " + + x + y + + " + ) + } + }; + + test("en", "ClearSpeak", &expr, expected)?; + } + + Ok(()) +} + +#[test] +fn geometry_prefix_tests() -> Result<()> { + let tests = vec![ + ("length", "length of x"), + ("area", "area of x"), + ("volume", "volume of x"), + ]; + + for (intent, expected) in tests { + let expr = format!( + " + + x + + " + ); + + test("en", "ClearSpeak", &expr, expected)?; + } + + Ok(()) +} + +#[test] +fn separator_tests() -> Result<()> { + let expr = format!( + " + + x + y + + " + ); + + test("en", "ClearSpeak", &expr, "x y")?; + Ok(()) +} + +#[test] +fn general_concepts_tests() -> Result<()> { + let tests = vec![ + // Unary structural + ("fenced-group", "fenced-group of x"), + ("highlight", "x highlighted"), + ("least-common-denominator", "least common denominator of x comma, y comma, z"), // add x, y , z ... + ("pochhammer", "permutation of x"), + ("permutation-cycle", "permutation cycle of x"), + + // Binary structural / infix-style + // ("ordered-pair", "the pair of x and y"), + ("rate", "x per y"), + + ("binomial-coefficient", "x choose y"), + ("embellished-name", "x with annotation y"), + ("indexed-by", "x indexed by y"), + // ("translation", "translation by x comma, y"), // Changes translation to comma + ("constraint", "x with constraint y"), + ]; + + for (intent, expected) in tests { + let expr = match intent { + "ordered-pair" + | "rate" + | "constraint" + | "binomial-coefficient" + | "embellished-name" + | "translation" + | "indexed-by" => { + format!( + " + + x + y + + ", + intent + ) + } + "least-common-denominator" => { + format!( + " + + x + y + z + + ", + intent + ) + } + + // unary cases + _ => { + format!( + " + + x + + ", + intent + ) + } + }; + + test("en", "ClearSpeak", &expr, expected)?; + } + + Ok(()) +} + +#[test] +fn grouping_tests() -> Result<()> { + let tests = vec![ + ("annotation", "x which is y"), + // ("braced-group", "grouped x end-grouped"), + // ("repeating-decimal", "repeating decimal of x"), + ]; + + for (intent, expected) in tests { + let expr = match intent { + "annotation" => { + format!( + " + + x + y + + ", + intent + ) + } + _ => { + format!( + " + + x + + ", + intent + ) + } + }; + + test("en", "ClearSpeak", &expr, expected)?; + } + + Ok(()) +} + +#[test] +fn function_default_fixity_tests() -> Result<()> { + let tests = vec![ + ("curl", "curl of x"), + ("divergence", "divergence of x"), + ("gradient", "gradient of x"), + ("laplacian", "laplacian of x"), + ]; + + for (intent, expected) in tests { + let expr = format!( + " + + x + + ", + intent + ); + + test("en", "ClearSpeak", &expr, expected)?; + } + + Ok(()) +} + +#[test] +fn prefix_default_fixity_tests() -> Result<()> { + let tests = vec![ + ("angle", "angle x"), + ("angle-measure", "angle measure x"), + ("change", "change in x"), + ("for-all", "for all x"), + ("measured-angle", "measured angle x"), + ("not", "not x"), + ("number-of", "number of x"), + ("partial-derivative", "partial x"), + ("right-angle", "right angle x"), + ("square-root-of", "square root of x"), + ("there-does-not-exist", "there does not exist x"), + ("there-exists", "there exists x"), + ]; + + for (intent, expected) in tests { + let expr = format!( + " + + x + + ", + intent + ); + + test("en", "ClearSpeak", &expr, expected)?; + } + + Ok(()) +} + +#[test] +fn infix_default_fixity_tests() -> Result<()> { + let tests = vec![ + ("and", "x and y"), + ("applied-to", "x applied to y"), + ("approximately", "x approximately y"), + ("congruent", "x congruent to y"), + ("cartesian-product", "x cartesian product y"), + ("composed-with", "x composed with y"), + ("cross-product", "x cross product y"), + ("defined-as", "x defined as y"), + ("divided-by", "x divided by y"), + ("divides", "x divides y"), + ("does-not-belong-to", "x does not belong to y"), + ("does-not-divide", "x does not divide y"), + ("dot-product", "x dot product y"), + ("downwards-diagonal-ellipsis", "x downwards diagonal ellipsis y"), + ("direct-product", "x direct product y"), + ("element-of", "x element of y"), + ("ellipsis", "x ellipsis y"), + ("equals", "x equals y"), + ("equivalent-to", "x equivalent to y"), + ("evaluates-to", "x evaluates to y"), + ("given", "x given y"), + ("greater-than", "x greater than y"), + ("greater-than-or-equal-to", "x greater than or equal to y"), + ("identically-equals", "x identically equals y"), + ("if-and-only-if", "x if and only if y"), + ("implies", "x implies y"), + ("inner-product", "x inner product y"), + ("intersection", "x intersection y"), + ("less-than", "x less than y"), + ("less-than-or-equal-to", "x less than or equal to y"), + ("list-separator", "x comma y"), + ("maps-to", "x maps to y"), + ("member-of", "x member of y"), + ("minus", "x minus y"), + ("minus-or-plus", "x minus or plus y"), + ("not-subset", "x not subset of y"), + ("not-superset", "x not superset of y"), + ("not-equal-to", "x not equal to y"), + ("not-member-of", "x not member of y"), + ("not-parallel-to", "x not parallel to y"), + ("obtained-from", "x obtained from y"), + ("or", "x or y"), + ("outer-product", "x outer product y"), + ("parallel-to", "x parallel to y"), + ("perpendicular", "x perpendicular to y"), + ("plus", "x plus y"), + ("plus-or-minus", "x plus or minus y"), + ("precedes", "x precedes y"), + ("proportional", "x proportional to y"), + ("range-separator", "x through y"), + ("ratio", "x ratio y"), + ("similar", "x similar to y"), + ("subset", "x subset of y"), + ("subset-or-equal", "x subset or equal to y"), + ("succeeds", "x succeeds y"), + ("such-that", "x such that y"), + ("superset", "x superset of y"), + ("superset-or-equal", "x superset or equal to y"), + ("tilde", "x tilde y"), + ("times", "x times y"), + ("union", "x union y"), + ("upwards-diagonal-ellipsis", "x upwards diagonal ellipsis y"), + ("vertical-ellipsis", "x vertical ellipsis y"), + ("xor", "x exclusive or y"), + ]; + + for (intent, expected) in tests { + let expr = format!( + " + + x + y + + ", + intent + ); + + test("en", "ClearSpeak", &expr, expected)?; + } + + Ok(()) +} + +#[test] +fn postfix_default_fixity_tests() -> Result<()> { + let tests = vec![ + ("factorial", "x factorial"), + ("percent", "x percent"), + ]; + + for (intent, expected) in tests { + let expr = format!( + " + + x + + ", + intent + ); + + test("en", "ClearSpeak", &expr, expected)?; + } + + Ok(()) +} + +#[test] +fn nofix_default_fixity_tests() -> Result<()> { + let tests = vec![ + ("diameter", "d", "diameter"), + ("distance", "D", "distance"), + ("probability", "P", "probability"), + ("radius", "r", "radius"), + ("volume", "V", "volume"), + ("exponential-e", "e", "e"), + ("imaginary-i", "i", "i"), + ("differential-d", "d", "d"), + ("golden-ratio", "ฯ†", "golden ratio"), + ]; + + for (intent, symbol, expected) in tests { + let expr = format!( + " + {} + ", + intent, + symbol + ); + + test("en", "ClearSpeak", &expr, expected)?; + } + + Ok(()) +} \ No newline at end of file diff --git a/tests/Languages/en/intent.rs b/tests/Languages/en/intent.rs index 795854781..aa75fbeed 100644 --- a/tests/Languages/en/intent.rs +++ b/tests/Languages/en/intent.rs @@ -133,6 +133,7 @@ fn silent_intent_underscore() -> Result<()> { #[test] fn intent_prob_x() -> Result<()> { + init_logger(); let expr = " x diff --git a/tests/Languages/en/mtable.rs b/tests/Languages/en/mtable.rs index f3c51174b..0889a0e0e 100644 --- a/tests/Languages/en/mtable.rs +++ b/tests/Languages/en/mtable.rs @@ -238,6 +238,44 @@ fn matrix_2x3() -> Result<()> { } +#[test] +fn augmented_matrix_2x3() -> Result<()> { + let expr = " + + + [ + + + + 3 + + + 1 + + + 4 + + + + + 0 + + + 2 + + + 6 + + + + ] + + "; + test("en", "ClearSpeak", expr, "the 2 by 3 augmented matrix; row 1; 3, 1, 4; row 2; 0, 2, 6")?; + test("en", "SimpleSpeak", expr, "the 2 by 3 augmented matrix; row 1; 3, 1, 4; row 2; 0, 2, 6")?; + Ok(()) +} + #[test] fn matrix_2x3_labeled() -> Result<()> { let expr = " @@ -859,6 +897,45 @@ test_ClearSpeak("en", "ClearSpeak_Matrix", "EndMatrix", return Ok(()); } +#[test] +fn augmented_matrix_3x4_end_matrix() -> Result<()> { +let expr = " + + [ + + + 1 + 2 + -1 + 3 + + + -3 + 3 + -1 + 2 + + + 2 + 3 + 2 + -1 + + + ] + +"; +test_ClearSpeak("en", "ClearSpeak_Matrix", "EndMatrix", + expr, "the 3 by 4 augmented matrix; row 1; column 1; 1, column 2; 2, column 3; negative 1, column 4; 3; \ + row 2; column 1; negative 3, column 2; 3, column 3; negative 1, column 4; 2; \ + row 3; column 1; 2, column 2; 3, column 3; 2, column 4; negative 1; end matrix")?; + test("en", "SimpleSpeak", + expr, "the 3 by 4 augmented matrix; row 1; column 1; 1, column 2; 2, column 3; negative 1, column 4; 3; \ + row 2; column 1; negative 3, column 2; 3, column 3; negative 1, column 4; 2; \ + row 3; column 1; 2, column 2; 3, column 3; 2, column 4; negative 1; end matrix")?; + Ok(()) + } + #[test] fn simple_matrix_vector() -> Result<()> { diff --git a/tests/Languages/en/shared.rs b/tests/Languages/en/shared.rs index 37fd45659..ee42fc3be 100644 --- a/tests/Languages/en/shared.rs +++ b/tests/Languages/en/shared.rs @@ -209,6 +209,40 @@ fn presentation_mathml_in_semantics() -> Result<()> { } +#[test] +fn roman_like_superscript_identifier_is_not_chemistry() -> Result<()> { + // Regression test for https://github.com/daisy/MathCAT/issues/528 + let expr = " + I + = + โˆ’ + b + r + + + + z + I + + "; + test("en", "ClearSpeak", expr, "cap i is equal to, negative b r, plus z to the cap i-th power")?; + Ok(()) +} + +#[test] +fn roman_like_identifier_sequence_is_not_number() -> Result<()> { + // Regression test for https://github.com/daisy/MathCAT/issues/528 + let expr = " + C + + + I + + + X + "; + test("en", "ClearSpeak", expr, "cap c plus cap i plus cap x")?; + Ok(()) +} + + #[test] fn ignore_period() -> Result<()> { // from https://en.wikipedia.org/wiki/Probability @@ -415,7 +449,7 @@ fn mn_with_block_and_decimal_separators() -> Result<()> { #[test] fn divergence() -> Result<()> { let expr = "·F"; // may want to change this for another language - test_prefs("en", "SimpleSpeak", vec![("Verbosity", "Terse")], expr, "dihv cap f")?; + test_prefs("en", "SimpleSpeak", vec![("Verbosity", "Terse")], expr, "div cap f")?; test_prefs("en", "SimpleSpeak", vec![("Verbosity", "Verbose")], expr, "divergence of cap f")?; return Ok(()); diff --git a/tests/Languages/intent/tables.rs b/tests/Languages/intent/tables.rs index ea3c0b7b1..c7968dee5 100644 --- a/tests/Languages/intent/tables.rs +++ b/tests/Languages/intent/tables.rs @@ -33,7 +33,7 @@ fn matrix_mtable_intent() -> Result<()> { 456 "#; let intent = " - + 1 2 @@ -57,7 +57,7 @@ fn matrix_mrow_intent() -> Result<()> { 456 "#; let intent = " - + 1 2 @@ -105,7 +105,7 @@ fn determinant_not_matrix() -> Result<()> { 45 "#; let intent = " - + '> 1 2 diff --git a/tests/Languages/vi/vi.rs b/tests/Languages/vi/vi.rs index 3f61cff0e..aa95f0e1f 100644 --- a/tests/Languages/vi/vi.rs +++ b/tests/Languages/vi/vi.rs @@ -43,12 +43,12 @@ fn number_2a() -> Result<()> { } #[test] +#[ignore] fn roman_numeral() -> Result<()> { let expr = "IX+VIII=XVII"; test_prefs("vi", "ClearSpeak", vec![("Verbosity", "Medium")], expr, "9 cแป™ng 8, bแบฑng 17")?; test_prefs("vi", "ClearSpeak", vec![("Verbosity", "Verbose")], expr, "9 la mรฃ cแป™ng 8 la mรฃ, bแบฑng 17 la mรฃ")?; return Ok(()); - } #[test] diff --git a/tests/Languages/zh/tw/SimpleSpeak/geometry.rs b/tests/Languages/zh/tw/SimpleSpeak/geometry.rs index 20235702b..4a9b4c72a 100644 --- a/tests/Languages/zh/tw/SimpleSpeak/geometry.rs +++ b/tests/Languages/zh/tw/SimpleSpeak/geometry.rs @@ -30,7 +30,7 @@ fn arc_mtext() -> Result<()> { #[test] fn ray_mtext() -> Result<()> { let expr = " XYโ†’ "; - test("zh-tw", "SimpleSpeak", expr, "ๅ‘้‡ ๅคงๅฏซ x ๅคงๅฏซ y")?; + test("zh-tw", "SimpleSpeak", expr, "ๅฐ„็ทš ๅคงๅฏซ x ๅคงๅฏซ y")?; return Ok(()); } diff --git a/tests/Languages/zh/tw/SimpleSpeak/mroot.rs b/tests/Languages/zh/tw/SimpleSpeak/mroot.rs index c28fd8e71..57cf39c59 100644 --- a/tests/Languages/zh/tw/SimpleSpeak/mroot.rs +++ b/tests/Languages/zh/tw/SimpleSpeak/mroot.rs @@ -48,7 +48,7 @@ fn cube_root() -> Result<()> { let expr = " x 3 "; - test("zh-tw", "SimpleSpeak", expr, "ๆ น่™Ÿ x ็š„ ็ซ‹ๆ–นๆ น")?; + test("zh-tw", "SimpleSpeak", expr, "x ็š„ ็ซ‹ๆ–นๆ น")?; return Ok(()); } @@ -58,7 +58,7 @@ fn ordinal_root() -> Result<()> { let expr = " x 9 "; - test("zh-tw", "SimpleSpeak", expr, "ๆ น่™Ÿ x ็š„ 9 ๆฌกๆ–นๆ น")?; + test("zh-tw", "SimpleSpeak", expr, "x ็š„ 9 ๆฌกๆ–นๆ น")?; return Ok(()); } @@ -67,7 +67,7 @@ fn ordinal_root_2() -> Result<()> { let expr = " x 9.1 "; - test("zh-tw", "SimpleSpeak", expr, "ๆ น่™Ÿ x ็š„ 9.1 ๆฌกๆ–นๆ น")?; + test("zh-tw", "SimpleSpeak", expr, "x ็š„ 9.1 ๆฌกๆ–นๆ น")?; return Ok(()); } @@ -77,7 +77,7 @@ fn simple_mi_root() -> Result<()> { let expr = " x n "; - test("zh-tw", "SimpleSpeak", expr, "ๆ น่™Ÿ x ็š„ n ๆฌกๆ–นๆ น")?; + test("zh-tw", "SimpleSpeak", expr, "x ็š„ n ๆฌกๆ–นๆ น")?; return Ok(()); } @@ -91,7 +91,7 @@ fn simple_fraction_power() -> Result<()> { 13 "; - test("zh-tw", "SimpleSpeak", expr, "ๆ น่™Ÿ x ็š„ 3 ๅˆ†ไน‹ 1 ๆฌกๆ–นๆ น")?; + test("zh-tw", "SimpleSpeak", expr, "x ็š„ 3 ๅˆ†ไน‹ 1 ๆฌกๆ–นๆ น")?; return Ok(()); } diff --git a/tests/braille.rs b/tests/braille.rs index 12b70cb87..2fc04fffc 100644 --- a/tests/braille.rs +++ b/tests/braille.rs @@ -24,6 +24,10 @@ mod braille { mod vi; } + mod Russian { + mod russian; + } + mod LaTeX { mod augenbit; mod other; diff --git a/tests/braille/Russian/russian.rs b/tests/braille/Russian/russian.rs new file mode 100644 index 000000000..e19a963bc --- /dev/null +++ b/tests/braille/Russian/russian.rs @@ -0,0 +1,152 @@ +use crate::common::*; +use anyhow::Result; + +#[test] +fn numbers_and_operators() -> Result<()> { + let expr = r#"5+12=17"#; + test_braille("Russian", expr, "โ ผโ ‘โ €โ –โ ผโ โ ƒโ €โ ถโ ผโ โ ›")?; + return Ok(()); +} + +#[test] +fn fraction() -> Result<()> { + let expr = r#"x2"#; + test_braille("Russian", expr, "โ  โ ญโ ณโ †")?; + return Ok(()); +} + +#[test] +fn scripts_and_root() -> Result<()> { + let expr = r#"x2+y"#; + test_braille("Russian", expr, "โ  โ ญโ Œโ †โ €โ –โ ฉโ ฑโ ฝโ น")?; + return Ok(()); +} + +#[test] +fn cyrillic_text() -> Result<()> { + let expr = r#"ัƒะณะพะป"#; + test_braille("Russian", expr, "โ ฅโ ›โ •โ ‡")?; + return Ok(()); +} + +#[test] +fn wikipedia_linear_parens_flat() -> Result<()> { + let expr = r#"3(9-7)=6"#; + test_braille("Russian", expr, "โ ผโ ‰โ „โ ฃโ ผโ Šโ €โ คโ ผโ ›โ œโ €โ ถโ ผโ ‹")?; + return Ok(()); +} + +#[test] +fn source_arithmetic_examples() -> Result<()> { + let expr = r#"2481=1944"#; + test_braille("Russian", expr, "โ ผโ ƒโ ™โ „โ ผโ “โ โ €โ ถโ ผโ โ Šโ ™โ ™")?; + + let expr = r#"783:9=87"#; + test_braille("Russian", expr, "โ ผโ ›โ “โ ‰โ €โ ฒโ ผโ Šโ €โ ถโ ผโ “โ ›")?; + + let expr = r#"12×35=420"#; + test_braille("Russian", expr, "โ ผโ โ ƒโ €โ ฆโ ผโ ‰โ ‘โ €โ ถโ ผโ ™โ ƒโ š")?; + return Ok(()); +} + +#[test] +fn nested_fraction_and_root() -> Result<()> { + let expr = r#"x+1yx-y"#; + test_braille("Russian", expr, "โ †โ  โ ญโ €โ –โ ฉโ ฑโ ผโ โ ณโ  โ ฝโ นโ €โ ณโ ญโ €โ คโ ฝโ ฐ")?; + return Ok(()); +} + +#[test] +fn source_simple_fractions_scripts_roots() -> Result<()> { + let expr = r#"12"#; + test_braille("Russian", expr, "โ ผโ โ †")?; + + let expr = r#"a3"#; + test_braille("Russian", expr, "โ  โ โ ณโ ’")?; + + let expr = r#"b7"#; + test_braille("Russian", expr, "โ  โ ƒโ กโ ถ")?; + + let expr = r#"x3"#; + test_braille("Russian", expr, "โ ฉโ ’โ ฑโ  โ ญโ น")?; + return Ok(()); +} + +#[test] +fn latin_alphabet_indicators() -> Result<()> { + let expr = r#"x+A+y+B=x+y+A+B"#; + test_braille("Russian", expr, "โ  โ ญโ €โ –โ จโ โ €โ –โ  โ ฝโ €โ –โ จโ ƒโ €โ ถโ  โ ญโ €โ –โ ฝโ €โ –โ จโ โ €โ –โ ƒ")?; + return Ok(()); +} + +#[test] +fn alphabet_indicators_after_numbers_and_greek() -> Result<()> { + let expr = r#"2x+15=23"#; + test_braille("Russian", expr, "โ ผโ ƒโ „โ  โ ญโ €โ –โ ผโ โ ‘โ €โ ถโ ผโ ƒโ ‰")?; + + let expr = r#"L=2πr"#; + test_braille("Russian", expr, "โ จโ ‡โ €โ ถโ ผโ ƒโ ฐโ โ  โ —")?; + + let expr = r#"α+β=Α+Β"#; + test_braille("Russian", expr, "โ ฐโ โ €โ –โ ƒโ €โ ถโ ธโ โ €โ –โ ƒ")?; + return Ok(()); +} + +#[test] +fn wikipedia_times_divide() -> Result<()> { + let expr = r#"6×7:14=3"#; + test_braille("Russian", expr, "โ ผโ ‹โ €โ ฆโ ผโ ›โ €โ ฒโ ผโ โ ™โ €โ ถโ ผโ ‰")?; + return Ok(()); +} + +#[test] +fn wikipedia_linear_parens() -> Result<()> { + let expr = r#"3·(97)=6"#; + test_braille("Russian", expr, "โ ผโ ‰โ „โ ฃโ ผโ Šโ €โ คโ ผโ ›โ œโ €โ ถโ ผโ ‹")?; + return Ok(()); +} + +#[test] +fn wikipedia_sqrt() -> Result<()> { + let expr = r#"10000<101"#; + test_braille("Russian", expr, "โ ฉโ ฑโ ผโ โ šโ šโ šโ šโ นโ €โ ชโ €โ ผโ โ šโ ")?; + return Ok(()); +} + +#[test] +fn source_functions_logs_derivatives() -> Result<()> { + let expr = r#"cosα"#; + test_braille("Russian", expr, "โ ซโ ‰โ ฐโ ")?; + + let expr = r#"tgxctgx=1"#; + test_braille("Russian", expr, "โ ซโ žโ  โ ญโ „โ ซโ ‰โ žโ  โ ญโ €โ ถโ ผโ ")?; + + let expr = r#"tanx+cotx"#; + test_braille("Russian", expr, "โ ซโ žโ  โ ญโ €โ –โ ซโ ‰โ žโ  โ ญ")?; + + let expr = r#"logxylogyx=1"#; + test_braille("Russian", expr, "โ ซโ ‡โ กโ  โ ญโ ฑโ ฝโ „โ ซโ ‡โ กโ  โ ฝโ ฑโ ญโ €โ ถโ ผโ ")?; + + let expr = r#"y(x)=f(x)"#; + test_braille("Russian", expr, "โ  โ ฝโ ”โ ฃโ ญโ œโ €โ ถโ ‹โ ฃโ ญโ œ")?; + return Ok(()); +} + +#[test] +fn source_geometry_matrix_chemistry() -> Result<()> { + let expr = r#"ABC=15°3012"#; + test_braille("Russian", expr, "โ ธโ ชโ จโ โ ƒโ ‰โ €โ ถโ ผโ โ ‘โ จโ ดโ ผโ ‰โ šโ ”โ ผโ โ ƒโ ”โ ”")?; + + let expr = r#"ABCD"#; + test_braille("Russian", expr, "โ จโ โ ƒโ ธโ ธโ จโ ‰โ ™")?; + + let expr = r#"(abcd)"#; + test_braille("Russian", expr, "โ ฃโ  โ โ €โ ƒโ จโ ณโ ‰โ €โ ™โ œ")?; + + let expr = r#"H2O"#; + test_braille("Russian", expr, "โ จโ “โ กโ †โ •")?; + + let expr = r#"H2C=CH2"#; + test_braille("Russian", expr, "โ จโ “โ กโ †โ ‰โ ฆโ ‰โ “โ กโ †")?; + return Ok(()); +}