Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
117 commits
Select commit Hold shift + click to select a range
578732b
Addition of Russian documentation
Kostenkov-2021 Jun 1, 2026
ce7c227
First version of Russian Braille
Kostenkov-2021 Jun 1, 2026
0ce956d
typo in example
NSoiffer Jun 1, 2026
065255f
Enhance Russian Braille support with mathematical symbols and rules (…
Kostenkov-2021 Jun 25, 2026
aa7d161
Ru - Add signed-integer and nested-fraction rules (#610)
Kostenkov-2021 Jun 25, 2026
68acf20
Ru - Add braille label marks and tests (#616)
Kostenkov-2021 Aug 1, 2026
1668344
Merge branch 'main' into ru
NSoiffer Aug 2, 2026
d5e460c
Merge branch 'main' into ru
NSoiffer Aug 3, 2026
6e2bc86
Merge branch 'main' into ru
NSoiffer Aug 3, 2026
cf0f8f4
Fix Russian braille chars for no-unsafe InternedString API
NSoiffer Aug 3, 2026
ef9e74f
Ru - Russian Braille tests addition and enhance no-unsafe builds with…
Kostenkov-2021 Aug 3, 2026
7c8bee2
add else clause to make build.rs not check the rules dir if 'include-…
NSoiffer Aug 3, 2026
2bea116
Merge origin/ru; keep local Rules/src, origin Russian braille tests
NSoiffer Aug 3, 2026
8538575
missing remove of CHEM_STATE if not chemistry
NSoiffer Aug 4, 2026
44ab000
remove #[ignore] from tensor() test -- fixed via chemistry fix
NSoiffer Aug 4, 2026
f1f5983
Removed `#ignore[]` from `test_up_to_date`.
NSoiffer Aug 4, 2026
98a9fe7
Up the sleep time after a change. This failed on github but not local…
NSoiffer Aug 4, 2026
070d9db
turn off panic handling for tests. I can't see what test_up_to_date i…
NSoiffer Aug 4, 2026
308a239
guard 'use std::panic'
NSoiffer Aug 4, 2026
a100b11
copy and then modify prefs.rs so all prefs are present on the CI machine
NSoiffer Aug 4, 2026
0c9ec31
move back to 5ms as timeout was not the problem
NSoiffer Aug 4, 2026
ff8a6a8
better version of suggested by AI that does not require turning it o…
NSoiffer Aug 4, 2026
e87d74f
update acknowledgment for Russian braille
NSoiffer Aug 4, 2026
66a78c6
update version number because added Russian braille
NSoiffer Aug 4, 2026
37f1d19
UEB has a rule for some pseudo-script chars. The match for that rule …
NSoiffer Aug 5, 2026
62ea156
Added new UEB chars. Many of these are accented letters. I added 'A' …
NSoiffer Aug 5, 2026
697579d
Translate German absolute-value ending
moritz-gross Aug 6, 2026
98fbc3e
Merge pull request #650 from moritz-gross/fix/de-absolute-value-end
moritz-gross Aug 6, 2026
c39d867
Fix German unit plurals
moritz-gross Aug 6, 2026
871a153
Merge remote-tracking branch 'upstream/main' into fix/de-unit-plurals
moritz-gross Aug 6, 2026
c0b575f
Merge pull request #651 from moritz-gross/fix/de-unit-plurals
moritz-gross Aug 6, 2026
bc97cbe
Fix German pluralization for "ruthe" and add regression test
moritz-gross Aug 6, 2026
71e068f
Correct German translations for "ruthe" to "rute" and update regressi…
moritz-gross Aug 6, 2026
206c0dc
Merge pull request #652 from moritz-gross/fix/typo-rute-ruthe
moritz-gross Aug 6, 2026
8afdcc7
Expand German unit definitions and add regression test for pluralization
moritz-gross Aug 6, 2026
9bc557d
Merge pull request #653 from moritz-gross/fix/more-weird-unit-plurals
moritz-gross Aug 6, 2026
31858f4
fix some symbols
moritz-gross Aug 6, 2026
0d7a362
Merge pull request #654 from moritz-gross/fix/some-unicode-full-symbols
moritz-gross Aug 6, 2026
d588bdc
fix german set grammar
moritz-gross Aug 6, 2026
3608ca9
Merge pull request #655 from moritz-gross/fix/german-set-grammar
moritz-gross Aug 6, 2026
45aefb2
make uptack speak as 'perpendicular' since so many editors generate i…
NSoiffer Aug 7, 2026
a363707
Merge branch 'main' of https://github.com/daisy/MathCAT
NSoiffer Aug 7, 2026
a42901b
update AGENTS.md to include GitHub CLI check
moritz-gross Aug 9, 2026
ce27413
Merge pull request #664 from moritz-gross/add-gh-cli-to-agents-md
moritz-gross Aug 9, 2026
acd5cfb
Fix assertions in chemistry.rs that could never fail (#551) (#665)
yasumorishima Aug 10, 2026
d154365
remove duplicate definition of convert_last_char_to_number (#663)
moritz-gross Aug 10, 2026
87da432
Refactor `is_complex` logic for clarity and add unit tests for YAML c…
moritz-gross Aug 11, 2026
9fd30c1
merging in latest update to Russian (avoiding all the other things th…
NSoiffer Aug 11, 2026
d1a3927
Refactor `RulesFor` to use `strum_macros::Display` and remove custom …
moritz-gross Aug 11, 2026
468054a
missing ! before condition (#657)
moritz-gross Aug 11, 2026
1c87cc6
simplify TTS using strum (#667)
moritz-gross Aug 11, 2026
b230d91
Exclude `definitions.yaml` from audits and update related tests and d…
moritz-gross Aug 11, 2026
4096a29
Remove unused `error` field and error handling logic from `SpeechRule…
moritz-gross Aug 12, 2026
ab01a5d
Remove `error` field and related checks from `PreferenceManager` (#669)
moritz-gross Aug 12, 2026
bfb6b07
Refactor `strum` dependency to use `derive` feature and replace `stru…
moritz-gross Aug 12, 2026
ca0e9dd
Recognize lg as an ASCIIMath function (#672)
luantaraschi Aug 12, 2026
42ec87e
regex XML_COMMENT is buggy, and xml comments are ignored by parser an…
moritz-gross Aug 12, 2026
d0c900b
update translation of traditioanl chinese based on english version da…
hjy1210 Aug 12, 2026
9c2a725
fix sqrt rule that emitted no speech for 'square root' if not terse. …
NSoiffer Aug 12, 2026
843e554
Merge branch 'main' of https://github.com/daisy/MathCAT
NSoiffer Aug 12, 2026
2730e7c
Add initial translation for the navigation rules
NSoiffer Aug 12, 2026
ec36e05
add `CommandOffset` instead of using `string-length($Prefix)+1` so th…
NSoiffer Aug 12, 2026
206d728
add some missing s for properties
NSoiffer Aug 13, 2026
9c1bdf6
Added a rule to the nb and sv branches to avoid saying "in" when zoom…
NSoiffer Aug 13, 2026
080ca16
Update navigate file to use the translated name of the intent. Fix th…
NSoiffer Aug 13, 2026
a589bad
Updating user- and translator's guide
TimArborealis Aug 13, 2026
63d442c
Revision of user guide
TimArborealis Aug 13, 2026
5dc807f
tweaked a test result
NSoiffer Aug 13, 2026
988a845
Merge branch 'main' of https://github.com/daisy/MathCAT
NSoiffer Aug 13, 2026
b891d1a
Sv update (#682)
NSoiffer Aug 13, 2026
520aa7f
add prolog so all languages display for user's guide
NSoiffer Aug 13, 2026
985f58f
remove users_old.md and helpers_old.md from_config.yml so English onl…
NSoiffer Aug 13, 2026
bd9a92d
Comment out definitions module import (not quite ready)
NSoiffer Aug 13, 2026
909755d
handle definitions.yaml
moritz-gross Aug 14, 2026
8d501cc
Merge pull request #684 from moritz-gross/handle-definitions-file-in-…
moritz-gross Aug 14, 2026
33b1939
translate "ray" as "strahl"
moritz-gross Aug 15, 2026
301746b
fix grammar of "umgekehrt" (German for "inverse"). fix some rare unic…
moritz-gross Aug 15, 2026
f221be7
add CurrencySymbols
moritz-gross Aug 15, 2026
374638d
Merge pull request #685 from moritz-gross/fix-some-more-german-rules
moritz-gross Aug 15, 2026
cd81ae6
Fix German grammar and update translations for math script descriptions
moritz-gross Aug 15, 2026
f8a79ca
Improve German translations for unicode integral and logical symbols,…
moritz-gross Aug 15, 2026
96e19a6
Merge pull request #686 from moritz-gross/fix-some-more-german-rules
moritz-gross Aug 15, 2026
c2dbcc6
Add MathJax demo link to developer docs for rendering inspection
moritz-gross Aug 15, 2026
eebb4be
.
moritz-gross Aug 15, 2026
d33e61b
update latest only if all subparts pass
NSoiffer Aug 15, 2026
98442f8
Merge branch 'main' of https://github.com/daisy/MathCAT
NSoiffer Aug 15, 2026
80a7ab9
update the checkout to @v5 to avoid deprecated warnings during build
NSoiffer Aug 15, 2026
cd1f45d
update some things to avoid deprecated warnings during build
NSoiffer Aug 15, 2026
5abc198
fix the python.yml update
NSoiffer Aug 15, 2026
5091153
hopefully last step for the update to work
NSoiffer Aug 15, 2026
c3c0aa1
comment out untranslated test (#676)
NSoiffer Aug 15, 2026
cd2c1fd
updated for some reason
NSoiffer Aug 15, 2026
4347d88
Modified the format allowed in definitions.yaml so that it more power…
NSoiffer Aug 15, 2026
ea152e5
uncomment definitions.yaml so that it runs
NSoiffer Aug 15, 2026
340c216
fix clippy warning
NSoiffer Aug 15, 2026
8e886cc
Merge changes (mostly unicode) from hu branch (#688)
NSoiffer Aug 15, 2026
7fbaf17
Ru -- merge speech changes into main (#689)
NSoiffer Aug 15, 2026
0380bb0
Remove unused and commented-out code (#680)
moritz-gross Aug 15, 2026
d4a112a
Update demo link in developers documentation
moritz-gross Aug 15, 2026
8305b6f
Merge pull request #687 from moritz-gross/link-mathjax-demo-as-helpfu…
moritz-gross Aug 15, 2026
6ecc412
Did cleanup with ranges to shrink file size. The big win was the 'id'…
NSoiffer Aug 16, 2026
2e1301f
Merge branch 'main' of https://github.com/daisy/MathCAT
NSoiffer Aug 16, 2026
fbc49bb
Announce column separator (#679)
moritz-gross Aug 16, 2026
d5c63d8
fix clippy warnings in the no-unsafe version
NSoiffer Aug 16, 2026
78744ec
Revert changes to file from 6ecc412
NSoiffer Aug 16, 2026
a1fc8e0
missed this change that needed to be reverted for Russian braille
NSoiffer Aug 16, 2026
bc712eb
fix AGENTS.md instruction on `uv run pytest`
moritz-gross Aug 16, 2026
58aa858
Merge pull request #693 from moritz-gross/main
moritz-gross Aug 16, 2026
37a456b
Rules/Languages/hu/navigate.yaml: sync differences after main branch …
hammera Aug 12, 2026
29454e7
Rules/Languages/hu/Clearspeak_rules.yaml: sync audit changes
hammera Aug 15, 2026
9725962
Rules/Languages/hu/unicode-full.yaml: follow up latest english transl…
hammera Aug 16, 2026
0e63a13
Rules/Languages/hu/Sharedrules/general.yaml: follow up english transl…
hammera Aug 16, 2026
e99cc5c
Rules/Languages/hu/SharedRules/geometry.yaml: follow up english trans…
hammera Aug 16, 2026
f66bb87
Rules/Languages/hu/SharedRules/default.yaml: follow up english rule c…
hammera Aug 16, 2026
2ae97fc
Rules/Languages/hu/definitions.yaml: Sync latest english definition c…
hammera Aug 16, 2026
0e85314
Sync hungarian tests, follow up new rule changes
hammera Aug 16, 2026
817d2e1
Merge branch 'hu' into hu
hammera Aug 16, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/coverage.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ jobs:
cargo llvm-cov --workspace --html --output-dir llvm-cov-html

- name: Upload HTML report artifact
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: llvm-cov-html
path: llvm-cov-html/
Expand Down Expand Up @@ -70,7 +70,7 @@ jobs:
(github.event_name == 'schedule' || github.event_name == 'workflow_dispatch')
runs-on: ubuntu-latest
steps:
- uses: actions/download-artifact@v4
- uses: actions/download-artifact@v8
with:
name: llvm-cov-html
path: llvm-cov-html
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/fuzz.yml
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ jobs:
# --- Crash artifact upload (on failure) ---
- name: Upload crash artifacts
if: failure()
uses: actions/upload-artifact@v5
uses: actions/upload-artifact@v7
with:
name: fuzz-crash-artifacts
path: fuzz/artifacts/
Expand Down
5 changes: 1 addition & 4 deletions .github/workflows/python.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,13 @@ name: Python

on: [push, pull_request]

env:
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true

jobs:
test:
name: Python Tests
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: astral-sh/setup-uv@v6
- uses: astral-sh/setup-uv@v10.0.1
- name: Run ruff lint
working-directory: PythonScripts
run: uv run ruff check audit_translations/
Expand Down
50 changes: 25 additions & 25 deletions .github/workflows/rust.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,6 @@ on: [push, pull_request] # note: pre-release job still only on 'refs/heads/main'
env:
CARGO_TERM_COLOR: always
RUSTFLAGS: "-Dwarnings"
# Until all marketplace actions ship Node 24 runtimes (see GitHub deprecation of Node 20).
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true

jobs:
build:
Expand Down Expand Up @@ -49,45 +47,47 @@ jobs:
steps:
- uses: actions/checkout@v5
- name: Remove empty Rules directories
run: find Rules -type d -empty -delete
run: find Rules -type d -empty -delete
- name: Remove test directory
run: rm -r Rules/Languages/zz
- name: create rules.zip
uses: thedoctor0/zip-release@0.7.5
with:
type: 'zip'
filename: 'Rules.zip'
directory: '.'
path: 'Rules'
run: rm -r Rules/Languages/zz
- name: create Rules.zip
run: zip -r Rules.zip Rules
- name: Upload Rules.zip
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: 'Rules.zip'
path: 'Rules.zip'
compression-level: 0
retention-days: 1

pre-release:
name: Pre Release
continue-on-error: false
if: github.event_name == 'push' && github.ref == 'refs/heads/main' # otherwise, job fails on pull requests, as GITHUB_TOKEN is not available
needs: [zip-rules]
needs: [build, clippy, zip-rules]
runs-on: ubuntu-latest
permissions:
contents: write
steps:
# download the previous build artifacts and put them in their proper places
- name: download Rules.zip
uses: actions/download-artifact@v5
uses: actions/download-artifact@v8
with:
name: Rules.zip
# put the files into the release
- name: Automatic release
uses: marvinpinto/action-automatic-releases@latest
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}
automatic_release_tag: latest
prerelease: true
title: Development Build
files: |
# Moving 'latest' prerelease (replaces marvinpinto/action-automatic-releases)
- name: Development Build release
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
REPO="${{ github.repository }}"
SHA="${{ github.sha }}"
# No checkout in this job — always pass --repo.
gh release delete latest --repo "$REPO" --yes --cleanup-tag || true
gh api --method DELETE "repos/${REPO}/git/refs/tags/latest" || true
gh release create latest \
--repo "$REPO" \
--target "$SHA" \
--prerelease \
--latest=false \
--title "Development Build" \
--notes "Development build from ${SHA}" \
Rules.zip
2 changes: 0 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -57,5 +57,3 @@ Rules/*/*/*.zip
docs/_site
docs/.jekyll-cache
docs/Gemfile.lock

docs/nb_of_norway/
6 changes: 4 additions & 2 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,20 +26,22 @@ but add common mistakes of AI agents here instead.
- In sandboxed runs, if needed:
- set `UV_CACHE_DIR=/tmp/uv-cache`
- rerun with escalated permissions if macOS `system-configuration` panics occur.
- *always* self-validate: `ùv run pytest`
- self-validate appropriately with: `uv run pytest`

## Agent Instructions
- Do not mirror README content here; keep guidance agent-specific.
- Avoid broad formatting sweeps; do not run `cargo fmt` in this repo.
- Keep code/rule changes focused and validate with targeted tests first: `cargo test <relevant-tests>`
- do not do any git commands unless explicitly asked for
- Rust coverage is in `target/coverage/`.
- When working with GitHub, e.g. looking at PRs and issues, check if the GitHub CLI is installed (`gh --version`).
- When writing tests, add a brief description explaining the purpose and expected behaviour. Avoid complex setups like using heavily parameterized tests (eg `@pytest.mark.parametrize` for Python)

## Fuzzing (`fuzz/` + cargo-fuzz)
- Install: `cargo install cargo-fuzz`, use a **nightly** toolchain (`rustup run nightly cargo fuzz …`).
- **Dictionary:** `fuzz/mathml.dict` is passed to libFuzzer as `-dict=mathml.dict` (path relative to the `fuzz/` crate). It lists MathML 4 presentation elements and attributes to improve coverage.
- **Harness:** `fuzz/fuzz_targets/fuzz_target_1.rs` calls `set_mathml`, then (on success) `get_spoken_text`, `get_braille` (with `""` and a lossy tail id), `do_navigate_command` with valid command names from `src/navigate.rs` `NAV_COMMANDS`, then speech/braille again.
- **CI:** `.github/workflows/fuzz.yml` builds `fuzz_target_1` with default and `--features no-unsafe`, runs with `mathml.dict` and **`corpus/fuzz_target_1`** (repo: `fuzz/corpus/fuzz_target_1`). The corpus is **restored/saved via GitHub Actions cache** so inputs improve across runs. Push/PR: `-max_total_time=60` each; **weekly schedule: 3600s (1 hour) per configuration**. Weekly runs also **minimize the corpus** (`cargo fuzz cmin`) to keep the cache lean. Workflows use **`actions/checkout@v5`**, **`actions/cache@v5`**, and **`actions/upload-artifact@v5`** (Node 24 runtimes).
- **CI:** `.github/workflows/fuzz.yml` builds `fuzz_target_1` with default and `--features no-unsafe`, runs with `mathml.dict` and **`corpus/fuzz_target_1`** (repo: `fuzz/corpus/fuzz_target_1`). The corpus is **restored/saved via GitHub Actions cache** so inputs improve across runs. Push/PR: `-max_total_time=60` each; **weekly schedule: 3600s (1 hour) per configuration**. Weekly runs also **minimize the corpus** (`cargo fuzz cmin`) to keep the cache lean. Workflows use **`actions/checkout@v5`**, **`actions/cache@v5`**, **`actions/upload-artifact@v7`**, and **`actions/download-artifact@v8`** (Node 24 runtimes).
- **Crash artifacts:** uploaded as GitHub Actions artifacts (90-day retention) on any fuzz failure. Download them from the failed workflow run's "Artifacts" section.
- **Regression tests from crashes:** run `python PythonScripts/fuzz_to_test.py` (optionally pass artifact paths; defaults to `fuzz/artifacts/fuzz_target_1/`). This appends `#[test]` functions to `tests/fuzz_regressions.rs`, deduplicating by content hash. Tests call `set_mathml` + `get_spoken_text` + `get_braille` on the crash input.
- **Coverage:** weekly CI runs `cargo fuzz coverage` against the corpus, then produces an HTML report via `llvm-cov show`. The report is uploaded as the **`fuzz-coverage-report`** Actions artifact (30-day retention). Download and open `index.html` to see which source lines the fuzzer has reached.
Expand Down
5 changes: 2 additions & 3 deletions Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "mathcat"
version = "0.7.6-beta.8"
version = "0.7.6-beta.9"
authors = ["Neil Soiffer <soiffer@alum.mit.edu>"]
license = "MIT"
description = "MathCAT: Math Capable Assistive Technology ('Speech and braille from MathML')"
Expand All @@ -23,8 +23,7 @@ sxd-document-no-unsafe = "0.4.2"
sxd-xpath-no-unsafe = "0.5.1"
yaml-rust = "0.4"
# yaml-rust = { version = "0.11", package = "yaml-rust2" }
strum = "0.28"
strum_macros = "0.28"
strum = { version = "0.28", features = ["derive"] }
anyhow = "1.0"
regex = "1.12.3"
dirs = "6.0"
Expand Down
6 changes: 6 additions & 0 deletions PythonScripts/audit_translations/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ The tool analyzes rule files to detect the following issues:
* **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 the source and target translation.
* **Definition Coverage:** Compares literal `definitions.yaml` entries by name and collection kind (`vector`, `set`, or `map`).

Add `# audit-ignore` to a rule block to suppress auditing that rule.

Expand Down Expand Up @@ -49,6 +50,11 @@ The tool automatically adjusts its matching logic based on the file type:
2. **Unicode Files:**
* Matches rules based on character/range keys.
* *Examples:* `unicode.yaml`, `unicode-full.yaml` (keys like `a-z`, `!`, `0-9`).
3. **Definition Files:**
* `definitions.yaml` is audited by default and can be selected with `--file definitions.yaml`.
* Definitions are matched by name. Missing definitions and collection-kind mismatches are issues; target-only definitions are informational.
* Definition contents are not compared, includes are not resolved, and translation verification is not available for definitions.


---

Expand Down
Loading