From 846327e70dc13c3922a487e788ea717e6e1fa277 Mon Sep 17 00:00:00 2001 From: AdamMagued Date: Mon, 28 Sep 2026 20:51:41 +0300 Subject: [PATCH] canonicalize double exclamation !! to speak as double factorial --- src/canonicalize.rs | 1 + src/operator-info.in | 1 + .../en/ClearSpeak/symbols_and_adornments.rs | 13 ++++++++++++- 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/canonicalize.rs b/src/canonicalize.rs index 0e0a81447..804074e09 100644 --- a/src/canonicalize.rs +++ b/src/canonicalize.rs @@ -3532,6 +3532,7 @@ impl CanonicalizeContext { "\u{02C9}"| "\u{0304}"| "\u{0305}" => "\u{00AF}", "\u{02DC}" | "~" => "\u{223C}", // for base, use version with prefix and infix "\u{01C1}" => "\u{2016}", // U+2016 is "‖" + "!!" => "\u{203C}", // U+203C is "‼" (double factorial) _ => mo_text, }; diff --git a/src/operator-info.in b/src/operator-info.in index 41bccb38b..1417d305e 100644 --- a/src/operator-info.in +++ b/src/operator-info.in @@ -114,6 +114,7 @@ phf_map! { "‵" => OperatorInfo{ op_type: OperatorTypes::POSTFIX, priority: 880, next: &None }, "‶" => OperatorInfo{ op_type: OperatorTypes::POSTFIX, priority: 880, next: &None }, "‷" => OperatorInfo{ op_type: OperatorTypes::POSTFIX, priority: 880, next: &None }, + "‼" => OperatorInfo{ op_type: OperatorTypes::POSTFIX, priority: 810, next: &None }, "‾" => OperatorInfo{ op_type: OperatorTypes::POSTFIX, priority: 880, next: &None }, "⁃" => OperatorInfo{ op_type: OperatorTypes::INFIX, priority: 390, next: &None }, "⁄" => OperatorInfo{ op_type: OperatorTypes::INFIX, priority: 680, next: &None }, diff --git a/tests/Languages/en/ClearSpeak/symbols_and_adornments.rs b/tests/Languages/en/ClearSpeak/symbols_and_adornments.rs index 5d0104e65..0829a4a3e 100644 --- a/tests/Languages/en/ClearSpeak/symbols_and_adornments.rs +++ b/tests/Languages/en/ClearSpeak/symbols_and_adornments.rs @@ -374,4 +374,15 @@ fn vertical_line_evaluated_at_both_given() -> Result<()> { "x squared plus x, evaluated at 1 minus the same expression evaluated at 0")?; return Ok(()); -} \ No newline at end of file +} + +#[test] +fn double_factorial_test() -> Result<()> { + let expr1 = "5!!"; + let expr2 = "5‼"; + test("en", "ClearSpeak", expr2, "5 double factorial")?; + test("en", "ClearSpeak", expr1, "5 double factorial")?; + test("en", "SimpleSpeak", expr1, "5 double factorial")?; + Ok(()) +} + \ No newline at end of file